OCaml 컴파일러의 기발한 C++ 백엔드 실험과 커스텀 백엔드의 세계
TL;DR OCaml 생태계에서는 기본 Cmm 백엔드를 넘어 LLVM, Golang, 심지어 C++ 템플릿 메타프로그래밍을 활용한 기발한 커스텀 백엔드 실험들이 이어지고 있습니다. 이러한 시도들은 호출 규약과 GC 통합이라는 과제를 안고 있지만, 프로그래밍 언어의 확장성을 탐구하는 흥미로운 기술적 이정표를 제시합니다.
프로그래밍 언어의 컴파일러 백엔드는 성능과 이식성을 결정짓는 핵심 엔진입니다. OCaml은 전통적으로 자체적인 중간 표현(IR)인 Cmm을 거쳐 고도로 최적화된 네이티브 코드를 생성해 왔지만, 최근 개발자들은 LLVM, WebAssembly, 심지어 C++를 타겟으로 하는 새롭고 기발한 커스텀 백엔드 실험을 통해 언어의 경계를 넓히고 있습니다. 이는 단순한 호기심을 넘어, 레거시 시스템과의 통합 및 크로스 플랫폼 지원을 위한 끊임없는 기술적 도전의 일환입니다.
핵심 내용
OCaml 컴파일러는 프론트엔드에서 고수준의 Lambda IR을 생성하고, 이를 저수준의 Cmm(Continuation Machine Language)으로 변환하여 레지스터 할당과 데드 코드 제거 등을 수행합니다. 이 기본 백엔드는 매우 안정적이지만, 더 넓은 생태계와의 통합을 위해 2012년 LLVM 백엔드 시도부터 2018년 WebAssembly(Cmm_of_wasm) 컴파일까지 다양한 시도가 있었습니다. 최근 주목받은 한 실험적인 PR(#14701)은 ocamlc에 C++ 백엔드를 추가하여, OCaml 코드를 C++ 템플릿 메타프로그래밍으로 변환하는 독특한 접근을 선보였습니다. 다른 한편으로는 Golang을 타겟으로 한 커스텀 백엔드도 커뮤니티에서 논의되었으나, 정수 및 포인터 박싱으로 인한 성능 저하와 가비지 컬렉터(GC) 충돌 문제가 뚜렷한 한계로 지적되었습니다.
기술적 인사이트
소프트웨어 엔지니어 관점에서 커스텀 백엔드 개발의 가장 큰 난관은 가비지 컬렉션(GC)과 호출 규약(Calling Convention)의 매핑입니다. LLVM 백엔드의 경우 강력한 최적화를 제공하지만 OCaml의 메모리 모델과 펜스를 완벽히 지원하기 어렵다는 복잡성이 존재합니다. 반면, C++ 백엔드 PR은 OCaml의 순수 함수형 로직을 C++의 템플릿 구조체(예: Cons, ifthenelse 템플릿)로 치환하여, 컴파일 타임에 연산을 수행하고 그 결과를 컴파일러 에러 메시지 형태로 출력하는 극단적이고 해커다운 방식을 취했습니다. 비록 단순한 소수 계산에 수십 초의 시간과 11GB의 메모리를 소모하는 등 실용성은 떨어지지만, 컴파일러 파이프라인의 유연성과 튜링 완전한 C++ 템플릿의 특성을 극적으로 보여주는 흥미로운 기술적 트레이드오프 사례입니다.
시사점
Jane Street와 같은 기업들이 고성능 시스템 구축에 OCaml을 적극 활용하는 상황에서, 백엔드의 다변화는 타 언어 생태계(Rust, C++ 등)와의 상호 운용성을 높이는 데 중요한 역할을 합니다. 비록 C++ 템플릿 백엔드와 같은 시도가 당장 프로덕션에 도입되기는 어렵고 공식 병합 여부도 불투명하지만, 이러한 실험들은 OCaml 컴파일러 아키텍처가 얼마나 확장 가능한지를 증명합니다. 향후 Rust의 부분 구현 특화(partial impl specialization) 기능이 안정화되는 등 타 언어의 메타프로그래밍 기능이 발전함에 따라, OCaml 프로그램을 다른 시스템 언어 위에서 구동하려는 실용적인 시도들이 더욱 탄력을 받을 수 있습니다.
언어의 컴파일러 백엔드를 교체하거나 확장하는 것은 성능, 호환성, 그리고 메모리 관리라는 세 마리 토끼를 잡기 위한 끝없는 도전입니다. 앞으로 LLVM이나 Rust 기반의 보다 실용적인 OCaml 커스텀 백엔드가 공식 생태계에 어떻게 통합될지, 그리고 이러한 해킹 실험들이 어떤 새로운 영감을 줄지 지켜보는 것은 매우 흥미로울 것입니다.
참고문헌
- A new C++ back end for ocamlc - https://github.com/ocaml/ocaml/pull/14701
- http://www.simonjf.com/2018/08/27/cmm-of-wasm.html
- https://ocaml.org/docs/compiler-backend
- https://mukulrathi.com/create-your-own-programming-language/compiler-engineering-structure/
- https://www.janestreet.com/tech-talks/ocaml-all-the-way-down/
- https://discuss.ocaml.org/t/best-approach-at-implementing-custom-backends-for-ocaml-in-2020/6859
- https://discuss.ocaml.org/t/llvm-backend-for-ocaml/1132
- https://www.youtube.com/watch?v=g3qd4zpm1LA
- https://blog.vedant.dev/ocaml-jane-streets-alternative-for-c-281a777444b3