卷 VI · 回流CH 20深度 20/20

接下来:去读 Crafting Interpreters

从第一页起,这本书就没打算成为终点。它的目的,是把你送到《Crafting Interpreters》的门口 —— 而且替你热好了身。你手里已经有一台能跑、有闭包的解释器,脑子里已经有了整条流水线的地图。现在,那本你一直想读却总没开始的厚书,该由你去翻开了。这最后一章,我诚实交代我们跳过了什么,给你一张 CI 的阅读地图,然后送你上路。

Crafting Interpreters阅读地图更远的路上路

先诚实交代:我们跳过了什么

这本书为了让你尽快尝到「造一门语言」的完整魅力,做了很多刻意的取舍。把它们摊开,正好就是你去 CI 该补的清单:

我们跳过的为什么跳CI 在哪补
变量解析(resolver)我们的闭包对正常程序都对,只差一个学术边角(第 15 章提过)jlox 后期,专门一章
类与继承有了函数和闭包,核心魅力已经齐了;类是往上加jlox 最后几章
垃圾回收(GC)我们借了 JS 的 GC;真造一个是另一门大功课clox,从零手写一个标记-清扫 GC
字节码上的控制流 / 函数 / 闭包我们的 VM 只尝了表达式(第 18 章说明过)clox 主线,最硬核也最漂亮的部分
各种优化玩具阶段不谈性能工程clox 后期(如哈希表、内联缓存)

看这张表,你不该有「学漏了」的焦虑,而该有「我知道接下来该学什么」的踏实。你不是从一片空白去啃 CI —— 你是带着一台造好的解释器、揣着一张明确的补课清单去的。这是天壤之别。

一张 CI 阅读地图

《Crafting Interpreters》分两半。有了这本书的底子,你读它的姿势会很不一样:

上半本 · jlox(Java 写的树遍历解释器)

这一半,你基本已经造过了。它的扫描器、递归下降解析器、树遍历求值器、环境、函数、闭包 —— 和你在卷 II 到卷 IV 造的东西一一对应,连用的都是同一门 Lox。

所以别把上半本当新知识从头学,把它当「同一件事,更严谨的做法」来对照读:看 Bob 怎么把你略过的 resolver 补上、怎么把错误处理做得更周全、怎么用访问者模式把代码组织得更干净、怎么加上类。你会读得很快,而且不断有「哦,原来那个边角是这么堵的」的会心一刻。这种「我造过一版、现在看更好的一版」的阅读,吸收率远高于从零学。

下半本 · clox(C 写的字节码虚拟机)

这一半,才是 CI 真正的深水区,也是这本书只让你尝了一口的地方。你在卷 V 已经理解了内核(压平成字节码、栈机器执行、编译就是不算只吐指令),clox 会把它做到完整、做到极致:

  • 用 C 手写,你会真正碰到内存管理 —— 然后亲手造一个垃圾回收器。
  • 控制流、函数调用、闭包全在字节码和栈上实现(而不是像我们借宿主语言)—— 这是最能长功力的部分。
  • Pratt 解析重写表达式解析 —— 你在第 9 章埋下的伏笔,在这里开花。
  • 各种让它真的快的工程手艺。

读到这里,你就从「造过一个玩具」迈向了「理解一个能打的实现」。而这一步,因为你有卷 V 的内核垫底,不会再有「完全看不懂在干嘛」的劝退感。

▶ 现在就上路:去写一门你自己的

不过,读 CI 之前(或者同时),最有效的一件事是:拿这本书的引擎,去写你自己的 Lox 程序,把它玩坏。下面这个 REPL 又给你了 —— 别看例子了,清空它,写点你自己的:一个你好奇的递归、一个嵌套闭包、一段会报错的代码看它怎么报。亲手把玩你造过的东西,是通往下一本书最好的热身。

再往远看:几条岔路

造语言这件事,是很多深水区的入口。读完 CI 之后,如果你还想往下走,这里有几个方向,每一个都能钻很深:

  • 类型系统:给你的语言加一个「不真运行、但假装运行一遍来挑错」的工位。从类型检查,到类型推断(Hindley–Milner),到依赖类型 —— 这是「把运行时错误提前到编译时」这条线的尽头。(如果你读过《上游》那本 Haskell 小书,这是它的实现侧。)
  • 真正的后端:把字节码换成机器码。学 LLVM(给它喂 IR,它替你生成各平台的高效机器码),或者研究 JIT(运行时把热点字节码即时编译成机器码 —— JVM、V8 都这么干)。
  • 更强的解析:Pratt 解析、解析器组合子(parser combinators)、PEG、以及自动生成解析器的工具(ANTLR)。
  • 语言设计本身:现在你会实现了,可以开始琢磨设计 —— 什么样的语法好用、什么样的语义少坑。造一门解决你身边某个真问题的小 DSL,是最好的练手。

最后的话

你翻开这本书,是因为一直想读《Crafting Interpreters》,却总没能开始 —— 想找个引子,先领略一下这件事的魅力,好有动力真正上路。

现在,引子读完了。你不只是「领略」了 —— 你亲手造了一门会跑的语言:从一个个孤零零的字符,到切好的记号,到搭起来的语法树,到会算数、会记事、会递归、会闭包的解释器,再到一台压压弹弹的虚拟机。你在浏览器里让它跑出了 1 2 3,那一刻它是活的。

那个「编程语言是魔法」的滤镜,现在应该碎了。取而代之的,是一种造过它的人才有的笃定:盖子底下没有魔法,只有一条你已经走通了一遍的流水线。

带着这份笃定,去翻开那本厚书吧。它等你很久了,而你,已经准备好了。

◆ 这本书的最后一句话

你写下的代码不再是黑箱 —— 因为让文本活起来的那台机器,你亲手造过一台。


—— 全书完 ——

《解释》 INTERPRET · 源 → 词 → 树 → 义 → 令
回到目录 · 返回全站