fbpx
维基百科

GCC

GNU编译器套裝(英語:GNU Compiler Collection,縮寫為GCC)是GNU計劃制作的一种优化编译器,支持各种编程語言操作系统计算机系统结构。该编译器是以GPLLGPL許可證所發行的自由軟體,也是GNU計劃的关键部分,还是GNU工具链的主要組成部份之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼開始發展,現在由自由軟體基金會負責維護工作。截至2019年,GCC大约有1500万行代码,是现存最大的自由程序之一。[4] 它在自由软件的发展中发挥了重要作用,不仅是一个工具,还是一个典例。

GNU编译器套裝
GCC 10.2编译自身源代码截图
開發者GNU計劃
首次发布1987年5月23日 (1987-05-23)
当前版本
  • 12.3 (2023年5月8日;維護版本)[1]
  • 11.4 (2023年5月29日;維護版本)[2]
  • 13.2 (2023年7月27日;穩定版本)[3]
源代码库
  • gcc.gnu.org/git/gcc.git
编程语言C++
操作系统跨平台
文件大小约一千五百万行[4]
语言英语
类型编译器
许可协议GNU通用公共许可证第三版或更新
网站gcc.gnu.org

原名為GNU C語言編譯器GNU C Compiler),因為它原本只能處理C語言。同年12月,新的GCC编译器可以编译C++语言。后来又为FortranPascalObjective-CJavaAdaGo等其他語言开发了前端。C和C++编译器也支持OpenMPOpenACC规范。

GCC编译器已经被移植到比其他编译器更多的平台和指令集架构上,并被广泛部署在开发自由和专有软件的工具中。GCC还可用于许多嵌入式系统,包括基于ARMPower ISA英语Power ISA的芯片。

GCC不仅是GNU操作系统的官方编译器,还是许多类UNIX系统和Linux发行版的标准编译器。BSD家族中的大部分操作系统也在GCC发布之后转用GCC;不过FreeBSD、OpenBSD和Apple macOS已经转向了Clang编译器[5],主要是因为许可问题。[6][7][8]GCC也可以编译WindowsAndroidiOSSolarisHP-UXIBM AIXDOS系统的代码。GCC原本用C開發,後來因為LLVMClang的崛起,它更快地將開發語言轉換為C++。許多C的愛好者在對C++一知半解的情況下主觀認定C++的性能一定會輸給C,但是Ian Lance Taylor給出了不同的意見,並表明C++不但性能不輸給C,而且能設計出更好,更容易維護的程式[9][10]

历史 编辑

1983年底,为了引导GNU操作系统,理查德·马修·斯托曼向阿姆斯特丹编译器套件(自由大学编译器套件)的作者安德鲁·塔能鲍姆请求在GNU上允许使用该编译器;但是作者告知他该编译器仅对大学免费。因此,他打算开发一个不同的编译器。[11]一开始他打算与Len Tower和其他人将勞倫斯利佛摩國家實驗室的一个现有编译器从Pastel改写成C。[12][13]但是他在给利弗莫尔编译器写了一个新的C前端后,发现它需要数兆字节的堆栈空间,只有64KB的68000 Unix系统上无法运行。因此,他打算自己从头写一个编译器。[12]总而言之,尽管斯托曼确实使用了他自己写的C前端,他并没有将任何Pastel编译器的代码放在GCC中。[12][14]

GCC于1987年3月22日在麻省理工学院文件传输协议上发布[15],斯托曼被列为作者,也提及了其他人并感谢他们的贡献:Jack Davidson和Christopher Fraser给出了使用暫存器傳遞語言作为中间语言的思路;Paul Rubin为预处理器贡献良多;以及Leonard Tower写了“部分解析器、RTL生成器、RTL定义和Vax机器描述”。[16]Peter H. Salus英语Peter H. Salus誉为“自由软件第一击”的GNU编译器发布正值太阳微系统将其操作系统与其开发工具解绑,并提价单独出售。这使得许多客户购买或下载GCC而非供应商的工具。[17]尽管斯托曼认为GNU Emacs是他的主要工程,但截至1990年,GCC支持13种电脑架构,性能比其他编译器优越并为商业所用。[18]

EGCS克隆 编辑

由于GCC是在GPL许可下授权的,其他为C以外语言编写接口的程序员可以自由的开发其自己的编译器分支,只要他们遵守GPL许可条款。但是,多分叉在日后体现出低效和不便的特点;而且人们很难使热爱稳定性胜过新特性的GCC官方项目接受他们的分支。[19]FSF对添加到GCC 2.x官方版本(1992年开始开发)中的内容进行了相当严格的控制,以至于被Eric S. Raymond在《大教堂与集市》中形容为 "大教堂 "开发模式。

在1997年,一群不滿GCC緩慢且封閉的創作環境者,組織了一個名為实验性/增强型GNU编译器系统(Experimental/Enhanced GNU Compiler System)的專案[19][14],将几个实验性分叉合并为一个项目。其基础是GCC的开发快照(大概取自2.7.2,后来跟进到2.8.1)。合并内容包括g77(Fortran)、PGCC(P5 Pentium优化的GCC)[14],许多C++的改进,以及许多新的架构和操作系统变种。[20]

这两个项目都密切观察着彼此的动态,但是EGCS的发展明显更活跃,因此FSF正式停止他们对GCC 2.x编译器的开发并希望EGCS成为GCC的官方版本。在1999年4月EGCS项目被任命为为GCC的维护者。随着1999年7月GCC 2.95的发布,这两个项目再次联合起来。[21][14]此后,GCC在一个指导委员会的指导下,来自各国的程序员小组会对其进行维护。[22]

由于缺乏维护,GCC 3 (2002)移除了CHILL的前端支持。[23]在版本4.0之前,GCC 3中的Fortran前端是g77,只支持FORTRAN 77。该前端后来被废弃,取而代之的是新GNU Fortran前端,支持Fortran 95Fortran 2003Fortran 2008的大部分内容 。[24][25]从GCC 4.8版开始,GCC由C++语言编写。[26]从GCC 5到GCC 7都保留了对Cilk Plus的支持。[27][28]

GCC已经被移植到各种指令集架构上,并被广泛部署为开发自由或专有软件的工具。GCC还可用于许多嵌入式系统,包括Symbian(称为gcce)[29]、基于ARM和基于Power ISA的芯片。[30]该编译器可以在各种平台上输出,包括游戏控制器中的PS2[31]Cell微处理器架构的PS3[32]以及Dreamcast[33]相比于其他编译器,GCC编译器被部署在更多的操作系统和处理器上。[34]

目前支持的语言 编辑

截至2022年9月,GCC 12.2版内含Cgcc)、C++g++)、Objective-CFortrangfortran)、AdaGNAT)、Gogccgo)以及D (gdc,从9.1版开始)[35]编程语言的前端。[36]OpenMPOpenACC并行语言拓展从GCC 5.1开始支持。[37][38]GCC 7之前的版本也支持Javagcj),允许将java编译为机器语言。[39]

有关C++和C的语言版本支持,从GCC 11.1开始默认为gnu++17C++17超集;以及gnu11C11超集,还提供严格的标准支持。GCC也对C++20和即将到来的C++23标准提供实验性部分支持。[40]

有许多为其它语言编写的第三方前端,比如Pascalgpc英语GNU Pascal)、Modula-2Modula-3Mercury语言以及VHDLGHDL)。[36]一些实验性分支可支持更多语言,比如GCC UPC编译器还支持UPC[41]Rust[42]

