C 编译器制作入门

步骤 29 以后:后续路线图

步骤 29 以后:后续路线图

原书这一章仅剩“步骤 29 以后:[待补写]”的标题。中文版不希望读者在这里遇到空白,因此把它改写为承上启下的过渡章节。前 28 步已经让 9cc 从一个只能算表达式的玩具,成长为一个能处理真实 C 子集的小型编译器。后续的工作将围绕更完整的类型系统、运行时链接机制,以及更接近标准 C 的语法特性继续展开。

到这里已经完成了什么

前 28 步已经实现了表达式求值、局部变量、函数定义与调用、控制语句、整数的二进制表示、指针、数组、全局变量、字符类型、字符串字面量,以及全局/局部变量的初始化式。换句话说,9cc 已经从一个只能处理简单算术表达式的“玩具”,成长为一个能编译真实 C 程序片段的小型但可用的编译器。

与此同时,项目结构也从最初的单文件实验程序,演进为多文件工程:词法分析器、语法分析器、代码生成器、头文件、测试脚本和 Makefile 各司其职。这一点非常关键——后续要加入的功能会越来越多,如果没有清晰的工程结构,编译器本身很快就会变得难以维护和扩展。

后续应继续补强的方向

接下来最自然的扩展方向,是补全 C 的类型语法。C 的声明语法以难读著称,尤其是当数组、函数指针、多级指针混在一起时,类型语义并不复杂,但语法形式却非常绕口。因此下一章(第 11 章)会专门用图示和自定义记法,帮助读者建立“从声明反推类型”的直觉。

另一个重要方向是让生成的程序更接近真实操作系统环境:理解静态链接与动态链接的区别、共享库的加载机制,以及为什么现代程序大量依赖动态链接。这些知识能帮助你把“能输出正确汇编”这件事,与“能生成可在 Linux 上正常运行的可执行文件”真正联系起来。

如果继续扩展 9cc,后续还可以逐步加入结构体、枚举、作用域规则、类型检查、C 预处理器、更多标准库函数支持,以及最终实现自举(用自己写的编译器编译自己)。到那个阶段,9cc 就不再只是一个学习项目,而是一个真正可以持续演进的实用软件系统。