yfaming on Nostr: 终于看完了 Crafting ...
终于看完了 Crafting Interpreters,它是近几年让我收获最大的一本书。
从 2026-07-19 开始阅读,到 2026-09-14 读完,用时近两个月。一边读一边跟着敲代码,除掉注释和空行,得到 2467 行 Java,2736 C。除了敲代码,我还一边阅读,一边做笔记。每读完一章,再将笔记整理为一个帖子,发到 Nostr 和微博。
Compiler / Interpreter 领域是比较庞杂的,光 parsing 算法就有十来种,更不用说各种 IR、优化、代码生成、VM 等等。经典著作龙书,上千页的篇幅,足以吓退大部分感兴趣的新手。
而这本书独辟蹊径,不借助任何第三方库,硬是从 0 一步步实现了完整的编程语言 Lox。作者循循善诱,特意选择了对读者而言阻力最小的路径。每章实现一个功能,每章产出一个可以运行的程序。几章下来,支持的功能越来越多,直到完全成形。
作者是实现编程语言的专家,却能保持初学者之心,克制炫技的冲动,尤其难能可贵。龙书对于初学者的不友好,就在于学究气,恨不能将出现过的所有理论都穷尽描述一番。而读者在学完 parsing 技术之前,就已经耗尽了所有的耐心和勇气。Crafting Interpreters 却精心选择简单容易理解的技术,比如 recursive descent parsing,environment chain,stack-based virtual machine,mark-sweep garbage collection 等等。更好玩的是,本书先后用 Java 和 C 两次实现了 Lox interpreter,但技术上略有不同。我们往往在第二次的时候,才意识到哪些东西是重要的,哪些却没那么重要。用软件工程的话来说,就是识别 essential complexity 和 accidental complexity。
本书的行文方式也独具匠心,一边讲解,一边给出代码。读者一边阅读,一边敲下代码,更能加深理解。Interpreter 各部分往往相互关联,作者也尽量拆解,使得适合用文字线性讲解,甚至为此将 print 从函数改为语句。我在敲代码时就发现,大部分时候,我们只需要新增代码,只有少数时候才需要修改已经写成的代码,可见其用心。作者还为本书代码库实现了一个构建系统,可以确保在任意章节,当前章节的代码都可以编译并运行。
为了更好地帮助理解,作者手工画了 181 幅插图,每一幅都是先在格子纸上画并修改,然后蒙上白纸描下来,最后扫描成电子版,并用 PS 修改。仅仅插图的工作量就很惊人了。
Amazon 上有条书评,标题是「An instant classic」,Crafting Interpreters 绝对担得起这个评价。
接下来,开始 Crafting Interpreters 第二部分,用 C 实现的 Lox 字节码解释器 clox。
在第一部分,用 Java 实现的 tree-walk interpreter jlox 中,我们完整实现了 Lox 解释器,包括 scanner、parser、resolver、interpreter 等等。
但是,第一部分的解释器利用了 Java 语言的许多特性。
比如,Lox 的值,全部用 Java 的 Object 类型表示。
Lox 里的 return,用 Java 的异常来实现。
而 Java 自带 GC,所以 Lox 中对象的生命周期,我们也完全没考虑过。
在第二部分,我们将使用 C 语言实现解释器。C 比 Java 更加 low-level,它不支持 OOP,不支持异常和 GC。
因此,这几个问题,我们就需要在 C 里面手动处理了。
而且,第二部分我们实现的是字节码解释器。我们需要定义字节码,并在 parsing 将 ast 编译为字节码。
用不同语言实现同一门语言,但采用略有不同的技术,可以加深我们的理解,并学习 compiler/interpreter 领域的不同主题。
Published at
2026-09-14 10:35:33 UTCEvent JSON
{
"id": "d74071a2835fdd62353377eb6206f89e9f1866e3919265b4829bea05954b3c13",
"pubkey": "908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4",
"created_at": 1789382133,
"kind": 1,
"tags": [
[
"q",
"1aea59b1f714db6bebf6019f30c55e36795d9bbba666682c752163c90db1acff",
"wss://lang.relays.land/zh",
"908fbc3babc322eea473a0ab1e6bf6b3adcf899288ac97b2fa79f34ad408d4e4"
]
],
"content": "终于看完了 Crafting Interpreters,它是近几年让我收获最大的一本书。\n\n从 2026-07-19 开始阅读,到 2026-09-14 读完,用时近两个月。一边读一边跟着敲代码,除掉注释和空行,得到 2467 行 Java,2736 C。除了敲代码,我还一边阅读,一边做笔记。每读完一章,再将笔记整理为一个帖子,发到 Nostr 和微博。\n\nCompiler / Interpreter 领域是比较庞杂的,光 parsing 算法就有十来种,更不用说各种 IR、优化、代码生成、VM 等等。经典著作龙书,上千页的篇幅,足以吓退大部分感兴趣的新手。\n\n而这本书独辟蹊径,不借助任何第三方库,硬是从 0 一步步实现了完整的编程语言 Lox。作者循循善诱,特意选择了对读者而言阻力最小的路径。每章实现一个功能,每章产出一个可以运行的程序。几章下来,支持的功能越来越多,直到完全成形。\n\n作者是实现编程语言的专家,却能保持初学者之心,克制炫技的冲动,尤其难能可贵。龙书对于初学者的不友好,就在于学究气,恨不能将出现过的所有理论都穷尽描述一番。而读者在学完 parsing 技术之前,就已经耗尽了所有的耐心和勇气。Crafting Interpreters 却精心选择简单容易理解的技术,比如 recursive descent parsing,environment chain,stack-based virtual machine,mark-sweep garbage collection 等等。更好玩的是,本书先后用 Java 和 C 两次实现了 Lox interpreter,但技术上略有不同。我们往往在第二次的时候,才意识到哪些东西是重要的,哪些却没那么重要。用软件工程的话来说,就是识别 essential complexity 和 accidental complexity。\n\n本书的行文方式也独具匠心,一边讲解,一边给出代码。读者一边阅读,一边敲下代码,更能加深理解。Interpreter 各部分往往相互关联,作者也尽量拆解,使得适合用文字线性讲解,甚至为此将 print 从函数改为语句。我在敲代码时就发现,大部分时候,我们只需要新增代码,只有少数时候才需要修改已经写成的代码,可见其用心。作者还为本书代码库实现了一个构建系统,可以确保在任意章节,当前章节的代码都可以编译并运行。\n\n为了更好地帮助理解,作者手工画了 181 幅插图,每一幅都是先在格子纸上画并修改,然后蒙上白纸描下来,最后扫描成电子版,并用 PS 修改。仅仅插图的工作量就很惊人了。\n\nAmazon 上有条书评,标题是「An instant classic」,Crafting Interpreters 绝对担得起这个评价。\n\nnostr:nevent1qvzqqqqqqypzpyy0hsa6hseza6j88g9tre4ldvade7ye9z9vj7e0570nft2q348yqyvhwumn8ghj7mrpdenjuun9d3shjuewd3skuep00f5qqgq6afvmrac5md47haspnucv2h3k09wehwaxve5zcafpv0ysmvdvlue2w2a0",
"sig": "787f4dd1ac233447bd41290af082b7a50dc0b2e920aa1f2ec22ee5a1f2f4d009abfbe614b4147284169cfa5113e3a6bfb44242d0a5d31967fcd84d7b2452c946"
}