百科解釋
目錄·概觀·目前支持的語(yǔ)言·支持的處理器架構(gòu)·結(jié)構(gòu)·替 GCC 程序除錯(cuò)·參考書(shū)目及注釋·參閱 GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由 GNU 開(kāi)發(fā)的編程語(yǔ)言編譯器。它是一套以 GPL 及 LGPL 許可證所發(fā)行的自由軟件,也是 GNU計(jì)劃 的關(guān)鍵部分,亦是自由的 類(lèi)Unix 及蘋(píng)果計(jì)算機(jī) Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。GCC(特別是其中的C語(yǔ)言編譯器)也常被認(rèn)為是跨平臺(tái)編譯器的事實(shí)標(biāo)準(zhǔn)。 GCC 原名為 GNU C 語(yǔ)言編譯器(GNU C Compiler),因?yàn)樗局荒芴幚?C語(yǔ)言。GCC 很快地?cái)U(kuò)展,變得可處理 C++。之后也變得可處理 Fortran、Pascal、Objective-C、Java, 以及 Ada 與其他語(yǔ)言。 概觀 GCC是由理查德·馬修·斯托曼在1985年開(kāi)始的。他首先擴(kuò)增一個(gè)舊有的編譯器,使它能編譯C,這個(gè)編譯器一開(kāi)始是以Pastel語(yǔ)言所寫(xiě)的。Pastel是一個(gè)不可移植的Pascal語(yǔ)言特殊版,這個(gè)編譯器也只能編譯Pastel語(yǔ)言。為了讓自由軟件有一個(gè)編譯器,后來(lái)此編譯器由斯托曼和Len Tower在1987年[1]以C語(yǔ)言重寫(xiě)[2]并成為GNU項(xiàng)目的編譯器。GCC的建立者由自由軟件基金會(huì)直接管理[3]。 在1997年,一群不滿GCC緩慢且封閉的創(chuàng)作環(huán)境者,組織了一個(gè)名為EGCS〈Experimental/Enhanced GNU Compiler System〉的項(xiàng)目,此項(xiàng)目匯整了數(shù)項(xiàng)實(shí)驗(yàn)性的分支進(jìn)入某個(gè)GCC項(xiàng)目的分支中。EGCS比起GCC的建構(gòu)環(huán)境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。 GCC目前由世界各地不同的數(shù)個(gè)程序設(shè)計(jì)師小組維護(hù)。它是移植到中央處理器架構(gòu)以及操作系統(tǒng)最多的編譯器。 由于GCC已成為GNU系統(tǒng)的官方編譯器(包括GNU/Linux家族),它也成為編譯與建立其他操作系統(tǒng)的主要編譯器,包括BSD家族、Mac OS X、NeXTSTEP與BeOS。 GCC通常是跨平臺(tái)軟件的編譯器首選。有別于一般局限于特定系統(tǒng)與執(zhí)行環(huán)境的編譯器,GCC在所有平臺(tái)上都使用同一個(gè)前端處理程序,產(chǎn)生一樣的中介碼,因此此中介碼在各個(gè)其他平臺(tái)上使用GCC編譯,有很大的機(jī)會(huì)可得到正確無(wú)誤的輸出程序。 目前支持的語(yǔ)言 以2006年5月24日釋出的4.1.1版為準(zhǔn),本編譯器版本可處理下列語(yǔ)言: 先前版本納入的CHILL前端由于缺乏維護(hù)而被廢棄。 Fortran前端在4.0版之前是G77,此前端僅支持Fortran 77。在本版本中,G77被廢棄而采用更新的GFortran,因?yàn)榇饲岸酥С諪ortran 95。 下列前端依然存在: 支持的處理器架構(gòu) GCC目前支持下列處理器架構(gòu)(以4.1版為準(zhǔn)): 較不知名的處理器架構(gòu)也在官方釋出版本中支持: 由FSF個(gè)別維護(hù)的GCC處理器架構(gòu): 當(dāng)GCC需要移植到一個(gè)新平臺(tái)上,通常使用此平臺(tái)固有的語(yǔ)言來(lái)撰寫(xiě)其初始階段。 結(jié)構(gòu) GCC的外部界面長(zhǎng)得像一個(gè)標(biāo)準(zhǔn)的Unix編譯器。使用者在命令行下鍵入<code>gcc</code>之程序名,以及一些命令參數(shù),以便決定每個(gè)輸入文件使用的個(gè)別語(yǔ)言編譯器,并為輸出代碼使用適合此硬件平臺(tái)的匯編語(yǔ)言編譯器,并且選擇性地執(zhí)行連接器以制造可執(zhí)行的程序。 每個(gè)語(yǔ)言編譯器都是獨(dú)立程序,此程序可處理輸入的源代碼,并輸出匯編語(yǔ)言碼。全部的語(yǔ)言編譯器都擁有共通的中介架構(gòu):一個(gè)前端解析符合此語(yǔ)言的源代碼,并產(chǎn)生一抽象語(yǔ)法樹(shù),以及一翻譯此語(yǔ)法樹(shù)成為GCC的寄存器轉(zhuǎn)換語(yǔ)言〈RTL〉的后端。編譯器最佳化與靜態(tài)代碼解析技術(shù)(例如FORTIFY_SOURCE[1],一個(gè)試圖發(fā)現(xiàn)緩存溢出〈buffer overflow〉的編譯器)在此階段應(yīng)用于代碼上。最后,適用于此硬件架構(gòu)的匯編語(yǔ)言代碼以Jack Davidson與Chris Fraser發(fā)明的算法產(chǎn)出。 幾乎全部的GCC都由C寫(xiě)成,除了Ada前端大部分以Ada寫(xiě)成。 前端界面 前端的功能在于產(chǎn)生一個(gè)可讓后端處理之語(yǔ)法樹(shù)。此語(yǔ)法解析器是手寫(xiě)之遞回語(yǔ)法解析器。 直到最近,程序的語(yǔ)法樹(shù)結(jié)構(gòu)尚無(wú)法與欲產(chǎn)出的處理器架構(gòu)脫鉤。而語(yǔ)法樹(shù)的規(guī)則有時(shí)在不同的語(yǔ)言前端也不一樣,有些前端會(huì)提供它們特別的語(yǔ)法樹(shù)規(guī)則。 在2005年,兩種與語(yǔ)言脫鉤的新型態(tài)語(yǔ)法樹(shù)納入GCC中。它們稱(chēng)為GENERIC與GIMPLE。語(yǔ)法解析變成產(chǎn)生與語(yǔ)言相關(guān)的暫時(shí)語(yǔ)法樹(shù),再將它們轉(zhuǎn)成GENERIC。之后再使用"gimplifier"技術(shù)降低GENERIC的復(fù)雜結(jié)構(gòu),成為一較簡(jiǎn)單的靜態(tài)唯一形式(Static Single Assignment form,SSA)基礎(chǔ)的GIMPLE形式。此形式是一個(gè)與語(yǔ)言和處理器架構(gòu)脫鉤的全局最佳化通用語(yǔ)言,適用于大多數(shù)的現(xiàn)代編程語(yǔ)言。 中介界面 一般編譯器作者會(huì)將語(yǔ)法樹(shù)的最佳化放在前端,但其實(shí)此步驟并不看語(yǔ)言的種類(lèi)而有不同,且不需要用到語(yǔ)法解析器。因此GCC作者們將此步驟歸入通稱(chēng)為中介階段的部分里。此類(lèi)的最佳化包括消解死碼、消解重復(fù)運(yùn)算與全局?jǐn)?shù)值重編碼等。許多最佳化技巧也正在實(shí)作中。 后端界面 GCC后端的行為因不同的前處理器宏和特定架構(gòu)的功能而不同,例如不同的字符尺寸、調(diào)用方式與大小尾序等。后端界面的前半部利用這些消息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉(zhuǎn)換成目標(biāo)架構(gòu)的格式。 GCC的最佳化技巧依其釋出版本而有很大不同,但都包含了標(biāo)準(zhǔn)的最佳化算法,例如循環(huán)最佳化、線程跳躍、共通程序子句消減、指令調(diào)度等等。而RTL的最佳化由于可用的情形較少,且缺乏較高級(jí)的信息,因此比較起近來(lái)增加的GIMPLE語(yǔ)法樹(shù)形式[2],便顯得比較不重要。 后端經(jīng)由一重讀取步驟后,利用描述目標(biāo)處理器的指令集時(shí)所取得的信息,將抽象寄存器替換成處理器的真實(shí)寄存器。此階段非常復(fù)雜,因?yàn)樗仨氷P(guān)照所有GCC可移植平臺(tái)的處理器指令集的規(guī)格與技術(shù)細(xì)節(jié)。 后端的最后步驟相當(dāng)公式化,僅僅將前一階段得到的匯編語(yǔ)言碼借由簡(jiǎn)單的副函數(shù)轉(zhuǎn)換其寄存器與內(nèi)存位置成相對(duì)應(yīng)的機(jī)器碼。 替 GCC 程序除錯(cuò) 為 GCC 除錯(cuò)的首選工具當(dāng)然是 GNU 除錯(cuò)器。其他特殊用途的除錯(cuò)工具是 Valgrind, 用以發(fā)現(xiàn)內(nèi)存漏失 (Memory leak)。而 GNU 測(cè)量器 (gprof) 可以得知程序中某些函數(shù)花費(fèi)多少時(shí)間,以及其調(diào)用頻率;此功能需要使用者在編譯時(shí)選定測(cè)量〈profiling〉選項(xiàng)。 參考書(shū)目及注釋 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 ^ Tower, Leonard (1987) "GNU C 編譯器beta測(cè)試版釋出" comp.lang.misc USENET 新聞組;參閱 http://gcc.gnu.org/releases.html#timeline ^ <cite style="font-style:normal;font-size: 100%">Stallman, Richard M.(1986年2月1日).“GNU 狀態(tài)”.GNU的公告版.1(1).</cite> ^ Stallman, Richard M. (2001) "GCC貢獻(xiàn)者名單" 于 使用及移植GCC 2.95版 (Cambridge, Mass.: Free Software Foundation) 參閱 [[Image:|36x32px|自由軟件主題]] 自由軟件主題首頁(yè) GCC目前包含了 Boehm GC,一個(gè)為 C/C++ 所設(shè)計(jì)的垃圾回收器。 distcc - 為分布式編譯所設(shè)計(jì)的軟件,以 GCC 為協(xié)同軟件。 LLVM - 低層虛擬機(jī)編譯器架構(gòu)。 MinGW - 將 GNU 開(kāi)發(fā)工具移植到 Win32 平臺(tái)下的計(jì)劃 Cygwin - 在 Windows 上執(zhí)行 GNU 程序的模擬軟件。 GCC Summit OpenWatcom - 另一個(gè)開(kāi)放原碼的 C++/Fortran 編譯器。 Code Sourcery - 一個(gè) GCC 顧問(wèn)公司。 ggcc - 全球化 GCC 項(xiàng)目。
移動(dòng)通信網(wǎng) | 通信人才網(wǎng) | 更新日志 | 團(tuán)隊(duì)博客 | 免責(zé)聲明 | 關(guān)于詞典 | 幫助