1P by GN⁺ 18시간전 | ★ favorite | 댓글 1개
  • 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 프로그램 실행이 가능할 것으로 언급됨

커뮤니티 반응 및 논의

  • 기능 테스트 및 피드백

    • 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.mlprimes.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월은 이미 지났는데 말임