编译器写作之旅
最近在Github上看到一个十分有趣的项目acwj(A Compiler Writing Journey),一个用C语言编写编译器的项目。身为一个程序员,这在我看来是一件十分酷的事情。于是便跟随着作者的项目学习,在此记录学习过程,并于大家分享。
本系列文章的目标
- 编写一个可以自编译的编译器,也就是说是一个C语言编译器
- 至少针对一个硬件平台。
- 在编译器领域有很多研究。我想在这个旅程中从绝对零开始,所以我倾向于采用实用的方法,而不是重理论的方法。
- 遵循 KISS 原则:保持简单,傻瓜式!我肯定会在这里使用 Ken Thompson 的原则:“如有疑问,请使用蛮力。”
- 我会将旅程分解为许多简单的步骤,而不是进行大的飞跃。这将使编译器的每一个新添加都成为一口大小且易于消化的东西。
编译器的工作基础
编译器的工作是将一种语言(通常是高级语言)的输入翻译成不同的输出语言(通常是比输入低级的语言)。主要步骤是:
让我们来依次介绍:
-
词法分析:识别词法元素。例如标识符、关键字、运算符等等,我们称其为
token
。 - 语法分析:解析输入,即识别输入的语法和结构元素,并确保它们符合语言的语法。
- 语义分析:即理解输入的意思。这实际上与识别语法和结构不同。
- 转义:将输入的含义翻译成不同的语言。在这里,我们一次将输入部分转换为较低级别的语言。
本次编译器开发简述到此为止。下一节我们将开始从scanner开始编写,扫描我们的输入文件并找到作为我们语言词汇元素的token。
本文Github地址:https://github.com/Shaw9379/acwj/tree/master/00_Introduction