编译原理学习笔记(十二)代码优化

代码优化

以老师PPT为标准,借鉴部分教材内容,AlvinZH学习笔记。

概述

.1. 目的:提高目标代码运行效率。时间效率(减少运行时间);空间效率(减少内存容量)。

原则:进行优化必须严格遵循“不能改变原有程序语义”原则。

2. 优化的分类

从优化的层次,与机器是否有关,分为:独立于机器的优化、与机器有关的优化。

从优化涉及的范围,又分为:局部优化、循环优化、全局优化。

3. 满足以下三个条件的程序段,称为基本块:

  • 只有一个入口和一个出口,且语句为顺序执行的程序段。
  • 它使得所有转向该基本块的入口都是该基本块的第一条语句。
  • 如果块中任一语句被执行,则该块内的所有语句也将被执行(无分支),且执行次数一样(无循环)。

基本块划分问题

(1)确定入口语句

  • 语句序列第一句为入口语句;
  • 任何可以由条件/无条件跳转而转移到的第一条语句为入口语句;
  • 紧跟在跳转语句之后的第一条语句为入口语句;

(2)每个入口语句直到下一个入口语句或程序结束,之间的语句属于同一个基本快。

优化基本方法

1. 利用代数性质(代数变换)

  • 编译时完成常数表达式的计算,如a:=5+6+x变成a:=11+x。
  • 数组下标引用时,下标偏移可在编译时预先做好。
  • 运算强度减弱,如x*8变成x<<3。

2. 复写(copy)传播:如 x:=y 这样的赋值语句,二者值相同,有些情况可以用y代替x编译。其实就是将多语句简化,减少值的传播过程。

3. 删除公共达式:具有相同值的子表达式在两个以上地方出现时,称它为公共子表达式。可以将之删除至一次,将多次计算变为一次。

4. 删除冗余代码:冗余代码就是毫无实际意义的代码,又称死代码 (deadcode)或无用代码(useless code)。永远不会执行的代码。

5. 循环优化

  • 循环不变式的代码外提:提取出循环过程中不随循环控制变量改变的表达式至循环之外,从而减少计算次数,也称频度削弱。
  • 循环展开:将循环展开减少执行语句数量,以空间换时间。
  • 归纳变量的优化和条件判断的替换
  • 其他循环优化方法:把多重嵌套的循环变成单层循环;把 n 个相同形式的循环合成一个循环等。

6. in_line展开:把过程(或函数)调用改为in_line展开可节省许多处理过程(函数)调用所花费的开销。省去了函数调用时参数压栈,保存返回地址等指令。这也仅仅限于简单的函数。

7. 其他方法,如控制流方法。

引用说明

- 邵老师课堂PDF
- 《编译原理级编译程序构造》
原文地址:https://www.cnblogs.com/AlvinZH/p/8314569.html