支援的處理器架構 编辑

 
GCC在Windows系统上编译Hello World程序

GCC 11.1版本支持的处理器包括:[43]

  • AArch64
  • Alpha
  • ARM
  • AVR
  • Blackfin英语Blackfin
  • eBPF英语eBPF
  • Epiphany英语Adapteva#Products(GCC 4.8)
  • H8/300英语Hitachi H8
  • HC12英语HC12
  • IA-32 (x86)
  • IA-64 (Intel安腾)
  • MIPS
  • Motorola 68000
  • MSP430
  • Nvidia GPU
  • Nvidia并行指令集英语Parallel_Thread_Execution
  • PA-RISC
  • PDP-11
  • PowerPC
  • R8C英语R8C / M16C英语M16C / M32C英语M32C
  • RISC-V
  • SPARC
  • SuperH
  • System/390英语System/390 / zSeries英语zSeries
  • VAX
  • x86-64

标准版本支持的少见处理器如下:

  • 68HC11英语68HC11
  • A29K英语A29K
  • C6x英语C6x
  • CR16
  • D30V英语D30V
  • DSP16xx英语DSP16xx
  • ETRAX CRIS英语ETRAX CRIS
  • FR-30英语Fujitsu FR
  • FR-V英语FR-V
  • IBM ROMP
  • Intel i960
  • IP2000英语IP2000
  • M32R英语M32R
  • MCORE英语MCORE
  • MIL-STD-1750A
  • MMIX英语MMIX
  • MN10200英语MN10200
  • MN10300英语MN10300
  • Motorola 88000
  • NS32K英语NS320xx
  • RL78英语RL78
  • Stormy16英语Stormy16
  • V850英语V850
  • Xtensa英语Xtensa

非FSF维护的GCC版本支持的处理器如下:

  • Cortus APS3英语Cortus APS3
  • ARC英语ARC (processor)
  • AVR32英语AVR32
  • C166英语C166C167英语C167
  • D10V英语D10V
  • EISC英语EISC
  • eSi-RISC英语eSi-RISC
  • Hexagon英语Hexagon (processor)[44]
  • LatticeMico32英语LatticeMico32
  • LatticeMico8英语LatticeMico8
  • MeP英语MeP
  • MicroBlaze英语MicroBlaze
  • Motorola 6809英语Motorola 6809
  • MRISC32英语MRISC32
  • MSP430
  • NEC SX architecture英语NEC SX architecture[45]
  • Nios IINios英语Nios embedded processor
  • OpenRISC英语OpenRISC
  • PDP-10
  • PIC24/dsPIC英语PIC30#PIC24 and dsPIC 16-bit microcontrollers
  • PIC32英语PIC30#PIC32 32-bit microcontrollers
  • Propeller英语Parallax Propeller
  • Saturn (HP48XGCC)
  • System/370英语System/370
  • TIGCC英语TIGCC (m68k英语m68k变种)
  • TMS9900英语TMS9900
  • TriCore英语TriCore
  • Z8000英语Z8000
  • ZPU英语ZPU (microprocessor)

GCJ Java编译器可以输出机器语言或者Java虚拟机Java字节码[46]当重定向GCC到新的平台上,经常会用到自举英语bootstrapping (compilers)。 Motorola 68000,Zilog Z80以及其他处理器也可在为德州仪器惠普夏普以及卡西欧可编程图形计算器设计的GCC编译器上输出。[47]

设计 编辑

 
GCC 的扩展编译流程概览,包括专门的程序如预处理器汇编器链接器
 
GCC 遵循多语言和多CPU编译器的典型三段架构。 所有程序树都在“中介界面”转换为通用代码,允许所有语言共享代码优化英语Program_optimization工具和二进制码英语Binary_code生成工具。

GCC的外部介面遵循UNIX使用惯例。用户输入特定语言的驱动程序码(C语言为gcc,C++为g++,如此不一而足),该程序解释命令语句,调用实际编译器,在输出界面上运行汇编器,然后选择性地运行链接器,产生一个完整的可执行二进制文件。

每种语言的编译器都是一个独立的程序,可读取源代码并输出机器码。所有語言的編譯器都擁有共通的中介架構:各语言前端解析符合此語言的原始碼,並產生一抽象語法樹。如有必要,这些代码会被转换为中介端的输入表示,即所谓的 GENERIC 形式;然后中介端会逐渐将程序转换为最终形式。编译器优化静态代码分析技术(例如FORTIFY_SOURCE[48],一种尝试发现緩衝區溢位的编译器指令)也会在源代码编译时应用。这些操作都是在多种表示法上工作,其中主要是独立于架构的GIMPLE表示法和独立于架构的RTL表示法。最终,机器码由傑克·戴維森英语Jack Davidson克里斯·弗雷澤英语Chris Fraser發明的算法产生。

除了Ada前端主要以Ada寫成,GCC大部分是用C语言编写的。GCC发行版包含主要以各自语言编写的Ada和C++标准库。[49]在一些平台上,GCC发行版还包括一个低级运行库libgcc该运行库由独立于机器的C语言和特定处理器的机器码组合编写,可处理目标处理器不能直接执行的复杂算术运算。[50]

GCC使用了许多额外的工具。虽然这些工具在UNIXLinux发行版中基本为默认安装的,但是Windows系统通常没有。这些工具包括PerlFlexBison和其他常用工具;还需要额外的依赖库GMP、MPC和MPFR英语MPFR[51]

2010年5月,GCC指导委员会决定允许使用C++编译器来编译GCC。[52] 编译器计划主要用C语言编写,并加上C++的一个子集特性。之所以这样做是为了了让GCC的开发者能够使用C++的析构器泛型功能。[53]2012年8月,GCC指导委员会宣布,GCC将以C++为源语言。[54]这意味着,要从源代码编写GCC编译器,需要一个能够理解ISO/IEC C++03标准的C++编译器。2020年5月18日,GCC从ISO/IEC C++03标准转向ISO/IEC C++11标准(即需要改写编译器本身;默认情况下可编译C++早期版本)。[55]

前端介面 编辑

 
前端包括预处理、词法分析语法分析(解析)和句意分析。编译器前端的目标是根据编程语言语法和语义接受或拒绝输入程序,识别错误并将有效的程序表述传递给编译器后端。这个例子展示了编译器前端对一个用C语言编写的简单程序进行词法分析和语法分析的步骤。

每个前端都使用一个分析器来产生给定的源代码的一个抽象语法树。由于语法树的抽象性,不同语言的源代码都可以被同一个后端处理。GCC一开始使用bison生成的LALR语法分析器,但在2004年逐渐转向用于C++的递归下降解析器[56],并在 2006 年用于CObjective-C[57]。2021年开始,所有前端都使用递归下降解析器

在 GCC 4.0 之前,程序的语法树结构不完全独立于输出的目标处理器架构。对于不同语言的前端来说,语法树的含义可能不同;而且前端可以提供它們特別的語法樹規則。随着 GENERIC 和 GIMPLE 的引入,这种情况得以避免。这是两种新的独立于语言的语法树形式,随GCC 4.0引入编译器前端。GENERIC更复杂,是一种基于 GCC 3.x Java 前端的中介表示。 GIMPLE 是一个简化的 GENERIC,其中各种结构被简化为多个 GIMPLE 指令。 C、C++ 和 Java 前端直接在前端生成 GENERIC。 相反,其他前端在解析后会有不同的中介表示,这些中介表示将转换为 GENERIC。前端生成GENERIC之後再使用「gimplifier」技術简化GENERIC的複雜結構,成為一較簡單的以SSA为基礎的GIMPLE形式,一种强大的,独立于语言和体系结构的全局(函数范围)优化的通用语言。

