编译器优化

转自:http://bbs.emath.ac.cn/thread-173-1-1.html

编译器优化

一直想给大家介绍一些编译器优化方面的知 识 ,只是又觉得这方面知识内容太多了,介绍起来太花费时间了,实在没有精力去逐一介绍,并且很多编译器方面术语我都不知道中文该如何翻译(国内相关资料应该也比较少,很有可能有些术语都没有标准的翻译),所以一直非常犹豫要不要讨论这方面的内容,所以就先随便试一试看吧,等每次有空有兴趣时就可以试着随便写一点。
我觉得大概懂得编译器到底可以做一些什么优化工作,对于写出高效率的程序是非常重要的。只有知道编译器大概会怎么去做,我们才能够知道用怎么样的代码会提供给编译器更多的优化机会,怎样的代码不会阻碍编译器的优化,甚至于,在知道编译器无能为力的情况下,可以通过手工模拟一些编译器的变化过程对代码做优化。
而我讨论的重点将在于通常编译器会做那些平台无关的优化。至于文法分析,代码生成之类的内容,我不会去介绍(其实我也不熟悉)。
先大概介绍一下编译器。通常编译器可以分成前端(FrontEnd/FE)和后端(BackEnd/BE)两个部分,其中前端负责将用户的源代码翻译成一种编译器的内部表示(Intermedium Representation/IR),我们简称IR. 这个就是通常词法分析,语法分析所做的事情。对于不同的源代码语言,我们需要不同的前端,但是我们可以通过使用公共的IR,使得对于不同的语言,可以使用相同编译器的后端。而编译器的后端,现在通常分成两个部分,一部分负责同平台无关的优化工作,我们通常称为中间端(MiddleEnd/ME),另外部分负责同平台相同的优化工作和代码生成(通常指生成汇编语言或直接二进制机器代码),我们通常称为代码生成部分(Code Generation/CG).
同样,对于不同的平台(不同的CPU,不同的操作系统),我们需要不同的代码生成部分,但是整个编译器的中间端可以在不同的源代码,不同的平台之间共享。
有一点需要注意的是,这里说的不同语言,是指像C/C++/Fortran/Pascal之类的静态编译的语言,而不包含像Java/C#之类需要在运行时间再编译的语言(这是因为这两种编译器的实现方法完全不同),而对于Java/C#之类的语言,所用的编译器就是另外一个话题了,不过其中用到的大部分技术还是类似的。
而我将会把介绍的重点放在编译器的中间端(ME).

关于介绍编译器优化的书,我推荐大家可以看一下美国的Steven S. Muchnick写的Advanced Compiler Design and Implementation. 国内有影印版,中文名字叫《高级编译器设计和实现》。但是有没有翻译成中文的版本我就不知道了。
而现成的比较好的编译器源代码,我推荐open64,这个可以在http://www.open64.net/上找到,这个编译器的前身是sgi的编译器pro64,后来移植到Itanium芯片上。根据open64网站上的信息,现在可以用于Itanium (IA64), i386 (32位x86通用芯片)和X86_64(64位x86通用芯片)。不过好像只支持Linux (Windows可以试着安装一下cygwin看看).对于语言,它可以同时编译C/C++/Fortran. 在我印象中,这个编译器的前端用的是gcc的前端,也就是说必须安装了gcc才能够使用open64,但是据说编译出来代码的性能比gcc要好很多。

本文转自:[url=http://bbs.emath.ac.cn/thread-173-1-1.html]数学研发论坛(bbs.emath.ac.cn)[/url]

代码交流 2021