LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 11106|回复: 54

gentoo月隐流剑宗第一章:GCC4——使命的召唤!

[复制链接]
发表于 2005-5-30 15:27:36 | 显示全部楼层 |阅读模式
著者:月隐风间 (Eric Neon@gnome-cn.org)

佛云:风不动,是人心在动!
机械本无生命,只是因为有了精益求精的人的存在,机械也有了呼吸。而更畅快的呼吸却因为有了GCC4。。。

5月28日,周六,黄历巳月廿一
天释日,四方清浊,罪可免赦,万物更新。宜编译、测试、升级,忌出行,会友。

GCC是可以在多种硬体平台上编译出可执行程序的超级编译器,其执行效率与一般的编译器相比平均效率要高20%~30%。作为自由软件的旗舰项目,Richard Stallman 在十多年前刚开始写作 GCC 的时候,还只是把它当作仅仅一个 C 程序语言的编译器;GCC 的意思也只是 GNU C Compiler 而已。经过了这么多年的发展,GCC 已经不仅仅能支持 C 语言;它现在还支持 Ada 语言、C++ 语言、Java 语言、Objective C 语言、Pascal 语言、COBOL语言,以及支持函数式编程和逻辑编程的 Mercury 语言,等等。而 GCC 也不再单只是 GNU C 语言编译器的意思了,而是变成了 GNU Compiler Collection 也即是 GNU 编译器家族的意思了。
第一版GCC 在1987年发布,随后的GCC便以C89标准为核心进行了非常完善的设计。GCC 3.0 版在2001年问世。GCC从3.4版本开始全面引入C99标准,使程序语法和性能都发生了巨大变化。但是在GCC3.3版升级到3.4版时,性能虽然有了很大的进步,却造成了严重的回溯兼容性问题。有些用3.3 版编译顺畅的软件,改用3.4 版却遭遇了失败。整个自由软件界在2004年前后笼罩在这种“要性能还是要稳定”的矛盾阴影之下,而国际最大的CPU生产商intel却在这个时候推出了自己的编译器ICC。ICC在intel架构的系统上编译效能很强大,一度超越了GCC3.3。但是人们也开始担心:如果没有使用intel的芯片,我们是否也能够获得如此强大的编译器?尤其是以AMD为代表的另一些厂商十分担心intel会借此机会垄断自己在自由软件界的地位。
我们需要另一个AMD的编译器吗?No!我们要做的只是把GCC做得更好罢了。
 楼主| 发表于 2005-5-30 15:47:45 | 显示全部楼层
与GCC开发相关的人们开始四处联络,分析GCC的出路和ICC的特点。主持GCC核心开发的CodeSourcery公司专门邀请了intel的工程师来讲解ICC的核心技术。可喜的是intel看到了开源的巨大动力和潜在的巨大利益,他们很愉快地接受了邀请,并将ICC技术公开出来。GCC4的一个重要挑战是强制纯粹的C99标准。在3.4.x时,由于考虑了过多的向下兼容,导致程序的错误更加严重,而且编程语法上的不规范严重影响了正常的编译。于是大师们决定把一切标准都推到最新的基础上。
如果我们目前在编译个别软件时,遭遇了失败。那么请不要担心,也许仅仅是你在某些语法的使用上落伍了。GCC4.0新增一个基础,以便在这个基础上添加最佳化(optimizations)处理。最佳化过程可能采取几种形式,但大致而言,都提供让编译器一览程序全貌的方法。目前的GCC 版本可把某程序局部的一小部分最佳化。但一种新式的最佳化,称为“纯量取代与聚集”(scalar replacement and aggregates),让GCC找寻范围涵盖更大量源代码的信息结构,然后GCC再把那些物件(objects)拆开,以便把物件元件直接存在快速的芯片上缓存内存(on-chip memory),而不是存入缓慢的主内存(main memory)。CodeSourcery公司GCC4发布经理兼“源代码长”Mark Mitchell 说:“打造最佳化架构,是为了赋予编译器宏观的能力。”这种架构称为“树状SSA ”(Tree SSA);SSA 的全称是“静态单一指派”(static single assignment)。不过这个最佳化架构只是刚刚起步而己,下一步会附带可插入此架构的编写最佳化(writing optimizations )。在GCC4.1版本可能加入一种称为“自动向量化”(autovectorization)的最佳化功能。这项功能的用途,是在软件中找寻某个区域,让单一指令适用于多重的信息元素,借此精简处理器的作业过程。对小至电玩游戏大至超级电脑运算的各种应用来说,这种功能堪称便利。GCC4.0版也引进称为“Mudflap ”的安全功能,在检查缓冲区溢位(buffer overruns)弱点的编译程序中加入额外的功能,但是Mudflap 会造成程序的执行性能减慢,所以该功能将会用于测试版,正式产品会关闭此项功能。
另外,GCC4开始也将提供Fortran 95程序编译器的预览版。Fortran 是拥有数十年历史的程序设计语言,Fortran 95是其更新版,至今仍是撰写科学与技术应用程序颇受欢迎的语言。工程师Henderson 认为,以C++ 程序语言写的软件,执行速度应该会更快,在某些情况下甚至“出奇的棒”。在gentoo的gcc4编译参数中我们已经可以看见Fortran的选项了。
回复 支持 反对