中介介面 编辑

GENERIC 和 GIMPLE 编辑

GENERIC 是一种中间表示语言,在将源代码编译成可执行二进制文件时用作“中介端”。GCC的所有前端都指向GENERIC的子集GIMPLE。GCC 的中间阶段进行所有的独立于编译语言和目标架构的代码分析和优化,从 GENERIC 表示法开始[58]将其转译为暫存器傳遞語言(RTL)。GENERIC 表示只包含中介端优化后的指令式编程结构的子集。

在将源代码转译为GIMPLE表示时[59],会使用临时变量将复杂表达式拆分为三位址碼。这种表示法的灵感来自于 Laurie J. Hendren[60] 在 McCAT 编译器[61]中提出的 SIMPLE 表示法,用于简化指令式程序的分析和优化。

优化 编辑

一般編譯器作者會將語法樹的最佳化放在前端,但其實此步驟並不看語言的種類而有不同,且不需要用到語法解析器。因此GCC作者們將此步驟歸入通稱為中介階段的部分裡。此類的最佳化包括消解死碼、消解重複運算與全域數值重編碼等。許多最佳化技巧也正在實作中。

後端介面 编辑

GCC的后端部分是由预处理器宏和目标架构特有的函数指定的,例如定义其字节序字大小调用约定。后端的前半部分使用这些来决定RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉換成目標架構的格式。在任何时候,构成程序的实际RTL指令都必须符合目标架构的机器描述标准。

机器描述文件包含了RTL模式、操作数约束和输出最终汇编的代码片段。这些约束条件表明,一个特定的RTL模式可能只适用于某些硬件寄存器,或者某些只允许有限大小的即时操作数偏移(例如12、16、24、...位偏移,等等)的架构。在RTL生成过程中,给定目标架构的约束条件会被检查。为了发布一个给定的RTL片段,它必须与机器描述文件中的一个或多个RTL模式相匹配,并满足该模式的约束条件;否则,就无法将最终的RTL转换成机器代码。

在编译结束时,有效RTL会被简化为严格的形式,其中每条指令都指向真实的机器寄存器、和目标机器描述文件中的一种模式。严格化RTL是个相当复杂的工作:首先是寄存器分配,选择真实的硬件寄存器来取代最初分配的伪寄存器;还有重载,未分配实际硬件寄存器的伪寄存器都会被溢出到堆栈中,并生成执行此溢出的 RTL。过大的偏移量无法适合实际指令,故会被分解成服从偏移量约束的RTL序列。

後端在最后通过调用与每个模式相关联的一小段代码来构建机器代码,以使用在重载时选择的最终寄存器、偏移量和地址从目标指令集中生成真正的指令。当汇编生成片段只是一个字符串时,就会执行寄存器、偏移量和/或地址到字符串的简单字符串替换。汇编生成片段也可以是一个简短的C代码块,但最终也会返回一个包含有效汇编代码的字符串。

C++标准库 编辑

GCC 项目在CPLv3的许可下实现了C++标准库(libstdc++)。[62][63]目前的最新版本是11。

替GCC程式除錯 编辑

GNU除錯器是一個為GCC除錯的程式。其他特殊用途的除錯工具是Valgrind,用以發現内存泄漏(memory leak)。而GNU測量器(gprof)可以得知程式中某些函式花費多少時間,以及其呼叫頻率;此功能需要使用者在編譯時選定測量(profiling)選項。

GCC内嵌汇编 编辑

