4 中间代码生成概述
中间代码生成的方法
边解析边生成中间代码
- 语法制导的翻译方案
- 理解分析器的运转机制、继承属性的处理
基于树访问的中间代码生成
- 树结构的实现
- 访问者模式
- 节点类的 visit/enter/exit 接口及实现
基本概念
过程/函数
过程(包括函数、方法等)
- 过程定义、过程调用、形式参数、实在参数
- 活动(过程的一次调用)、活动的生存期

变量
程序语言中对机器内存单元的抽象
- 名字、类型、字宽、地址(
int a;名字为 a,类型为 int,字宽为 4 字节) - 绝大多数的变量都有名字
- 没有名字的变量:① 临时变量,② 存储在堆中的变量(堆:存放动态分配的对象)
- 变量的地址就是左值,变量关联的内存单元地址;变量的值是右值
- 程序中相同的变量在不同时间关联到不同的地址(如同名的不同过程的形参、局部变量)
- 环境把名字映射到左值,状态把左值映射到右值
- 赋值改变状态,但不改变环境
- 过程调用改变环境,不同的活动有不同的活动记录
- 如果环境将名字 x 映射到存储单元 s,则说 x 被绑定到 s

- 通过不同的变量名可以访问同一内存单元,如 union、pointer、过程参数
生存期与作用域
存储绑定与生存期(lifetime)
- 变量所绑定的内存单元的分配、回收(分配机制:静态、栈、堆)
- 生存期:变量绑定到某个存储单元的时间区间
控制绑定与作用域(scope)
- 作用域:一个(变量/过程)声明起作用的程序部分
- 局部变量、非局部变量
程序块与同名变量的处理
程序块:含有局部变量声明的语句
- C/C++ 使用最近最小嵌套作用域规则
- 并列程序块不会同时活跃,不同并列块中的变量可以重叠分配

中间代码生成的关键问题
类型与符号表的变化
- 类型的多样化(整形、浮点型……)
- 字宽对齐
语句的翻译
- 声明语句:不生成指令,但是会更新符号表
- 赋值语句:引入临时变量,地址计算,类型转换
- 控制流语句:跳转目标的确定,短路计算
符号表的设计
- 符号表的条目:(标识符、存储类别、类型信息)
- 存储类别:extern, static, register ……
- 类型信息:如 Array (len, type)
- 作用域:以多个符号表表示
- 变量:字宽、存储的相对地址(以字节为单位)
- 记录类型:用符号表管理各个成员的字宽、相对地址