GCC

title: 概观.
content: 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家族),在LLVM、Clang崛起之前,它也是编译与建立其他操作系统的主要编译器,包括BSD家族、Mac OS X、NeXTSTEP与BeOS等。  GCC通常是跨平台软件的编译器首选。有别于一般局限于特定系统与执行环境的编译器,GCC在所有平台上都使用同一个前端处理程序,产生一样的中介码,因此此中介码在各个其他平台上使用GCC编译,有很大的机会可得到正确无误的输出程序。
title: 目前支持的语言.
content: 以2011年10月26日释出的4.6.2版为准,本编译器版本可处理下列语言:  先前版本纳入的CHILL前端由于缺乏维护而被废弃。  Fortran前端在4.0版之前是G77,此前端仅支援Fortran 77。在本版本中,G77被废弃而采用更新的GFortran,因为此前端支援Fortran 95。  下列前端依然存在:
title: 内嵌OpenMP支持.
content: OpenMP是一种跨语言的对称多处理机多线程并行程序的编程工具,也非常适合当今越来越流行的单CPU多核硬件环境,因此从gcc4.2开始,OpenMP成为其内嵌支持的并行编程规范,可以直接编译内嵌OpenMP语句的C/C++/Fortran95的源代码。gcc4.2之前如果想在C/C++/Fortran中嵌入OpenMP语句的话,需要额外安装库和预处理器才能识别和正确处理这些语句。现在 GCC GOMP 计划实现了这些支持:
title: 支援的处理器架构.
content: GCC目前支援下列处理器架构(以4.1版为准):  较不知名的处理器架构也在官方释出版本中支援:  由FSF个别维护的GCC处理器架构:  当GCC需要移植到一个新平台上,通常使用此平台固有的语言来撰写其初始阶段。
title: 结构.
content: GCC的外部接口长得像一个标准的Unix编译器。使用者在命令列下键入codice_1之程序名,以及一些命令参数,以便决定每个输入档案使用的个别语言编译器,并为输出程序码使用适合此硬件平台的组合语言编译器,并且选择性地执行连结器以制造可执行的程序。  每个语言编译器都是独立程序,此程序可处理输入的源代码,并输出组合语言码。全部的语言编译器都拥有共通的中介架构:一个前端解析符合此语言的源代码,并产生一抽象语法树,以及一翻译此语法树成为GCC的暂存器转换语言的后端。编译器最佳化与静态程序码解析技术(例如FORTIFY_SOURCE,一个试图发现缓冲区溢位的编译器)在此阶段应用于程序码上。最后,适用于此硬件架构的组合语言程序码以杰克·戴维森与克里斯·弗雷泽发明的算法产出。  几乎全部的GCC都由C/C++写成,除了Ada前端大部分以Ada写成。
title: 前端接口.
content: 前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递回语法解析器。  直到最近,程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样,有些前端会提供它们特别的语法树规则。  在2005年,两种与语言脱钩的新型态语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树,再将它们转成GENERIC。之后再使用「gimplifier」技术降低GENERIC的复杂结构,成为一较简单的静态唯一形式(Static Single Assignment form,SSA)基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全域最佳化通用语言,适用于大多数的现代程序语言。
title: 中介接口.
content: 一般编译器作者会将语法树的最佳化放在前端,但其实此步骤并不看语言的种类而有不同,且不需要用到语法解析器。因此GCC作者们将此步骤归入通称为中介阶段的部分里。此类的最佳化包括消解死码、消解重复运算与全域数值重编码等。许多最佳化技巧也正在实作中。
title: 后端接口.
content: GCC后端的行为因不同的前处理器宏和特定架构的功能而不同,例如不同的字符尺寸、呼叫方式与大小尾序等。后端接口的前半部利用这些讯息决定其RTL的生成形式,因此虽然GCC的RTL理论上不受处理器影响,但在此阶段其抽象指令已被转换成目标架构的格式。  GCC的最佳化技巧依其释出版本而有很大不同,但都包含了标准的最佳化算法,例如循环最佳化、执行绪跳跃、共通程序子句消减、指令排程等等。而RTL的最佳化由于可用的情形较少,且缺乏较高阶的资讯,因此比较起近来增加的GIMPLE语法树形式,便显得比较不重要。  后端经由一重读取步骤后,利用描述目标处理器的指令集时所取得的资讯,将抽象暂存器替换成处理器的真实暂存器。此阶段非常复杂,因为它必须关照所有GCC可移植平台的处理器指令集的规格与技术细节。  后端的最后步骤相当公式化,仅仅将前一阶段得到的组合语言码借由简单的副函式转换其暂存器与内存位置成相对应的机械码。
title: 替GCC程序除错.
content: 为GCC除错的首选工具当然是GNU除错器。其他特殊用途的除错工具是Valgrind,用以发现内存泄漏(Memory leak)。而GNU测量器(gprof)可以得知程序中某些函式花费多少时间,以及其呼叫频率;此功能需要使用者在编译时选定测量(profiling)选项。
title: GCC内嵌汇编.
content: 内嵌汇编也称行内汇编,是把汇编语言代码块插在C语言语句之间。详情参见GCC-Inline-Assembly-HOWTO.html

Summary: GNU编译器套装(英语:GNU Compiler Collection,缩写为GCC),指一套编程语言编译器,以GPL及LGPL许可证所发行的自由软件,也是GNU计划的关键部分,也是GNU工具链的主要组成部分之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理乍得·马修·斯托曼开始发展,现在由自由软件基金会负责维护工作。

GNU Compiler Collection: The GNU Compiler Collection (GCC) is a compiler system produced by the GNU Project supporting various programming languages. GCC is a key component of the GNU toolchain and the standard compiler for most projects related to GNU and Linux, including the Linux kernel. The Free Software Foundation (FSF) distributes GCC under the GNU General Public License (GNU GPL). GCC has played an important role in the growth of free software, as both a tool and an example.