5.1. 基础知识

5.1.1. 编译器

简单来说,编译程序是一种翻译程序,它将高级语言所写的源程序翻译成等价的机器语言或汇编语言的目标程序。

解释程序也是一种翻译程序,它将源程序作为输入并执行之,解释程序与编译程序的主要区别是解释程序的执行过程中不生成目标程序。

编译的过程大致可分为词法分析、语法分析、语义分析、中间代码生成、代码优化、代码生成等几步。

词法分析阶段的任务是对构成源程序的字符串从左到右进行扫描和分解,根据语言的词法规则,识别出一个一个具有独立意义的token。

词法规则是单词符号的形成规则,它规定了哪样的字符串构成一个单词符号。

语法分析的任务是在词法分析的基础上, 根据语言的语法规则从单词符号串中识别出各种语法单位 (如表达式、说明、语句等) ,并进行语法检查,即检查各种语法单位在语法结构上的正确性。

语言的语法规则规定了如何从单词符号形成语法单位,语法规则是语法单位的形成规则。

语义分析的任务是首先对每种语法单位进行静态的语义审查,然后分析其含义,并用另一种语言形式 (比源语言更接近于目标语言的一种中间代码或直接用目标语言 ) 来描述这种语义。

代码优化的任务是对前阶段产生的中间代码进行等价变换或改造,以期获得更为高效,(省时间和空间)的目标代码。优化主要包括局部优化和循环优化等。

5.1.2. 相关书籍

编译原理领域最有名的三本书昵称为龙、虎、鲸。

龙书原名 Compilers: Principles, Techniques, and Tools ,由Alfred V.Aho等人编写。主要讨论了编译器设计的主题,包括词法分析、语法分析、语法制导分析、类型检查、运行环境、中间代码生成、代码生成、代码优化等问题。

虎书原名 Modern Compiler Implenentation in C 由Andrew W.Apple等人编写。虎书与龙书内容相似,但是增加了数据流分析、循环优化、内存管理等内容。

鲸书原名 Advanced Compiler Design and Implementation 由Steven S.Muchnick编写,和前两本书相比,鲸书涉及到了更多的比较高级的编译器实现。

5.1.3. 编译阶段

编译第一阶段为预处理阶段,涉及以下操作

  • 执行预编译指令 #define 等

  • 处理条件预编译指令 #ifdef 等

  • 删除注释

  • 添加行号和文件名标识

  • 保留 #pragma 预编译指令

  • gcc -E hello.c -o hello.i

编译阶段,对预处理完的文件进行词法分析、语法分析、语义分析以及优化后生成相应的汇编代码。将文本文件hello.i翻译成文本文件.s,包含一个汇编语言程序。可使用gcc的 -S 参数, 例如 gcc -S hello.i -o hello.s

汇编阶段,汇编器将.s文件翻译成机器语言指令,使用 gcc 的 -c 参数,例如 gcc -c hello.s -o hello.o

链接阶段,编译器以动态链接或静态链接的方式生成二进制文件。