GCC

























































GNU编译器套裝

GNU Compiler Collection logo.svg
開發者
GNU計劃
初始版本
1987年5月23日 (1987-05-23)
穩定版本
穩定版本
8.2
(2018年7月26日,​3個月前​(2018-07-26[1]


编程语言
C++
操作系统
跨平台
类型
编译器
许可协议
GNU通用公共许可证第三版或更新
網站
gcc.gnu.org
源代码库

  • https://gcc.gnu.org/viewcvs/gcc/

編輯維基數據鏈接

GNU编译器套裝英语:GNU Compiler Collection,縮寫為GCC),指一套编程語言编译器,以GPL及LGPL許可證所發行的自由軟體,也是GNU計畫的关键部分,也是GNU工具链的主要組成部份之一。GCC(特别是其中的C语言编译器)也常被认为是跨平台编译器的事实标准。1985年由理查德·马修·斯托曼開始發展,現在由自由軟體基金會負責維護工作。


原名為GNU C語言編譯器GNU C Compiler),因為它原本只能處理C語言。GCC在发布后很快地得到擴展,變得可處理C++。之後也變得可處理Fortran、Pascal、Objective-C、Java、Ada,Go與其他語言。


許多操作系統,包括許多类Unix系統,如Linux及BSD家族都採用GCC作為标准编译器。蘋果電腦预装的Mac OS X操作系统也採用這個編譯器。


