- 机器无关的优化尝试改进中间代码以获得更好的目标代码。此处转换的代码部分不涉及任何绝对内存位置或任何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;
}