TECH 으로 돌아가기
TECH HACKER NEWS 오늘 6분 읽기 27 READS

괄호의 언어로 스택의 언어를 만들다 — Let Over Lambda의 Forth 구현기

Lisp 매크로의 끝판왕 책으로 불리는 Let Over Lambda의 8장 'Lisp moving Forth moving Lisp'이 온라인에 무료로 공개돼 있어요. 이 장이 다루는 주제가 상당히 독특한데요, Common Lisp의 매크로로 Forth라는 언어를 통째로 구현하면서, 프로그래밍 역사상 가장 '메타'한 두 언어가 서로를 비추게 만드는 내용이거든요.

Forth가 뭐냐면

1970년경 찰스 무어(Chuck Moore)가 천문대 망원경을 제어하려고 만든 스택 기반 언어예요. 스택이 뭐냐면 접시 쌓기를 떠올리면 돼요. 나중에 올린 접시를 먼저 꺼내는 구조인데, Forth에서는 모든 계산이 이 접시 더미 위에서 일어나요. 예를 들어 3 + 4를 계산하고 싶으면 '3 4 +'라고 써요. 3을 스택에 올리고, 4를 올리고, +가 위의 두 개를 꺼내서 더한 뒤 결과 7을 다시 올리는 거죠. 이걸 후위 표기법(RPN)이라고 하는데, 괄호도 연산자 우선순위도 필요 없어져요.

Forth의 명령 단위는 '워드(word)'라고 부르고, 새로 만든 워드는 '사전(dictionary)'에 등록돼요. 문법이라고 할 게 거의 없어서 언어 전체 구현이 몇 KB면 충분한데요, 이 극단적인 작음 덕분에 우주 탐사선, 임베디드 장비, 그리고 옛날 맥과 썬 워크스테이션의 부팅을 담당하던 Open Firmware에까지 쓰였어요. 프린터 언어인 PostScript도 같은 스택 방식이고요.

Lisp 매크로가 뭐냐면

Lisp에서는 코드 자체가 리스트라는 데이터 구조예요. 그래서 '코드를 입력받아 코드를 만들어 돌려주는 함수', 즉 매크로를 쓸 수 있어요. 언어에 없는 문법이 필요하면 라이브러리 만들듯 직접 추가하면 되는 거죠. if문 같은 제어 구조조차 사용자가 만들 수 있는 수준이에요.

왜 하필 이 둘을 붙였을까

두 언어의 공통점은 '언어 위에 언어를 지어 올리며 문제를 푼다'는 철학이에요. 그리고 놀랍도록 정확한 대응 관계가 있는데요. Forth에는 immediate word라는 게 있어요. 보통 워드는 컴파일된 뒤 나중에 실행되는데, immediate word는 컴파일하는 도중에 즉시 실행돼서 컴파일 과정 자체를 조작해요. 눈치채셨겠지만 이건 Lisp 매크로가 하는 일과 본질적으로 같아요. 컴파일 타임에 개입해서 언어를 확장하는 장치라는 점에서요.

책의 8장은 Common Lisp의 클로저와 매크로를 재료로 Forth의 스택, 사전, 컴파일 상태를 하나씩 만들어가요. 그 과정에서 threaded code라는 고전 기법도 나오는데요, 이게 뭐냐면 워드의 본문이 기계어가 아니라 '다른 워드들을 가리키는 주소의 목록'으로 이어진 구조예요. 메모리가 귀하던 시절에 코드 크기를 극단적으로 줄여주던 방식인데, 이걸 Lisp의 클로저 배열로 우아하게 재현하는 걸 보면 두 언어가 얼마나 닮은꼴인지 실감하게 돼요.

업계 맥락에서 보면

스택 머신이라는 아이디어는 사실 우리 곁에 계속 있었어요. JVM 바이트코드도, WebAssembly도 내부적으로는 스택 머신이거든요. 여러분이 자바 코드를 컴파일할 때마다 Forth의 먼 친척이 만들어지고 있는 셈이죠. Factor 같은 현대적인 스택 기반 언어도 이 계보를 잇고 있고요. 그리고 Forth는 파서가 거의 필요 없는 언어라서, '내 손으로 언어 하나 만들어보기'의 입문 코스로도 최고예요. 인터프리터 핵심이 몇백 줄이면 나오거든요.

한국 개발자에게는

실무에서 Forth를 쓸 일은 거의 없겠지만, 이 챕터를 읽는 경험은 DSL(도메인 특화 언어)을 설계하거나 메타프로그래밍을 이해하는 관점을 크게 넓혀줘요. 언어를 주어진 도구가 아니라 빚어 쓰는 재료로 보는 훈련이 되거든요. 주말 프로젝트로 파이썬이나 자바스크립트로 미니 Forth 인터프리터를 만들어보는 것도 강력 추천해요. 스택 하나, 사전 하나, 루프 하나면 시작할 수 있어요.

정리하면, 이 글은 두 극단의 언어를 겹쳐 보며 '프로그래밍 언어란 무엇인가'를 다시 묻게 만드는 고전이에요. 여러분은 스택 기반 언어를 직접 다뤄본 적 있으신가요? 혹은 내 언어를 만들어보고 싶었던 적은요?


🔗 출처: Hacker News

SOURCE · HACKER NEWS
원문 전체 보기 → https://letoverlambda.com/textmode.cl/guest/chap8.html
SHARE
처리 중...