从零开始编写 C 编译器 Chapter 3.2 | IR Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler 2026-01-26 compiler #compiler
从零开始编写 C 编译器 Chapter 3.1 | Frontend Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler 添加对二元运算符 +、-、*、/、% 的支持。 Lexer 新增 4 种 token,Plus、Star、Slash、Percent。- 在 Unary 中已经作为 Hyphen 添加了,在 Lexer 阶段不会区分 token 在语义上的区别。 Parser 新增 二元表达式 2026-01-25 compiler #compiler
从零开始编写 C 编译器 Chapter 2.3 | Backend Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler TACKY 是一种接近汇编语言的 IR,但仍不直接对应具体的 x86 指令。为生成可执行的汇编代码,还需要将 TACKY 程序转换为 Assembly AST,再进一步修复不合法的 x86 指令。 Assembly AST 在这节中,我们需要新维护一些东西:function pr 2026-01-23 compiler #compiler
从零开始编写 C 编译器 Chapter 2.2 | Intermediate Representation Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler 我们成功生成了一元运算符的 AST,但将 AST 转换成 Assembly AST 却明显不如上一章简单。AST 中的 exp 结点拥有递归结构,而 Assembly AST 中的 operand 和 instruction 结点无法直接表达这种结构。我们需要将嵌套的表达式,通过 2026-01-22 compiler #compiler
从零开始编写 C 编译器 Chapter 2.1 | Front End Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler Lexer 这部分没新增什么东西,只需要 \(3\) 个 token 类型即可。 字符序列 运算符名称 语义说明 ~ Bitwise complement 按位取反 - Negation 算数负号 -- Decrement 自减运算符 注意到我们新增了 2026-01-22 compiler #compiler
从零开始编写 C 编译器 Chapter 2.0 | Runtime Stack Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler 在 Chapter 1 中我们实现了对 return 语句和 constant 的支持。这章将会实现对一元运算符(unary operator)的支持。具体的说,是 算数负号运算符 - 和 按位取反运算符 ~ 的支持。同时还引入 IR 来化简生成汇编的难度。 Introduce 2026-01-22 compiler #compiler
从零开始编写 C 编译器 Chapter 1.3 | Codegen Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler Assembly Generation Assembly Generate 阶段需要将 AST 转换为 x64 汇编代码。转换过程会按照程序执行顺序遍历 AST,并为每个结点生成对应的汇编指令。由于为了兼容后续生成IR, 我们不会直接将汇编指令输出到文件,而是先构建一个中间数据结 2026-01-17 compiler #compiler
从零开始编写 C 编译器 Chapter 1.2 | Parser Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler Parser 源代码在经过 Lexer 之后,剔除了无用的部分(如换行、空格等),形成了一个 token.t 列表。Parser 遍历 token 流,判断某一部分 token 是否能组成正确的语言结构,并把他们抽象为一个结点。将不同的结点分层,最终组成一棵抽象语法树(Abstr 2026-01-16 compiler #compiler
从零开始编写 C 编译器 Chapter 1.1 | Lexer Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler Lexer Lexer 读取源代码文件,将其转换为 有序的 token 列表。由于 C 语言语义不依赖缩进,所以我们不用将 空白字符(whitespace) 视为 token,但在 python 中需要维护。 对于上篇中提到的最简 C 程序,它的 token 列表应该长这样: 2026-01-16 compiler #compiler
从零开始编写 C 编译器 Chapter 1.0 | Introduction Note: 所有代码、定义、术语命名都参考 Nora Sandler 的书籍 Write a C Compiler 老生常谈,CPU 只能识别 ISA 规定的机器码,不能识别高级语言。所以有了编译器:将高级语言翻译为机器码(特定的二进制序列)。然而,这套工作是通过一系列编译套件(或语言工具链, Language Toolchins)来实现的。 一般来说,将高级语言翻译为机器码需要经过这几个步骤 2026-01-15 compiler #compiler