# 프로그래밍 언어 인터프리터 만들기

> Clean Markdown view of GeekNews topic #25886. Use the original source for factual precision when an external source URL is present.

## Metadata

- GeekNews HTML: [https://news.hada.io/topic?id=25886](https://news.hada.io/topic?id=25886)
- GeekNews Markdown: [https://news.hada.io/topic/25886.md](https://news.hada.io/topic/25886.md)
- Type: GN+
- Author: [neo](https://news.hada.io/@neo)
- Published: 2026-01-17T07:32:35+09:00
- Updated: 2026-01-17T07:32:35+09:00
- Original source: [craftinginterpreters.com](https://craftinginterpreters.com/)
- Points: 2
- Comments: 1

## Topic Body

- **프로그래밍 언어 설계와 구현**을 직접 배우며, 완전한 스크립트 언어를 만드는 과정을 다루는 책  
- **파싱, 의미론, 바이트코드, 가비지 컬렉션** 등 고수준 개념부터 저수준 구현까지 단계별로 설명  
- `main()` 함수에서 시작해 **동적 타이핑, 렉시컬 스코프, 일급 함수, 클래스, 상속**을 포함한 언어를 직접 작성  
- 인쇄본, eBook, PDF, 웹 버전 등 **4가지 형식**으로 제공되며, 웹에서는 전체 내용을 무료로 열람 가능  
- **Google의 Dart 언어 개발자 Robert Nystrom**이 저술, 언어 제작에 관심 있는 개발자에게 실용적 학습 자료로 중요  

---
### 책 개요
- _Crafting Interpreters_는 **완전한 기능의 효율적인 스크립트 언어**를 직접 구현하는 방법을 다루는 책  
  - 파싱과 의미론 같은 **고수준 개념**과 바이트코드 표현, 가비지 컬렉션 같은 **저수준 세부 구현**을 모두 포함  
  - 독자가 직접 코드를 작성하며 언어의 구조를 완전히 이해하도록 구성  
- 완성되는 언어는 **풍부한 문법, 동적 타이핑, 가비지 컬렉션, 렉시컬 스코프, 일급 함수, 클로저, 클래스, 상속**을 지원  
  - 수천 줄의 **간결하고 빠른 코드**로 구성되어 있으며, 모든 코드를 독자가 직접 작성  

### 제공 형식
- 책은 **Print, eBook, PDF, Web**의 네 가지 형식으로 제공  
  - **Print**: 640쪽 분량, 고해상도 손그림 삽화와 정교한 타이포그래피 포함  
  - **eBook**: CSS가 기기 화면 크기에 맞게 조정되며, **컬러 구문 강조와 하이퍼링크** 지원  
  - **PDF**: 인쇄본의 조판과 삽화를 그대로 재현하면서 휴대성 강화  
  - **Web**: 반응형 디자인으로 모든 장과 삽화를 포함, **전체 무료 열람 가능**  

### 저자 소개
- 저자 **Robert Nystrom**은 Google에서 **Dart 언어 개발**에 참여 중  
  - 과거 Electronic Arts에서 **8년간 게임 개발**을 담당  
  - 베스트셀러 _Game Programming Patterns_의 저자이며, 해당 책도 무료로 공개  
- 언어 제작에 매료되어 여러 **취미 언어 프로젝트(Wren, Magpie, Finch, Vigil)** 를 개발  
- 개인 블로그와 트위터(`@munificentbob`)를 통해 활동하며, 저서와 관련된 **메일링 리스트** 운영  

### 접근 및 구매 경로
- 인쇄본은 **Amazon, Barnes & Noble, Book Depository** 등 주요 서점에서 구매 가능  
- eBook은 **Kindle, Apple Books, Google Play Books, Smashwords** 등에서 제공  
- PDF 버전은 **Payhip**에서 구매 가능하며, **무료 샘플 PDF** 다운로드 제공  
- 웹 버전은 공식 사이트에서 **무료로 전체 열람 가능**

## Comments



### Comment 49366

- Author: neo
- Created: 2026-01-17T07:32:35+09:00
- Points: 1

###### [Hacker News 의견들](https://news.ycombinator.com/item?id=46624658) 
- 이 책을 읽으며 **expression problem**과 그 해결책으로서의 **visitor 패턴**을 더 잘 이해하게 되었음  
  덕분에 visitor가 필요 없는 **클래스 계층 상속(Class Hierarchy Inheritance)** 개념도 완전히 깨달았음  
  Newspeak 언어에서는 클래스 안에 중첩 클래스를 둘 수 있어서, 상속 시 그 중첩 클래스들도 함께 상속됨  
  이 기능이 **Free Object Algebras**를 가능하게 한다는 점을 [이 블로그 글](https://blog.bracha.org/primordialsoup.html?snapshot=AmpleforthViewer.vfuel&docName=FreeObjectAlgebras)에서 다루고 있음  
  참고: [Expression Problem 글](https://blog.bracha.org/primordialsoup.html?snapshot=AmpleforthViewer.vfuel&docName=ExpressionProblem), [Newspeak 공식 사이트](https://newspeaklanguage.org)
- 이 훌륭한 책에 대한 두 번의 인기 토론이 있었음  
  2020년에는 [777포인트](https://news.ycombinator.com/item?id=22788738), 2024년에는 [607포인트](https://news.ycombinator.com/item?id=40950235)를 기록했음
- 이 책은 새로운 언어를 배울 때 정말 좋은 자료였음  
  다양한 언어 기능과 패턴을 직접 구현해보며 학습하게 되기 때문임  
  Java에 없는 기능이 있는 언어에서는 비슷한 패턴을 적용하기가 어렵지만, 그 **도전 자체가 재미**였음
- 겨울 휴가 동안 이 책을 완독했음  
  작가의 **캐주얼한 문체**와 곳곳의 유머가 정말 마음에 들었음  
  “Lox에 타입 체커 추가하기” 같은 후속편이 나오길 바람
- 정말 좋은 책임  
  처음엔 종이책을 샀는데 너무 크고 무거워서 결국 **전자책**으로 다시 구입했음  
  메모와 검색이 훨씬 편리함  
  그래도 읽다 보면 산속에서 길을 잃은 기분이 들기도 함 :)  
  저자의 또 다른 저서인 *Game Programming Patterns*도 추천함
  - 나는 책의 **제본을 링 바인딩**으로 바꿔서 쓰기도 함  
    인쇄소에서 쉽게 해줄 수 있고, 책상 위에서 다루기 훨씬 편함  
    다만 *Crafting Interpreters*는 절대 버릴 수 없는 책이라 그대로 두고 있음
- 이 책을 세 번이나 **선물용으로 인쇄본**을 구입했음  
  그만큼 훌륭한 책임
  - 복사본을 사줘서 고맙다는 인사 :)
- 컴파일러 설계를 배우기에 최고의 자료 중 하나임  
  게다가 **웹 버전이 무료**라는 점이 정말 관대함
  - 다만 책 제목에는 ‘compiler’라는 단어가 직접적으로 들어가 있지는 않음
- 이 책을 정말 좋아함  
  다만 **Java 버전이 오래된** 점이 아쉬움  
  최근 추가된 **sealed classes**나 **exhaustive switch** 같은 기능을 반영한 개정판이 있었으면 함
  - 최신 Java로 직접 업그레이드해보는 것도 좋은 **연습 과제**임  
    그렇게 하면 저자가 만든 임시 코드 생성 도구가 필요 없어짐
- C++의 typedef처럼 **문맥 의존적 구문**을 파싱하는 방법이 궁금했음  
  PEG 기반 파서에서 context stack을 추가하는 해킹성 접근도 있지만, 구문 전환 문제는 여전히 어려움  
  **persistent data structure**나 **transactional data structure**가 도움이 될 것 같지만, 아직 명확한 형식화를 찾지 못했음
  - [Lexer hack](https://en.wikipedia.org/wiki/Lexer_hack)을 참고하면 됨  
    파서가 lexer에 상태를 전달하도록 만들어, 타입 이름 집합을 lexer가 알 수 있게 하는 방식임
  - 또 다른 방법으로는 **functional parser**를 사용하는 것임  
    예를 들어 [Parsec](https://hackage.haskell.org/package/parsec) 같은 라이브러리에서 ‘do’ 표기법을 활용하면 각 단계의 결과를 다음 파서들이 공유할 수 있음
  - C/C++의 **문법 설계가 최악 수준**이라 이런 문제가 생김  
    다행히 Rust나 Go는 이런 문제를 피했으며, 신중한 설계로 충분히 방지 가능함
- 인터프리터를 시작하려는 사람들을 위해 몇 가지 자료를 공유함  
  [shi 프로젝트](https://github.com/codr7/shi)와, C 언어 쪽에 관심 있다면 [hacktical-c](https://github.com/codr7/hacktical-c)를 참고하면 좋음
