手把手构建C编译器:从零到实战的编译原理之旅

本文记录了作者基于《Writing a C Compiler》一书实践构建C编译器的过程,涵盖章节式功能迭代、测试套件验证、Rust实现细节及与原著作者的交流,深入探讨编译器开发的技术实践与挑战。

手把手构建C编译器:从零到实战的编译原理之旅

2025年3月13日

前段时间,我决定为nand2tetris书中的Hack处理器创建一个C编译器。在经历了几次失败的尝试后(后续可能会描述),我发现了这本书:《Writing a C Compiler | No Starch Press》。

我决定从头开始学习它,并计划按章节进度撰写博客文章。我已经通过邮件与作者交流过几次,并得到了及时有用的回复!——非常感谢。

这本书好在哪里?

循序渐进

到第1章结束时,你已经拥有一个可工作的编译器。每个后续章节都会添加更多功能。第1章的编译器只能处理:

1
2
3
int main(void){
    return <constant>;
}

但它能生成完整的可执行文件。

第2章添加了一元运算符,现在我们可以这样写:

1
2
3
int main(void){
    return ~3;
}

这与大多数其他编译器书籍(如同样优秀的《Crafting Interpreters》和《nand2tetris》)形成鲜明对比。而且,我们构建的是真实语言而非虚构语言,这也很棒。

:书中未实现某些C特性,但作为“附加题”建议实现。我打算实现所有这些特性。有些特性既未实现也未覆盖,后续再详谈。

测试套件

另一个优点是提供了大型测试套件。每个章节都会添加测试,因此运行第5章测试时也会运行第1、2、3和4章的测试。

你可以选择测试:

  • 附加题功能
  • 仅词法分析阶段
  • 词法和语法分析阶段
  • 语义分析
  • 全部功能

即使是第1章的简单编译器也有24个测试。这是一个巨大的资源,看到测试套件输出:

1
2
3
4
5
PS C:\work\forks\writing-a-c-compiler-tests> python .\test_compiler C:\work\mycc\target\debug\mycc.exe --chapter 1 --extra-credit
----------------------------------------------------------------------
Ran 24 tests in 2.843s

OK

真是令人愉悦。是时候启动gitui(gitui-org/gitui: Blazing 💥 fast terminal-ui for git written in rust 🦀)并提交了。

代码仓库

Nora为这本书维护了两个GitHub仓库:

我也有两个:

  • 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’”

  1. 2025.03.14:Working through ‘WACC’ – chapter 5, Local Variables
    […] 这是关于《Writing A C Compiler》一书的系列文章之一。解释项目的第一篇文章在此:Working through ‘Writing A C Compiler’ – Jolly Interesting Stuff […]
    👍 喜欢 | 回复

  2. 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

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计