OCaml 컴파일러용 새로운 C++ 백엔드
(github.com/ocaml)- OCaml 컴파일러에 C++ 코드 생성을 지원하는 새로운 백엔드가 제안되어, 기존 C 기반 백엔드의 한계를 보완
- 변환된 코드는 순수 함수형 스타일로 작성되며, 가변 상태나 표준 라이브러리 사용 없이
List모듈 일부를 재구현 - 실행에는 C++ 컴파일러(g++) 가 필요하며, 템플릿 깊이 제한 해제나 인자 전달을 위한 옵션을 지원
- 성능은 컴파일러별로 차이가 있으며, 개선된 우선순위 큐 기반 체 알고리듬 적용 시 속도와 메모리 효율이 향상
- 커뮤니티는 이를 함수형 언어와 템플릿 메타프로그래밍의 결합 실험으로 평가하며, Rust 확장 가능성도 언급됨
C++ 백엔드 추가 제안
-
OCaml 컴파일러(
ocamlc)에 C++ 백엔드를 추가하는 패치가 제안됨- 기존 런타임과 FFI에서 사용 중인 비증분 C 백엔드를 개선한 형태
-
ocamlc -incr-c primes.ml명령으로 OCaml 코드를 C++로 변환 가능
- 변환된 C++ 코드는 순수 함수형 스타일로 작성되어 가변 상태를 지원하지 않음
- 이로 인해 표준 라이브러리 사용이 불가능하며, 예제에서는
List모듈 일부를 순수 함수형으로 재구현 - 출력은
Cons<hd, tl>형태의 중첩 구조로 표현되며, C++의::연산자와 충돌을 피하기 위해 별도 구조 사용
- 이로 인해 표준 라이브러리 사용이 불가능하며, 예제에서는
- 실행에는 C++ 컴파일러(g++) 가 필요하며,
-Dlimit=100옵션으로 인자 전달 가능- 실행 결과는 컴파일러 오류 메시지 형식으로 출력
- 대규모 계산 시
-ftemplate-depth=999999옵션으로 템플릿 깊이 제한을 해제 가능
- 성능은 컴파일러에 따라 차이가 있음
-
g++은 10000 이하 소수 계산에 약 30초, 11GiB 메모리 사용 -
clang++은 1초 내 경고 후 세그멘테이션 오류 발생 - O’Neill의 우선순위 큐 기반 체 알고리듬 적용 시 8초, 3.1GiB로 개선
-
-
향후 확장 방향으로 Rust 지원이 언급됨
- Rust가 부분적
impl specialization을 완성하면 OCaml 프로그램 실행이 가능할 것으로 언급됨
- Rust가 부분적
커뮤니티 반응 및 논의
-
기능 테스트 및 피드백
-
redianthus는 비균일 재귀 데이터 타입 지원 여부를 질문 -
stedolan은%predint미구현으로 인한 오류를 수정하고 해당 타입이 정상 동작함을 확인
-
-
유머와 반응
-
avsm은 “C--이 필요했는데 C++이라니, C#으로 타협하자”는 농담을 남김 -
stedolan은 “내년엔 복소수 ℂ를 시도하겠다”고 응답 - 😂, ❤️, 🚀 등의 이모지 반응이 다수 달리며 커뮤니티의 긍정적 반응이 확인됨
-
-
기술적 제안
-
AdelKS는 템플릿 대신constexpr평가를 이용한 대안을 제시- 컴파일 시점에 소수를 계산해 바이너리에 직접 포함하는 예시 코드 공유
-
LoganDark는 “그건 순수한 재미를 위한 것”이라며 템플릿 사용 이유를 유머러스하게 답변
-
-
추가 논의
-
redianthus는 “이제 C++이 진정한 함수형 언어가 되었다”고 언급- OCaml의 순수 함수형 자료구조를 C++에서 구현 가능함을 강조
-
dzmitry-lahoda는 Rust에서도 이미 OCaml 실행이 가능한 프로젝트(contextgeneric/cgp)를 언급
-
성능 및 실행 예시
-
기본 예제: 소수 계산 프로그램
-
ocamlc -incr-c primes.ml→primes.cpp생성 -
g++ -Dlimit=100 primes.cpp실행 시 소수 목록 출력
-
-
고성능 설정
-
g++ -ftemplate-depth=999999 -Dlimit=10000 primes.cpp - 약 30초, 11GiB 메모리 사용
-
-
개선된 알고리듬 적용 시
- 8초, 3.1GiB로 성능 향상
결론
- 이 PR은 OCaml을 C++로 변환하는 새로운 백엔드 실험으로, 함수형 언어와 템플릿 메타프로그래밍의 결합 가능성을 보여줌
- 커뮤니티는 이를 기술적 유머와 창의적 실험의 결합 사례로 받아들이며 활발히 반응
- Rust 등 타 언어로의 확장 가능성도 제시됨
Hacker News 의견들
-
정말 훌륭한 내용임. 오래 실행되는 C++ 코드를 쓸 때 한 가지 팁을 주고 싶음
이상하게도 C++ 인터프리터에는 tail call optimization이 전혀 없음
그래서 대부분의 관용적인 C++ 코드는reverse,map,range,filter같은 함수를 직접 구현해서 스택이 터지지 않도록 처리함
이런 식으로 구현하면 유지보수하는 사람이 훨씬 편할 것임. 명령줄 플래그에 의존하지 말고 이식성 있는 접근법을 쓰는 게 좋음 -
“이런 고급 자료구조를 사용하면 g++이 10000 이하의 소수를 8초 만에 계산하고, 메모리는 3.1GiB만 사용한다”는 문장을 보고 웃음이 나왔음
드디어 내 노트북에서도 소수 계산을 할 수 있게 되었음 -
“이 코드는 idiomatic하고 읽기 쉬운 C++로 번역된다”는 부분을 보고 정말 공감했음
C++을 좋아하는 입장에서, 이건 진짜 읽기 좋은 C++ 코드라고 생각함- 대부분은 동의하지만,
typedef I<((I<((n::val (p::val))>::val) != (I<0>::val))> res;같은 부분은 정말 마법 수준의 템플릿 트릭임
C++에서 타입 정의 안에 조건식을 넣은 건 처음 봤음
나중에 보니 이건 실제 코드가 아니라 템플릿 평가 로직의 일부였음
즉, 고수준 언어의 컴파일러 로직 일부를 템플릿 엔진으로 오프로드한 셈임
이런 접근은 파서에 시간을 더 쓰는 것보다 효율적일 수도 있음
그래서 지금은 내가 개발 중인 elevate 컴파일러 프레임워크의 lowering 타깃으로 C++을 써볼까 하는 생각이 듦
- 대부분은 동의하지만,
-
“C++ is a purely functional language”라는 문장을 보고 처음엔 오타인 줄 알고 눈썹이 올라갔음
그런데 오타가 아니라는 걸 알고 나니 더 흥미로웠음. 나머지 내용도 훌륭했음 -
이 글 덕분에 하루가 즐거워졌음. 고마움
-
Stephen Dolan은 역시나 실망시키지 않음. 매번 놀라움을 줌
-
“C++은 순수 함수형 언어이며, 변경 가능한 상태를 지원하지 않는다. C++ 프로그램을 실행하려면 C++ 인터프리터가 필요하다”는 부분을 보고
순간 만우절 농담인 줄 알았음. 4월은 이미 지났는데 말임