第七章 中间代码生成
编译器的前端把源程序翻译成中间表示,后端从中间表示产生目标代码,与目标语言有关的细节尽可能限制在后端。使用独立于机器的中间表示的好处有如下两点。
(1)再目标( retargeting指生成另一 种机器的目标代码)比较容易。把针对新机器的后端与现成的前端组合起来,就可以得到另一种机器的编译器。
(2)独立于机器的代码优化器可以作用于这种中间表示。第9章将介绍这种代码优化、因此,虽然可以把源程序直接翻译并生成目标代码,但编译器一般都采用中间表示形式。
7.1 中间语言
7.1.1 后缀表示
表达式E的后缀表示可以如下归纳定义
- 如果E是变量或常数,那么E的后缀表示就是E本身。
- 如果E是形式为E1 opE2的表达式,那么E的后缀表示是E1 E2 op,其中E1和E2分别是E1和E2的后缀表示。
- 如果E是形式为(E1)的表达式,那么E1的后缀表示也是E的后缀表示。
- 后缀表示不需要括号:(8 - 4) + 2 的后缀表示是8 4 - 2 +
- 后缀表示的最大优点是便于计算机处理表达式
- 后缀表示很容易拓广到含一元算符的表达式
- 后缀表示也可以拓广到表示赋值语句和控制语句,但很难用栈来描述它的计算
7.1.2 图形表示
- 语法树是一种图形化的中间表示
- 有向无环图也是一种中间表示
7.1.3 三地址代码
7.2 声 明 语 句
- 为局部名字建立符号表条目
- 为它分配存储单元
- 符号表中包含名字的类型和分配给它的存储单元的相对地址等信息
7.2.1 过程中的声明
7.2.3 记录的域名
7.3 赋 值 语 句
7.3.1 符号表的中名字
7.3.2 临时名字的重新使用
- 大量临时变量的使用对优化有利
- 大量临时变量会增加符号表管理的负担
- 也会增加运行时临时数据占的空间
7.3.3 数组元素的地址计算
7.3.4 数组元素地址计算的翻译方案
7.3.5 类型转换
7.4 布尔表达式和控制流语句
布尔表达式有两个基本目的- 计算逻辑值
- 在控制流语句中用作条件表达式
布尔表达式的完全计算
- 布尔表达式的“短路”计算
E1 or E2 定义成 if E1 then true else E2
E1 and E2 定义成 if E1 then E2 else false