TECH 으로 돌아가기
TECH HACKER NEWS 오늘 7분 읽기 26 READS

컴파일러의 눈으로 C++를 보다, 소스 변환 도구 C++ Insights

컴파일러의 눈으로 C++를 보다, 소스 변환 도구 C++ Insights
SOURCE IMAGE · HACKER NEWS

C++는 겉으로 드러나는 코드와 실제로 컴파일러가 만들어내는 코드 사이의 간극이 유독 큰 언어다. 복사 생성자나 소멸자 같은 특수 멤버 함수는 선언하지 않아도 컴파일러가 자동으로 채워 넣고, 파생 클래스에서 기반 클래스로의 업캐스트나 암묵적 형변환도 눈에 보이지 않게 일어난다. 람다, 범위 기반 for 문, 구조적 바인딩처럼 최근 표준에서 추가된 문법적 편의 기능일수록 '컴파일러가 대신 풀어 써 주는' 내부 코드와 우리가 작성한 코드의 거리는 더 멀어진다. Andreas Fertig가 만든 오픈소스 도구 C++ Insights는 바로 이 보이지 않는 영역을 눈으로 확인할 수 있게 해 준다.

어셈블리도 AST도 아닌 'C++로 된 설명'

C++ Insights는 Clang을 기반으로 한 소스-투-소스(source-to-source) 변환 도구다. 즉 입력된 C++ 코드를 받아, 컴파일러가 내부적으로 이해하는 형태를 다시 사람이 읽을 수 있는 C++ 코드로 풀어서 출력한다. 저자는 이 접근의 배경을 분명히 밝히고 있다. Clang에는 이미 AST 덤프 기능이 있고, Compiler Explorer 같은 도구로 생성된 코드를 볼 수도 있다. 그러나 AST는 추상 트리이고 Compiler Explorer가 보여 주는 것은 어셈블리다. 둘 다 평소 우리가 코드를 작성하는 언어가 아니기에 직관적으로 와닿지 않는다. 학생들에게 C++를 가르치면서 'AST가 전부'라고 설명하는 것이 만족스럽지 않았다는 점이 이 프로젝트의 출발점이 됐다.

도구는 2017년 저자가 C++11·14·17의 새 기능들을 정리하던 과정에서 시작됐다. 처음에는 범위 기반 for 문을 컴파일러 내부 형태로 바꾸는 작은 실험이었지만, 이후 구조적 바인딩과 람다로 확장됐고 결국 애초 계획보다 훨씬 많은 것을 다루게 됐다. 지금은 연산자가 실제로 호출되는 지점, 컴파일러가 형변환을 수행하는 위치를 드러내고, auto나 decltype 뒤에 숨은 실제 타입까지 추론해 보여 준다.

실무에서 어떻게 쓰나

가장 손쉬운 사용법은 설치 없이 cppinsights.io에 접속해 코드 조각을 붙여 넣는 것이다. 람다가 어떤 함수 객체 클래스로 바뀌는지, 범위 기반 for 문이 어떤 반복자 호출로 펼쳐지는지, auto가 어떤 타입으로 확정되는지를 즉시 확인할 수 있다. 교육 현장이나 코드 리뷰, 혹은 새 문법의 동작 원리를 동료에게 설명할 때 '컴파일러가 실제로 무엇을 하는가'를 추측이 아니라 코드로 제시할 수 있다는 점이 핵심 가치다. 저자는 매달 새 영상을 올리는 유튜브 채널을 운영하며, 이 도구로 특정 C++ 구문을 설명하기도 한다.

에디터 통합도 마련돼 있다. Visual Studio Code 확장과 Neovim 플러그인이 제공되고, macOS에서는 Homebrew로 설치할 수 있으며, 최신 버전을 담은 Docker 컨테이너를 꾸려 두는 별도 프로젝트도 있다. bash·zsh·fish용 자동 완성 스크립트가 함께 제공돼, C++ Insights 자체 옵션은 물론 -- 뒤에 전달하는 Clang 옵션까지 설명과 함께 보완해 준다.

직접 빌드할 때의 함정

소스에서 직접 빌드하려는 경우에는 몇 가지 주의할 점이 있다. C++ Insights는 Clang 소스 트리 안에서도, 밖에서도 빌드할 수 있는데, 가장 간편한 방법은 트리 안에서 LLVM_EXTERNAL_PROJECTS 옵션을 쓰는 것이다. 가장 까다로운 지점은 시스템 인클루드 경로다. 이 경로는 빌드에 사용한 컴파일러 기준으로 바이너리에 하드코딩되기 때문에, 실행 환경과 어긋나면 표준 헤더를 찾지 못할 수 있다. 이를 위해 저장소에는 컴파일러에서 인클루드 경로를 수집해 주는 scripts/getinclude.py 스크립트가 들어 있다. 또한 GCC를 기본 경로가 아닌 곳에 커스텀 빌드해 둔 환경이라면 Clang이 libstdc++(GCC의 STL) 경로를 찾지 못하는데, 이때는 --gcc-toolchain 옵션으로 설치 위치를 직접 알려 주면 된다.

도구의 성격상 분명한 한계도 있다. 결과물은 '컴파일 가능한 코드'를 지향하지만, 저자 스스로 밝히듯 모든 지점에서 그것이 가능한 것은 아니다. 또한 출력은 어디까지나 Clang과 그 AST 해석에 기반하므로, 특정 구문의 표현이 다른 컴파일러의 실제 동작과 완전히 일치한다고 단정할 수는 없다. 저자 역시 모든 것을 정확히 담아낸다고 주장하지 않으며, 현재 C++20 기능 지원을 진행 중이라고 밝히고 있다. 웹사이트 버전은 최신 Clang 릴리스에 맞추려 하지만 윈도우용 Clang 빌드 문제 등으로 몇 달가량 뒤처지는 경우가 있다는 점도 참고할 만하다.

정리하면 C++ Insights는 생산 코드를 자동으로 고쳐 주는 도구가 아니라, 언어의 숨은 동작을 학습하고 검증하는 렌즈에 가깝다. 어셈블리나 AST라는 중간 언어를 거치지 않고 '컴파일러가 보는 C++'를 다시 C++로 돌려받는다는 발상 자체가, 복잡해진 현대 C++를 이해하려는 실무자에게 실질적인 도움을 준다. 다만 그 출력을 Clang의 한 가지 해석으로 받아들이고, 필요하면 표준 문서나 다른 구현과 교차 확인하는 자세가 함께 필요하다.

SOURCE · HACKER NEWS
원문 전체 보기 → https://github.com/andreasfertig/cppinsights
SHARE
NEXT · CHOOSE

변화를 읽었다면,
내가 만들 수익 구조를 고릅니다.

정보를 더 모으는 데서 멈추지 않고, 광고·외주·판매·중개·구독 중 내 상황에 맞는 출발점을 정해보세요.

21가지 수익 구조 살펴보기 →
처리 중...