![](https://pic2.zhimg.com/v2-85071d1ccfde8bac0cc694931e7ac91d_r.jpg)
何为优化,是代码发生变换后,能够保质保量完成原本的任务,而对使用时间和空间上面进行改进。主要的优化有两大类:中间代码优化(不依赖计算机)和目标代码优化(依赖计算机)
局部优化:在基本块上优化循环优化:对循环代码进行一些操作全局优化:整个程序范围内(略,我没学)
常用优化技术:删除多余运算、合并已知量和复写传播、删除无用赋值、循环优化技术(代码外提、强度削弱、变换循环控制条件)
局部优化:在基本块上优化
入口语句:程序第一句、(有条件或无条件)转移GOTO所到的语句、条件GOTO语句后面一句
基本块:顺序读取程序语句,得到是入口语句之间的程序部分;
不在基本块的语句直接可以删除
![](https://pic1.zhimg.com/v2-db2c246cd30f2bcf13646958afeb1964_r.jpg)
简单来说,这个部分是想将基本块作为附带信息标志的节点,创建一个有向无环图(DAG)。
具体的操作看视频很清楚:
![](https://pic1.zhimg.com/v2-772226c0ae99163e0f0f33973ff14056.jpg?source=382ee89a)
程序流图:基本块为节点,按照执行顺序(相邻,转移出口->入口)将基本块用有向边连接。
![](https://pic1.zhimg.com/v2-badb667223094a4690b972b9a3cb5040_r.jpg)
代码外提:可以只计算一次的表达式外提
![](https://pic1.zhimg.com/v2-353889ba8f279900b1f9bf1a1fe48854_r.jpg)
循环不变运算:如果每次循环后这个值不改变(为常量),就不用每次都去做。
强度削弱:比如,乘法换加法。
![](https://pic4.zhimg.com/v2-ab2caec7fd09dac46308f4b50758a977_r.jpg)
目标代码生成
中间代码输入——>转换为——>特定的机器语言或者汇编语言输出。
转换的函数称为,基本块的代码生成算法。
我们需要考虑的是:如何生成的代码最短最有效率?如何优化这段代码和寄存器的接触,充分利用寄存器以减少对存储单元的访问?答:寄存器分配算法。
![](https://pic1.zhimg.com/v2-3efd091c8c4a60b58c1b4190371a4164_r.jpg)
![](https://picx.zhimg.com/v2-6aa70896c7cd7e791d75199745817add.jpg?source=382ee89a)