第七章 中间代码生成

编译器的前端把源程序翻译成中间表示,后端从中间表示产生目标代码,与目标语言有关的细节尽可能限制在后端。使用独立于机器的中间表示的好处有如下两点。
(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

7.4.1 布尔表达式的翻译

7.4.2 控制流语句的翻译

7.4.3 布尔表达式的控制流翻译

7.4.4 开关语句的翻译

7.4.5 过程调用的翻译