与机器无关的优化

  • 机器无关的优化尝试改进中间代码以获得更好的目标代码。此处转换的代码部分不涉及任何绝对内存位置或任何CPU寄存器。
  • 中间代码生成的过程引入了很多低效率的问题, 例如:使用变量而不是常量, 额外的变量副本, 重复计算表达式。通过代码优化, 你可以消除这种效率并改善代码。
  • 它有时可能会改变程序的结构, 使其无法识别, 例如:展开循环, 内联函数, 消除一些程序员定义的变量。
代码优化可以通过以下不同方式执行:
(1)编译时间评估:
(a)z = 5 *(45.0 / 5.0)* r在编译时执行5 *(45.0 / 5.0)* r。
(b)x = 5.7 y = x / 3.6在编译时将x / 3.6评估为5.7 / 3.6。
(2)变量传播:
在优化之前, 代码为:
c = a * bx = atilld = x * b + 4

优化后的代码是:
c = a * bx = atill d = a * b + 4

在此, 在变量传播之后, a * b和x * b被标识为公共子表达式。
(3)消除死代码:
消除之前的代码是:
c = a * bx = btilld = a * b + 4

消除后的代码是:
c = a * btilld = a * b + 4

在此, x = b是无效状态, 因为它将永远不会在程序中使用。因此, 我们可以消除这种状态。
(4)代码运动:
  • 它减少了表达的评估频率。
  • 它将循环不变的语句带出循环。
do{item = 10; value = http://www.srcmini.com/value + item; } while(value< 100); //This code can be further optimized asitem = 10; do{value = value + item; } while(value< 100);

(5)归纳变量和强度降低:
  • 强度降低用于以低强度代替高强度操作员。
  • 归纳变量在循环中用于以下类型的赋值, 例如i = i +常数。
减少之前的代码是:
i = 1; while(i< 10){y = i * 4; }

【与机器无关的优化】减少后的代码是:
i = 1t = 4{ while( t< 40) y = t; t = t + 4; }

    推荐阅读