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. Java 框架分阶段指导
  2. PA4:中间代码优化

实验内容

PreviousPA4:中间代码优化Next基本块

Last updated 5 years ago

Was this helpful?

注:目前Java和Scala版并没有自己的PA4的文档,这里是Rust版的文档,且不一定是最新的。因此现在建议直接,等Java和Scala版的文档准备好的时候再阅读它。

pa4中我们将进行一定程度的基于数据流分析的中间代码优化。

框架中已经提供了三种优化的实现,即公共表达式提取,常量传播,复写传播,还有一项死代码消除没有实现,这是大家的实验任务。需要说明的是,目前我们只在很有限的测例上检测了优化的正确性,而且这个框架是第一次使用,所以有可能在已经实现的优化中存在bug,大家如果发现bug希望能及时汇报。接下来的文档中分别描述了这些数据流分析是怎样实现的,但是实际上主要只是起到科普的作用,如果不想看的话理论上可以跳过,认真阅读死代码消除的文档即可。

我们默认的检查答案方式是直接对比tac的输出结果,但是也许输出的tac会因算法的细节不同而略有差异(尽管我个人并不太相信),所以假如测试结果为Fail,仍然可以在pa4/out文件夹下查看与decaf代码同名的.info文件,这里输出了tacvm终止前执行的指令的条数,只要它小于等于ans文件夹中对应的条数,你的实现仍然会被认为是正确的。

值得注意的是,对于tac语句%x = call F,tacvm在运行前会先将它拆分成两条指令;其余语句,包括call F,在tacvm中都对应于一条指令。

这份文档