ARTICLE · INTELLIGENCE

战地情报 · 详情页

来自尧图项目组的一线实战观察与深度解析

Crafting Interpreters 仓库全指南:构建 clox 与 jlox、织入式站点生成与 Lox 测试套件

Crafting Interpreters 仓库全指南:构建 clox 与 jlox、织入式站点生成与 Lox 测试套件 编程语言解释器编译器语言运行时教程【免费下载链接】craftinginterpretersRepository for the book Crafting Interpreters项目地址https://gitcode.com/gh_mirrors/cr/craftinginterpreters点击查看免费下载本文是craftinginterpreters仓库《Crafting Interpreters》一书的配套代码库的完整技术指南覆盖从环境准备、一键构建到按章节编译、测试套件运行与自定义 Lox 实现验证的完整工作流。读者读完将掌握如何构建并运行两套解释器Java 版 jlox 与 C 版 clox、如何理解Markdown 正文 源码片段织入的站点生成机制、以及如何用仓库自带测试运行器tool/bin/test.dart验证任意 Lox 实现。仓库定位一本书、两套解释器、一套构建系统本仓库是还在创作中的书籍《Crafting Interpreters》的配套仓库集中存放三类核心资产全书 Markdown 正文book/、两套解释器的完整实现以及把二者织入成最终网站site/的构建系统。两条技术主线贯穿全书jlox位于 java/com/craftinginterpreters/lox用 Java 编写的树遍历解释器从词法扫描、语法解析一路实现到类与继承读者在书中前半部分Part I–II逐步搭建clox位于 c用 C99 编写的单遍编译 字节码虚拟机覆盖 chunk、扫描器、编译器、哈希表、闭包、垃圾回收、类与超类等完整实现对应书中后半部分Part III。仓库采用 POSIX 环境 make 编排整个工作流绝大多数构建与测试逻辑都由make驱动而构建脚本、测试运行器等工具则统一用 Dart 编写见 tool/bin。环境准备Dart、make、C 编译器与 javacREADME 明确的前提条件是任何 POSIX 系统作者开发环境为 macOS均可工作Windows 需要额外努力。安装好 Dart并在 PATH 中后第一步是拉取工具依赖$ make get该命令等价于在 tool 目录下执行dart pub get见 Makefile用于下载构建脚本与测试脚本依赖的所有 Dart 包。另外要编译两套解释器还需要 PATH 中包含C 编译器编译 clox与javac编译 jlox。从 tool/pubspec.yaml 可以确认工具包依赖的核心库——sass、shelf、glob、args、path 等——这些正是站点构建Sass 编译、开发服务器HTTP 服务与测试参数解析的基础。一键构建make 同时产出站点与两套解释器环境就绪后在仓库根目录运行$ make根据 Makefile 的默认目标default: book clox jlox这一条命令会完成三件事生成整本书的网站book编译 C 版解释器 cloxclox编译 Java 版解释器 jloxjlox。构建完成后可以直接从仓库根目录运行任意一个解释器$ ./clox $ ./jlox值得注意的实现细节jlox目标依赖generate_astMakefile——先用com.craftinginterpreters.tool.GenerateAst生成 AST 节点源码再编译java/com/craftinginterpreters/lox下的.java文件而clox目标则通过 util/c.make 以-stdc99编译并启用-Wall -Wextra -Werrorrelease 模式还追加-O3 -flto编译产物会复制到仓库根目录的clox可执行文件Makefile。站点生成机制Markdown 与源码片段的织入正文与代码如何合二为一仓库的最终 HTML 站点site/已经直接提交在仓库中但它不是手写的而是由一套自写的静态站点生成器构建的。这套生成器起源于作者上一本书《Game Programming Patterns》的一个微型 Python 脚本在本书中演化为一个 Dart 程序。构建输入分两部分正文book/目录下的章节 Markdown如 book/chunks-of-bytecode.md代码从 java 与 c 两套实现中提取的源码片段。二者的粘合剂是源代码里那些看似奇怪的注释标记。以 c/compiler.c 中的// [negative]、c/debug.c 中的// [debug]、java/com/craftinginterpreters/lox/Interpreter.java 中的// [void]为例这些形如// [tag]的标记正是生成器判断哪一段代码插入到书中的哪个位置的依据。生成入口与两种运行方式执行生成的脚本是 tool/bin/build.dart其main()依次调用_buildSass()把 asset 下的 Sass 编译为site/*.css与_buildPages()逐页渲染 Markdown、织入代码片段、套用 asset/mustache 模板并写出 HTML。可以直接运行$ make book这条命令会一次性批量生成整个站点。构建过程还会输出统计信息——每页的散文词数、织入的代码行数与总词数供作者校对书稿长度使用tool/bin/build.dart。增量开发模式make serve如果正在一章一章地推进书稿推荐启动开发服务器$ make serve其背后是dart build.dart.snapshot --serveMakefile。build.dart检测到--serve参数后会在localhost:8000启动一个 HTTP 服务器根目录指向site/tool/bin/build.dart。关键特性是按需增量重建每当浏览器请求一个.html页面服务器会先检查该页的 Markdown、解释器源码、模板与资源文件是否有改动只重新生成源文件发生过变化的页面请求.css时同样只重编对应 Sass。因此可以保持服务常驻、本地编辑文件、刷新浏览器即可看到改动而不必每次全量构建。构建解释器最终版与逐章版最终版本$ make clox $ make jlox分别产出书中对应部分结束时的最终版 clox 与 jlox。jlox 的最终版可通过java -cp build/java com.craftinginterpreters.lox.Lox运行clox 则直接是build/clox可执行文件。逐章版本split_chapters 与 gen/ 目录仓库还支持查看每章结束时解释器长什么样作者用它确认书中途各章代码也能工作。驱动脚本是 tool/bin/split_chapters.dart它复用同一套代码注释标记解析出到某章结束为止已出现的代码片段把源码按章节切分输出到gen/目录——每个章节一个子目录。切分后的源码还顺带剥离了那些干扰视线的标记注释阅读更清爽。然后可以分别编译每个章节的版本$ make c_chapters这会在build/目录下为每个章节生成可执行文件命名形如chap14_chunks、chap15_virtual……直至chap30_optimization完整清单见 Makefile。同样$ make java_chapters会把 Java 代码编译成build/gen/下按章节组织的 class 文件对应章节从chap04_scanning到chap13_inheritance见 Makefile。这一机制也意味着你可以直接阅读gen/chapXX_*下的源码观察某个特性例如第 25 章的闭包、第 26 章的垃圾回收加入前后解释器的完整形态。测试从 make 目标到期望注释协议测试目标族仓库内置一整套 Lox 测试套件测试用例全部位于 test按语言特性组织成子目录如closure/、class/、inheritance/、method/、super/、limit/等。运行测试的入口是 Dart 程序 tool/bin/test.dart它会逐个运行测试文件、解析结果并与期望值比对。Makefile 提供了六个测试目标$ make test # 最终版 clox 与 jlox $ make test_clox # 仅最终版 clox $ make test_jlox # 仅最终版 jlox $ make test_c # clox 每个章节的版本 $ make test_java # jlox 每个章节的版本 $ make test_all # 以上全部测试文件如何表达期望测试用例本身是带注释的 Lox 程序注释承担了断言职责。从 tool/bin/test.dart 可以看到运行器解析的几种标记协议// expect: 输出——期望程序打印到 stdout 的某行输出多行依次匹配// Error ...——期望出现的编译错误对应退出码 65即EX_DATAERR// [line N] Error ...——带行号的编译错误可通过[java ]/[c ]前缀限定仅在某套解释器上生效因为两套解释器的 panic 恢复略有差异级联错误可能不同// expect runtime error: 消息——期望运行时错误及其所在行对应退出码 70即EX_SOFTWARE运行器还会校验堆栈追踪中的行号。Suite套件决定期望边界运行器通过套件名区分测试期望行为与 jlox 一致就用jlox与 clox 一致就用clox如果你的实现只完成到书中某一章也可以直接用该章作为套件名例如chap10_functions。所有套件名定义在 tool/bin/test.dart与 Makefile 的章节命名一一对应。各套件内部用skip映射排除该阶段尚未实现特性的测试例如 jlox 没有硬编码上限就跳过test/limit/下的用例早期章节没有函数/类就跳过对应测试目录这正是同一套测试文件可以验证不同完成度实现的关键设计。用测试套件验证你自己的 Lox 实现仓库欢迎读者把测试套件与运行器用于自己的 Lox 实现。运行器支持--interpreter指定自定义解释器可执行文件例如实现位于my_code/boblox$ dart tool/bin/test.dart clox --interpreter my_code/boblox如果你的解释器需要额外命令行参数用--arguments传入运行器会原样转发$ dart tool/bin/test.dart jlox --interpreter my_code/boblox --arguments --flag1 --flag2注意仍需先指定套件名clox、jlox或某个章节名来确定测试期望若提供自定义参数但未指定解释器运行器会直接报错tool/bin/test.dart。测试执行时test.dart会跳过benchmark目录并识别// nontest标记的非测试文件tool/bin/test.dart。仓库布局速查README 的 Repository Layout 章节给出了顶层目录职责结合源码可进一步细化目录内容与说明assetSass 样式与 Jinja2 模板站点生成的样式与页面骨架来源book每章正文的 Markdown 文本build构建中间产物build/debug、build/release、class 文件、diff 等不提交到 Gitcclox 的 C 源码另含 Xcode 工程gensplit_chapters.dart切分出的逐章 Java 源码目录亦供GenerateAst.java输出不提交javajlox 的 Java 源码note研究笔记、TODO 与杂项note/answers书中各章挑战题的参考答案site最终生成的站点内容与 craftinginterpreters.com 直接对应除由生成器产出的 HTML/CSS 外字体、图片与 JS 也一并提交testLox 实现的全套测试用例tool包含构建、测试等脚本的 Dart 包入口在tool/bin/此外Makefile 还隐藏着一些不常见但实用的目标make cpplox会把 clox 以-stdc11编译成 C 版本利用 GCC/Clang 对指定初始化器的扩展见 util/c.makemake generate_ast单独运行 AST 生成器make diffs生成相邻章节之间的代码 diff如build/diffs/chap25_closures.diff方便对比特性演进make xml则输出用于导入 InDesign 的 XML。make clean可清空build/与gen/中间产物。如何参与仓库以公开接受反馈的方式协作发现错误或有不清晰之处可在仓库提交 issue愿意提交 pull request 的读者无需预先搭建完整构建系统——作者在合入时会自行重新生成 HTML。另一种参与方式是分享自己的 Lox 移植实现README 将各语言的 Lox 移植称为尤其有用的贡献毕竟并非所有读者都喜欢 Java 与 C并邀请作者把移植添加到项目 wiki 的 Lox implementations 列表。对想要深入验证或扩展仓库的读者建议按如下路径实践先make get拉取 Dart 依赖再make完成全量构建接着用make serve体验增量站点生成最后用dart tool/bin/test.dart clox --interpreter 你的解释器把仓库测试套件变成你自己的回归测试。赞分享编程语言解释器编译器语言运行时教程【免费下载链接】craftinginterpretersRepository for the book Crafting Interpreters项目地址https://gitcode.com/gh_mirrors/cr/craftinginterpreters点击查看免费下载相关推荐tchMaterial-parser电子课本下载tchMaterial parser电子课本下载 周三晚上张老师想把周五要用的三本教材提前存到平板里但平台只提供电子课本在线预览没有 PDF 保存入口。编程语言解释器编译器语言运行时教程5分钟跑通 timmPyTorch 预训练视觉模型安装实战5分钟跑通 timmPyTorch 预训练视觉模型安装实战 不想自己训练只想给一张图片打上分类标签最快的路是直接拿一个预训练视觉模型跑一次前向几秒内拿到编程语言解释器编译器语言运行时教程2025最新从零构建解释器Crafting Interpreters中的Lox语言核心设计与实现指南2025最新从零构建解释器Crafting Interpreters中的Lox语言核心设计与实现指南 你还在为理解编程语言底层原理而苦恼本文将带你深入解析编程语言解释器编译器语言运行时教程创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
RELATED READING

延伸阅读

更多一线实战笔记与深度复盘,助您持续精进