웃긴 Hacker News · 6일 전

과제로 1+1 계산하려다 홧김에 프로그래밍 언어 통째로 만들어버린 개발자

핵심 요약
  • 자료구조 수업에서 이진 트리를 이용해 1+1+1을 계산하는 단순 과제를 받았습니다.
  • 변수와 함수 추상화, 메모리 오버헤드를 해결하려다 해시 테이블과 아레나 할당기까지 바닥부터 구현했습니다.
  • 결국 클로저, 가비지 컬렉터, REPL 등을 갖춘 독자적인 함수형 언어를 C언어로 완성해 버렸습니다.
요약 자료구조 수업 과제로 '산술 연산식을 이진 트리로 변환하고 1+1+1을 계산하는 평가기'를 만들려던 개발자가 배보다 배꼽이 더 커진 황당한 개발 일화를 공개했습니다. 처음에는 그저 덧셈, 뺄셈, 곱셈, 나눗셈을 이진 트리로 파싱해 계산하는 단순한 과제였으나, 연산자들을 추상화하면서 "평가기가 연산 종류를 굳이 알 필요 없이 함수 적용 방식으로 처리하면 된다"는 깨달음을 얻게 되었습니다. 여기서부터 일이 걷잡을 수 없이 커졌습니다. 변수 기능을 넣으려다 보니 C언어에 기본 해시 테이블이 없다는 사실에 직면해 직접 해시 테이블을 구현했고, 노드 구조체를 C언어의 태그드 유니온(tagged union)으로 짜면서 메모리 계산에 들어갔습니다. 64비트 환경에서 노드 하나당 32바이트인데 malloc 헤더 16바이트까지 더해져 1+1 계산에만 노드 3개(144바이트)가 소모된다는 것을 확인하자, 메모리 낭비를 줄이겠다며 커스텀 아레나 할당기(Arena Allocator)까지 직접 만들었습니다. 더 나아가 변수와 함수를 동일한 환경(Env Table)에 저장해 '함수도 값으로 취급'할 수 있게 만들기로 결심했습니다. 하지만 단순한 C 함수 포인터로는 사용자가 직접 정의한 함수나 함수를 반환하는 고차 함수(클로저)를 표현할 수 없다는 한계에 부딪혔고, 결국 C 함수 포인터 대신 AST 트리 자체를 함수 몸체로 저장하는 구조를 설계하기에 이르렀습니다. 결국 단순한 사칙연산 과제로 시작했던 작업은 클로저, 커스텀 메모리 할당기, 가비지 컬렉터, REPL, FFI까지 직접 구현하며 온전한 함수형 프로그래밍 언어를 C언어로 바닥부터 구축하는 거대한 프로젝트로 탈바꿈했습니다.
Sponsored · 광고