GCC

概观

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编译，有很大的机会可得到正确无误的输出程序。

结构

GCC的外部接口长得像一个标准的Unix编译器。用户在命令行下键入gcc之程序名，以及一些命令参数，以便决定每个输入文件使用的个别语言编译器，并为输出代码使用适合此硬件平台的汇编语言编译器，并且选择性地运行链接器以制造可执行的程序。
每个语言编译器都是独立程序，此程序可处理输入的源代码，并输出汇编语言码。全部的语言编译器都拥有共通的中介架构：一个前端解析符合此语言的源代码，并产生一抽象语法树，以及一翻译此语法树成为GCC的寄存器转换语言的后端。编译器最优化与静态代码解析技术（例如FORTIFY_SOURCE，一个试图发现缓存溢出的编译器）在此阶段应用于代码上。最后，适用于此硬件架构的汇编语言代码以杰克·戴维森与克里斯·弗雷泽发明的算法产出。
几乎全部的GCC都由C/C++写成，除了Ada前端大部分以Ada写成。

前端接口

前端的功能在于产生一个可让后端处理之语法树。此语法解析器是手写之递归语法解析器。
直到最近，程序的语法树结构尚无法与欲产出的处理器架构脱钩。而语法树的规则有时在不同的语言前端也不一样，有些前端会提供它们特别的语法树规则。
在2005年，两种与语言脱钩的新类型语法树纳入GCC中。它们称为GENERIC与GIMPLE。语法解析变成产生与语言相关的暂时语法树，再将它们转成GENERIC。之后再使用“gimplifier”技术降低GENERIC的复杂结构，成为一较简单的静态唯一形式（Static Single Assignment form，SSA）基础的GIMPLE形式。此形式是一个与语言和处理器架构脱钩的全局最优化通用语言，适用于大多数的现代编程语言。

中介接口

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

后端接口

GCC后端的行为因不同的前处理器宏和特定架构的功能而不同，例如不同的字符尺寸、调用方式与大小尾序等。后端接口的前半部利用这些消息决定其RTL的生成形式，因此虽然GCC的RTL理论上不受处理器影响，但在此阶段其抽象指令已被转换成目标架构的格式。
GCC的最优化技巧依其发布版本而有很大不同，但都包含了标准的最优化算法，例如循环最优化、线程跳跃、共通程序子句消减、指令调度等等。而RTL的最优化由于可用的情形较少，且缺乏较高端的信息，因此比较起近来增加的GIMPLE语法树形式，便显得比较不重要。
后端经由一重读取步骤后，利用描述目标处理器的指令集时所获取的信息，将抽象寄存器替换成处理器的真实寄存器。此阶段非常复杂，因为它必须关照所有GCC可移植平台的处理器指令集的规格与技术细节。
后端的最后步骤相当公式化，仅仅将前一阶段得到的汇编语言码借由简单的副函数转换其寄存器与存储器位置成相对应的机器代码。

替GCC程序调试

为GCC调试的首选工具当然是GNU调试器。其他特殊用途的调试工具是Valgrind，用以发现内存泄漏（Memory leak）。而GNU测量器（gprof）可以得知程序中某些函数花费多少时间，以及其调用频率；此功能需要用户在编译时选定测量（profiling）选项。

GCC内嵌汇编

内嵌汇编也称行内汇编，是把汇编语言代码块插在C语言语句之间。详情参见GCC-Inline-Assembly-HOWTO.html