2010년, 구글의 저명한 AI 연구자 피터 노빅(Peter Norvig)이 공개한 '파이썬으로 리스프(Lisp) 인터프리터 만들기' 가이드가 최근 다시금 개발자들 사이에서 회자되고 있습니다. 이 가이드는 컴퓨터 언어 인터프리터 구현의 일반적인 원리를 설명하고, 특히 파이썬 3를 이용해 스킴(Scheme) 방언의 리스프 인터프리터 '리스피(Lispy)'를 구축하는 과정을 간결하게 보여줍니다. 앨런 케이(Alan Kay)가 '소프트웨어의 맥스웰 방정식'이라 불렀던 언어 구현의 본질을 이해하는 데 초점을 맞추고 있습니다.
노빅은 스티브 예기(Steve Yegge)의 말을 인용하며 컴파일러(또는 인터프리터)의 작동 방식을 아는 것이 컴퓨터 작동 방식을 이해하는 데 필수적이라고 강조합니다. 이 가이드는 언어의 구문(syntax)과 의미(semantics)를 명확히 구분하여 설명합니다. 예를 들어, 자바(Java)가 다양한 구문 규칙을 가진 반면, 스킴은 모든 것이 표현식(expression)으로 이루어져 있어 훨씬 단순합니다. 숫자나 심볼 같은 원자 표현식(atomic expressions)과 괄호로 묶인 리스트 표현식(list expressions)이 전부이며, 'if', 'define' 등 5개의 키워드와 8개의 구문 형식만으로 언어 전체를 구성할 수 있습니다. 이는 파이썬의 33개 키워드, 자바의 50개 키워드와 비교하면 매우 간결한 구조입니다.
인터프리터는 크게 파싱(parsing)과 실행(execution) 두 부분으로 나뉩니다. 파싱은 입력된 프로그램을 언어의 구문 규칙에 따라 검증하고 추상 구문 트리(Abstract Syntax Tree, AST)와 같은 내부 표현으로 변환하는 과정입니다. 리스피에서는 'parse' 함수가 이 역할을 담당합니다. 이후 실행 단계에서는 이 내부 표현을 언어의 의미 규칙에 따라 처리하여 실제 계산을 수행하며, 리스피의 'eval' 함수가 이 역할을 합니다. 노빅은 리스피 계산기(Lispy Calculator)라는 스킴의 부분 집합 언어를 먼저 정의하여, 변수 정의, 조건문, 함수 호출 등 기본적인 계산기 기능을 구현하는 과정을 통해 인터프리터의 핵심 원리를 단계적으로 설명합니다. 이처럼 단순한 구조를 통해 언어 구현의 복잡성을 해체하고 프로그래밍 언어의 근본적인 작동 방식을 직관적으로 이해할 수 있도록 돕는 것이 이 가이드의 핵심 가치입니다.