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

时间:2022-01-15 03:54:07

代码优化

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

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

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

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

  • 常用的代码优化技术 :

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

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

      删除公共子表达式

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

     

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

    代码外提

  2. 强度削弱

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

    比如将乘法改成加法

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

    强度削弱

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

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

    删除归纳变量

  1. 合并已知变量

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

    合并已知变量

  1. 复写传播

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

     

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

    复写传播

  2. 删除无用赋值

     

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

    删除无用赋值

  • 基本块的划分:

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

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

  • 流图:

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

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

    流图

  • DAG 表示的代码优化分析

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

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

    DAG 表示的代码优化分析

  • 循环优化:

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