The Decaf Book
  • Introduction
  • 语言规范
  • Java 框架分阶段指导
    • 本章导引
    • PA1-A:语法分析器的自动构造
      • 阶段任务
      • 词法分析
      • 抽象语法树
      • 文法分析
    • PA1-B:基于 LL(1) 的语法分析器半自动构造
      • 阶段任务
      • LL(1) 文法分析
      • 错误恢复
    • PA2:语义分析
      • 阶段任务
      • 类型、符号和作用域
      • 访问者模式
      • 符号表构建
      • 类型检查
    • PA3:中间代码生成
      • 阶段任务
      • TAC 程序
      • 面向对象机制
      • 控制流的翻译
    • PA4:中间代码优化
      • 实验内容
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
  • Scala 框架分阶段指导
    • 本章导引
    • PA1:语法分析器的自动构造
      • 阶段任务
      • 词法分析
      • 抽象语法树
      • 文法分析
      • 访问者模式
    • PA2:语义分析
      • 阶段任务
      • 类型、符号和作用域
      • 符号表构建
      • 类型检查
    • PA3:中间代码生成
      • 阶段任务
      • TAC 程序
      • 面向对象机制
      • 控制流的翻译
    • PA3-JVM:JVM 字节码生成
      • 阶段任务
      • JVM 字节码简介
      • 翻译过程
    • PA4:中间代码优化
      • 实验内容
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
  • Rust 框架分阶段指导
    • 本章导引
    • PA1-A:语法分析器的自动构造
      • 实验内容
      • lalr1使用指导
        • 编写lexer
        • impl块的可选属性
        • 产生式和语法动作
        • 解决冲突
        • 一个完整的例子
      • 抽象语法树
      • 框架中部分实现的解释
      • 文件结构
    • PA1-B:基于 LL(1) 的语法分析器半自动构造
      • 实验内容
      • lalr1使用指导
      • 错误恢复
      • 文件结构
    • PA2:语义分析
      • 实验内容
      • 语义分析
      • 符号表
      • visitor模式
    • PA3:中间代码生成
      • 实验内容
      • 中间代码
      • 中间代码中的类型信息
      • 运行时存储布局
      • 面向对象机制
      • tacvm简述
    • PA4:中间代码优化
      • 基本块
      • 数据流分析概述
      • 数据流优化概述
      • 公共表达式提取
      • 复写传播
      • 常量传播
      • 死代码消除
    • PA5:寄存器分配
      • 实验内容
      • 图着色基本原理
      • 着色算法
      • 预着色节点
      • 干涉图节点合并
      • 调用约定
Powered by GitBook
On this page

Was this helpful?

  1. Rust 框架分阶段指导
  2. PA3:中间代码生成

实验内容

在pa2中,我们已经完成了对输入程序的语义分析工作,此时的输入程序必定是有明确的语义而且不具有不符合语言规范的语义错误的,在接下来的pa3中,我们将对该输入程序进行翻译,把使用带属性修饰的ast来表示的输入程序翻译成适合后期处理的另一种中间表示方式。

一般来说,把程序翻译为ast以外的中间表示方式是各种编译器前端的最后一步工作,这步工作以后编译过程便进入了中端处理或者直接进入后端处理部分。为了便于翻译工作的进行,在实际的编译过程中往往需要反复地从一种中间表示变为另一种中间表示,直到变换成最终的汇编代码或者二进制目标代码为止,其中后一种中间表示总是更加适合后面所需要进行的分析和处理。有的时候为了更好地分析程序的需要中间表示之间的变换次数是非常多的,例如gcc的编译过程除ast以外还有GENERIC,GIMPLE,RTL几种中间表示;而ORC/Open64的编译过程除ast以外还有多达九种的中间表示。

在decaf编译器中,为简单起见,我们在ast以外只涉及一种中间表示:三地址码(tac, Three Address Code),它是一种比较接近mips汇编的中间表示。pa3中我们需要把ast表示的程序翻译为跟它在语义上等价的tac中间表示,并在合适的地方加入诸如检查数组访问越界、数组大小非法等运行时错误的内容。得到的tac可以通过模拟器来运行,这样我们的decaf程序就第一次跑起来了。

在tac表示的基础上,在下一阶段(pa4)构造控制流图,进行数据流分析,进行中间代码优化,最后(pa5)生成汇编代码以后,整个编译过程便告完成。

通过这个阶段,希望大家能在语法制导处理的基础上进一步掌握语法制导的中间代码翻译方法,并且对过程调用约定、面向对象机制的实现方法、存储布局等内容有所了解。

实验框架中已经实现了decaf语言的基本语法的中间代码生成,大家的任务是实现新语法的ast到tac的翻译。通过新语法的语义其实不难推测出翻译的方式,如果有什么特别需要注意的地方,之后会在这里补充。

PreviousPA3:中间代码生成Next中间代码

Last updated 5 years ago

Was this helpful?