内嵌汇编也称行内汇编,是把汇编语言代码块插在C语言语句之间。详情参见GCC-Inline-Assembly-HOWTO.html(页面存档备份,存于互联网档案馆

参考文献 编辑

引用 编辑

  1. ^ GCC 12.3 Released. 2023年5月8日 [2023年5月9日] (英語). 
  2. ^ GCC 11.4 Released. 2023年5月29日 [2023年5月29日] (英語). 
  3. ^ 3.0 3.1 "GCC 13.2 Released"; 检索日期: 2023年7月27日; 作者姓名字符串: Richard Biener; 出版日期: 2023年7月27日.
  4. ^ 4.0 4.1 Víctor Rodríguez. Cutting Edge Toolchain (Latest Features in GCC/GLIBC). youtube.com. Linux Foundation. 2019-10-01 [2021-01-19]. (原始内容存档于2021-11-07). 
  5. ^ The LLVM Compiler Infrastructure Project. llvm.org. [2022-09-24]. (原始内容于2023-01-18). 
  6. ^ Apple's GPLv3 purge. meta.ath0.com. [2021-01-12]. (原始内容于2023-01-18) (美国英语). 
  7. ^ Linnemann, Reid. Why Clang. 2012-06-20 [2021-01-12]. (原始内容于2023-01-18). 
  8. ^ . 2007-10-11 [2021-01-12]. (原始内容存档于2007-10-11). 
  9. ^ GCC's move to C++. [2013-05-01]. (原始内容于2013-06-14). 
  10. ^ Taylor的演讲簡報 (PDF). [2018-05-19]. (原始内容 (PDF)于2018-07-01). 
  11. ^ von Hagen, William. The Definitive Guide to GCC. Definitive Guides 2nd. Apress. 2006: XXVII. ISBN 978-1-4302-0219-6. So he wrote to VUCK's author asking if GNU could use it. Evidently, VUCK's developer was uncooperative, responding that the university was free but that the compiler was not. 
  12. ^ 12.0 12.1 12.2 Stallman, Richard. About the GNU Project. The GNU Project. 2011-09-20 [2011-10-09]. (原始内容于2011-04-24). 
  13. ^ Puzo, Jerome E. (编). Gnu's Zoo. GNU's Bulletin (Free Software Foundation). February 1986, 1 (1) [2007-08-11]. (原始内容于2015-06-23). 
  14. ^ 14.0 14.1 14.2 14.3 von Hagen, William. The Definitive Guide to GCC. Definitive Guides 2nd. Apress. 2006: XXVII. ISBN 978-1-4302-0219-6. 
  15. ^ Richard M. Stallman (forwarded by Leonard H. Tower Jr.). GNU C compiler beta test release. Newsgroup: comp.lang.c 请检查|newsgroup=值 (帮助). March 22, 1987 [October 9, 2011]. (原始内容于2013-06-02). 
  16. ^ Stallman, Richard M., Contributors to GNU CC, Using and Porting the GNU Compiler Collection (GCC), Free Software Foundation, Inc.: 7, 2001-06-22 [First published 1988] [2015-06-18], (原始内容于2023-01-18). 
  17. ^ Salus, Peter H. Chapter 10. SUN and gcc. The Daemon, the Gnu and the Penguin. Groklaw. 2005 [2022-09-24]. (原始内容于2022-06-20). 
  18. ^ Garfinkel, Simson L. Get ready for GNU software. Computerworld. 1990-08-06: 102. 
  19. ^ 19.0 19.1 Henkel-Wallace, David, A new compiler project to merge the existing GCC forks, 1997-08-15 [2012-05-25], (原始内容于2023-01-18). 
  20. ^ The Short History of GCC development. www.softpanorama.org. [2021-01-24]. (原始内容于2022-11-09). 
  21. ^ History - GCC Wiki. gcc.gnu.org. [2020-09-28]. (原始内容于2023-01-18). 
  22. ^ GCC steering committee - GNU Project. gcc.gnu.org. [2022-09-24]. (原始内容于2023-01-18). 
  23. ^ PATCH] Remove chill. gcc.gnu.org. [2010-07-29]. (原始内容于2016-10-20). 
  24. ^ Chart of Fortran 2003 Features supported by GNU Fortran. GNU. [2009-06-25]. (原始内容于2023-01-18). 
  25. ^ Chart of Fortran 2008 Features supported by GNU Fortran. GNU. [2009-06-25]. (原始内容于2023-01-18). 
  26. ^ GCC 4.8 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. [2022-09-24]. (原始内容于2015-12-08). 
  27. ^ GCC 5 Release Series — Changes, New Features, and Fixes. gcc.gnu.org. [2022-09-24]. (原始内容于2023-01-18). 
  28. ^ GCC 8 Release Series — Changes, New Features, and Fixes. gcc.gnu.org. [2022-09-24]. (原始内容于2018-11-29). 
  29. ^ Symbian GCC Improvement Project. [2007-11-08]. (原始内容于2014-08-01). 
  30. ^ . [2021-01-24]. (原始内容存档于2011-06-07). 
  31. ^ . ps2stuff. 2002-06-08 [2008-12-12]. (原始内容存档于2008-12-11). 
  32. ^ CompileFarm - GCC Wiki. gcc.gnu.org. [2022-09-25]. (原始内容于2023-01-18). 
  33. ^ . [2008-12-12]. (原始内容存档于2002-12-20). 
  34. ^ Linux Information Project. LINFO. [2010-04-27]. (原始内容于2023-01-03). The GCC has been ported to (i.e., modified to run on) more than 60 platforms, which is more than for any other compiler. 
  35. ^ The D Language Front-End Finally Merged Into GCC 9 - Phoronix. phoronix.com. [2021-01-19]. (原始内容于2022-05-17). 
  36. ^ 36.0 36.1 GCC Front Ends. gnu.org. 2022-04-16 [2022-09-25]. (原始内容于2023-01-18). 
  37. ^ 引用错误:没有为名为:2的参考文献提供内容
  38. ^ GCC 5 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. 2015-04-22 [2022-09-25]. (原始内容于2023-01-18). 
  39. ^ GCC 7 Release Series. GCC 7 Release Series: Changes, New Features, and Fixes. gnu.org. 2017-05-02 [2022-09-25]. (原始内容于2020-09-02). 
  40. ^ C++ Standards Support in GCC. gcc.gnu.org. 2022-09-09 [2022-09-25]. (原始内容于2022-04-20). 
  41. ^ GCC UPC (GCC Unified Parallel C). Intrepid Technology, Inc. 2006-02-20 [2009-03-11]. (原始内容于2010-02-11). 
  42. ^ Spengler, Brad. Open Source Security, Inc. Announces Funding of GCC Front-End for Rust. 2021-01-12. (原始内容于2021-04-25). 
  43. ^ Option Summary (Using the GNU Compiler Collection (GCC)). gcc.gnu.org. [2020-08-21]. (原始内容于2023-01-18). 
  44. ^ Hexagon Project Wiki. [2022-09-25]. (原始内容于2013-12-24). 
  45. ^ Google Code Archive - Long-term storage for Google Code Project Hosting.. code.google.com. [2022-09-25]. (原始内容于2022-09-25). 
  46. ^ . [2010-04-22]. (原始内容存档于2007-05-09). 
  47. ^ graphing calculators#programming
  48. ^ Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE). Security Features. fedoraproject.org. [2022-09-26]. (原始内容于2007-01-07). 
  49. ^ languages used to make GCC. [2022-09-26]. (原始内容于2008-05-27). 
  50. ^ GCC generates calls to routines in this library automatically, whenever it needs to perform some operation that is too complicated to emit inline code for.. 4 The GCC low-level runtime library. GCC.org. [2022-09-26]. (原始内容于2023-01-18). 
  51. ^ Prerequisites for GCC - GNU Project. gcc.gnu.org. 2022-04-29 [2022-09-26]. (原始内容于2023-01-18). 
  52. ^ GCC allows C++ – to some degree. The H. 2010-06-01 [2022-09-26]. (原始内容于2022-09-26). 
  53. ^ Re: Efforts to attract more users?. lists.gnu.org. [2022-09-26]. (原始内容于2023-01-18). 
  54. ^ GCC 4.8 Release Series: Changes, New Features, and Fixes. [2013-10-04]. (原始内容于2015-12-08). 
  55. ^ bootstrap: Update requirement to C++11.. GitHub. 2020-05-19 [2022-09-27]. (原始内容于2022-09-29) –通过github. 
  56. ^ GCC 3.4 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. gcc.gnu.org. 2021-07-28 [2022-09-27]. (原始内容于2023-01-18). 
  57. ^ GCC 4.1 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. 2021-10-18 [2022-09-27]. (原始内容于2023-01-18). 
  58. ^ GENERIC (GNU Compiler Collection (GCC) Internals). gcc.gnu.org. [2022-09-27]. (原始内容于2023-01-18). 
  59. ^ GIMPLE (GNU Compiler Collection (GCC) Internals). gcc.gnu.org. [2022-09-27]. (原始内容于2023-01-18). 
  60. ^ Laurie Hendren's Home Page. www.sable.mcgill.ca. [2022-09-27]. (原始内容于2022-09-27). 
  61. ^ . [2022-09-27]. (原始内容存档于2004-08-12). 
  62. ^ The GNU C++ Library. GNU Project. [2021-02-21]. (原始内容于2022-12-25). 
  63. ^ License. GNU Project. [2021-02-21]. (原始内容于2023-01-18). 

来源 编辑

更多閱讀 编辑

  • Arthur Griffith, GCC: The Complete Reference. McGrawHill/Osborne. ISBN 0-07-222405-3.
  • Kerner, Sean Michael. Open Source GCC 4.0: Older, Faster. internetnews.com. 2005-04-22 [2006-12-27]. (原始内容于2006-09-17). 
  • Kerner, Sean Michael. New GCC Heavy on Optimization. internetnews.com. 2006-03-02 [2006-12-27]. (原始内容于2006-10-22). 

