读《编译原理》第八章,代码生成

来源:互联网 发布:散热器转速控制软件 编辑:程序博客网 时间:2024/06/13 19:25
326/631 页

1,代码生成器设计中的问题
     优先考虑正确性;把代码生成器设计得易于实现、测试和维护。
     代码生成器的输入
          由前端生成的源程序的中间表示形式,符号表中的信息。
          受到目标机器的指令集体系结构极大影响。
     目标程序
     指令选择
          IR 的层次
          指令集体系结构本身的特性。
          想要达到的生成代码质量。
     寄存器分配
          寄存器分配
          寄存器指派
     求值顺序
2,目标语言
     一个简单的目标机模型
     程序和指令的代价
          编译及运行一个程序所需的代价。
          编译时间的长短。
          目标程序的大小,运行时间和能耗。
3,目标代码中的地址
     静态分配
     栈分配
     名字的运行时刻地址
4,基本块和流图
     基本块
     后续使用信息
     流图
          将一个中间代码程序划分成为基本块后,用一个流图表示它们之间的控制流。
     流图的表示方式
     循环
5,基本块的优化
     基本块的 DAG 图表示
          DAG (有向无环图)是一个基本块转换的。
     寻找局部公共子表达式
     死代码消除
     代数恒等式的使用
     数组指引的表示
     指针赋值和过程调用
     从 DAG 图到基本块的重组
6,一个简单的代码生成器
     寄存器和地址描述符
     代码生成算法
     函数 getReg 的设计
7,窥孔优化
     消除冗余的加载和保存指令
     消除不可达代码
     控制流优化
     代数简化和强度消减
     使用机器特有的指令
8,寄存器分配和指派
     全局寄存器分配
     使用计数
     外层循环的寄存器指派
     通过图着色方法进行寄存器分配
9,通过树重写进行指令选择
     树翻译方案
     通过覆盖一个输入树来生成代码
     通过扫描进行模式匹配
     用于语义检查的子过程
     通用的树匹配方法
10,表达式的优化代码生成
     Ershov 数
     从带标号的表达式树生成代码
     寄存器数量不足时的表达式
11,使用动态规划的代码生成
     连续求值
     动态规划的算法
12,小结