下载
第8章 代 码 生 成
本章要点
• 中间代码和用于代码生成的数据结构 • 商用编译器中的代码生成:两个案例研究
• 基本的代码生成技术 • TM:简单的目标机器
• 数据结构引用的代码生成 • TINY语言的代码生成器
• 控制语句和逻辑表达式的代码生成 • 代码优化技术考察
• 过程和函数调用的代码生成 • TINY代码生成器的简单优化
在这一章中,我们着手编译器的最后工作——用来生成目标机器的可执行代码,这个可执
行代码是源代码语义的忠实体现。代码生成是编译器最复杂的阶段,因为它不仅依赖于源语言
的特征,而且还依赖于目标结构、运行时环境的结构和运行在目标机器的操作系统的细节信息。
通过收集源程序进一步的信息,并通过定制生成代码以便利用目标机器,如寄存器、寻址模式、
管道和高速缓存的特殊性质,代码生成通常也涉及到了一些优化或改善的尝试。
由于代码生成较复杂,所以编译器一般将这一阶段分成几个涉及不同中间数据结构的步骤,
其中包括了某种称做中间代码 (itermediate code)的抽象代码。编译器也可能没有生成真正的可
执行代码,而是生成了某种形式的汇编代码,这必须由汇编器、链接器和装入器进行进一步处
理。汇编器、链接器和装入器可由操作系统提供或由编译器自带。在这一章中,我们仅仅集中
关注于中间代码和汇编代码的生成,这两者之间有很多共同特性。我们不考虑汇编代码到可执
行代码的更进一步的处理,汇编语言或系统的编程文本可以更充分地处理它。
本章的第1节考虑中间代码的两种普遍形式,三地址码和 P - 代码,并且讨论它们的一些属
性。第2节描述生成中间代码或汇编代码的基本算法。接下来的章节讨论针对不同语言特性的
代码生成技术,这包括了表达式、赋值语句、控制语句 (如i f 语句,w h i l e 语句)以及过程和函
数调用。
之后的一节将应用在前面章节中学到的技术开发 T I N Y语言的一个汇编代码生成器。由于
在这种细节水平上的代码生成需要实际的目标机器,因此首先讨论一个目标结构和机器模拟器
T M。附录C提供了源代码清单。然后,我们再描述完整的 T I N Y 语言的代码生成器。最后给出
一个关于标准代码的改善、优化技术的简介,同时描述了怎样将一些简单的技术融入到 T I N Y
代码生成器之中。
8.1 中间代码和用于代码生成的数据结构
在翻译期间,中间表示(intermediate representation)或I R 代表了源程序的数据结构。迄今为
止,本文使用了抽象语法树作为主要的I R 。除I R外,翻译期间的主要数据结构是符号表,这在
第6章中已学过了。
虽然抽象语法树是源代码完美充分的表述,即使对于代码生成也不过这样 (这一点我们将
在后面的章节中看到 ),但是它与目标代码极不相像,在控制流构造的描述上尤为如此。在控
制流构造上,目标代码 (如机器代码或汇编代码 )使用转移语句而不是 i f和w h i l e语句。因此,