신기한 Hacker News · 2026-09-26

"이걸로 3D 그래픽을 돌린다고?"… 기괴한 언어 브레인퍽으로 레이 트레이서 만든 개발자

핵심 요약
  • 한 개발자가 단 8개의 명령어만 지원하는 난해한 언어 브레인퍽(Brainfuck)으로 3D 레이 트레이서를 구현했습니다.
  • 더 단순한 언어일수록 코드가 간단해질 거라는 엉뚱한 역발상에서 시작해 고정소수점 연산과 컴파일러 DSL을 밑바닥부터 설계했습니다.
  • 레지스터나 기본 연산조차 없는 극단적인 환경에서 수학적 원리와 알고리즘을 총동원해 실제 렌더링에 성공했습니다.
요약 한 개발자가 프로그래밍 언어계의 기행으로 불리는 난해한 난독화 언어 브레인퍽(Brainfuck)을 이용해 3D 그래픽 기술인 '레이 트레이서(Ray Tracer)'를 구현한 과정을 공개해 개발자 커뮤니티에서 화제를 모았습니다. 작성자는 C++ 시스템 프로그래밍 대회를 준비하던 중 CMake 튜토리얼에서 'CMake 언어로 레이 트레이서까지 작성된 적이 있지만 권장하지 않는다'는 문구를 우연히 보게 되었습니다. 이전에 이미 일반 레이 트레이서와 GPU용 레이 트레이서를 작성해 본 적이 있던 그는 "더 단순한 언어로 레이 트레이서를 만든다면 코드가 훨씬 단순해지지 않을까?"라는 엉뚱한 발상에서 출발해, 단 8개의 명령어(>, <, +, -, ., ,, [, ])와 무한 테이프 형태의 단일 바이트 셀 메모리 구조만 지원하는 극도로 미니멀한 언어 브레인퍽을 선택했습니다. 브레인퍽에는 레지스터나 곱셈/나눗셈 같은 고차 연산이 전혀 없기 때문에 모든 것을 바닥부터 설계해야 했습니다. 우선 3D 공간 연산에 필수적인 소수점과 큰 수를 다루기 위해 여러 개의 메모리 셀을 묶은 고정소수점 'Q16.16 포맷'을 고안해 넓은 범위와 정밀도를 확보했습니다. 또한 복잡한 재귀 연산을 반복문으로 바꾸고 변수 이름 충돌을 방지하는 헝가리안 표기법을 적용한 SSA 형태의 중간 표현(IR) DSL을 만들어 연산과 코드 생성을 분리했습니다. 난관이었던 제곱근(sqrt) 연산의 경우, 나눗셈이 필요한 헤론 공식이나 특정 구간에서 오차가 심한 테일러 급수 대신 오차 보정이 확실한 장제법(Long division) 방식을 적용했고, 안티에일리어싱을 위한 난수 생성기 역시 256주기를 보장하는 단순 선형 방정식을 직접 구성해 작동시켰습니다. 터무니없이 제한된 환경에서 수학적 원리와 컴파일러 기법을 총동원해 실제로 작동하는 3D 렌더러를 뽑아낸 이 프로젝트는 '광기 어린 프로그래밍'의 정수로 주목받고 있습니다.
Sponsored · 광고