跳转至

4 中间代码生成概述

中间代码生成的方法

边解析边生成中间代码

  • 语法制导的翻译方案
  • 理解分析器的运转机制、继承属性的处理

基于树访问的中间代码生成

  • 树结构的实现
  • 访问者模式
  • 节点类的 visit/enter/exit 接口及实现

基本概念

过程/函数

过程(包括函数、方法等)

  • 过程定义、过程调用、形式参数、实在参数
  • 活动(过程的一次调用)、活动的生存期

image-20221127212528256

变量

程序语言中对机器内存单元的抽象

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

image-20221127213924140

  • 通过不同的变量名可以访问同一内存单元,如 union、pointer、过程参数

生存期与作用域

存储绑定与生存期(lifetime)

  • 变量所绑定的内存单元的分配、回收(分配机制:静态、栈、堆)
  • 生存期:变量绑定到某个存储单元的时间区间

控制绑定与作用域(scope)

  • 作用域:一个(变量/过程)声明起作用的程序部分
  • 局部变量、非局部变量

程序块与同名变量的处理

程序块:含有局部变量声明的语句

  • C/C++ 使用最近最小嵌套作用域规则
  • 并列程序块不会同时活跃,不同并列块中的变量可以重叠分配

image-20221127214612499

中间代码生成的关键问题

类型与符号表的变化

  • 类型的多样化(整形、浮点型……)
  • 字宽对齐

语句的翻译

  • 声明语句:不生成指令,但是会更新符号表
  • 赋值语句:引入临时变量,地址计算,类型转换
  • 控制流语句:跳转目标的确定,短路计算

符号表的设计

  • 符号表的条目:(标识符、存储类别、类型信息)
  • 存储类别:extern, static, register ……
  • 类型信息:如 Array (len, type)
  • 作用域:以多个符号表表示
  • 变量:字宽、存储的相对地址(以字节为单位)
  • 记录类型:用符号表管理各个成员的字宽、相对地址
本文阅读量