外部链接 编辑

  • GCC官方网站(页面存档备份,存于互联网档案馆
  • YouTube上的淺談GCC編譯技術Break Compilation Boundaries with GCC
  • - 由Nabble(页面存档备份,存于互联网档案馆)維持,整理所有gcc通訊討論串,並整合入一個可搜尋介面中。

参见 编辑

  • GCC目前包含了贝姆垃圾收集器,一個為C/C++所設計的垃圾回收器
  • distcc - 為分散式編譯所設計的軟體,以GCC為協同軟體。
  • ccache - 用于缓存编译的中间结果,加快重新编译的速度。
  • LLVM - 低層虛擬機器編譯器架構,其中的 clang (Obj-)C(++) 编译器实现了大部分 GNU C 拓展。
  • MinGW - 將GNU開發工具移植到Win32平臺下的計畫
  • Cygwin - 在 Windows 上執行 Unix 程式的模擬軟體。
  • GCC Summit
  • OpenWatcom - 另一個開放原碼的C++/Fortran編譯器。
  • Code Sourcery - 一個GCC顧問公司。
  • ggcc - 全球化GCC專案。

此条目的主題是gnu编译器套裝, 关于關於与, 標題相近或相同的条目, 請見, 消歧義, gnu编译器套裝, 英語, compiler, collection, 縮寫為, 是gnu計劃制作的一种优化编译器, 支持各种编程語言, 操作系统, 计算机系统结构, 该编译器是以gpl及lgpl許可證所發行的自由軟體, 也是gnu計劃的关键部分, 还是gnu工具链的主要組成部份之一, 特别是其中的c语言编译器, 也常被认为是跨平台编译器的事实标准, 1985年由理查德, 马修, 斯托曼開始發展, 現在由自由軟體基金會負責維護. 此条目的主題是GNU编译器套裝 关于關於与 GCC 標題相近或相同的条目 請見 GCC 消歧義 GNU编译器套裝 英語 GNU Compiler Collection 縮寫為GCC 是GNU計劃制作的一种优化编译器 支持各种编程語言 操作系统 计算机系统结构 该编译器是以GPL及LGPL許可證所發行的自由軟體 也是GNU計劃的关键部分 还是GNU工具链的主要組成部份之一 GCC 特别是其中的C语言编译器 也常被认为是跨平台编译器的事实标准 1985年由理查德 马修 斯托曼開始發展 現在由自由軟體基金會負責維護工作 截至2019年 GCC大约有1500万行代码 是现存最大的自由程序之一 4 它在自由软件的发展中发挥了重要作用 不仅是一个工具 还是一个典例 GNU编译器套裝GCC 10 2编译自身源代码截图開發者GNU計劃首次发布1987年5月23日 1987 05 23 当前版本12 3 2023年5月8日 維護版本 1 11 4 2023年5月29日 維護版本 2 13 2 2023年7月27日 穩定版本 3 源代码库gcc wbr gnu wbr org wbr git wbr gcc wbr git编程语言C 操作系统跨平台文件大小约一千五百万行 4 语言英语类型编译器许可协议GNU通用公共许可证第三版或更新网站gcc wbr gnu wbr org原名為GNU C語言編譯器 GNU C Compiler 因為它原本只能處理C語言 同年12月 新的GCC编译器可以编译C 语言 后来又为Fortran Pascal Objective C Java Ada Go等其他語言开发了前端 C和C 编译器也支持OpenMP和OpenACC规范 GCC编译器已经被移植到比其他编译器更多的平台和指令集架构上 并被广泛部署在开发自由和专有软件的工具中 GCC还可用于许多嵌入式系统 包括基于ARM和Power ISA 英语 Power ISA 的芯片 GCC不仅是GNU操作系统的官方编译器 还是许多类UNIX系统和Linux发行版的标准编译器 BSD家族中的大部分操作系统也在GCC发布之后转用GCC 不过FreeBSD OpenBSD和Apple macOS已经转向了Clang编译器 5 主要是因为许可问题 6 7 8 GCC也可以编译Windows Android iOS Solaris HP UX IBM AIX和DOS系统的代码 GCC原本用C開發 後來因為LLVM Clang的崛起 它更快地將開發語言轉換為C 許多C的愛好者在對C 一知半解的情況下主觀認定C 的性能一定會輸給C 但是Ian Lance Taylor給出了不同的意見 並表明C 不但性能不輸給C 而且能設計出更好 更容易維護的程式 9 10 目录 1 历史 1 1 EGCS克隆 2 目前支持的语言 3 支援的處理器架構 4 设计 4 1 前端介面 4 2 中介介面 4 2 1 GENERIC 和 GIMPLE 4 2 2 优化 4 3 後端介面 4 4 C 标准库 5 替GCC程式除錯 6 GCC内嵌汇编 7 参考文献 7 1 引用 7 2 来源 8 更多閱讀 9 外部链接 10 参见历史 编辑1983年底 为了引导GNU操作系统 理查德 马修 斯托曼向阿姆斯特丹编译器套件 自由大学编译器套件 的作者安德鲁 塔能鲍姆请求在GNU上允许使用该编译器 但是作者告知他该编译器仅对大学免费 因此 他打算开发一个不同的编译器 11 一开始他打算与Len Tower和其他人将勞倫斯利佛摩國家實驗室的一个现有编译器从Pastel改写成C 12 13 但是他在给利弗莫尔编译器写了一个新的C前端后 发现它需要数兆字节的堆栈空间 只有64KB的68000 Unix系统上无法运行 因此 他打算自己从头写一个编译器 12 总而言之 尽管斯托曼确实使用了他自己写的C前端 他并没有将任何Pastel编译器的代码放在GCC中 12 14 GCC于1987年3月22日在麻省理工学院的文件传输协议上发布 15 斯托曼被列为作者 也提及了其他人并感谢他们的贡献 Jack Davidson和Christopher Fraser给出了使用暫存器傳遞語言作为中间语言的思路 Paul Rubin为预处理器贡献良多 以及Leonard Tower写了 部分解析器 RTL生成器 RTL定义和Vax机器描述 16 被Peter H Salus 英语 Peter H Salus 誉为 自由软件第一击 的GNU编译器发布正值太阳微系统将其操作系统与其开发工具解绑 并提价单独出售 这使得许多客户购买或下载GCC而非供应商的工具 17 尽管斯托曼认为GNU Emacs是他的主要工程 但截至1990年 GCC支持13种电脑架构 性能比其他编译器优越并为商业所用 18 EGCS克隆 编辑 由于GCC是在GPL许可下授权的 其他为C以外语言编写接口的程序员可以自由的开发其自己的编译器分支 只要他们遵守GPL许可条款 但是 多分叉在日后体现出低效和不便的特点 而且人们很难使热爱稳定性胜过新特性的GCC官方项目接受他们的分支 19 FSF对添加到GCC 2 x官方版本 1992年开始开发 中的内容进行了相当严格的控制 以至于被Eric S Raymond在 大教堂与集市 中形容为 大教堂 开发模式 在1997年 一群不滿GCC緩慢且封閉的創作環境者 組織了一個名為实验性 增强型GNU编译器系统 Experimental Enhanced GNU Compiler System 的專案 19 14 将几个实验性分叉合并为一个项目 其基础是GCC的开发快照 大概取自2 7 2 后来跟进到2 8 1 合并内容包括g77 Fortran PGCC P5 Pentium优化的GCC 14 许多C 的改进 以及许多新的架构和操作系统变种 20 这两个项目都密切观察着彼此的动态 但是EGCS的发展明显更活跃 因此FSF正式停止他们对GCC 2 x编译器的开发并希望EGCS成为GCC的官方版本 在1999年4月EGCS项目被任命为为GCC的维护者 随着1999年7月GCC 2 95的发布 这两个项目再次联合起来 21 14 此后 GCC在一个指导委员会的指导下 来自各国的程序员小组会对其进行维护 22 由于缺乏维护 GCC 3 2002 移除了CHILL的前端支持 23 在版本4 0之前 GCC 3中的Fortran前端是g77 只支持FORTRAN 77 该前端后来被废弃 取而代之的是新GNU Fortran前端 支持Fortran 95和Fortran 2003及Fortran 2008的大部分内容 24 25 从GCC 4 8版开始 GCC由C 语言编写 26 从GCC 5到GCC 7都保留了对Cilk Plus的支持 27 28 GCC已经被移植到各种指令集架构上 并被广泛部署为开发自由或专有软件的工具 GCC还可用于许多嵌入式系统 包括Symbian 称为gcce 29 基于ARM和基于Power ISA的芯片 30 该编译器可以在各种平台上输出 包括游戏控制器中的PS2 31 Cell微处理器架构的PS3 32 以及Dreamcast 33 相比于其他编译器 GCC编译器被部署在更多的操作系统和处理器上 34 目前支持的语言 编辑截至2022年9月 GCC 12 2版内含C gcc C g Objective C Fortran a href Gfortran html class mw redirect title Gfortran gfortran a Ada GNAT Go gccgo 以及D gdc 从9 1版开始 35 编程语言的前端 36 OpenMP和OpenACC并行语言拓展从GCC 5 1开始支持 37 38 GCC 7之前的版本也支持Java a href GNU Compiler for Java html class mw redirect title GNU Compiler for Java gcj a 允许将java编译为机器语言 39 有关C 和C的语言版本支持 从GCC 11 1开始默认为gnu 17 C 17的超集 以及gnu11 C11的超集 还提供严格的标准支持 GCC也对C 20和即将到来的C 23标准提供实验性部分支持 40 有许多为其它语言编写的第三方前端 比如Pascal span class ilh all data orig title GNU Pascal data lang code en data lang name 英语 data foreign title GNU Pascal span class ilh page gpc span span class noprint ilh comment span class ilh lang 英语 span span class ilh colon span span class ilh link span lang en dir auto GNU Pascal span span span span Modula 2 Modula 3 Mercury语言以及VHDL GHDL 36 一些实验性分支可支持更多语言 比如GCC UPC编译器还支持UPC 41 和Rust 42 支援的處理器架構 编辑 nbsp GCC在Windows系统上编译Hello World程序GCC 11 1版本支持的处理器包括 43 AArch64 Alpha ARM AVR Blackfin 英语 Blackfin eBPF 英语 eBPF Epiphany 英语 Adapteva Products GCC 4 8 H8 300 英语 Hitachi H8 HC12 英语 HC12 IA 32 x86 IA 64 Intel安腾 MIPS Motorola 68000 MSP430 Nvidia GPU Nvidia并行指令集 英语 Parallel Thread Execution PA RISC PDP 11 PowerPC R8C 英语 R8C M16C 英语 M16C M32C 英语 M32C RISC V SPARC SuperH System 390 英语 System 390 zSeries 英语 zSeries VAX x86 64 标准版本支持的少见处理器如下 68HC11 英语 68HC11 A29K 英语 A29K C6x 英语 C6x CR16 D30V 英语 D30V DSP16xx 英语 DSP16xx ETRAX CRIS 英语 ETRAX CRIS FR 30 英语 Fujitsu FR FR V 英语 FR V IBM ROMP Intel i960 IP2000 英语 IP2000 M32R 英语 M32R MCORE 英语 MCORE MIL STD 1750A MMIX 英语 MMIX MN10200 英语 MN10200 MN10300 英语 MN10300 Motorola 88000 NS32K 英语 NS320xx RL78 英语 RL78 Stormy16 英语 Stormy16 V850 英语 V850 Xtensa 英语 Xtensa 非FSF维护的GCC版本支持的处理器如下 Cortus APS3 英语 Cortus APS3 ARC 英语 ARC processor AVR32 英语 AVR32 C166 英语 C166 和C167 英语 C167 D10V 英语 D10V EISC 英语 EISC eSi RISC 英语 eSi RISC Hexagon 英语 Hexagon processor 44 LatticeMico32 英语 LatticeMico32 LatticeMico8 英语 LatticeMico8 MeP 英语 MeP MicroBlaze 英语 MicroBlaze Motorola 6809 英语 Motorola 6809 MRISC32 英语 MRISC32 MSP430 NEC SX architecture 英语 NEC SX architecture 45 Nios II和Nios 英语 Nios embedded processor OpenRISC 英语 OpenRISC PDP 10 PIC24 dsPIC 英语 PIC30 PIC24 and dsPIC 16 bit microcontrollers PIC32 英语 PIC30 PIC32 32 bit microcontrollers Propeller 英语 Parallax Propeller Saturn HP48XGCC System 370 英语 System 370 TIGCC 英语 TIGCC m68k 英语 m68k 变种 TMS9900 英语 TMS9900 TriCore 英语 TriCore Z8000 英语 Z8000 ZPU 英语 ZPU microprocessor GCJ Java编译器可以输出机器语言或者Java虚拟机的Java字节码 46 当重定向GCC到新的平台上 经常会用到自举 英语 bootstrapping compilers Motorola 68000 Zilog Z80以及其他处理器也可在为德州仪器 惠普 夏普以及卡西欧可编程图形计算器设计的GCC编译器上输出 47 设计 编辑 nbsp GCC 的扩展编译流程概览 包括专门的程序如预处理器 汇编器和链接器 nbsp GCC 遵循多语言和多CPU编译器的典型三段架构 所有程序树都在 中介界面 转换为通用代码 允许所有语言共享代码优化 英语 Program optimization 工具和二进制码 英语 Binary code 生成工具 GCC的外部介面遵循UNIX使用惯例 用户输入特定语言的驱动程序码 C语言为gcc C 为g 如此不一而足 该程序解释命令语句 调用实际编译器 在输出界面上运行汇编器 然后选择性地运行链接器 产生一个完整的可执行二进制文件 每种语言的编译器都是一个独立的程序 可读取源代码并输出机器码 所有語言的編譯器都擁有共通的中介架構 各语言前端解析符合此語言的原始碼 並產生一抽象語法樹 如有必要 这些代码会被转换为中介端的输入表示 即所谓的 GENERIC 形式 然后中介端会逐渐将程序转换为最终形式 编译器优化和静态代码分析技术 例如FORTIFY SOURCE 48 一种尝试发现緩衝區溢位的编译器指令 也会在源代码编译时应用 这些操作都是在多种表示法上工作 其中主要是独立于架构的GIMPLE表示法和独立于架构的RTL表示法 最终 机器码由傑克 戴維森 英语 Jack Davidson 與克里斯 弗雷澤 英语 Chris Fraser 發明的算法产生 除了Ada前端主要以Ada寫成 GCC大部分是用C语言编写的 GCC发行版包含主要以各自语言编写的Ada和C 标准库 49 在一些平台上 GCC发行版还包括一个低级运行库libgcc该运行库由独立于机器的C语言和特定处理器的机器码组合编写 可处理目标处理器不能直接执行的复杂算术运算 50 GCC使用了许多额外的工具 虽然这些工具在UNIX和Linux发行版中基本为默认安装的 但是Windows系统通常没有 这些工具包括Perl Flex Bison和其他常用工具 还需要额外的依赖库GMP MPC和MPFR 英语 MPFR 51 2010年5月 GCC指导委员会决定允许使用C 编译器来编译GCC 52 编译器计划主要用C语言编写 并加上C 的一个子集特性 之所以这样做是为了了让GCC的开发者能够使用C 的析构器和泛型功能 53 2012年8月 GCC指导委员会宣布 GCC将以C 为源语言 54 这意味着 要从源代码编写GCC编译器 需要一个能够理解ISO IEC C 03标准的C 编译器 2020年5月18日 GCC从ISO IEC C 03标准转向ISO IEC C 11标准 即需要改写编译器本身 默认情况下可编译C 早期版本 55 前端介面 编辑 nbsp 前端包括预处理 词法分析 语法分析 解析 和句意分析 编译器前端的目标是根据编程语言语法和语义接受或拒绝输入程序 识别错误并将有效的程序表述传递给编译器后端 这个例子展示了编译器前端对一个用C语言编写的简单程序进行词法分析和语法分析的步骤 每个前端都使用一个分析器来产生给定的源代码的一个抽象语法树 由于语法树的抽象性 不同语言的源代码都可以被同一个后端处理 GCC一开始使用bison生成的LALR语法分析器 但在2004年逐渐转向用于C 的递归下降解析器 56 并在 2006 年用于C和Objective C 57 2021年开始 所有前端都使用递归下降解析器 在 GCC 4 0 之前 程序的语法树结构不完全独立于输出的目标处理器架构 对于不同语言的前端来说 语法树的含义可能不同 而且前端可以提供它們特別的語法樹規則 随着 GENERIC 和 GIMPLE 的引入 这种情况得以避免 这是两种新的独立于语言的语法树形式 随GCC 4 0引入编译器前端 GENERIC更复杂 是一种基于 GCC 3 x Java 前端的中介表示 GIMPLE 是一个简化的 GENERIC 其中各种结构被简化为多个 GIMPLE 指令 C C 和 Java 前端直接在前端生成 GENERIC 相反 其他前端在解析后会有不同的中介表示 这些中介表示将转换为 GENERIC 前端生成GENERIC之後再使用 gimplifier 技術简化GENERIC的複雜結構 成為一較簡單的以SSA为基礎的GIMPLE形式 一种强大的 独立于语言和体系结构的全局 函数范围 优化的通用语言 中介介面 编辑 GENERIC 和 GIMPLE 编辑 GENERIC 是一种中间表示语言 在将源代码编译成可执行二进制文件时用作 中介端 GCC的所有前端都指向GENERIC的子集GIMPLE GCC 的中间阶段进行所有的独立于编译语言和目标架构的代码分析和优化 从 GENERIC 表示法开始 58 将其转译为暫存器傳遞語言 RTL GENERIC 表示只包含中介端优化后的指令式编程结构的子集 在将源代码转译为GIMPLE表示时 59 会使用临时变量将复杂表达式拆分为三位址碼 这种表示法的灵感来自于 Laurie J Hendren 60 在 McCAT 编译器 61 中提出的 SIMPLE 表示法 用于简化指令式程序的分析和优化 优化 编辑 一般編譯器作者會將語法樹的最佳化放在前端 但其實此步驟並不看語言的種類而有不同 且不需要用到語法解析器 因此GCC作者們將此步驟歸入通稱為中介階段的部分裡 此類的最佳化包括消解死碼 消解重複運算與全域數值重編碼等 許多最佳化技巧也正在實作中 後端介面 编辑 GCC的后端部分是由预处理器宏和目标架构特有的函数指定的 例如定义其字节序 字大小和调用约定 后端的前半部分使用这些来决定RTL的生成形式 因此雖然GCC的RTL理論上不受處理器影響 但在此階段其抽象指令已被轉換成目標架構的格式 在任何时候 构成程序的实际RTL指令都必须符合目标架构的机器描述标准 机器描述文件包含了RTL模式 操作数约束和输出最终汇编的代码片段 这些约束条件表明 一个特定的RTL模式可能只适用于某些硬件寄存器 或者某些只允许有限大小的即时操作数偏移 例如12 16 24 位偏移 等等 的架构 在RTL生成过程中 给定目标架构的约束条件会被检查 为了发布一个给定的RTL片段 它必须与机器描述文件中的一个或多个RTL模式相匹配 并满足该模式的约束条件 否则 就无法将最终的RTL转换成机器代码 在编译结束时 有效RTL会被简化为严格的形式 其中每条指令都指向真实的机器寄存器 和目标机器描述文件中的一种模式 严格化RTL是个相当复杂的工作 首先是寄存器分配 选择真实的硬件寄存器来取代最初分配的伪寄存器 还有重载 未分配实际硬件寄存器的伪寄存器都会被溢出到堆栈中 并生成执行此溢出的 RTL 过大的偏移量无法适合实际指令 故会被分解成服从偏移量约束的RTL序列 後端在最后通过调用与每个模式相关联的一小段代码来构建机器代码 以使用在重载时选择的最终寄存器 偏移量和地址从目标指令集中生成真正的指令 当汇编生成片段只是一个字符串时 就会执行寄存器 偏移量和 或地址到字符串的简单字符串替换 汇编生成片段也可以是一个简短的C代码块 但最终也会返回一个包含有效汇编代码的字符串 C 标准库 编辑 GCC 项目在CPLv3的许可下实现了C 标准库 libstdc 62 63 目前的最新版本是11 替GCC程式除錯 编辑GNU除錯器是一個為GCC除錯的程式 其他特殊用途的除錯工具是Valgrind 用以發現内存泄漏 memory leak 而GNU測量器 gprof 可以得知程式中某些函式花費多少時間 以及其呼叫頻率 此功能需要使用者在編譯時選定測量 profiling 選項 GCC内嵌汇编 编辑内嵌汇编也称行内汇编 是把汇编语言代码块插在C语言语句之间 详情参见GCC Inline Assembly HOWTO html 页面存档备份 存于互联网档案馆 参考文献 编辑引用 编辑 GCC 12 3 Released 2023年5月8日 2023年5月9日 英語 引文格式1维护 未识别语文类型 link GCC 11 4 Released 2023年5月29日 2023年5月29日 英語 引文格式1维护 未识别语文类型 link 3 0 3 1 GCC 13 2 Released 检索日期 2023年7月27日 作者姓名字符串 Richard Biener 出版日期 2023年7月27日 4 0 4 1 Victor Rodriguez Cutting Edge Toolchain Latest Features in GCC GLIBC youtube com Linux Foundation 2019 10 01 2021 01 19 原始内容存档于2021 11 07 The LLVM Compiler Infrastructure Project llvm org 2022 09 24 原始内容存档于2023 01 18 Apple s GPLv3 purge meta ath0 com 2021 01 12 原始内容存档于2023 01 18 美国英语 Linnemann Reid Why Clang 2012 06 20 2021 01 12 原始内容存档于2023 01 18 August 29 2007 FreeBSD Foundation Newsletter August 29 2007 2007 10 11 2021 01 12 原始内容存档于2007 10 11 GCC s move to C 2013 05 01 原始内容存档于2013 06 14 Taylor的演讲簡報 PDF 2018 05 19 原始内容存档 PDF 于2018 07 01 von Hagen William The Definitive Guide to GCC Definitive Guides 2nd Apress 2006 XXVII ISBN 978 1 4302 0219 6 So he wrote to VUCK s author asking if GNU could use it Evidently VUCK s developer was uncooperative responding that the university was free but that the compiler was not 12 0 12 1 12 2 Stallman Richard About the GNU Project The GNU Project 2011 09 20 2011 10 09 原始内容存档于2011 04 24 Puzo Jerome E 编 Gnu s Zoo GNU s Bulletin Free Software Foundation February 1986 1 1 2007 08 11 原始内容存档于2015 06 23 14 0 14 1 14 2 14 3 von Hagen William The Definitive Guide to GCC Definitive Guides 2nd Apress 2006 XXVII ISBN 978 1 4302 0219 6 Richard M Stallman forwarded by Leonard H Tower Jr GNU C compiler beta test release Newsgroup comp lang c请检查 newsgroup 值 帮助 March 22 1987 October 9 2011 原始内容存档于2013 06 02 Stallman Richard M Contributors to GNU CC Using and Porting the GNU Compiler Collection GCC Free Software Foundation Inc 7 2001 06 22 First published 1988 2015 06 18 原始内容存档于2023 01 18 Salus Peter H Chapter 10 SUN and gcc The Daemon the Gnu and the Penguin Groklaw 2005 2022 09 24 原始内容存档于2022 06 20 Garfinkel Simson L Get ready for GNU software Computerworld 1990 08 06 102 19 0 19 1 Henkel Wallace David A new compiler project to merge the existing GCC forks 1997 08 15 2012 05 25 原始内容存档于2023 01 18 The Short History of GCC development www softpanorama org 2021 01 24 原始内容存档于2022 11 09 History GCC Wiki gcc gnu org 2020 09 28 原始内容存档于2023 01 18 GCC steering committee GNU Project gcc gnu org 2022 09 24 原始内容存档于2023 01 18 PATCH Remove chill gcc gnu org 2010 07 29 原始内容存档于2016 10 20 Chart of Fortran 2003 Features supported by GNU Fortran GNU 2009 06 25 原始内容存档于2023 01 18 Chart of Fortran 2008 Features supported by GNU Fortran GNU 2009 06 25 原始内容存档于2023 01 18 GCC 4 8 Release Series Changes New Features and Fixes GNU Project gcc gnu org 2022 09 24 原始内容存档于2015 12 08 GCC 5 Release Series Changes New Features and Fixes gcc gnu org 2022 09 24 原始内容存档于2023 01 18 GCC 8 Release Series Changes New Features and Fixes gcc gnu org 2022 09 24 原始内容存档于2018 11 29 Symbian GCC Improvement Project 2007 11 08 原始内容存档于2014 08 01 Linux Board Support Packages 2021 01 24 原始内容存档于2011 06 07 setting up gcc as a cross compiler ps2stuff 2002 06 08 2008 12 12 原始内容存档于2008 12 11 CompileFarm GCC Wiki gcc gnu org 2022 09 25 原始内容存档于2023 01 18 sh4 g guide 2008 12 12 原始内容存档于2002 12 20 Linux Information Project LINFO 2010 04 27 原始内容存档于2023 01 03 The GCC has been ported to i e modified to run on more than 60 platforms which is more than for any other compiler The D Language Front End Finally Merged Into GCC 9 Phoronix phoronix com 2021 01 19 原始内容存档于2022 05 17 36 0 36 1 GCC Front Ends gnu org 2022 04 16 2022 09 25 原始内容存档于2023 01 18 引用错误 没有为名为 2的参考文献提供内容 GCC 5 Release Series Changes New Features and Fixes GNU Project gcc gnu org 2015 04 22 2022 09 25 原始内容存档于2023 01 18 GCC 7 Release Series GCC 7 Release Series Changes New Features and Fixes gnu org 2017 05 02 2022 09 25 原始内容存档于2020 09 02 C Standards Support in GCC gcc gnu org 2022 09 09 2022 09 25 原始内容存档于2022 04 20 GCC UPC GCC Unified Parallel C Intrepid Technology Inc 2006 02 20 2009 03 11 原始内容存档于2010 02 11 Spengler Brad Open Source Security Inc Announces Funding of GCC Front End for Rust 2021 01 12 原始内容存档于2021 04 25 Option Summary Using the GNU Compiler Collection GCC gcc gnu org 2020 08 21 原始内容存档于2023 01 18 Hexagon Project Wiki 2022 09 25 原始内容存档于2013 12 24 Google Code Archive Long term storage for Google Code Project Hosting code google com 2022 09 25 原始内容存档于2022 09 25 The GNU Compiler for the Java Programming Language 2010 04 22 原始内容存档于2007 05 09 graphing calculators programming Security Features Compile Time Buffer Checks FORTIFY SOURCE Security Features fedoraproject org 2022 09 26 原始内容存档于2007 01 07 languages used to make GCC 2022 09 26 原始内容存档于2008 05 27 GCC generates calls to routines in this library automatically whenever it needs to perform some operation that is too complicated to emit inline code for 4 The GCC low level runtime library GCC org 2022 09 26 原始内容存档于2023 01 18 Prerequisites for GCC GNU Project gcc gnu org 2022 04 29 2022 09 26 原始内容存档于2023 01 18 GCC allows C to some degree The H 2010 06 01 2022 09 26 原始内容存档于2022 09 26 Re Efforts to attract more users lists gnu org 2022 09 26 原始内容存档于2023 01 18 GCC 4 8 Release Series Changes New Features and Fixes 2013 10 04 原始内容存档于2015 12 08 bootstrap Update requirement to C 11 GitHub 2020 05 19 2022 09 27 原始内容存档于2022 09 29 通过github GCC 3 4 Release Series Changes New Features and Fixes GNU Project gcc gnu org gcc gnu org 2021 07 28 2022 09 27 原始内容存档于2023 01 18 GCC 4 1 Release Series Changes New Features and Fixes GNU Project gcc gnu org 2021 10 18 2022 09 27 原始内容存档于2023 01 18 GENERIC GNU Compiler Collection GCC Internals gcc gnu org 2022 09 27 原始内容存档于2023 01 18 GIMPLE GNU Compiler Collection GCC Internals gcc gnu org 2022 09 27 原始内容存档于2023 01 18 Laurie Hendren s Home Page www sable mcgill ca 2022 09 27 原始内容存档于2022 09 27 McCAT 2022 09 27 原始内容存档于2004 08 12 The GNU C Library GNU Project 2021 02 21 原始内容存档于2022 12 25 License GNU Project 2021 02 21 原始内容存档于2023 01 18 来源 编辑 Richard M Stallman Using and Porting the GNU Compiler Collection 页面存档备份 存于互联网档案馆 Free Software Foundation ISBN 0 595 10035 X Richard M Stallman Using Gcc The Gnu Compiler Collection Reference 页面存档备份 存于互联网档案馆 Free Software Foundation ISBN 1 882114 39 6 Brian J Gough An Introduction to GCC Network Theory Ltd ISBN 0 9541617 9 3更多閱讀 编辑Arthur Griffith GCC The Complete Reference McGrawHill Osborne ISBN 0 07 222405 3 Kerner Sean Michael Open Source GCC 4 0 Older Faster internetnews com 2005 04 22 2006 12 27 原始内容存档于2006 09 17 Kerner Sean Michael New GCC Heavy on Optimization internetnews com 2006 03 02 2006 12 27 原始内容存档于2006 10 22 外部链接 编辑GCC官方网站 页面存档备份 存于互联网档案馆 YouTube上的淺談GCC編譯技術Break Compilation Boundaries with GCC GCC Forum 由Nabble 页面存档备份 存于互联网档案馆 維持 整理所有gcc通訊討論串 並整合入一個可搜尋介面中 参见 编辑 nbsp 自由软件主题 GCC目前包含了贝姆垃圾收集器 一個為C C 所設計的垃圾回收器 distcc 為分散式編譯所設計的軟體 以GCC為協同軟體 ccache 用于缓存编译的中间结果 加快重新编译的速度 LLVM 低層虛擬機器編譯器架構 其中的 clang Obj C 编译器实现了大部分 GNU C 拓展 MinGW 將GNU開發工具移植到Win32平臺下的計畫 Cygwin 在 Windows 上執行 Unix 程式的模擬軟體 GCC Summit OpenWatcom 另一個開放原碼的C Fortran編譯器 Code Sourcery 一個GCC顧問公司 ggcc 全球化GCC專案 取自 https zh wikipedia org w index php title GCC amp oldid 78945996, 维基百科,wiki,书籍,书籍,图书馆,

文章

,阅读,下载,免费,免费下载,mp3,视频,mp4,3gp, jpg,jpeg,gif,png,图片,音乐,歌曲,电影,书籍,游戏,游戏。