编译原理系列之十 代码优化

代码优化

  • 代码优化可分为与机器有关的优化和与机器无关的优化。

    与机器有关的优化一般在目标代码上进行。与机器无关的优化一般在中间代码上进行。

  • 代码优化也可分为局部优化、 循环优化和全局优化:

    局部优化指的是在只有一个入口、 一个出口的基本程序块上进行的优化。
    循环优化是对循环中的代码进行的优化,在一个程序运行时,相当多的一部分时间会花在循环上,因此,基于循环的优化非常重要。
    全局优化是在整个程序范围内进行的优化。

  • 常用的代码优化技术 :

    1. 删除公共子表达式(删除多余运算)

      2869373-649c98c699fa6f5c.png

      删除公共子表达式

  1. 代码外提
    代码外提是指将循环中的不变运算提到循环体前面。

     

    2869373-907263d66590f2a9.png

    代码外提

  2. 强度削弱

    强度削弱是指用执行效率较高的操作等价地替换原操作。

    比如将乘法改成加法

    2869373-88b20996e9aa464b.png

    强度削弱

  1. 变换循环控制条件(删除归纳变量)

    2869373-501b64edd1e448d6.png

    删除归纳变量

  1. 合并已知变量

    2869373-836da130d9f16bf6.png

    合并已知变量

  1. 复写传播

    复写传播是指尽量不引用那些在程序中仅仅只传递信息而不改变其值,也不影响其运行结果的变量。

     

    2869373-17f520dc594a9bf4.png

    复写传播

  2. 删除无用赋值

     

    2869373-0fd29921e62b0657.png

    删除无用赋值

  • 基本块的划分:

    基本块:是指程序中一顺序执行的语句序列,其中只有一个入口语句和一个出口语句。执行时只能从其入口语句进入,从其出口语句退出,不存在跳转和分叉汇合的情况。

    基本块入口语句的判断:
    • 程序的第一个语句;
    • 条件转移语句或无条件转移语句的转移目标语句
    • 紧跟在条件转移语句后面的语句

  • 流图:

    流图以基本块集为结点集:第一个结点为含有程序第一条语句的基本块;

    2869373-057e505ac2e8c0a2.png

    流图

  • DAG 表示的代码优化分析

    所作的优化合并已知量、删除多余运算、删除无用赋值

    2869373-429a83ef326ecb62.png

    DAG 表示的代码优化分析

  • 循环优化:

    对循环中的代码段,可以进行代码外提、强度削弱和删除归纳变量等优化。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值