编译器对程序的优化过程

编译器的优化过程:
优化过程是所谓的“NP完全问题(NP-complete problem)”复杂度理论的例子。但现代的优化程序并不尝试完全的可能,只是用启发式和案例型算法来确定机器码应采取的转换过程。
最好不要使用goto语句,goto不见可能降低程序的可读性,还可能导致程序不能规约,使得编译器的优化工作很难进行。

常用的优化措施有下面7种:
(1) 常量折叠:即编译时计算出常量表达式的值。
(2) 常量传播:即如果变量被赋值以常量,常量传播会将所有变量替换成常量。
(3) 死代码消除:删除不会被执行的目标码。
(4) 公共子表达式消除:表达式在函数多个地方出现,如果变量值没有改变,仅计算一次。
(5) 强度削弱:识别出运算量大的操作,并将其替换为开销较小的等价机器指令序列。
(6) 归纳:一个变量的值依赖另外一个时,通常省去计算中间变量的过程。
(7) 循环不变量:循环不变量就是不会随着每轮循环改变的表达式,优化程序只在循环体外计算一次并在循环过程中使用。编译器的优化程序能找出循环不变量并使用“代码移动(code motion)”将其移出循环体。

编译器的输出与目标文件和可执行文件的格式:
编译器有四种可能的输出:高级语言代码(如C++编译器输出C语言代码)、汇编语言代码、目标文件和可执行文件。
常见的目标文件格式有:OMF(Object Module Format)、COFF(Common Object File Format)、PE/COFF(Microsoft推出的COFF变种)和ELF(Executable and Linkable Format)。
通常可执行文件格式与目标文件格式相似,主要区别是可执行文件中一般没有未解析的外部引用。除了机器码和二进制数据,可执行文件还含有其他元数据,包括调试信息/动态链接信息,还有定义操作系统应怎样将文件各区域调入内存的信息。目标文件通常设计的尽量小,而可执行文件往往设计成尽可能快的导入内存,有时这会使文件增大。由于目标文件可能有多个,生成可执行文件时,链接器可能将目标文件中的同名的多个区域合并成一个区域。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值