使用道具 举报

发表于 2005-5-30 16:23:42 | 显示全部楼层
期待gentoo能早日将gcc加入x86的keywords
回复 支持 反对

使用道具 举报

发表于 2005-5-30 16:41:30 | 显示全部楼层
最近也考虑升级我的gcc了
回复 支持 反对

使用道具 举报

发表于 2005-5-30 17:00:42 | 显示全部楼层
使用了很长时间了,不过目前在生成某些代码的时候会产生错误的代码,不过针对C语言的时候好像问题不是很大,
不过目前kde 将gcc4.0.0列入了黑名单:)
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-30 17:21:01 | 显示全部楼层
虽然GCC的工程师说:“GCC 的优点向来是可携带性(portability)与跨平台支持(cross-platform support),而不是速度。”但是我们可以想见,GCC4会在最短的时间内超越GCC3.x系列所创造的性能神话。在java和.net风行的今天,我们不知道c++还能走多远。但是我们已经看见GCC4将是一个新的起点,在这里,我们试图去实现以前所有的梦想。这仅仅只是一个开始!
据官方的说法,对于未选择优化选项情况下,GCC4.0.0编译出来的C++程序运行速度高于任何以前版本的GCC,而一些程序测试显示比前一版本也就是3.4版本提高25%的速度。这对于所有以GCC为编译器的开放源码软件来说都是很大的进步。我个人在Gentoo的编译过程中,注意了使用不同版本的GCC编译相同程序所花费的时间。很明显的是,当使用GCC4来编译程序时,编译时间比GCC3.4.3要节约40%-60%,相比3.3要节约30%以上。这个性能的对比似乎不能说明什么,但至少让我不在恐惧gentoo的编译安装。只要手有多快,安装就有多快。

接着我们必须来谈谈glibc,因为我们不谈glibc,那么多的人还是会在编译GCC4时遭遇它。在GNU/Linux系统中,其C函数库的发展史是GNU/Linux演化的重要里程碑。早期的GNU/Linux系统并不支持共享函数库,因此所有的应用程序都是以静态链接的方式存在系统中。直到1995-1996年libc5问世以后,系统才开始支持ELF共享函数库,同时此版本的C函数库也提供了其他UNIX上大部分的功能与函数群,可谓是GNU/Linux发展上的一大进步。
然而libc5在程序的国际化(I18N)与本土化(L10N)方面的支持很差,在那个时候,若要开发中文程序,就必须自己从头写一套标准。1998年后,GNU/Linux开始使用GNU所开发的glibc-2.0作为其C函数库,其国际化与本地化的支持才算是开始起步了。
在GNU的计划中,开发glibc原本是给Hurd内核使用的,由于当时几乎99%的GNU系统工具已经完成,但是hurd内核却进展缓慢,而恰巧LInux内核在Torvalds的领导下已经成熟稳定。于是GNU团队根据Linux的特点修改了glibc,使其同时适应hurd和linux两种内核。这两个系统平台就有了一个统一的程序开发环境。所有GNU的程序都可以在这两个内核上顺利运行。
回复 支持 反对

使用道具 举报

发表于 2005-5-30 18:00:18 | 显示全部楼层
好文,赞一个
回复 支持 反对

使用道具 举报

发表于 2005-5-30 18:15:48 | 显示全部楼层
期待下文
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-5-30 21:16:47 | 显示全部楼层
小二,五斤牛肉一壶酒!我们边吃边聊:)
剑法源于书法。无论是提挑顿挪,还是疾走偏锋,都要依存于手腕的连贯动作。书法的行云流水最忌断笔和残笔。灵活的手腕作为人和剑之间的连接,是一个剑客最懂得呵护的部位。否则人剑不能合一,剑就不能变成人的延伸的长臂。那么在GCC和glibc以及其他的程序之间,什么是“手腕”呢?这就是binutils!

装过LFS的朋友也许都知道Binutils是一组开发工具,包括连接器,汇编器和其他用于目标文件和档案的工具。
在程序的编译过程中,经由编译器的编译与优化之后,其输入的就是程序的组合代码。这时就需要经由解释器将组合代码翻译成机器所能接受的机器代码,输出成.o的文件,而最后再由链接器将这些文件与所需的系统函数库和启动模块链接进来,从而生成一个完整的可执行程序。链接器在编译过程中扮演着十分重要的角色,但是它们都是在幕后工作。binutils主要包括这些命令工具:addr2line, ar, as, c++filt, gprof, ld, nm, objcopy, objdump, ranlib, readelf, size, strings 和 strip。其中as和ld是最主要的链接器,而其他是一些帮助我们管理生成档案的工具以及其他各种功能的工具。而它本身依赖于: Bash, Coreutils, Diffutils, GCC, Gettext, Glibc, Grep, Make, Perl, Sed, Texinfo。所以在Gentoo中编译新的binutils,我们也可以从这里看出个先后次序。当升级到GCC4时,我们应该先把GCC4编译完,然后用GCC4来编译glibc和binutils。
回复 支持 反对

使用道具 举报

发表于 2005-5-30 22:22:56 | 显示全部楼层
好文,支持一个!
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表