산술식을 이진 트리로 변환하는 단순한 자료구조 과제에서 출발한 한 개발자가 결국 C언어로 'graphLang'이라는 함수형 프로그래밍 언어와 그래프 축약 엔진을 직접 구현해냈습니다. 덧셈과 뺄셈 같은 개별 연산을 '함수 적용(function application)'이라는 개념으로 일반화하고, 변수와 함수를 모두 이름으로 조회할 수 있는 값으로 취급하는 등 함수형 프로그래밍의 핵심 아이디어를 적용했습니다. 이 프로젝트는 클로저(closure), 가비지 컬렉터(garbage collector), 사용자 정의 메모리 할당기, REPL(읽기-평가-출력 루프), FFI(외국 함수 인터페이스)까지 포함하는 방대한 규모로 발전했습니다.
개발자는 초기 '1+1+1' 같은 산술식을 이진 트리로 평가하는 과정에서, 모든 연산자가 'Expr × Expr → Expr' 형태를 가진다는 점에 주목했습니다. 이를 'Func Expr Expr | Val' 형태로 일반화하여 평가기가 함수가 무엇을 하는지보다 어떻게 적용하는지만 알면 되도록 설계했습니다. 특히, 사용자 정의 함수를 C 함수 포인터가 아닌 매개변수와 본문 트리를 가진 '클로저 노드'로 표현하여, 다른 함수에 전달하거나 반환하고 단계적으로 평가할 수 있게 했습니다. 또한, 고정 크기 아레나 할당기의 용량 한계를 '청크 할당기(chunk allocator)'로 해결하고, 사용이 끝난 노드를 회수하기 위해 '표시 후 쓸기(mark-and-sweep) 가비지 컬렉터'를 추가했습니다. 이 GC 덕분에 피보나치 수열(fib(40)) 계산 시 메모리 사용량이 12GB 이상에서 약 1.7MB로 획기적으로 줄었습니다.
이 프로젝트는 단순한 과제 해결을 넘어, 저수준 언어인 C로 고수준 함수형 언어의 핵심 개념들을 직접 구현하며 겪는 실제적인 문제 해결 과정을 보여줍니다. 메모리 관리, 성능 최적화, 복잡한 데이터 구조 설계 등 개발자가 마주할 수 있는 다양한 난관과 이를 극복하는 창의적인 접근 방식은 많은 이들에게 영감을 줍니다. 비록 fib(40) 계산에 6분이 걸리는 등 성능 개선 과제가 남아있지만, 이 경험은 프로그래밍 언어의 내부 동작 원리를 깊이 이해하고 자신만의 도구를 만들어낼 수 있다는 가능성을 제시하며, 향후 꼬리 호출 최적화(TCO), 렉서/파서 구현 등 후속 작업에 대한 기대를 높이고 있습니다.