craftinginterpreters

C/C++ 2025-08-11

这是用于过程中的书“制作口译员”的存储库。它包含本书的降价文本,两个口译员的完整实现,以及将两者共同编织到最终站点的构建系统。

如果您发现错误或有建议,请在此处提出问题。谢谢你!

贡献

在网上写书并将其放在那里之前,绝对最好的事情之一是,像您这样的人非常友善,可以给我反馈,指出错别字,并找到其他错误或不清楚的文字。

如果您想这样做,太好了!您只需在存储库上的文件中提交错误,也可以在您倾向于发送拉动请求。如果您想发送拉动请求,但不想设置构建系统以重新生成HTML,请不要担心。当我将其拉进去时,我会做的。

端口和实现

参与的另一种方法是分享您自己的LOX实施。其他语言的端口特别有用,因为并非每个读者都喜欢Java和C.随时将LOX端口或实现添加到Wiki:

  • LOX实现

建造东西

我是一个非常健忘,容易出错的哺乳动物,所以我尽可能多地自动化。

先决条件

我在OS X机器上开发,但是任何POSIX系统也应该使用。稍作额外的努力,您也应该能够在Windows上使用此功能,尽管我不能为您提供太多帮助。

大部分作品都是由Make精心策划的。构建脚本,测试跑步者和其他实用程序都是用DART编写的。安装飞镖的说明在这里。一旦安装了飞镖并在路径上,请运行:

$ make get

这将下载构建和测试脚本使用的所有软件包。

为了编译两个口译员,您还需要路径和javac上的C编译器。

建筑

设置后,请尝试:

$ make

如果一切正常,那将为书籍生成本网站,并编译两个口译员Clox和Jlox。您可以直接从回购的根部运行任何一个解释器:

$ ./clox
$ ./jlox

黑客入侵

源代码的降价和片段使用手写的静态站点生成器将其编织到最终的HTML中,该静态站点生成器最初是我的第一本书的单个小python脚本,并以某种方式成长为近似真实程序的东西。

生成的HTML在site/下的存储库中进行。它是由散文的Markdown的组合建造的,该散文居住在book/ ,以及由java/ and c/中的Java和C实现编织的代码片段。 (源代码中所有这些有趣的评论都是它如何知道哪个片段去的地方。)

所有魔术的脚本是tool/bin/build.dart 。您可以直接运行或运行:

$ make book

这会在一批中生成整个网站。如果您正在逐步处理它,则需要运行开发服务器:

$ make serve

这将在植根于site/目录的Localhost上运行一些HTTP服务器。每当您请求页面时,它都会重新生成任何已更改源的文件,包括Markdown文件,解释器源文件,模板和资产。只需让它继续运行,本地编辑文件,并刷新您的浏览器以查看更改。

建立口译员

您可以这样构建每个解释器:

$ make clox
$ make jlox

这构建了每个解释器的最终版本,因为它出现在书中的末尾。

您还可以在每章结尾处看到口译员的样子。 (我用它来确保它们甚至在书的中间也可以工作。)这是由脚本, tool/bin/split_chapters.dart驱动的,该脚本使用相同的评论标记来确定代码段来确定每章中存在哪些代码块。它仅需在每章结尾处看到的片段,并在gen/中生成新的源副本,这是每个章节代码的一个目录。 (这些也是查看源代码的一种更简单的方法,因为它们都将所有分散注意力的标记评论都删除了。)

然后,每个都可以单独构建。跑步:

$ make c_chapters

build/目录中,您将获得每章的可执行文件,例如chap14_chunks等。同样:

$ make java_chapters

这将Java代码编译为每章中的子目录中的build/gen/ classfiles。

测试

我有一个完整的LOX测试套件,可以用来确保书中的口译员按照他们应该做的事情。测试用例生活在test/中。 DART程序tool/bin/test.dart是一个测试跑步者,在LOX解释器上运行每个测试文件,解析结果并验证测试是否可以执行预期。

您可以在各种口译员上进行测试:

$ make test       # The final versions of clox and jlox.
$ make test_clox  # The final version of clox.
$ make test_jlox  # The final version of jlox.
$ make test_c     # Every chapter's version of clox.
$ make test_java  # Every chapter's version of jlox.
$ make test_all   # All of the above.

测试您的实现

欢迎您使用测试套件和测试跑步者测试自己的LOX实现。测试跑者在tool/bin/test.dart上,可以给出一个自定义解释器,可执行使用--interpreter 。例如,如果您在my_code/boblox上具有解释器可执行文件,则可以像以下方式测试:

$ dart tool/bin/test.dart clox --interpreter my_code/boblox

您仍然需要告诉它要运行哪种测试套件,因为这决定了测试期望。如果您的口译员应该像Jlox一样行事,请使用“ Jlox”作为套件名称。如果其表现为Clox,请使用“ Clox”。如果您的解释器仅到本书中的一章的结尾完成,则可以将该章节用作套件,例如“ Chap10_functions”。有关所有章节的名称,请参见Makefile。

如果您的解释器需要使用其他命令行参数,请使用--arguments将其传递给测试跑者,并且它将转发给您的解释器。

存储库布局

  • asset/ - 用于生成网站的SASS文件和JINJA2模板。
  • 每章文本的book/降价文件。
  • build/ - 中间文件和其他构建输出(网站本身除外)转到此处。不致力于git。
  • c/ - Clox的源代码,Clox用C中写的解释器也包含一个Xcode项目,如果您是您的事。
  • gen/ - generateast.java生成的Java源文件请转到此处。不承诺。
  • java/ - Jlox的源代码,用Java编写的解释器。
  • note/ - 各种研究,注释,毒品和其他杂项。
  • note/answers - 挑战的示例答案。没有作弊!
  • site/ - 最终生成的网站。该目录的内容直接映射craftinginterpreters .com。这里的大多数内容都是由build.py生成的,但是字体,图像和JS仅在这里生成。一切都是奉献的,甚至是生成的内容。
  • test/ - LOX实现的测试用例。
  • tool/ - 包含构建,测试和其他脚本的DART软件包。
下载源码

通过命令行克隆项目:

git clone https://github.com/munificent/craftinginterpreters.git