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