GCC 4.0 的新特性

2008-02-23 05:41:12来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

本文侧重介绍了 GCC 4.0 内部结构相对于 3.4.x 版本的一些全新变化。

GCC(GNU Compiler Collection) 是 GNU(GNU's Not Unix) 计划提供的编译器家族,他能够支持 C, C , Objective-C, Fortran, Java 和 Ada 等等程式设计语言前端,同时能够运行在 x86, x86-64, IA-64, PowerPC, SPARC 和 Alpha 等等几乎现在任何的硬件平台上。鉴于这些特征,连同 GCC 编译代码的高效性,使得 GCC 成为绝大多数免费软件研发编译的最好选择工具。虽然对于程式员们来说,编译器只是个工具,除了研发和维护人员,很少有人关注编译器的发展,但是 GCC 的影响力是如此之大,他的性能提升甚至有望改善任何的免费软件的运行效率,同时他的内部结构的变化也体现出现代编译器发展的新特征,所以 2005年4月20日,GNU 组织发布的 GCC 4.0 引起了广泛的关注。那么这次 GCC 从 3.4.x 直接跃迁到 4.x 的主版本变化到底有什么值得关注的呢?

我们能够从不同的角度看待 GCC 的这次变迁,对于普通程式员来说,关注的主要是GCC 的前端支持情况连同编译性能的变化。

1. GCC 4.0 的前端支持
GCC 的研发者和使用者当中,大多数人都是 C 或 C 的用户,所以 GCC 对Fortran 语言支持不足也不令人奇怪。但是,这并不代表 Fortran 是无足轻重的,事实上,研发商业的 Fortran 编译器的公司要远远多于研发 C 和 C 编译器的公司。

在科学计算和工程应用领域,程式员们仍然在频繁使用 Fortran 程式,同时,大量的经过长时间考验的函数库也为Fortran语言的数值计算提供了强有力的支持,所以,在一些"终极电脑" (supercomputer)上,Fortran仍然是绝大多数应用的最好选择语言。

然而,在GCC 4.0发布之前,假如不想购买商用的Fortran编译器,那么程式员们的唯一选择就是GNU的g77编译器。但是g77编译器是个相当陈旧的技术,很多Fortran语言的新特性都不能支持,比如流行的Fortran 95,他能够支持的模块化编程,并行处理和数组操作等等,g77编译器基本上都无法支持。

这次GCC 4.0发布时推出了支持Fortran 95语言前端的编译器gfortran,他已能够大大超越g77编译器,支持Fortran 95标准中的很多新特性,虽然gfortran更有一些缺陷,比如不能支持自动并行化(automatic parallelization),不能支持Fortran 2003中的面向对象特性等等,他已给了Fortran程式员除了商业编译器和g77以外一个更好的选择。

2. GCC 4.0的编译性能
编译器的性能主要能够从三个方面来考查:

1. 编译时间(compile time),指编译器编译一个源程式得到目标代码所需要的时间。

2. 目标代码的大小(object size),编译得到的目标代码当然是越精悍越好了。

3. 目标代码运行时间(run time),运行时间体现了速度和效率。

这里,作者没有亲自测试和实验,引用了Scott Robert Ladd的《GCC 4.0: A Review for AMD and Intel Processors》文章中的一些实验结果。这篇文章引起了比较大的反响,其实验结果和结论也得到了广泛的认可,假如对Scott的具体测试采用的软件和硬件平台和工具方法感兴趣,原文能够在http://www.coyotegulch.com/reviews/gcc4/index.html看到。

Scott 使用AMD和Intel的两款处理器:64位的Opteron处理器和32位的Pentium 4处理器,分别针对GCC 3.4.3和GCC 4.0来进行测试。他选用了POV-Ray 3.6.1, LAME 3.96.1, SciMark 2.0和Linux 2.6.11.8作为benchmark来进行测试,分别记录了GCC 3.4.3和GCC 4.0在ADM Opteron和Intel Pentium 4下的编译时间、代码大小和代码运行时间进行比较,具体的实验结果请参见原文。

这样,根据这些实验数据,我们能够给出一个粗糙的结论,在编译性能方面,GCC 4.0似乎不如GCC 3.4.3,因为在很多时候,GCC 4.0的编译时间、代码大小连同代码运行时间全面高于GCC 3.4.3。这样的结果看似出人意料,GCC这次大的版本变化就是因为引入了新的优化框架,怎么会编译性能有所下降呢?这主要是因为:首先,这是一次主版本变化,我们能够理解巨大的变化带来的性能损耗;另外,更主要的是,GCC新的优化框架的潜力尚未完全发挥出来,这一点,在我们文章结束的时候,读者会有更深的理解。

3. GCC 4.0 的内部结构变化
GCC 遵循 GPL 协议,是开放源代码的,其研发过程也是完全开放的,任何人都能够对 GCC 的发展作出贡献,因而 GCC 特别适合用于学习和研究编译器。对于学习和研究编译器本身来说,GCC 内部的结构变化显然更吸引人。

现在 GCC 发行维护者 Mark Mitchell 在接受 internetnews.com 网站采访时这样说到:"毫无疑问地,GCC 4.0 中最引人注意的特性连同为何把 GCC 的这个版本称作 4.0 而不是 3.5,就是因为其新的优化框架(optimization infrastructure)。大体上来说,GCC 以前的版本的代码优化工作主要在底层机器指令级别进行的。不幸的是,到了底层的时候,很多信息已丢失了,因此,GCC 4.0 在更接近输入高级语言程式的级别上做了很多优化工作。"

Mark Mitchell 所说的 GCC 新的优化框架主要就是指 Tree SSA(Static Single Assignment),Tree SSA 经过长时间的单独研发,最终整合进了 GCC 的主流(mainstream)中,可见这种设计是意义非凡的。Tree SSA 是什么?为什么要采用 Tree SSA? 使用了 Tree SSA 的 GCC 有什么不同?新的 GCC 编译和优化框架是什么样的?等等,这些将是本文探讨的主要问题。

这部分文章内容是这样组织的:首先回顾 GCC 4.0 版本之前的编译流程,以便进行对比;接下来介绍 GCC 4.0 的编译流程连同新的优化框架结构,这里先介绍 GENERIC Tree和 GIMPLE Tree,SSA 形式等基本概念,在读者对这些概念和理论有了一定的了解之后,再介绍 GCC 中是如何实现 Tree SSA 框架结构的。

3.1 GCC 4.0 之前的编译流程
这里有必要回顾一下 GCC4.0 之前的版本进行代码优化的框架结构,以便进行对比分析。GCC 的前端在接受了输入的源程式之后,经过分析器(parser)处理得到 Parse Tree(通常是一种抽象语法数,AST, Abstract Syntax Tree),根据这个 Parse Tree 生成程式的RTL(Register Transfer Language)表示,然后在 RTL 表示的基础上进行优化处理,然后生成相应的目标代码,如下图 1 所示。

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: Linux on POWER 中的 GNU C/C 工具链

下一篇: 如何在Linux桌面上搭建C/C IDE研发环境 (2)