GCC原本用C開發,後來因為LLVM、Clang的崛起,它更快地將開發語言轉換為C++。許多C的愛好者在對C++一知半解的情況下主觀認定C++的性能一定會輸給C,但是Ian Lance Taylor給出了不同的意見,並表明C++不但性能不輸給C,而且能設計出更好,更容易維護的程式(GCC's move to C++、Taylor的演讲簡報)。




目录






  • 1 概觀


  • 2 目前支持的语言


    • 2.1 内嵌OpenMP支持




  • 3 支援的處理器架構


  • 4 結構


    • 4.1 前端介面


    • 4.2 中介介面


    • 4.3 後端介面




  • 5 替GCC程式除錯


  • 6 GCC内嵌汇编


  • 7 参考文献


    • 7.1 引用


    • 7.2 来源




  • 8 更多閱讀


  • 9 外部链接


  • 10 参见





概觀


GCC是由理查德·马修·斯托曼在1985年開始的。他首先擴增一個舊有的編譯器,使它能編譯C,這個編譯器一開始是以Pastel語言所寫的。Pastel是一個不可移植的Pascal語言特殊版,這個編譯器也只能編譯Pastel語言。為了讓自由軟體有一個編譯器,後來此編譯器由斯托曼和Len Tower在1987年[2]以C語言重寫[3]並成為GNU專案的編譯器。GCC的建立者由自由軟體基金會直接管理[4]


在1997年,一群不滿GCC緩慢且封閉的創作環境者,組織了一個名為EGCS(Experimental/Enhanced GNU Compiler System)的專案,此專案彙整了數項實驗性的分支進入某個GCC專案的分支中。EGCS比起GCC的建構環境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。


GCC目前由世界各地不同的數個程式設計師小組維護。它是移植到最多中央處理器架構以及最多操作系统的編譯器。


由於GCC已成為GNU系統的官方編譯器(包括GNU/Linux家族),在LLVM、Clang崛起之前,它也是編譯與建立其他作業系統的主要編譯器,包括BSD家族、Mac OS X、NeXTSTEP與BeOS等。


GCC通常是跨平台軟體的編譯器首選。有別於一般侷限於特定系統與執行環境的編譯器,GCC在所有平台上都使用同一個前端處理程式,產生一樣的中介碼,因此此中介碼在各個其他平台上使用GCC編譯,有很大的機會可得到正確無誤的輸出程式。



目前支持的语言


以2011年10月26日釋出的4.6.2版為準,本編譯器版本可處理下列語言:










  • Ada(GNAT)


  • C(GCC,带 GNU 拓展)


  • C++(G++,带 GNU 拓展)


  • Fortran(Fortran 77: G77,Fortran 90: GFORTRAN)






  • Java(编译器:GCJ;解释器:GIJ英语GNU Interpreter for Java


  • Objective-C(GOBJC)

  • Objective-C++

  • Go






先前版本納入的CHILL英语CHILL前端由於缺乏維護而被廢棄。


Fortran前端在4.0版之前是G77,此前端僅支援Fortran 77。在本版本中,G77被廢棄而採用更新的GFortran,因為此前端支援Fortran 95。


下列前端依然存在:









  • Modula-2

  • Modula-3

  • Pascal

  • PL/I





  • D語言

  • Mercury

  • VHDL







内嵌OpenMP支持


OpenMP是一种跨语言的对称多处理机多线程并行程序的编程工具,也非常适合当今越来越流行的单CPU多核硬件环境,因此从gcc4.2开始,OpenMP成为其内嵌支持的并行编程规范,可以直接编译内嵌OpenMP语句的C/C++/Fortran95的源代码。gcc4.2之前如果想在C/C++/Fortran中嵌入OpenMP语句的话,需要额外安装库和预处理器才能识别和正确处理这些语句。现在 GCC GOMP 计划实现了这些支持[5]



  • gcc 4.2.0开始支持OpenMP v2.5

  • gcc 4.4.0开始支持OpenMP v3.0

  • gcc 4.9.1开始支持OpenMP v4.0



支援的處理器架構


GCC目前支援下列處理器架構(以4.1版為準):










  • Alpha

  • ARM

  • Atmel AVR

  • Blackfin

  • H8/300


  • IA-32(x86)與x86-64


  • IA-64例如:Itanium






  • MorphoSys家族

  • Motorola 68000

  • Motorola 88000


  • MIPS與龍芯

  • PA-RISC

  • PDP-11

  • PowerPC






  • System/370,System/390

  • SuperH

  • HC12

  • SPARC

  • VAX


  • Renesas R8C/M16C/M32C家族






較不知名的處理器架構也在官方釋出版本中支援:










  • A29K

  • ARC

  • C4x

  • CRIS

  • D30V

  • DSP16xx

  • FR-30

  • FR-V





  • Intel i960

  • IP2000

  • M32R

  • 68HC11

  • MCORE

  • MMIX





  • MN10200

  • MN10300

  • NS32K

  • ROMP

  • Stormy16

  • V850

  • Xtensa






由FSF個別維護的GCC處理器架構:









  • D10V

  • MicroBlaze





  • PDP-10

  • MSP430





  • Z8000


  • NEC SX-9 並行向量處理機[6]




當GCC需要移植到一個新平台上,通常使用此平台固有的語言來撰寫其初始階段



結構


GCC的外部介面長得像一個標準的Unix編譯器。使用者在命令列下鍵入gcc之程式名,以及一些命令參數,以便決定每個輸入檔案使用的個別語言編譯器,並為輸出程式碼使用適合此硬體平台的組合語言編譯器,並且選擇性地執行連結器以製造可執行的程式。


每個語言編譯器都是獨立程式,此程式可處理輸入的原始碼,並輸出組合語言碼。全部的語言編譯器都擁有共通的中介架構:一個前端解析符合此語言的原始碼,並產生一抽象語法樹,以及一翻譯此語法樹成為GCC的暫存器轉換語言的後端。編譯器最佳化與靜態程式碼解析技術(例如FORTIFY_SOURCE[1],一個試圖發現緩衝區溢位的編譯器)在此階段應用於程式碼上。最後,適用於此硬體架構的組合語言程式碼以傑克·戴維森英语Jack Davidson克里斯·弗雷澤英语Chris Fraser發明的演算法產出。


幾乎全部的GCC都由C/C++寫成,除了Ada前端大部分以Ada寫成。



前端介面


前端的功能在於產生一個可讓後端處理之語法樹。此語法解析器是手寫之遞迴語法解析器。


直到最近,程式的語法樹結構尚無法與欲產出的處理器架構脫鉤。而語法樹的規則有時在不同的語言前端也不一樣,有些前端會提供它們特別的語法樹規則。


在2005年,兩種與語言脫鉤的新型態語法樹納入GCC中。它們稱為GENERIC與GIMPLE。語法解析變成產生與語言相關的暫時語法樹,再將它們轉成GENERIC。之後再使用「gimplifier」技術降低GENERIC的複雜結構,成為一較簡單的靜態唯一形式(Static Single Assignment form,SSA)基礎的GIMPLE形式。此形式是一個與語言和處理器架構脫鉤的全域最佳化通用語言,適用於大多數的現代程式語言。



中介介面


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



後端介面


GCC後端的行為因不同的前處理器巨集和特定架構的功能而不同,例如不同的字元尺寸、呼叫方式與大小尾序等。後端介面的前半部利用這些訊息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉換成目標架構的格式。


GCC的最佳化技巧依其釋出版本而有很大不同,但都包含了標準的最佳化演算法,例如迴圈最佳化、執行緒跳躍、共通程式子句消減、指令排程等等。而RTL的最佳化由於可用的情形較少,且缺乏較高階的資訊,因此比較起近來增加的GIMPLE語法樹形式[2],便顯得比較不重要。


後端經由一重讀取步驟後,利用描述目標處理器的指令集時所取得的資訊,將抽象暫存器替換成處理器的真實暫存器。此階段非常複雜,因為它必須關照所有GCC可移植平台的處理器指令集的規格與技術細節。


後端的最後步驟相當公式化,僅僅將前一階段得到的組合語言碼藉由簡單的副函式轉換其暫存器與記憶體位置成相對應的機械碼。



替GCC程式除錯


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



GCC内嵌汇编


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



参考文献



引用





  1. ^ GCC Releases. 


  2. ^ Tower, Leonard (1987) "GNU C編譯器beta測試版釋出" comp.lang.misc USENET新聞群組;參閱http://gcc.gnu.org/releases.html#timeline


  3. ^ Stallman, Richard M. GNU狀態. GNU的公告版 (自由軟體基金會). February 1986, 1 (1). 


  4. ^ Stallman, Richard M. (2001) "GCC貢獻者名單"於使用及移植GCC 2.95版(Cambridge, Mass.: Free Software Foundation)


  5. ^ GOMP计划


  6. ^ sx-gcc - port gcc to nec sx vector cpu - Google Project Hosting




来源




  • 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. April 22, 2005. 


  • Kerner, Sean Michael. New GCC Heavy on Optimization. internetnews.com. March 2, 2006. 



外部链接



  • GCC官方网站


  • YouTube上的淺談GCC編譯技術Break Compilation Boundaries with GCC


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






Popular posts from this blog

Lambaréné

Chris Pine

Kashihara Line