GCC:修订间差异

维基百科,自由的百科全书
删除的内容 添加的内容
无编辑摘要
→‎C++标准库:​ 修正笔误
 
(未显示6个用户的8个中间版本)
第1行: 第1行:
{{otheruse|subject=GNU编译器套裝|other=这个名字類似名其他意义和用法|GCC (消歧義)}}
{{otheruse|subject=GNU编译器套裝|other=關於与「'''GCC'''」標題相近相同条目|GCC (消歧義)}}
{{noteTA
{{noteTA
|G1 = IT
|G1 = IT
第31行: 第31行:
GCC编译器已经被移植到比其他编译器更多的平台和指令集架构上,并被广泛部署在开发自由和专有软件的工具中。GCC还可用于许多嵌入式系统,包括基于[[ARM架構|ARM]]和{{link-en|Power ISA}}的芯片。
GCC编译器已经被移植到比其他编译器更多的平台和指令集架构上,并被广泛部署在开发自由和专有软件的工具中。GCC还可用于许多嵌入式系统,包括基于[[ARM架構|ARM]]和{{link-en|Power ISA}}的芯片。


GCC不仅是GNU操作系统的官方编译器,还是许多类UNIX系统和Linux发行版的标准编译器。BSD家族中的大部分操作系统也在GCC发布之后转用GCC;不过FreeBSD、OpenBSD和Apple macOS已经转向了Clang编译器<ref>{{Cite web|url=https://llvm.org/Users.html|title=The LLVM Compiler Infrastructure Project|website=llvm.org}}</ref>,主要是因为许可问题。<ref>{{Cite web|title=Apple's GPLv3 purge|url=http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/|access-date=2021-01-12|website=meta.ath0.com|language=en-us}}</ref><ref>{{Cite web|last=Linnemann|first=Reid|date=June 20, 2012|title=Why Clang|url=https://lists.freebsd.org/pipermail/freebsd-questions/2012-June/242495.html|access-date=2021-01-12}}</ref><ref>{{Cite web|date=2007-10-11|title=August 29, 2007: FreeBSD Foundation Newsletter, August 29, 2007|url=http://www.freebsdfoundation.org/press/2007Aug-newsletter.shtml#Letter|access-date=2021-01-12|archive-url=https://web.archive.org/web/20071011023649/http://www.freebsdfoundation.org/press/2007Aug-newsletter.shtml#Letter|archive-date=October 11, 2007}}</ref>GCC也可以编译[[Microsoft_Windows|Windows]]、[[Android]]、[[iOS]]、[[Solaris]]、[[HP-UX]]、[[IBM AIX]]和[[DOS]]系统的代码。GCC原本用C開發,後來因為[[LLVM]]、[[Clang]]的崛起,它更快地將開發語言轉換為C++。許多C的愛好者在對C++一知半解的情況下主觀認定C++的性能一定會輸給C,但是Ian Lance Taylor給出了不同的意見,並表明C++不但性能不輸給C,而且能設計出更好,更容易維護的程式<ref>{{Cite web |url=https://lwn.net/Articles/542457/ |title=GCC's move to C++ |accessdate=2013-05-01 |archive-date=2013-06-14 |archive-url=https://web.archive.org/web/20130614184259/http://lwn.net/Articles/542457/ |dead-url=no }}</ref><ref>{{Cite web |url=http://airs.com/ian/cxx-slides.pdf |title=Taylor的演讲簡報 |accessdate=2018-05-19 |archive-date=2018-07-01 |archive-url=https://web.archive.org/web/20180701164437/https://airs.com/ian/cxx-slides.pdf |dead-url=no }}</ref>。
GCC不仅是GNU操作系统的官方编译器,还是许多类UNIX系统和Linux发行版的标准编译器。BSD家族中的大部分操作系统也在GCC发布之后转用GCC;不过FreeBSD、OpenBSD和Apple macOS已经转向了Clang编译器<ref>{{Cite web|url=https://llvm.org/Users.html|title=The LLVM Compiler Infrastructure Project|website=llvm.org|access-date=2022-09-24|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185909/https://llvm.org/Users.html|dead-url=no}}</ref>,主要是因为许可问题。<ref>{{Cite web|title=Apple's GPLv3 purge|url=http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/|access-date=2021-01-12|website=meta.ath0.com|language=en-us|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185910/http://meta.ath0.com/2012/02/05/apples-great-gpl-purge/|dead-url=no}}</ref><ref>{{Cite web|last=Linnemann|first=Reid|date=2012-06-20|title=Why Clang|url=https://lists.freebsd.org/pipermail/freebsd-questions/2012-June/242495.html|access-date=2021-01-12|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185910/https://lists.freebsd.org/pipermail/freebsd-questions/2012-June/242495.html|dead-url=no}}</ref><ref>{{Cite web|date=2007-10-11|title=August 29, 2007: FreeBSD Foundation Newsletter, August 29, 2007|url=http://www.freebsdfoundation.org/press/2007Aug-newsletter.shtml#Letter|access-date=2021-01-12|archive-url=https://web.archive.org/web/20071011023649/http://www.freebsdfoundation.org/press/2007Aug-newsletter.shtml#Letter|archive-date=2007-10-11}}</ref>GCC也可以编译[[Microsoft_Windows|Windows]]、[[Android]]、[[iOS]]、[[Solaris]]、[[HP-UX]]、[[IBM AIX]]和[[DOS]]系统的代码。GCC原本用C開發,後來因為[[LLVM]]、[[Clang]]的崛起,它更快地將開發語言轉換為C++。許多C的愛好者在對C++一知半解的情況下主觀認定C++的性能一定會輸給C,但是Ian Lance Taylor給出了不同的意見,並表明C++不但性能不輸給C,而且能設計出更好,更容易維護的程式<ref>{{Cite web |url=https://lwn.net/Articles/542457/ |title=GCC's move to C++ |accessdate=2013-05-01 |archive-date=2013-06-14 |archive-url=https://web.archive.org/web/20130614184259/http://lwn.net/Articles/542457/ |dead-url=no }}</ref><ref>{{Cite web |url=http://airs.com/ian/cxx-slides.pdf |title=Taylor的演讲簡報 |accessdate=2018-05-19 |archive-date=2018-07-01 |archive-url=https://web.archive.org/web/20180701164437/https://airs.com/ian/cxx-slides.pdf |dead-url=no }}</ref>。


== 历史 ==
== 历史 ==
1983年底,为了引导[[GNU]]操作系统,[[理查德·马修·斯托曼]]向阿姆斯特丹编译器套件(自由大学编译器套件)的作者[[Andrew S. Tanenbaum|安德鲁·塔能鲍姆]]请求允许使用该编译器GNU;但是作者告知他该编译器仅对大学免费。因此,他打算开发一个不同的编译器。<ref>{{cite book |last=von Hagen |first=William |date=2006 |title=The Definitive Guide to GCC |edition=2nd |series=Definitive Guides |publisher=Apress |isbn=978-1-4302-0219-6 |page=XXVII |quote=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. |url=https://books.google.com/books?id=wQ6r3UTivJgC}}</ref>一开始他打算与[[Leonard H. Tower Jr.|Len Tower]]和其他人将[[勞倫斯利佛摩國家實驗室]]的一个现有编译器从Pastel改写成C。<ref name=LLLCompiler>{{cite web | last = Stallman | first = Richard | title = About the GNU Project | publisher = The GNU Project | date = September 20, 2011 | url = https://www.gnu.org/gnu/thegnuproject.html | access-date = October 9, 2011 }}</ref><ref>{{cite journal | editor-last = Puzo | editor-first = Jerome E. | title = Gnu's Zoo | journal = GNU's Bulletin | volume = 1 | issue = 1 | date = February 1986 | publisher = Free Software Foundation | url = https://www.gnu.org/bulletins/bull1.txt | access-date = 2007-08-11 }}</ref>但是他在给利弗莫尔编译器写了一个新的C前端后,发现它需要数兆字节的堆栈空间,只有64KB的[[摩托罗拉68000|68000]] Unix系统上无法运行。因此,他打算自己从头写一个编译器。<ref name=LLLCompiler />总而言之,尽管斯托曼确实使用了他自己写的C前端,他并没有将任何Pastel编译器的代码放在GCC中。<ref name=LLLCompiler /><ref name=":6">{{cite book |last=von Hagen |first=William |date=2006 |title=The Definitive Guide to GCC |edition=2nd |series=Definitive Guides |publisher=Apress |isbn=978-1-4302-0219-6 |page=XXVII |url=https://books.google.com/books?id=wQ6r3UTivJgC}}</ref>
1983年底,为了引导[[GNU]]操作系统,[[理查德·马修·斯托曼]]向阿姆斯特丹编译器套件(自由大学编译器套件)的作者[[Andrew S. Tanenbaum|安德鲁·塔能鲍姆]]请求在GNU上允许使用该编译器但是作者告知他该编译器仅对大学免费。因此,他打算开发一个不同的编译器。<ref>{{cite book |last=von Hagen |first=William |date=2006 |title=The Definitive Guide to GCC |edition=2nd |series=Definitive Guides |publisher=Apress |isbn=978-1-4302-0219-6 |page=XXVII |quote=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. |url=https://books.google.com/books?id=wQ6r3UTivJgC}}</ref>一开始他打算与[[Leonard H. Tower Jr.|Len Tower]]和其他人将[[勞倫斯利佛摩國家實驗室]]的一个现有编译器从Pastel改写成C。<ref name=LLLCompiler>{{cite web | last = Stallman | first = Richard | title = About the GNU Project | publisher = The GNU Project | date = 2011-09-20 | url = https://www.gnu.org/gnu/thegnuproject.html | access-date = 2011-10-09 | archive-date = 2011-04-24 | archive-url = https://web.archive.org/web/20110424064815/http://www.gnu.org/gnu/thegnuproject.html | dead-url = no }}</ref><ref>{{cite journal | editor-last = Puzo | editor-first = Jerome E. | title = Gnu's Zoo | journal = GNU's Bulletin | volume = 1 | issue = 1 | date = February 1986 | publisher = Free Software Foundation | url = https://www.gnu.org/bulletins/bull1.txt | access-date = 2007-08-11 | archive-date = 2015-06-23 | archive-url = https://web.archive.org/web/20150623180723/http://www.gnu.org/bulletins/bull1.txt | dead-url = no }}</ref>但是他在给利弗莫尔编译器写了一个新的C前端后,发现它需要数兆字节的堆栈空间,只有64KB的[[摩托罗拉68000|68000]] Unix系统上无法运行。因此,他打算自己从头写一个编译器。<ref name=LLLCompiler />总而言之,尽管斯托曼确实使用了他自己写的C前端,他并没有将任何Pastel编译器的代码放在GCC中。<ref name=LLLCompiler /><ref name=":6">{{cite book |last=von Hagen |first=William |date=2006 |title=The Definitive Guide to GCC |edition=2nd |series=Definitive Guides |publisher=Apress |isbn=978-1-4302-0219-6 |page=XXVII |url=https://books.google.com/books?id=wQ6r3UTivJgC}}</ref>


GCC于1987年3月22日在[[麻省理工学院]]的[[文件传输协议]]上发布<ref>{{cite newsgroup | title = GNU C compiler beta test release | author = Richard M. Stallman (forwarded by Leonard H. Tower Jr.) | date = March 22, 1987 | newsgroup = comp.lang.c | url = https://groups.google.com/group/comp.lang.misc/msg/32eda22392c20f98 | access-date = October 9, 2011 }}</ref>,斯托曼被列为作者,也提及了其他人并感谢他们的贡献:Jack Davidson和Christopher Fraser给出了使用[[暫存器傳遞語言]]作为中间语言的思路;Paul Rubin为预处理器贡献良多;以及Leonard Tower写了“部分解析器、RTL生成器、RTL定义和Vax机器描述”。<ref name=GccContributors>{{ citation | last = Stallman | first = Richard M. | title = Using and Porting the GNU Compiler Collection (GCC) | chapter-url = https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_23.html | publisher = Free Software Foundation, Inc. | date = June 22, 2001 | orig-year = First published 1988 | chapter = Contributors to GNU CC | page = 7 | access-date = June 18, 2015 |postscript=.}}</ref>被{{link-en|Peter H. Salus}}誉为“自由软件第一击”的GNU编译器发布正值[[昇陽電腦|太阳微系统]]将其[[SunOS|操作系统]]与其开发工具解绑,并提价单独出售。这使得许多客户购买或下载GCC而非供应商的工具。<ref name="penguin">{{cite book |first=Peter H. |last=Salus |author-link=Peter H. Salus |title=The Daemon, the Gnu and the Penguin |chapter=Chapter 10. SUN and gcc |chapter-url=http://www.groklaw.net/article.php?story=20050525231654621 |publisher=[[Groklaw]] |year=2005}}</ref>尽管斯托曼认为[[GNU Emacs]]是他的主要工程,但截至1990年,GCC支持13种电脑架构,性能比其他编译器优越并为商业所用。<ref>{{cite news|last=Garfinkel|first=Simson L.|author-link=Simson Garfinkel|date=6 August 1990|title=Get ready for GNU software|page=102|newspaper=Computerworld|url=https://books.google.com/books?id=mZ0kj6qvsvYC&pg=PT101|access-date=}}</ref>
GCC于1987年3月22日在[[麻省理工学院]]的[[文件传输协议]]上发布<ref>{{cite newsgroup | title = GNU C compiler beta test release | author = Richard M. Stallman (forwarded by Leonard H. Tower Jr.) | date = March 22, 1987 | newsgroup = comp.lang.c | url = https://groups.google.com/group/comp.lang.misc/msg/32eda22392c20f98 | access-date = October 9, 2011 | archive-date = 2013-06-02 | archive-url = https://web.archive.org/web/20130602041632/http://groups.google.com/group/comp.lang.misc/msg/32eda22392c20f98 | dead-url = no }}</ref>,斯托曼被列为作者,也提及了其他人并感谢他们的贡献:Jack Davidson和Christopher Fraser给出了使用[[暫存器傳遞語言]]作为中间语言的思路;Paul Rubin为预处理器贡献良多;以及Leonard Tower写了“部分解析器、RTL生成器、RTL定义和Vax机器描述”。<ref name=GccContributors>{{citation | last = Stallman | first = Richard M. | title = Using and Porting the GNU Compiler Collection (GCC) | chapter-url = https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_23.html | publisher = Free Software Foundation, Inc. | date = 2001-06-22 | orig-year = First published 1988 | chapter = Contributors to GNU CC | page = 7 | access-date = 2015-06-18 | postscript = . | archive-date = 2023-01-18 | archive-url = https://web.archive.org/web/20230118185814/https://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc_23.html | dead-url = no }}</ref>被{{link-en|Peter H. Salus}}誉为“自由软件第一击”的GNU编译器发布正值[[昇陽電腦|太阳微系统]]将其[[SunOS|操作系统]]与其开发工具解绑,并提价单独出售。这使得许多客户购买或下载GCC而非供应商的工具。<ref name="penguin">{{cite book |first=Peter H. |last=Salus |author-link=Peter H. Salus |title=The Daemon, the Gnu and the Penguin |chapter=Chapter 10. SUN and gcc |chapter-url=http://www.groklaw.net/article.php?story=20050525231654621 |publisher=[[Groklaw]] |year=2005 |access-date=2022-09-24 |archive-date=2022-06-20 |archive-url=https://web.archive.org/web/20220620020435/http://www.groklaw.net/article.php?story=20050525231654621 |dead-url=no }}</ref>尽管斯托曼认为[[GNU Emacs]]是他的主要工程,但截至1990年,GCC支持13种电脑架构,性能比其他编译器优越并为商业所用。<ref>{{cite news|last=Garfinkel|first=Simson L.|author-link=Simson Garfinkel|date=1990-08-06|title=Get ready for GNU software|page=102|newspaper=Computerworld|url=https://books.google.com/books?id=mZ0kj6qvsvYC&pg=PT101|access-date=}}</ref>
=== EGCS克隆{{Anchor|EGCS Fork}} ===
=== EGCS克隆{{Anchor|EGCS Fork}} ===
由于GCC是在GPL许可下授权的,其他为C以外语言编写接口的程序员可以自由的开发其自己的编译器分支,只要他们遵守GPL许可条款。但是,多分叉在日后体现出低效和不便的特点;而且人们很难使热爱稳定性胜过新特性的GCC官方项目接受他们的分支。<ref name="egcs">{{citation | last = Henkel-Wallace | first = David | title = A new compiler project to merge the existing GCC forks | url = https://gcc.gnu.org/news/announcement.html | date = August 15, 1997 | access-date = May 25, 2012 |postscript=.}}</ref>FSF对添加到GCC 2.x官方版本(1992年开始开发)中的内容进行了相当严格的控制,以至于被Eric S. Raymond在《大教堂与集市》中形容为 "大教堂 "开发模式。
由于GCC是在GPL许可下授权的,其他为C以外语言编写接口的程序员可以自由的开发其自己的编译器分支,只要他们遵守GPL许可条款。但是,多分叉在日后体现出低效和不便的特点;而且人们很难使热爱稳定性胜过新特性的GCC官方项目接受他们的分支。<ref name="egcs">{{citation | last = Henkel-Wallace | first = David | title = A new compiler project to merge the existing GCC forks | url = https://gcc.gnu.org/news/announcement.html | date = 1997-08-15 | access-date = 2012-05-25 | postscript = . | archive-date = 2023-01-18 | archive-url = https://web.archive.org/web/20230118185814/https://gcc.gnu.org/news/announcement.html | dead-url = no }}</ref>FSF对添加到GCC 2.x官方版本(1992年开始开发)中的内容进行了相当严格的控制,以至于被Eric S. Raymond在《大教堂与集市》中形容为 "大教堂 "开发模式。


在1997年,一群不滿GCC緩慢且封閉的創作環境者,組織了一個名為[[EGCS|实验性/增强型GNU编译器系统]](Experimental/Enhanced GNU Compiler System)的專案<ref name="egcs" /><ref name=":6" />,将几个实验性分叉合并为一个项目。其基础是GCC的开发快照(大概取自2.7.2,后来跟进到2.8.1)。合并内容包括g77(Fortran)、PGCC(P5 Pentium优化的GCC)<ref name=":6" />,许多C++的改进,以及许多新的架构和[[操作系统]]变种。<ref>{{Cite web|title=The Short History of GCC development|url=http://www.softpanorama.org/People/Stallman/history_of_gcc_development.shtml|access-date=2021-01-24|website=www.softpanorama.org}}</ref>
在1997年,一群不滿GCC緩慢且封閉的創作環境者,組織了一個名為[[EGCS|实验性/增强型GNU编译器系统]](Experimental/Enhanced GNU Compiler System)的專案<ref name="egcs" /><ref name=":6" />,将几个实验性分叉合并为一个项目。其基础是GCC的开发快照(大概取自2.7.2,后来跟进到2.8.1)。合并内容包括g77(Fortran)、PGCC(P5 Pentium优化的GCC)<ref name=":6" />,许多C++的改进,以及许多新的架构和[[操作系统]]变种。<ref>{{Cite web|title=The Short History of GCC development|url=http://www.softpanorama.org/People/Stallman/history_of_gcc_development.shtml|access-date=2021-01-24|website=www.softpanorama.org|archive-date=2022-11-09|archive-url=https://web.archive.org/web/20221109211504/https://softpanorama.org/People/Stallman/history_of_gcc_development.shtml|dead-url=no}}</ref>


这两个项目都密切观察着彼此的动态,但是EGCS的发展明显更活跃,因此FSF正式停止他们对GCC 2.x编译器的开发并希望EGCS成为GCC的官方版本。在1999年4月EGCS项目被任命为为GCC的维护者。随着1999年7月GCC 2.95的发布,这两个项目再次联合起来。<ref>{{Cite web|title=History - GCC Wiki|url=https://gcc.gnu.org/wiki/History#Reunification|access-date=2020-09-28|website=gcc.gnu.org}}</ref><ref name=":6" />此后,GCC在一个指导委员会的指导下,来自各国的程序员小组会对其进行维护。<ref name=":0">{{Cite web|url=https://gcc.gnu.org/steering.html|title=GCC steering committee - GNU Project|website=gcc.gnu.org}}</ref>
这两个项目都密切观察着彼此的动态,但是EGCS的发展明显更活跃,因此FSF正式停止他们对GCC 2.x编译器的开发并希望EGCS成为GCC的官方版本。在1999年4月EGCS项目被任命为为GCC的维护者。随着1999年7月GCC 2.95的发布,这两个项目再次联合起来。<ref>{{Cite web|title=History - GCC Wiki|url=https://gcc.gnu.org/wiki/History#Reunification|access-date=2020-09-28|website=gcc.gnu.org|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/wiki/History#Reunification|dead-url=no}}</ref><ref name=":6" />此后,GCC在一个指导委员会的指导下,来自各国的程序员小组会对其进行维护。<ref name=":0">{{Cite web|url=https://gcc.gnu.org/steering.html|title=GCC steering committee - GNU Project|website=gcc.gnu.org|access-date=2022-09-24|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/steering.html|dead-url=no}}</ref>


由于缺乏维护,GCC 3 (2002)移除了CHILL的前端支持。<ref>{{cite web|title=PATCH&#93; Remove chill|url=https://gcc.gnu.org/ml/gcc-patches/2002-04/msg00887.html|access-date=July 29, 2010|website=gcc.gnu.org}}</ref>在版本4.0之前,GCC 3中的Fortran前端是<code>g77</code>,只支持[[Fortran#FORTRAN_77|FORTRAN 77]]。该前端后来被废弃,取而代之的是新GNU Fortran前端,支持[[Fortran 95]]和[[Fortran 2003]]及[[Fortran 2008]]的大部分内容 。<ref name="gcc_wiki_f2003">{{cite web|title=Chart of Fortran 2003 Features supported by GNU Fortran|url=https://gcc.gnu.org/wiki/Fortran2003Status|access-date=2009-06-25|publisher=[[GNU]]}}</ref><ref name="gcc_wiki_f2008">{{cite web|title=Chart of Fortran 2008 Features supported by GNU Fortran|url=https://gcc.gnu.org/wiki/Fortran2008Status|access-date=2009-06-25|publisher=[[GNU]]}}</ref>从GCC 4.8版开始,GCC由C++语言编写。<ref>{{Cite web|url=https://gcc.gnu.org/gcc-4.8/changes.html|title=GCC 4.8 Release Series — Changes, New Features, and Fixes - GNU Project|website=gcc.gnu.org}}</ref>从GCC 5到GCC 7都保留了对[[Cilk Plus]]的支持。<ref>{{Cite web|url=https://gcc.gnu.org/gcc-5/changes.html#c-family|title=GCC 5 Release Series — Changes, New Features, and Fixes|website=gcc.gnu.org}}</ref><ref>{{Cite web|url=https://gcc.gnu.org/gcc-8/changes.html|title=GCC 8 Release Series — Changes, New Features, and Fixes|website=gcc.gnu.org}}</ref>
由于缺乏维护,GCC 3 (2002)移除了CHILL的前端支持。<ref>{{cite web|title=PATCH&#93; Remove chill|url=https://gcc.gnu.org/ml/gcc-patches/2002-04/msg00887.html|access-date=2010-07-29|website=gcc.gnu.org|archive-date=2016-10-20|archive-url=https://web.archive.org/web/20161020222510/https://gcc.gnu.org/ml/gcc-patches/2002-04/msg00887.html|dead-url=no}}</ref>在版本4.0之前,GCC 3中的Fortran前端是<code>g77</code>,只支持[[Fortran#FORTRAN_77|FORTRAN 77]]。该前端后来被废弃,取而代之的是新GNU Fortran前端,支持[[Fortran 95]]和[[Fortran 2003]]及[[Fortran 2008]]的大部分内容 。<ref name="gcc_wiki_f2003">{{cite web|title=Chart of Fortran 2003 Features supported by GNU Fortran|url=https://gcc.gnu.org/wiki/Fortran2003Status|access-date=2009-06-25|publisher=[[GNU]]|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/wiki/Fortran2003Status|dead-url=no}}</ref><ref name="gcc_wiki_f2008">{{cite web|title=Chart of Fortran 2008 Features supported by GNU Fortran|url=https://gcc.gnu.org/wiki/Fortran2008Status|access-date=2009-06-25|publisher=[[GNU]]|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/wiki/Fortran2008Status|dead-url=no}}</ref>从GCC 4.8版开始,GCC由C++语言编写。<ref>{{Cite web|url=https://gcc.gnu.org/gcc-4.8/changes.html|title=GCC 4.8 Release Series — Changes, New Features, and Fixes - GNU Project|website=gcc.gnu.org|access-date=2022-09-24|archive-date=2015-12-08|archive-url=https://web.archive.org/web/20151208064435/https://gcc.gnu.org/gcc-4.8/changes.html|dead-url=no}}</ref>从GCC 5到GCC 7都保留了对[[Cilk Plus]]的支持。<ref>{{Cite web|url=https://gcc.gnu.org/gcc-5/changes.html#c-family|title=GCC 5 Release Series — Changes, New Features, and Fixes|website=gcc.gnu.org|access-date=2022-09-24|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/gcc-5/changes.html#c-family|dead-url=no}}</ref><ref>{{Cite web|url=https://gcc.gnu.org/gcc-8/changes.html|title=GCC 8 Release Series — Changes, New Features, and Fixes|website=gcc.gnu.org|access-date=2022-09-24|archive-date=2018-11-29|archive-url=https://web.archive.org/web/20181129002653/http://gcc.gnu.org/gcc-8/changes.html|dead-url=no}}</ref>


GCC已经被移植到各种指令集架构上,并被广泛部署为开发自由或专有软件的工具。GCC还可用于许多嵌入式系统,包括Symbian(称为gcce)<ref>{{cite web|url=http://www.inf.u-szeged.hu/symbian-gcc/|title=Symbian GCC Improvement Project|access-date=2007-11-08 }}</ref>、基于[[ARM]]和基于Power ISA的芯片。<ref name="Linux Board Support Packages">{{cite web|last=|first=|date=|title=Linux Board Support Packages|url=http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_BSP&fsrch=1|url-status=dead|archive-url=https://web.archive.org/web/20110607140609/http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_BSP&fsrch=1|archive-date=2011-06-07|access-date=2021-01-24|website=}}</ref>该编译器可以在各种平台上输出,包括游戏控制器中的PS2<ref name=":3">{{cite web|url=http://ps2stuff.playstation2-linux.com/gcc_build.html |title=setting up gcc as a cross-compiler |work=ps2stuff |date=2002-06-08 |access-date=2008-12-12 |url-status=dead |archive-url=https://web.archive.org/web/20081211044658/http://ps2stuff.playstation2-linux.com/gcc_build.html |archive-date=December 11, 2008 }}</ref>、[[Cell_(微處理器)|Cell微处理器架构]]的PS3<ref name=":4">{{Cite web|url=https://gcc.gnu.org/wiki/CompileFarm|title=CompileFarm - GCC Wiki|website=gcc.gnu.org}}</ref>以及[[Dreamcast]]。<ref name=":5">{{cite web |url=http://www.ngine.de/gccguide.html |title=sh4 g++ guide |archive-url=https://web.archive.org/web/20021220025554/http://www.ngine.de/gccguide.html |archive-date=2002-12-20 |access-date=2008-12-12 }}</ref>相比于其他编译器,GCC编译器被部署在更多的操作系统和处理器上。<ref name=":1">{{cite web|last=|first=|date=|title=Linux Information Project|url=http://www.linfo.org/gcc.html|access-date=2010-04-27|website=|publisher=LINFO|quote=The GCC has been ported to (i.e., modified to run on) more than 60 platforms, which is more than for any other compiler.}}</ref>
GCC已经被移植到各种指令集架构上,并被广泛部署为开发自由或专有软件的工具。GCC还可用于许多嵌入式系统,包括Symbian(称为gcce)<ref>{{cite web|url=http://www.inf.u-szeged.hu/symbian-gcc/|title=Symbian GCC Improvement Project|access-date=2007-11-08|archive-date=2014-08-01|archive-url=https://web.archive.org/web/20140801121616/http://www.inf.u-szeged.hu/symbian-gcc/|dead-url=no}}</ref>、基于[[ARM]]和基于Power ISA的芯片。<ref name="Linux Board Support Packages">{{cite web|last=|first=|date=|title=Linux Board Support Packages|url=http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_BSP&fsrch=1|url-status=dead|archive-url=https://web.archive.org/web/20110607140609/http://www.freescale.com/webapp/sps/site/overview.jsp?code=CW_BSP&fsrch=1|archive-date=2011-06-07|access-date=2021-01-24|website=}}</ref>该编译器可以在各种平台上输出,包括游戏控制器中的PS2<ref name=":3">{{cite web|url=http://ps2stuff.playstation2-linux.com/gcc_build.html |title=setting up gcc as a cross-compiler |work=ps2stuff |date=2002-06-08 |access-date=2008-12-12 |url-status=dead |archive-url=https://web.archive.org/web/20081211044658/http://ps2stuff.playstation2-linux.com/gcc_build.html |archive-date=2008-12-11 }}</ref>、[[Cell_(微處理器)|Cell微处理器架构]]的PS3<ref name=":4">{{Cite web|url=https://gcc.gnu.org/wiki/CompileFarm|title=CompileFarm - GCC Wiki|website=gcc.gnu.org|access-date=2022-09-25|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/wiki/CompileFarm|dead-url=no}}</ref>以及[[Dreamcast]]。<ref name=":5">{{cite web |url=http://www.ngine.de/gccguide.html |title=sh4 g++ guide |archive-url=https://web.archive.org/web/20021220025554/http://www.ngine.de/gccguide.html |archive-date=2002-12-20 |access-date=2008-12-12 }}</ref>相比于其他编译器,GCC编译器被部署在更多的操作系统和处理器上。<ref name=":1">{{cite web|last=|first=|date=|title=Linux Information Project|url=http://www.linfo.org/gcc.html|access-date=2010-04-27|website=|publisher=LINFO|quote=The GCC has been ported to (i.e., modified to run on) more than 60 platforms, which is more than for any other compiler.|archive-date=2023-01-03|archive-url=https://web.archive.org/web/20230103063841/http://www.linfo.org/gcc.html|dead-url=no}}</ref>


== 目前支持的语言 ==
== 目前支持的语言 ==
截至2022年9月,GCC 12.2版内含[[C语言|C]](<code>gcc</code>)、[[C++]](<code>g++</code>)、[[Objective-C]]、[[Fortran]](<code>[[gfortran]]</code>)、[[Ada]]([[GNAT]])、[[Go]] (<code>gccgo</code>)以及[[D语言|D]] (<code>gdc</code>,从9.1版开始)<ref>{{Cite web|title=The D Language Front-End Finally Merged Into GCC 9 - Phoronix|url=https://phoronix.com/scan.php?page=news_item&px=GCC-9-Merges-D-Language|access-date=2021-01-19|website=phoronix.com}}</ref>编程语言的前端。<ref name=":7">{{Cite web |date=2022-04-16 |title=GCC Front Ends |url=https://gcc.gnu.org/frontends.html |publisher=gnu.org |access-date=2022-09-25}}</ref>[[OpenMP]]和[[OpenACC]]并行语言拓展从GCC 5.1开始支持。<ref name=":2" /><ref>{{Cite web |date=2015-04-22 |title=GCC 5 Release Series — Changes, New Features, and Fixes - GNU Project |url=https://gcc.gnu.org/gcc-5/changes.html |website=gcc.gnu.org |access-date=2022-09-25}}</ref>GCC 7之前的版本也支持[[Java]](<code>[[GNU Compiler for Java|gcj]]</code>),允许将java编译为机器语言。<ref>{{Cite web |date=2017-05-02 |title=GCC 7 Release Series |url=https://gcc.gnu.org/gcc-7/changes.html |website=GCC 7 Release Series: Changes, New Features, and Fixes |publisher=gnu.org |access-date=2022-09-25}}</ref>
截至2022年9月,GCC 12.2版内含[[C语言|C]](<code>gcc</code>)、[[C++]](<code>g++</code>)、[[Objective-C]]、[[Fortran]](<code>[[gfortran]]</code>)、[[Ada]]([[GNAT]])、[[Go]] (<code>gccgo</code>)以及[[D语言|D]] (<code>gdc</code>,从9.1版开始)<ref>{{Cite web|title=The D Language Front-End Finally Merged Into GCC 9 - Phoronix|url=https://phoronix.com/scan.php?page=news_item&px=GCC-9-Merges-D-Language|access-date=2021-01-19|website=phoronix.com|archive-date=2022-05-17|archive-url=https://web.archive.org/web/20220517184343/https://www.phoronix.com/scan.php?page=news_item&px=GCC-9-Merges-D-Language|dead-url=no}}</ref>编程语言的前端。<ref name=":7">{{Cite web |date=2022-04-16 |title=GCC Front Ends |url=https://gcc.gnu.org/frontends.html |publisher=gnu.org |access-date=2022-09-25 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/frontends.html |dead-url=no }}</ref>[[OpenMP]]和[[OpenACC]]并行语言拓展从GCC 5.1开始支持。<ref name=":2" /><ref>{{Cite web |date=2015-04-22 |title=GCC 5 Release Series — Changes, New Features, and Fixes - GNU Project |url=https://gcc.gnu.org/gcc-5/changes.html |website=gcc.gnu.org |access-date=2022-09-25 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/gcc-5/changes.html |dead-url=no }}</ref>GCC 7之前的版本也支持[[Java]](<code>[[GNU Compiler for Java|gcj]]</code>),允许将java编译为机器语言。<ref>{{Cite web |date=2017-05-02 |title=GCC 7 Release Series |url=https://gcc.gnu.org/gcc-7/changes.html |website=GCC 7 Release Series: Changes, New Features, and Fixes |publisher=gnu.org |access-date=2022-09-25 |archive-date=2020-09-02 |archive-url=https://web.archive.org/web/20200902223230/https://gcc.gnu.org/gcc-7/changes.html |dead-url=no }}</ref>


有关C++和C的语言版本支持,从GCC 11.1开始默认为''gnu++17'',[[C++17]]的[[超集]];以及''gnu11'',[[C11_(C语言标准)|C11]]的[[超集]],还提供严格的标准支持。GCC也对[[C++20]]和即将到来的[[C++23]]标准提供实验性部分支持。<ref>{{Cite web |date=2022-09-09 |title=C++ Standards Support in GCC |url=https://gcc.gnu.org/projects/cxx-status.html |publisher=gcc.gnu.org |access-date=2022-09-25}}</ref>
有关C++和C的语言版本支持,从GCC 11.1开始默认为''gnu++17'',[[C++17]]的[[超集]];以及''gnu11'',[[C11_(C语言标准)|C11]]的[[超集]],还提供严格的标准支持。GCC也对[[C++20]]和即将到来的[[C++23]]标准提供实验性部分支持。<ref>{{Cite web |date=2022-09-09 |title=C++ Standards Support in GCC |url=https://gcc.gnu.org/projects/cxx-status.html |publisher=gcc.gnu.org |access-date=2022-09-25 |archive-date=2022-04-20 |archive-url=https://web.archive.org/web/20220420114133/https://gcc.gnu.org/projects/cxx-status.html |dead-url=no }}</ref>


有许多为其它语言编写的第三方前端,比如[[Pascal語言|Pascal]](<code>{{link-en|GNU Pascal|GNU Pascal|gpc}}</code>)、[[Modula-2]]、[[Modula-3]]、[[Mercury语言]]以及[[VHDL]](<code>GHDL</code>)。<ref name=":7" />一些实验性分支可支持更多语言,比如GCC [[Unified Parallel C|UPC]]编译器还支持[[Unified Parallel C|UPC]]<ref>{{cite web|url=http://www.gccupc.org/|title=GCC UPC (GCC Unified Parallel C)|publisher=Intrepid Technology, Inc.|date=2006-02-20|access-date=2009-03-11}}</ref>和[[Rust]]。<ref>{{Cite web|last=Spengler|first=Brad|date=12 January 2021|title=Open Source Security, Inc. Announces Funding of GCC Front-End for Rust|url=https://opensrcsec.com/open_source_security_announces_rust_gcc_funding|access-date=|website=}}</ref>
有许多为其它语言编写的第三方前端,比如[[Pascal語言|Pascal]](<code>{{link-en|GNU Pascal|GNU Pascal|gpc}}</code>)、[[Modula-2]]、[[Modula-3]]、[[Mercury语言]]以及[[VHDL]](<code>GHDL</code>)。<ref name=":7" />一些实验性分支可支持更多语言,比如GCC [[Unified Parallel C|UPC]]编译器还支持[[Unified Parallel C|UPC]]<ref>{{cite web|url=http://www.gccupc.org/|title=GCC UPC (GCC Unified Parallel C)|publisher=Intrepid Technology, Inc.|date=2006-02-20|access-date=2009-03-11|archive-date=2010-02-11|archive-url=https://web.archive.org/web/20100211142352/http://www.gccupc.org/|dead-url=no}}</ref>和[[Rust]]。<ref>{{Cite web|last=Spengler|first=Brad|date=2021-01-12|title=Open Source Security, Inc. Announces Funding of GCC Front-End for Rust|url=https://opensrcsec.com/open_source_security_announces_rust_gcc_funding|access-date=|website=|archive-date=2021-04-25|archive-url=https://web.archive.org/web/20210425170408/https://opensrcsec.com/open_source_security_announces_rust_gcc_funding|dead-url=no}}</ref>


== 支援的處理器架構 ==
== 支援的處理器架構 ==
[[File:GCC DJGPP Windows.png|thumb|249x249px|GCC在Windows系统上编译[[Hello_World程序样例|Hello World程序]]]]
[[File:GCC DJGPP Windows.png|thumb|249x249px|GCC在Windows系统上编译[[Hello_World程序样例|Hello World程序]]]]
GCC 11.1版本支持的处理器包括:<ref>{{Cite web|title=Option Summary (Using the GNU Compiler Collection (GCC))|url=https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Option-Summary.html#Option-Summary|access-date=2020-08-21|website=gcc.gnu.org}}</ref>
GCC 11.1版本支持的处理器包括:<ref>{{Cite web|title=Option Summary (Using the GNU Compiler Collection (GCC))|url=https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Option-Summary.html#Option-Summary|access-date=2020-08-21|website=gcc.gnu.org|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/onlinedocs/gcc-10.2.0/gcc/Option-Summary.html#Option-Summary|dead-url=no}}</ref>


{{div col|colwidth=15em|small=no}}
{{div col|colwidth=15em|small=no}}
第127行: 第127行:
* {{link-en|EISC}}
* {{link-en|EISC}}
* {{link-en|eSi-RISC}}
* {{link-en|eSi-RISC}}
* {{link-en|Hexagon|Hexagon (processor)|Hexagon}}<ref>{{Cite web|url=https://www.codeaurora.org/xwiki/bin/Hexagon/|title=Hexagon Project Wiki}}</ref>
* {{link-en|Hexagon|Hexagon (processor)|Hexagon}}<ref>{{Cite web|url=https://www.codeaurora.org/xwiki/bin/Hexagon/|title=Hexagon Project Wiki|access-date=2022-09-25|archive-date=2013-12-24|archive-url=https://web.archive.org/web/20131224105524/https://www.codeaurora.org/xwiki/bin/Hexagon/|dead-url=no}}</ref>
* {{link-en|LatticeMico32}}
* {{link-en|LatticeMico32}}
* {{link-en|LatticeMico8}}
* {{link-en|LatticeMico8}}
第135行: 第135行:
* {{link-en|MRISC32}}
* {{link-en|MRISC32}}
* [[MSP430]]
* [[MSP430]]
* {{link-en|NEC SX architecture}}<ref>{{Cite web|url=https://code.google.com/archive/p/sx-gcc|title=Google Code Archive - Long-term storage for Google Code Project Hosting.|website=code.google.com}}</ref>
* {{link-en|NEC SX architecture}}<ref>{{Cite web|url=https://code.google.com/archive/p/sx-gcc|title=Google Code Archive - Long-term storage for Google Code Project Hosting.|website=code.google.com|access-date=2022-09-25|archive-date=2022-09-25|archive-url=https://web.archive.org/web/20220925035202/https://code.google.com/archive/p/sx-gcc|dead-url=no}}</ref>
* [[Nios II]]和{{link-en|Nios嵌入式处理器|Nios embedded processor|Nios}}
* [[Nios II]]和{{link-en|Nios嵌入式处理器|Nios embedded processor|Nios}}
* {{link-en|OpenRISC}}
* {{link-en|OpenRISC}}
第151行: 第151行:
{{Refend}}
{{Refend}}


[[GNU Compiler for Java|GCJ]] Java编译器可以输出机器语言或者[[Java虚拟机]]的[[Java字节码]]。<ref>{{cite web|url=https://gcc.gnu.org/java/|title=The GNU Compiler for the Java Programming Language|access-date=2010-04-22|url-status=dead|archive-url=https://web.archive.org/web/20070509055923/http://gcc.gnu.org/java/|archive-date=May 9, 2007|df=mdy-all}}</ref>当重定向GCC到新的平台上,经常会用到{{link-en|自举|bootstrapping (compilers)}}。 Motorola 68000,Zilog Z80以及其他处理器也可在为[[德州仪器]]、[[惠普]]、[[夏普]]以及卡西欧可编程图形计算器设计的GCC编译器上输出。<ref>graphing calculators#programming</ref>
[[GNU Compiler for Java|GCJ]] Java编译器可以输出机器语言或者[[Java虚拟机]]的[[Java字节码]]。<ref>{{cite web|url=https://gcc.gnu.org/java/|title=The GNU Compiler for the Java Programming Language|access-date=2010-04-22|url-status=dead|archive-url=https://web.archive.org/web/20070509055923/http://gcc.gnu.org/java/|archive-date=2007-05-09}}</ref>当重定向GCC到新的平台上,经常会用到{{link-en|自举|bootstrapping (compilers)}}。 Motorola 68000,Zilog Z80以及其他处理器也可在为[[德州仪器]]、[[惠普]]、[[夏普]]以及卡西欧可编程图形计算器设计的GCC编译器上输出。<ref>graphing calculators#programming</ref>


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


每种语言的编译器都是一个独立的程序,可读取源代码并输出机器码。所有語言的[[編譯器]]都擁有共通的中介架構:各语言前端[[構文解析|解析]]符合此語言的原始碼,並產生一[[抽象語法樹]]。如有必要,这些代码会被转换为中介端的输入表示,即所谓的 ''GENERIC'' 形式;然后中介端会逐渐将程序转换为最终形式。[[编译器优化]]和[[静态代码分析]]技术(例如FORTIFY_SOURCE<ref>{{Cite web |title=Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE) |url=http://fedoraproject.org/wiki/Security/Features |website=Security Features |publisher=fedoraproject.org |access-date=2022-09-26}}</ref>,一种尝试发现[[緩衝區溢位]]的编译器指令)也会在源代码编译时应用。这些操作都是在多种表示法上工作,其中主要是独立于架构的GIMPLE表示法和独立于架构的[[RTL]]表示法。最终,机器码由{{tsl|en|Jack Davidson|傑克·戴維森}}與{{tsl|en|Chris Fraser|克里斯·弗雷澤}}發明的算法产生。
每种语言的编译器都是一个独立的程序,可读取源代码并输出机器码。所有語言的[[編譯器]]都擁有共通的中介架構:各语言前端[[構文解析|解析]]符合此語言的原始碼,並產生一[[抽象語法樹]]。如有必要,这些代码会被转换为中介端的输入表示,即所谓的 ''GENERIC'' 形式;然后中介端会逐渐将程序转换为最终形式。[[编译器优化]]和[[静态代码分析]]技术(例如FORTIFY_SOURCE<ref>{{Cite web |title=Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE) |url=http://fedoraproject.org/wiki/Security/Features |website=Security Features |publisher=fedoraproject.org |access-date=2022-09-26 |archive-date=2007-01-07 |archive-url=https://web.archive.org/web/20070107153447/http://fedoraproject.org/wiki/Security/Features |dead-url=no }}</ref>,一种尝试发现[[緩衝區溢位]]的编译器指令)也会在源代码编译时应用。这些操作都是在多种表示法上工作,其中主要是独立于架构的GIMPLE表示法和独立于架构的[[RTL]]表示法。最终,机器码由{{tsl|en|Jack Davidson|傑克·戴維森}}與{{tsl|en|Chris Fraser|克里斯·弗雷澤}}發明的算法产生。


除了[[Ada]]前端主要以[[Ada]]寫成,GCC大部分是用[[C语言]]编写的。GCC发行版包含主要以各自语言编写的Ada和C++标准库。<ref>{{Cite web |title=languages used to make GCC |url=http://www.ohloh.net/projects/gcc/analyses/latest}}</ref>在一些平台上,GCC发行版还包括一个低级运行库<code>libgcc</code>该运行库由独立于机器的C语言和特定处理器的机器码组合编写,可处理目标处理器不能直接执行的复杂算术运算。<ref>{{Cite web |title=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. |url=https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html |website=4 The GCC low-level runtime library |publisher=GCC.org |access-date=2022-09-26}}</ref>
除了[[Ada]]前端主要以[[Ada]]寫成,GCC大部分是用[[C语言]]编写的。GCC发行版包含主要以各自语言编写的Ada和C++标准库。<ref>{{Cite web |title=languages used to make GCC |url=http://www.ohloh.net/projects/gcc/analyses/latest |access-date=2022-09-26 |archive-date=2008-05-27 |archive-url=https://web.archive.org/web/20080527213819/http://www.ohloh.net/projects/gcc/analyses/latest |dead-url=no }}</ref>在一些平台上,GCC发行版还包括一个低级运行库<code>libgcc</code>该运行库由独立于机器的C语言和特定处理器的机器码组合编写,可处理目标处理器不能直接执行的复杂算术运算。<ref>{{Cite web |title=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. |url=https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html |website=4 The GCC low-level runtime library |publisher=GCC.org |access-date=2022-09-26 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/onlinedocs/gccint/Libgcc.html |dead-url=no }}</ref>


GCC使用了许多额外的工具。虽然这些工具在[[UNIX]]和[[Linux]]发行版中基本为默认安装的,但是Windows系统通常没有。这些工具包括[[Perl]]、[[Flex詞法分析器|Flex]]、[[GNU_bison|Bison]]和其他常用工具;还需要额外的依赖库[[GNU多重精度运算库|GMP]]、MPC和{{link-en|MPFR}}。<ref>{{Cite web |date=2022-04-29 |title=Prerequisites for GCC - GNU Project |url=https://gcc.gnu.org/install/prerequisites.html |website=gcc.gnu.org |access-date=2022-09-26}}</ref>
GCC使用了许多额外的工具。虽然这些工具在[[UNIX]]和[[Linux]]发行版中基本为默认安装的,但是Windows系统通常没有。这些工具包括[[Perl]]、[[Flex詞法分析器|Flex]]、[[GNU_bison|Bison]]和其他常用工具;还需要额外的依赖库[[GNU多重精度运算库|GMP]]、MPC和{{link-en|MPFR}}。<ref>{{Cite web |date=2022-04-29 |title=Prerequisites for GCC - GNU Project |url=https://gcc.gnu.org/install/prerequisites.html |website=gcc.gnu.org |access-date=2022-09-26 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/install/prerequisites.html |dead-url=no }}</ref>


2010年5月,GCC指导委员会决定允许使用[[C++]]编译器来编译GCC。<ref name="gcc-c++">{{cite news | title = GCC allows C++&nbsp;– to some degree | url = http://www.h-online.com/open/news/item/GCC-allows-C-to-some-degree-1012611.html | publisher = [[Heinz Heise|The H]] |date=June 1, 2010 }}</ref> 编译器计划主要用C语言编写,并加上C++的一个子集特性。之所以这样做是为了了让GCC的开发者能够使用C++的[[解構子|析构器]]和[[泛型编程|泛型]]功能。<ref>{{Cite web|url=https://lists.gnu.org/archive/html/emacs-devel/2010-07/msg00518.html|title=Re: Efforts to attract more users?|website=lists.gnu.org}}</ref>2012年8月,GCC指导委员会宣布,GCC将以C++为源语言。<ref>{{cite web|title=GCC 4.8 Release Series: Changes, New Features, and Fixes|url=https://gcc.gnu.org/gcc-4.8/changes.html|access-date=October 4, 2013}}</ref>这意味着,要从源代码编写GCC编译器,需要一个能够理解[[C++03|ISO/IEC C++03标准]]的C++编译器。2020年5月18日,GCC从[[C++03|ISO/IEC C++03标准]]转向[[C++11|ISO/IEC C++11标准]](即需要改写编译器本身;默认情况下可编译C++早期版本)。<ref>{{Cite web |date=19 May 2020 |title=bootstrap: Update requirement to C++11. |url=https://github.com/gcc-mirror/gcc/commit/5329b59a2e13dabbe2038af0fe2e3cf5fc7f98ed |website=[[GitHub]] |access-date=2022-09-27 |via=github}}</ref>
2010年5月,GCC指导委员会决定允许使用[[C++]]编译器来编译GCC。<ref name="gcc-c++">{{cite news | title = GCC allows C++&nbsp;– to some degree | url = http://www.h-online.com/open/news/item/GCC-allows-C-to-some-degree-1012611.html | publisher = [[Heinz Heise|The H]] | date = 2010-06-01 | accessdate = 2022-09-26 | archive-date = 2022-09-26 | archive-url = https://web.archive.org/web/20220926160308/http://www.h-online.com/open/news/item/GCC-allows-C-to-some-degree-1012611.html | dead-url = no }}</ref> 编译器计划主要用C语言编写,并加上C++的一个子集特性。之所以这样做是为了了让GCC的开发者能够使用C++的[[解構子|析构器]]和[[泛型编程|泛型]]功能。<ref>{{Cite web|url=https://lists.gnu.org/archive/html/emacs-devel/2010-07/msg00518.html|title=Re: Efforts to attract more users?|website=lists.gnu.org|access-date=2022-09-26|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185909/https://lists.gnu.org/archive/html/emacs-devel/2010-07/msg00518.html|dead-url=no}}</ref>2012年8月,GCC指导委员会宣布,GCC将以C++为源语言。<ref>{{cite web|title=GCC 4.8 Release Series: Changes, New Features, and Fixes|url=https://gcc.gnu.org/gcc-4.8/changes.html|access-date=2013-10-04|archive-date=2015-12-08|archive-url=https://web.archive.org/web/20151208064435/https://gcc.gnu.org/gcc-4.8/changes.html|dead-url=no}}</ref>这意味着,要从源代码编写GCC编译器,需要一个能够理解[[C++03|ISO/IEC C++03标准]]的C++编译器。2020年5月18日,GCC从[[C++03|ISO/IEC C++03标准]]转向[[C++11|ISO/IEC C++11标准]](即需要改写编译器本身;默认情况下可编译C++早期版本)。<ref>{{Cite web |date=2020-05-19 |title=bootstrap: Update requirement to C++11. |url=https://github.com/gcc-mirror/gcc/commit/5329b59a2e13dabbe2038af0fe2e3cf5fc7f98ed |website=[[GitHub]] |access-date=2022-09-27 |via=github |archive-date=2022-09-29 |archive-url=https://web.archive.org/web/20220929120518/https://github.com/gcc-mirror/gcc/commit/5329b59a2e13dabbe2038af0fe2e3cf5fc7f98ed |dead-url=no }}</ref>
=== 前端介面 ===
=== 前端介面 ===
[[File:Xxx Scanner and parser example for C.gif|thumb|right|300px|前端包括[[预处理]]、[[词法分析]]、[[语法分析]](解析)和句意分析。编译器前端的目标是根据编程语言语法和语义接受或拒绝输入程序,识别错误并将有效的程序表述传递给编译器后端。这个例子展示了编译器前端对一个用[[C语言]]编写的简单程序进行词法分析和语法分析的步骤。]]
[[File:Xxx Scanner and parser example for C.gif|thumb|right|300px|前端包括[[预处理]]、[[词法分析]]、[[语法分析]](解析)和句意分析。编译器前端的目标是根据编程语言语法和语义接受或拒绝输入程序,识别错误并将有效的程序表述传递给编译器后端。这个例子展示了编译器前端对一个用[[C语言]]编写的简单程序进行词法分析和语法分析的步骤。]]
每个前端都使用一个分析器来产生给定的源代码的一个[[抽象语法树]]。由于语法树的抽象性,不同语言的源代码都可以被同一个后端处理。GCC一开始使用[[GNU_bison|bison]]生成的[[LALR语法分析器]],但在2004年逐渐转向用于C++的[[递归下降解析器]]<ref>{{Cite web |date=2021-07-28 |title=GCC 3.4 Release Series — Changes, New Features, and Fixes - GNU Project |url=https://gcc.gnu.org/gcc-3.4/changes.html |website=gcc.gnu.org |publisher=gcc.gnu.org |access-date=2022-09-27}}</ref>,并在 2006 年用于[[C语言|C]]和[[Objective-C]]<ref>{{Cite web |date=2021-10-18 |title=GCC 4.1 Release Series — Changes, New Features, and Fixes - GNU Project |url=https://gcc.gnu.org/gcc-4.1/changes.html |website=gcc.gnu.org |access-date=2022-09-27}}</ref>。2021年开始,所有前端都使用[[递归下降解析器]]。
每个前端都使用一个分析器来产生给定的源代码的一个[[抽象语法树]]。由于语法树的抽象性,不同语言的源代码都可以被同一个后端处理。GCC一开始使用[[GNU_bison|bison]]生成的[[LALR语法分析器]],但在2004年逐渐转向用于C++的[[递归下降解析器]]<ref>{{Cite web |date=2021-07-28 |title=GCC 3.4 Release Series — Changes, New Features, and Fixes - GNU Project |url=https://gcc.gnu.org/gcc-3.4/changes.html |website=gcc.gnu.org |publisher=gcc.gnu.org |access-date=2022-09-27 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/gcc-3.4/changes.html |dead-url=no }}</ref>,并在 2006 年用于[[C语言|C]]和[[Objective-C]]<ref>{{Cite web |date=2021-10-18 |title=GCC 4.1 Release Series — Changes, New Features, and Fixes - GNU Project |url=https://gcc.gnu.org/gcc-4.1/changes.html |website=gcc.gnu.org |access-date=2022-09-27 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/gcc-4.1/changes.html |dead-url=no }}</ref>。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形式,一种强大的,独立于语言和体系结构的全局(函数范围)优化的通用语言。
在 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形式,一种强大的,独立于语言和体系结构的全局(函数范围)优化的通用语言。
第173行: 第173行:
=== 中介介面 ===
=== 中介介面 ===
==== GENERIC 和 GIMPLE ====
==== GENERIC 和 GIMPLE ====
GENERIC 是一种[[中間語言|中间表示语言]],在将源代码编译成可执行二进制文件时用作“中介端”。GCC的所有前端都指向GENERIC的子集GIMPLE。GCC 的中间阶段进行所有的独立于编译语言和目标架构的代码分析和优化,从 GENERIC 表示法开始<ref>{{Cite web |title=GENERIC (GNU Compiler Collection (GCC) Internals) |url=https://gcc.gnu.org/onlinedocs/gccint/GENERIC.html |website=gcc.gnu.org |access-date=2022-09-27}}</ref>将其转译为[[暫存器傳遞語言]](RTL)。GENERIC 表示只包含中介端优化后的指令式编程结构的子集。
GENERIC 是一种[[中間語言|中间表示语言]],在将源代码编译成可执行二进制文件时用作“中介端”。GCC的所有前端都指向GENERIC的子集GIMPLE。GCC 的中间阶段进行所有的独立于编译语言和目标架构的代码分析和优化,从 GENERIC 表示法开始<ref>{{Cite web |title=GENERIC (GNU Compiler Collection (GCC) Internals) |url=https://gcc.gnu.org/onlinedocs/gccint/GENERIC.html |website=gcc.gnu.org |access-date=2022-09-27 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/onlinedocs/gccint/GENERIC.html |dead-url=no }}</ref>将其转译为[[暫存器傳遞語言]](RTL)。GENERIC 表示只包含中介端优化后的指令式编程结构的子集。


在将源代码转译为GIMPLE表示时<ref>{{Cite web |title=GIMPLE (GNU Compiler Collection (GCC) Internals) |url=https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html |website=gcc.gnu.org |access-date=2022-09-27}}</ref>,会使用[[临时变量]]将复杂表达式拆分为[[三位址碼]]。这种表示法的灵感来自于 Laurie J. Hendren<ref>{{Cite web |title=Laurie Hendren's Home Page |url=http://www.sable.mcgill.ca/~hendren/ |website=www.sable.mcgill.ca |access-date=2022-09-27}}</ref> 在 McCAT 编译器<ref>{{Cite web |title=McCAT |url=http://www-acaps.cs.mcgill.ca/info/McCAT/McCAT.html |url-status=dead |archive-url=https://web.archive.org/web/20040812030043/http://www-acaps.cs.mcgill.ca/info/McCAT/McCAT.html |archive-date=August 12, 2004 |access-date=2022-09-27 |df=mdy-all}}</ref>中提出的 SIMPLE 表示法,用于简化[[指令式編程|指令式程序]]的分析和优化。
在将源代码转译为GIMPLE表示时<ref>{{Cite web |title=GIMPLE (GNU Compiler Collection (GCC) Internals) |url=https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html |website=gcc.gnu.org |access-date=2022-09-27 |archive-date=2023-01-18 |archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/onlinedocs/gccint/GIMPLE.html |dead-url=no }}</ref>,会使用[[临时变量]]将复杂表达式拆分为[[三位址碼]]。这种表示法的灵感来自于 Laurie J. Hendren<ref>{{Cite web |title=Laurie Hendren's Home Page |url=http://www.sable.mcgill.ca/~hendren/ |website=www.sable.mcgill.ca |access-date=2022-09-27 |archive-date=2022-09-27 |archive-url=https://web.archive.org/web/20220927074148/http://www.sable.mcgill.ca/~hendren/ |dead-url=no }}</ref> 在 McCAT 编译器<ref>{{Cite web |title=McCAT |url=http://www-acaps.cs.mcgill.ca/info/McCAT/McCAT.html |url-status=dead |archive-url=https://web.archive.org/web/20040812030043/http://www-acaps.cs.mcgill.ca/info/McCAT/McCAT.html |archive-date=2004-08-12 |access-date=2022-09-27 }}</ref>中提出的 SIMPLE 表示法,用于简化[[指令式編程|指令式程序]]的分析和优化。
==== 优化 ====
==== 优化 ====
一般[[編譯器]]作者會將語法樹的最佳化放在前端,但其實此步驟並不看語言的種類而有不同,且不需要用到語法解析器。因此GCC作者們將此步驟歸入通稱為'''中介階段'''的部分裡。此類的最佳化包括[[消解死碼]]、[[消解重複運算]]與[[全域數值重編碼]]等。許多最佳化技巧也正在實作中。
一般[[編譯器]]作者會將語法樹的最佳化放在前端,但其實此步驟並不看語言的種類而有不同,且不需要用到語法解析器。因此GCC作者們將此步驟歸入通稱為'''中介階段'''的部分裡。此類的最佳化包括[[消解死碼]]、[[消解重複運算]]與[[全域數值重編碼]]等。許多最佳化技巧也正在實作中。


=== 後端介面 ===
=== 後端介面 ===
GCC的行為因不同的[[前處理器巨集]]和特定架構功能而不同,例如不同的[[字元尺寸]]、[[呼叫方式]]與大小[[尾序]]介面的前半部訊息決RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉換成目標架構的格式。
GCC的后部分是由预处理器目标架构有的函数指定的,例如定义其[[字节序]]、[[字_(计算机)|字大小]]和[[调用约定]]。端的前半部分使来决定RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉換成目標架構的格式。在任何时候,构成程序的实际RTL指令都必须符合目标架构的机器描述标准


机器描述文件包含了RTL模式、操作数约束和输出最终汇编的代码片段。这些约束条件表明,一个特定的RTL模式可能只适用于某些硬件寄存器,或者某些只允许有限大小的即时操作数偏移(例如12、16、24、...位偏移,等等)的架构。在RTL生成过程中,给定目标架构的约束条件会被检查。为了发布一个给定的RTL片段,它必须与机器描述文件中的一个或多个RTL模式相匹配,并满足该模式的约束条件;否则,就无法将最终的RTL转换成机器代码。
GCC的最佳化技巧依其釋出版本而有很大不同,但都包含了標準的最佳化演算法,例如[[迴圈最佳化]]、[[執行緒跳躍]]、[[共通程式子句消減]]、[[指令排程]]等等。而RTL的最佳化由於可用的情形較少,且缺乏較高階的資訊,因此比較起近來增加的GIMPLE語法樹形式[https://web.archive.org/web/20070106234009/http://people.redhat.com/dnovillo/pub/tree-ssa/doc/html/],便顯得比較不重要。


在编译结束时,有效RTL会被简化为严格的形式,其中每条指令都指向真实的机器寄存器、和目标机器描述文件中的一种模式。严格化RTL是个相当复杂的工作:首先是寄存器分配,选择真实的硬件寄存器来取代最初分配的伪寄存器;还有重载,未分配实际硬件寄存器的伪寄存器都会被溢出到堆栈中,并生成执行此溢出的 RTL。过大的偏移量无法适合实际指令,故会被分解成服从偏移量约束的RTL序列。
後端經由一'''重讀取'''步驟後,利用描述目標處理器的[[指令集]]時所取得的資訊,將抽象暫存器替換成處理器的真實暫存器。此階段非常複雜,因為它必須關照所有GCC可移植平台的處理器指令集的規格與技術細節。


後端在最后通过调用与每个模式相关联的一小段代码来构建机器代码,以使用在重载时选择的最终寄存器、偏移量和地址从目标指令集中生成真正的指令。当汇编生成片段只是一个字符串时,就会执行寄存器、偏移量和/或地址到字符串的简单字符串替换。汇编生成片段也可以是一个简短的C代码块,但最终也会返回一个包含有效汇编代码的字符串。
後端的最後步驟相當公式化,僅僅將前一階段得到的組合語言碼藉由簡單的副函式轉換其暫存器與記憶體位置成相對應的機械碼。

=== C++标准库 ===
GCC 项目在GPLv3的许可下实现了C++标准库(libstdc++)。<ref>{{cite web|url=https://gcc.gnu.org/onlinedocs/libstdc++|title=The GNU C++ Library|publisher=GNU Project|accessdate=2021-02-21|archive-date=2022-12-25|archive-url=https://web.archive.org/web/20221225041607/https://gcc.gnu.org/onlinedocs/libstdc++/|dead-url=no}}</ref><ref>{{cite web|url=https://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html|title=License|publisher=GNU Project|accessdate=2021-02-21|archive-date=2023-01-18|archive-url=https://web.archive.org/web/20230118185814/https://gcc.gnu.org/onlinedocs/libstdc++/manual/license.html|dead-url=no}}</ref>目前的最新版本是11。


== 替GCC程式除錯 ==
== 替GCC程式除錯 ==
第201行: 第204行:
* [[Richard Stallman|Richard M. Stallman]]:''[http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html Using and Porting the GNU Compiler Collection]{{Wayback|url=http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html |date=20061227005125 }}'', [[Free Software Foundation]],ISBN 0-595-10035-X
* [[Richard Stallman|Richard M. Stallman]]:''[http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html Using and Porting the GNU Compiler Collection]{{Wayback|url=http://gcc.gnu.org/onlinedocs/gcc-2.95.3/gcc.html |date=20061227005125 }}'', [[Free Software Foundation]],ISBN 0-595-10035-X
* Richard M. Stallman: ''[http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/ Using Gcc: The Gnu Compiler Collection Reference]{{Wayback|url=http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/ |date=20061222151630 }}'', Free Software Foundation, ISBN 1-882114-39-6
* Richard M. Stallman: ''[http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/ Using Gcc: The Gnu Compiler Collection Reference]{{Wayback|url=http://gcc.gnu.org/onlinedocs/gcc-3.3.1/gcc/ |date=20061222151630 }}'', Free Software Foundation, ISBN 1-882114-39-6
* [[Brian J. Gough]]:''[https://archive.is/20121205072412/http://www.network-theory.co.uk/gcc/intro/ An Introduction to GCC]'', Network Theory Ltd., ISBN 0-9541617-9-3
* [[Brian J. Gough]]:''[https://archive.today/20121205072412/http://www.network-theory.co.uk/gcc/intro/ 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.
* Arthur Griffith, ''GCC: The Complete Reference''. McGrawHill/Osborne. ISBN 0-07-222405-3.
* {{cite news
* {{cite news
| date = April 22, 2005
| date = 2005-04-22
| title = Open Source GCC 4.0: Older, Faster
| title = Open Source GCC 4.0: Older, Faster
| publisher = internetnews.com
| publisher = internetnews.com
第217行: 第220行:
}}
}}
* {{cite news
* {{cite news
| date = March 2, 2006
| date = 2006-03-02
| title = New GCC Heavy on Optimization
| title = New GCC Heavy on Optimization
| publisher = internetnews.com
| publisher = internetnews.com
第248行: 第251行:
{{-}}
{{-}}
{{GNU}}
{{GNU}}
{{C语言}}
{{Authority control}}


[[Category:编译器软件]]
[[Category:编译器软件]]

2024年1月2日 (二) 11:26的最新版本

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

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

原名為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编译器[3],主要是因为许可问题。[4][5][6]GCC也可以编译WindowsAndroidiOSSolarisHP-UXIBM AIXDOS系统的代码。GCC原本用C開發,後來因為LLVMClang的崛起,它更快地將開發語言轉換為C++。許多C的愛好者在對C++一知半解的情況下主觀認定C++的性能一定會輸給C,但是Ian Lance Taylor給出了不同的意見,並表明C++不但性能不輸給C,而且能設計出更好,更容易維護的程式[7][8]

历史[编辑]

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

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

EGCS克隆[编辑]

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

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

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

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

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

目前支持的语言[编辑]

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

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

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

支援的處理器架構[编辑]

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

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

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

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

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

设计[编辑]

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

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

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

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

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

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

前端介面[编辑]

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

每个前端都使用一个分析器来产生给定的源代码的一个抽象语法树。由于语法树的抽象性,不同语言的源代码都可以被同一个后端处理。GCC一开始使用bison生成的LALR语法分析器,但在2004年逐渐转向用于C++的递归下降解析器[54],并在 2006 年用于CObjective-C[55]。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 表示法开始[56]将其转译为暫存器傳遞語言(RTL)。GENERIC 表示只包含中介端优化后的指令式编程结构的子集。

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

优化[编辑]

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

後端介面[编辑]

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

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

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

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

C++标准库[编辑]

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

替GCC程式除錯[编辑]

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

GCC内嵌汇编[编辑]

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

参考文献[编辑]

引用[编辑]

  1. ^ 1.0 1.1 GCC 14.1 Released. 2024年5月7日 [2024年5月7日]. 
  2. ^ 2.0 2.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). 
  3. ^ The LLVM Compiler Infrastructure Project. llvm.org. [2022-09-24]. (原始内容存档于2023-01-18). 
  4. ^ Apple's GPLv3 purge. meta.ath0.com. [2021-01-12]. (原始内容存档于2023-01-18) (美国英语). 
  5. ^ Linnemann, Reid. Why Clang. 2012-06-20 [2021-01-12]. (原始内容存档于2023-01-18). 
  6. ^ August 29, 2007: FreeBSD Foundation Newsletter, August 29, 2007. 2007-10-11 [2021-01-12]. (原始内容存档于2007-10-11). 
  7. ^ GCC's move to C++. [2013-05-01]. (原始内容存档于2013-06-14). 
  8. ^ Taylor的演讲簡報 (PDF). [2018-05-19]. (原始内容存档 (PDF)于2018-07-01). 
  9. ^ 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. 
  10. ^ 10.0 10.1 10.2 Stallman, Richard. About the GNU Project. The GNU Project. 2011-09-20 [2011-10-09]. (原始内容存档于2011-04-24). 
  11. ^ Puzo, Jerome E. (编). Gnu's Zoo. GNU's Bulletin (Free Software Foundation). February 1986, 1 (1) [2007-08-11]. (原始内容存档于2015-06-23). 
  12. ^ 12.0 12.1 12.2 12.3 von Hagen, William. The Definitive Guide to GCC. Definitive Guides 2nd. Apress. 2006: XXVII. ISBN 978-1-4302-0219-6. 
  13. ^ Richard M. Stallman (forwarded by Leonard H. Tower Jr.). GNU C compiler beta test release. Newsgroupcomp.lang.c 请检查|newsgroup=值 (帮助). March 22, 1987 [October 9, 2011]. (原始内容存档于2013-06-02). 
  14. ^ 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). 
  15. ^ Salus, Peter H. Chapter 10. SUN and gcc. The Daemon, the Gnu and the Penguin. Groklaw. 2005 [2022-09-24]. (原始内容存档于2022-06-20). 
  16. ^ Garfinkel, Simson L. Get ready for GNU software. Computerworld. 1990-08-06: 102. 
  17. ^ 17.0 17.1 Henkel-Wallace, David, A new compiler project to merge the existing GCC forks, 1997-08-15 [2012-05-25], (原始内容存档于2023-01-18). 
  18. ^ The Short History of GCC development. www.softpanorama.org. [2021-01-24]. (原始内容存档于2022-11-09). 
  19. ^ History - GCC Wiki. gcc.gnu.org. [2020-09-28]. (原始内容存档于2023-01-18). 
  20. ^ GCC steering committee - GNU Project. gcc.gnu.org. [2022-09-24]. (原始内容存档于2023-01-18). 
  21. ^ PATCH] Remove chill. gcc.gnu.org. [2010-07-29]. (原始内容存档于2016-10-20). 
  22. ^ Chart of Fortran 2003 Features supported by GNU Fortran. GNU. [2009-06-25]. (原始内容存档于2023-01-18). 
  23. ^ Chart of Fortran 2008 Features supported by GNU Fortran. GNU. [2009-06-25]. (原始内容存档于2023-01-18). 
  24. ^ GCC 4.8 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. [2022-09-24]. (原始内容存档于2015-12-08). 
  25. ^ GCC 5 Release Series — Changes, New Features, and Fixes. gcc.gnu.org. [2022-09-24]. (原始内容存档于2023-01-18). 
  26. ^ GCC 8 Release Series — Changes, New Features, and Fixes. gcc.gnu.org. [2022-09-24]. (原始内容存档于2018-11-29). 
  27. ^ Symbian GCC Improvement Project. [2007-11-08]. (原始内容存档于2014-08-01). 
  28. ^ Linux Board Support Packages. [2021-01-24]. (原始内容存档于2011-06-07). 
  29. ^ setting up gcc as a cross-compiler. ps2stuff. 2002-06-08 [2008-12-12]. (原始内容存档于2008-12-11). 
  30. ^ CompileFarm - GCC Wiki. gcc.gnu.org. [2022-09-25]. (原始内容存档于2023-01-18). 
  31. ^ sh4 g++ guide. [2008-12-12]. (原始内容存档于2002-12-20). 
  32. ^ 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. 
  33. ^ The D Language Front-End Finally Merged Into GCC 9 - Phoronix. phoronix.com. [2021-01-19]. (原始内容存档于2022-05-17). 
  34. ^ 34.0 34.1 GCC Front Ends. gnu.org. 2022-04-16 [2022-09-25]. (原始内容存档于2023-01-18). 
  35. ^ 引用错误:没有为名为:2的参考文献提供内容
  36. ^ GCC 5 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. 2015-04-22 [2022-09-25]. (原始内容存档于2023-01-18). 
  37. ^ GCC 7 Release Series. GCC 7 Release Series: Changes, New Features, and Fixes. gnu.org. 2017-05-02 [2022-09-25]. (原始内容存档于2020-09-02). 
  38. ^ C++ Standards Support in GCC. gcc.gnu.org. 2022-09-09 [2022-09-25]. (原始内容存档于2022-04-20). 
  39. ^ GCC UPC (GCC Unified Parallel C). Intrepid Technology, Inc. 2006-02-20 [2009-03-11]. (原始内容存档于2010-02-11). 
  40. ^ Spengler, Brad. Open Source Security, Inc. Announces Funding of GCC Front-End for Rust. 2021-01-12. (原始内容存档于2021-04-25). 
  41. ^ Option Summary (Using the GNU Compiler Collection (GCC)). gcc.gnu.org. [2020-08-21]. (原始内容存档于2023-01-18). 
  42. ^ Hexagon Project Wiki. [2022-09-25]. (原始内容存档于2013-12-24). 
  43. ^ Google Code Archive - Long-term storage for Google Code Project Hosting.. code.google.com. [2022-09-25]. (原始内容存档于2022-09-25). 
  44. ^ The GNU Compiler for the Java Programming Language. [2010-04-22]. (原始内容存档于2007-05-09). 
  45. ^ graphing calculators#programming
  46. ^ Security Features: Compile Time Buffer Checks (FORTIFY_SOURCE). Security Features. fedoraproject.org. [2022-09-26]. (原始内容存档于2007-01-07). 
  47. ^ languages used to make GCC. [2022-09-26]. (原始内容存档于2008-05-27). 
  48. ^ 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). 
  49. ^ Prerequisites for GCC - GNU Project. gcc.gnu.org. 2022-04-29 [2022-09-26]. (原始内容存档于2023-01-18). 
  50. ^ GCC allows C++ – to some degree. The H. 2010-06-01 [2022-09-26]. (原始内容存档于2022-09-26). 
  51. ^ Re: Efforts to attract more users?. lists.gnu.org. [2022-09-26]. (原始内容存档于2023-01-18). 
  52. ^ GCC 4.8 Release Series: Changes, New Features, and Fixes. [2013-10-04]. (原始内容存档于2015-12-08). 
  53. ^ bootstrap: Update requirement to C++11.. GitHub. 2020-05-19 [2022-09-27]. (原始内容存档于2022-09-29) –通过github. 
  54. ^ 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). 
  55. ^ GCC 4.1 Release Series — Changes, New Features, and Fixes - GNU Project. gcc.gnu.org. 2021-10-18 [2022-09-27]. (原始内容存档于2023-01-18). 
  56. ^ GENERIC (GNU Compiler Collection (GCC) Internals). gcc.gnu.org. [2022-09-27]. (原始内容存档于2023-01-18). 
  57. ^ GIMPLE (GNU Compiler Collection (GCC) Internals). gcc.gnu.org. [2022-09-27]. (原始内容存档于2023-01-18). 
  58. ^ Laurie Hendren's Home Page. www.sable.mcgill.ca. [2022-09-27]. (原始内容存档于2022-09-27). 
  59. ^ McCAT. [2022-09-27]. (原始内容存档于2004-08-12). 
  60. ^ The GNU C++ Library. GNU Project. [2021-02-21]. (原始内容存档于2022-12-25). 
  61. ^ License. GNU Project. [2021-02-21]. (原始内容存档于2023-01-18). 

来源[编辑]

更多閱讀[编辑]

外部链接[编辑]

参见[编辑]

  • 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專案。