编译原理——代码优化

代码优化:

概述:

  • 目的:提高代码运行效率,占用更少空间
  • 实质:代码之间的等价变换

优化概念:

  • 优化等级:
    • 源程序级 程序员做的代码优化
    • 中间代码级,主要优化内容 编译程序优化部分
    • 目标代码级
  • 优化代价:
    • 优化算法的复杂度,即编程难易程度及算法时间复杂度
  • 优化代码和优化程度的关系:
    在这里插入图片描述手工水平为最优化代码,也就是汇编
  • 优化的分类:
    • 局部优化,针对一段顺序执行的语句序列的优化
      • 优化方法:
        • 合并已知量
        • 删除公共子表达式
        • 变量传播与无用赋值删除

在这里插入图片描述在这里插入图片描述对于常量运算,可以直接在编译阶段运算出来,给运行阶段提高速度

在这里插入图片描述删除重复运算,使用赋值操作替代重复的运算操作
在这里插入图片描述我们可以发现,红色代码部分的左值是没有作为操作数 或者 重复赋值被覆盖了,所以可以将它们删去。

循环优化:

在这里插入图片描述在这里插入图片描述在这里插入图片描述这里有不变部分,T3和T6,主要是为了计算A,B数组的不变部分(参考数组的定义),这就需要我们将代码外提
在这里插入图片描述这样减少了200次赋值操作
在这里插入图片描述首先进行块内优化,将T1和T4合并为一个,然后观察两个的变化发现,规律是每次加10
在这里插入图片描述将乘法操作同义替换为加法操作,有利于计算机的运算

在这里插入图片描述在这里插入图片描述通过使用T1的每次加10的规律,作为控制变量,这样就删去了i变量

完成循环优化,做局部优化

局部优化:

在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述入口包括:1,3,6,10,根据划分得到

在这里插入图片描述
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述将op施加在B上,得到的值由n2代表,再将A附加在n2上面,表示运算出来的结果,就是A的值
以下为各种类型的四元式通过DAG的表示方式

在这里插入图片描述
在这里插入图片描述在这里插入图片描述
对于一个基本块,应该怎么操作其对于的DAG图:

在这里插入图片描述
当A有定义:

  • A为附加标记,将A拿掉,在附加当当前结点上
  • A为标记,不拿掉A

在这里插入图片描述在这里插入图片描述在这里插入图片描述
当程序到达了第三步,表示常量运算已经运算完了,后面的运算都是需要变量参与的

3.1步是通过一元运算中存在变量运算到达的

3.2步是通过二元运算中存在变量运算到达的

到了第四步,表示运算的结果,要么找到了,要么建好了
在这里插入图片描述
其实主要就是做了下面几件事:
1,准备操作数结点

2,合并常数量

3,删除公共子表达式

4,删除无用赋值

在这里插入图片描述在这里插入图片描述
创建3.14结点,附加上T0,创建2结点,搜索T0结点,运算得到6.28,删除2结点,将T1附加到6.28上

在这里插入图片描述
添加两个结点R,r,父节点进行加法操作,并将T2附在父节点上
在这里插入图片描述在这里插入图片描述
运算完6,得到6.28,将T3附到n2上

在这里插入图片描述
添加T5*T6,发现需要附上B,发现B有定义了,但是为附加标记,可以删除,为附加标记,表示的就是一个取值操作,但是如果是标记就表示需要参与运算了

我们只需要将DAG图还原就得到了优化后的代码:按n的顺序还原
在这里插入图片描述在这里插入图片描述
当T0在后面不需要使用了就可以优化了
我们可以在退出这个基本块之前将局部变量重新命名,这样当下一次基本块优化时,可以继续使用T0,Tn

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值