根据一些经典编译器的设计经验,编译优化往往不是一遍完成的。理想的状态是,在编译过程中每遍代码生成后,都存在相应的优化环节,尽可能保证得到相对最优的中间形式。这种优化组织方式的优点就在于能够针对不同的代码形式选用最适合的优化算法,以达到相对最优的结果。
通常,编译过程主要涉及三种代码形式:输入源程序、IR、目标代码。一般来说,针对这三种形式,就需要三个优化环节,或称为“三遍优化”。当然,这里并不局限于编译器的优化。广义而言,程序员对输入源程序的改善也可以视为一种优化,是一种基于源程序的人工优化。例如,完全可以通过运用一些编程技巧来节省程序运行的时空消耗,其中,最经典的例子可能就是两个整型变量的原地交换算法。当然,软件工程却不提倡这种编程习惯,它可能会大大降低程序的可读性、可维护性。因此,编译器设计者并不能对输入源程序的性能抱有太大的希望,死代码、死变量、不可到达代码可能是无处不在的。
真正的编译优化主要包括两个级别,即IR优化与指令级优化。这种划分的依据是优化算法对目标机的依赖程度。所谓“IR优化”指的就是那些与目标机特性无关的优化算法,有时亦可称为“机器无关优化”(machine-independent optimization),它的优化对象就是IR。而所谓“指令级优化”指的就是那些与目标机特性相关的优化算法,有些书籍将其称为“目标代码优化”或“机器相关优化”(machine-dependent optimization),它的优化对象就是目标代码。在优化技术中,IR优化的理论与技术相对成熟,早期,编译器设计者在这个领域研究中投入了大量的精力,提出许多著名的IR优化算法。而指令级优化的发展稍晚些。当然,随着一些新型编译器模型的提出,指令级优化已经逐渐成为一个崭新的研究领域。(www.daowen.com)
本章将着重讨论IR优化,关于指令级优化的话题,将在后续章节中详述。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。