GCC

目录·概观
·目前支持的语言
·支持的处理器架构
·结构
·替 GCC 程序除错
·参阅



GCC(GNU Compiler Collection,GNU编译器套装),是一套由 GNU 开发的编程语言编译器。它是一套以 GPL 及 LGPL 许可证所发行的自由软件,也是 GNU计划 的关键部分,亦是自由的 类Unix 及苹果计算机 Mac OS X 操作系统的标准编译器。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。

GCC 原名为 GNU C 语言编译器(GNU C Compiler),因为它原本只能处理 C语言。GCC 很快地扩展,变得可处理 C++。之后也变得可处理 Fortran、Pascal、Objective-C、Java, 以及 Ada 与其他语言。

概观

GCC是由理查德·马修·斯托曼在1985年开始的。他首先扩增一个旧有的编译器,使它能编译C,这个编译器一开始是以Pastel语言所写的。Pastel是一个不可移植的Pascal语言特殊版,这个编译器也只能编译Pastel语言。为了让自由软件有一个编译器,后来此编译器由斯托曼和Len Tower在1987年以C语言重写并成为GNU项目的编译器。GCC的建立者由自由软件基金会直接管理。

在1997年,一群不满GCC缓慢且封闭的创作环境者,组织了一个名为EGCS〈Experimental/Enhanced GNU Compiler System〉的项目,此项目汇整了数项实验性的分支进入某个GCC项目的分支中。EGCS比起GCC的建构环境更有活力,且EGCS最终也在1999年四月成为GCC的官方版本。

GCC目前由世界各地不同的数个程序设计师小组维护。它是移植到中央处理器架构以及操作系统最多的编译器。

由于GCC已成为GNU系统的官方编译器(包括GNU/Linux家族),它也成为编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS。

GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。

目前支持的语言

以2006年5月24日释出的4.1.1版为准,本编译器版本可处理下列语言:

先前版本纳入的CHILL前端由于缺乏维护而被废弃。

Fortran前端在4.0版之前是G77,此前端仅支持Fortran 77。在本版本中,G77被废弃而采用更新的GFortran,因为此前端支持Fortran 95。

支持的处理器架构

GCC目前支持下列处理器架构(以4.1版为准):

较不知名的处理器架构也在官方释出版本中支持:

由FSF个别维护的GCC处理器架构:

当GCC需要移植到一个新平台上,通常使用此平台固有的语言来撰写其初始阶段。

结构

GCC的外部界面长得像一个标准的Unix编译器。使用者在命令行下键入<code>gcc</code>之程序名,以及一些命令参数,以便决定每个输入文件使用的个别语言编译器,并为输出代码使用适合此硬件平台的汇编语言编译器,并且选择性地执行连接器以制造可执行的程序。

每个语言编译器都是独立程序,此程序可处理输入的源代码,并输出汇编语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的源代码,并产生一抽象语法树,以及一翻译此语法树成为GCC的寄存器转换语言〈RTL〉的后端。编译器最佳化与静态代码解析技术(例如FORTIFY_SOURCE[1],一个试图发现缓存溢出〈buffer overflow〉的编译器)在此阶段应用于代码上。最后,适用于此硬件架构的汇编语言代码以Jack Davidson与Chris Fraser发明的算法产出。
几乎全部的GCC都由C写成,除了Ada前端大部分以Ada写成。

前端界面

前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递回语法解析器。

直到最近,程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样,有些前端会提供它们特别的语法树规则。

在2005年,两种与语言脱钩的新型态语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树,再将它们转成GENERIC。之后再使用"gimplifier"技术降低GENERIC的复杂结构,成为一较简单的静态唯一形式(Static Single Assignment form,SSA)基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全局最佳化通用语言,适用于大多数的现代编程语言。

中介界面

一般编译器作者会将语法树的最佳化放在前端,但其实此步骤并不看语言的种类而有不同,且不需要用到语法解析器。因此GCC作者们将此步骤归入通称为中介阶段的部分里。此类的最佳化包括消解死码、消解重复运算与全局数值重编码等。许多最佳化技巧也正在实作中。

后端界面

GCC后端的行为因不同的前处理器宏和特定架构的功能而不同,例如不同的字符尺寸、调用方式与大小尾序等。后端界面的前半部利用这些消息决定其RTL的生成形式,因此虽然GCC的RTL理论上不受处理器影响,但在此阶段其抽象指令已被转换成目标架构的格式。

GCC的最佳化技巧依其释出版本而有很大不同,但都包含了标准的最佳化算法,例如循环最佳化、线程跳跃、共通程序子句消减、指令调度等等。而RTL的最佳化由于可用的情形较少,且缺乏较高级的信息,因此比较起近来增加的GIMPLE语法树形式[2],便显得比较不重要。

后端经由一重读取步骤后,利用描述目标处理器的指令集时所取得的信息,将抽象寄存器替换成处理器的真实寄存器。此阶段非常复杂,因为它必须关照所有GCC可移植平台的处理器指令集的规格与技术细节。

后端的最后步骤相当公式化,仅仅将前一阶段得到的汇编语言码借由简单的副函数转换其寄存器与内存位置成相对应的机器码。

替 GCC 程序除错

为 GCC 除错的首选工具当然是 GNU 除错器。其他特殊用途的除错工具是 Valgrind, 用以发现内存漏失 (Memory leak)。而 GNU 测量器 (gprof) 可以得知程序中某些函数花费多少时间,以及其调用频率;此功能需要使用者在编译时选定测量〈profiling〉选项。

参阅

GCC目前包含了 Boehm GC,一个为 C/C++ 所设计的垃圾回收器。

distcc - 为分布式编译所设计的软件,以 GCC 为协同软件。
LLVM - 低层虚拟机编译器架构。
MinGW - 将 GNU 开发工具移植到 Win32 平台下的计划
Cygwin - 在 Windows 上执行 GNU 程序的模拟软件。
GCC Summit
OpenWatcom - 另一个开放原码的 C++/Fortran 编译器。
Code Sourcery - 一个 GCC 顾问公司。
ggcc - 全球化 GCC 项目。


其他解释:

General Communication Channel -- 通用通信信道

相关词条:
NGCC  
 
自定义分类:
GNUGNU计划软件
 
贡献者:
VOIP之子woodnn
Copyright © 1999-2024 C114 All Rights Reserved | 联系我们 | 沪ICP备12002291号-4