QBE 1.3, 성능과 단순성을 잡다!
QBE 1.3은 GCC -O2 성능의 70% 목표에 근접한 63% 성능 향상을 달성하며 주요 릴리스로 평가됨
새로운 IL 매칭 알고리즘과 mgen 도구를 도입하여 컴파일러 내부 로직을 개선함
Windows ABI 지원 및 위치 독립 코드(PIC) 생성 기능이 강화되어 범용성이 증대됨
LLVM/Cranelift 대비 단순성을 강점으로 내세우며 특정 사용 사례에 집중함
QBE 1.3의 성능 최적화 및 목표 달성
QBE 1.3 릴리스는 GCC -O2 성능의 70% 달성이라는 목표에 근접한 63% 성능 향상을 이뤄냈습니다. 특히 `ee_isdigit` 및 `crcu8` 함수 최적화에 집중했으나, 이는 일반적인 컴파일 부하에 적용하기 어려운 특정 사례였습니다. 그럼에도 불구하고 GVN/GCM, 루프 최적화 등 다양한 최적화 기법을 적용하여 코어마크(CoreMark) 벤치마크에서 상당한 성능 개선을 보였습니다. 다만, QBE의 스트리밍 컴파일 모델과의 비호환성으로 인해 인라이닝(Inlining)은 최적화에서 제외되었습니다.
새로운 IL 매칭 알고리즘과 mgen 도구
QBE 1.3은 기존의 트리 넘버링 알고리즘을 대체하는 새로운 OCaml 기반 mgen 도구를 도입했습니다. 이 도구는 lispy IL 패턴을 인식하여 자동으로 C 코드를 생성하며, 이를 통해 연산자 연관성 및 교환 법칙 처리의 복잡성을 줄였습니다. mgen은 향후 중간 언어(IL) 패턴 인식 및 최적화 패스에 더 광범위하게 활용될 것으로 기대됩니다. 이는 메타프로그래밍(Metaprogramming) 솔루션 구현이라는 장기 목표를 달성한 것입니다.
Windows ABI 및 위치 독립 코드 지원 강화
이번 릴리스에서는 Windows ABI 지원이 추가되어 Windows 환경에서의 컴파일이 용이해졌습니다. 또한, 위치 독립 코드(Position-Independent Code, PIC) 생성 능력이 향상되어 공유 객체(Shared Objects) 생성이 가능해졌습니다. 이는 ELF 등에서 글로벌 오프셋 테이블(Global Offset Table, GOT)과 같은 간접적인 전역 변수 접근을 지원하는 새로운 `extern “dynamic constant”` 플래그 덕분에 가능해졌습니다. 이를 통해 런타임에 결정되는 심볼에 대한 접근이 가능해졌습니다.
QBE vs LLVM/Cranelift 비교 및 단순성 강조
커뮤니티에서는 QBE가 LLVM이나 Cranelift와 같은 다른 컴파일러 백엔드와 목표가 중첩되는지에 대한 질문이 있었습니다. 이에 대한 답변으로 QBE는 다른 두 프로젝트에 비해 훨씬 단순한 구조를 지향한다고 언급되었습니다. 이는 복잡한 최적화 기법이나 광범위한 언어 지원보다는 핵심 컴파일러 기능의 단순성과 효율성에 초점을 맞추고 있음을 시사합니다.