手把手构建C编译器:从零到实战的编译原理之旅
2025年3月13日
前段时间,我决定为nand2tetris书中的Hack处理器创建一个C编译器。在经历了几次失败的尝试后(后续可能会描述),我发现了这本书:《Writing a C Compiler | No Starch Press》。
我决定从头开始学习它,并计划按章节进度撰写博客文章。我已经通过邮件与作者交流过几次,并得到了及时有用的回复!——非常感谢。
这本书好在哪里?
循序渐进
到第1章结束时,你已经拥有一个可工作的编译器。每个后续章节都会添加更多功能。第1章的编译器只能处理:
|
|
但它能生成完整的可执行文件。
第2章添加了一元运算符,现在我们可以这样写:
|
|
这与大多数其他编译器书籍(如同样优秀的《Crafting Interpreters》和《nand2tetris》)形成鲜明对比。而且,我们构建的是真实语言而非虚构语言,这也很棒。
注:书中未实现某些C特性,但作为“附加题”建议实现。我打算实现所有这些特性。有些特性既未实现也未覆盖,后续再详谈。
测试套件
另一个优点是提供了大型测试套件。每个章节都会添加测试,因此运行第5章测试时也会运行第1、2、3和4章的测试。
你可以选择测试:
- 附加题功能
- 仅词法分析阶段
- 词法和语法分析阶段
- 语义分析
- 全部功能
即使是第1章的简单编译器也有24个测试。这是一个巨大的资源,看到测试套件输出:
|
|
真是令人愉悦。是时候启动gitui(gitui-org/gitui: Blazing 💥 fast terminal-ui for git written in rust 🦀)并提交了。
代码仓库
Nora为这本书维护了两个GitHub仓库:
- nlsandler/writing-a-c-compiler-tests:测试用例
- nlsandler/nqcc2:参考实现(OCaml版本),未实现附加题功能
我也有两个:
- pm100/writing-a-c-compiler-tests:原版的分支,包含一些更改和错误修复,主要涉及Windows支持(详见后续文章)
- pm100/mycc:我的Rust实现。与nqcc2仓库类似,主要按章节提交
博客文章
我可能会每章写一篇博客文章,包括介绍篇。在想到记录这个过程之前,我已经完成了第8章的附加题部分。因此会有一系列文章集中发布,覆盖已完成的工作并使用过去时态。随着进展,文章会更随意,记录我如何决策实现方式,并按我的进度节奏发布。
最后说明
这是一本极好的书。后续章节中我可能提到一些认为缺失、错误或混淆的内容,但这不应掩盖它是一本非常优秀的书的事实。
分享至:
点击分享到X(在新窗口中打开) | 点击分享到Facebook(在新窗口中打开)
更多文章
- 13.05:WACC实践——第15章,数组和指针算术
- 18.04:WACC实践——第14章,指针
- 16.04:WACC实践——第13章,浮点数
- 09.04:WACC实践——第12章,无符号类型
- 06.04:WACC实践——第11章,长整型
- 06.04:WACC实践——第一部分暂停
2条回复至“Working through ‘Writing A C Compiler’”
-
2025.03.14:Working through ‘WACC’ – chapter 5, Local Variables
[…] 这是关于《Writing A C Compiler》一书的系列文章之一。解释项目的第一篇文章在此:Working through ‘Writing A C Compiler’ – Jolly Interesting Stuff […]
👍 喜欢 | 回复 -
2025.03.15:Working Through WACC – Chapter 7, Compound statements
[…] 因为有一段时间没出现了,这是封面。如果不清楚这篇文章在讲什么,请查看第1期:https://jollygoodsw.wordpress.com/2025/03/13/working-through-writing-a-c-compiler/ […]
👍 喜欢 | 回复
发表评论 取消回复
Δ
搜索
使用WordPress设计
加载评论中…
写评论…
邮箱(必填)
姓名(必填)
网站
评论 | 重播 | 订阅
已订阅
Jolly Interesting Stuff
注册 | 登录
复制短链接
举报内容 | 在Reader中查看 | 管理订阅 | 收起此栏
%d