GCC
维基百科,自由的百科全书
|
GNU编译器套裝 |
|
|---|---|
| 開發 | The GNU Project |
| 最新版本 | 4.4.0 / 4月21日, 2009年 |
| 作業系統 | 跨平台 |
| 類型 | 编译器 |
| 許可協議 | GPL |
| 網站 | gcc.gnu.org |
GCC(GNU Compiler Collection,GNU编译器套裝),是一套由 GNU 开发的编程語言编译器。它是一套以 GPL 及 LGPL 許可證所發行的自由軟體,也是 GNU計畫 的关键部分,亦是自由的 类Unix 及蘋果電腦 Mac OS X 操作系統的标准编译器。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緩慢且封閉的創作環境者,組織了一個名為EGCS《Experimental/Enhanced GNU Compiler System》的專案,此專案彙整了數項實驗性的分支進入某個GCC專案的分支中。EGCS比起GCC的建構環境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。
GCC目前由世界各地不同的數個程式設計師小組維護。它是移植到中央處理器架構以及作業系統最多的編譯器。
由於GCC已成為GNU系統的官方編譯器(包括GNU/Linux家族),它也成為編譯與建立其他作業系統的主要編譯器,包括BSD家族、Mac OS X、NeXTSTEP與BeOS。
GCC通常是跨平台軟體的編譯器首選。有別於一般侷限於特定系統與執行環境的編譯器,GCC在所有平台上都使用同一個前端處理程式,產生一樣的中介碼,因此此中介碼在各個其他平台上使用GCC編譯,有很大的機會可得到正確無誤的輸出程式。
[编辑] 目前支持的语言
以2006年5月24日釋出的4.1.1版為準,本編譯器版本可處理下列語言:
|
先前版本納入的CHILL前端由於缺乏維護而被廢棄。
Fortran前端在4.0版之前是G77,此前端僅支援Fortran 77。在本版本中,G77被廢棄而採用更新的GFortran,因為此前端支援Fortran 95。
下列前端依然存在:
[编辑] 内嵌OpenMP支持
OpenMP是一种跨语言的对称多处理器(SMP)多线程并行程序的编程工具,也非常适合当今越来越流行的单CPU多核硬件环境,因此从gcc4.2开始,OpenMP成为其内嵌支持的并行编程规范,可以直接编译内嵌OpenMP语句的C/C++/Fortran95的源代码。gcc4.2之前如果想在C/C++/Fortran中嵌入OpenMP语句的话,需要额外安装库和预处理器才能识别和正确处理这些语句。
- gcc 4.2.0 开始支持 OpenMP v2.5
- gcc 4.4.0 开始支持 OpenMP v2.5及v3.0
参见GNU的GOMP计划
[编辑] 支援的處理器架構
GCC目前支援下列處理器架構(以4.1版為準):
較不知名的處理器架構也在官方釋出版本中支援:
由FSF個別維護的GCC處理器架構:
當GCC需要移植到一個新平台上,通常使用此平台固有的語言來撰寫其初始階段。
[编辑] 結構
GCC的外部介面長得像一個標準的Unix編譯器。使用者在命令列下鍵入gcc之程式名,以及一些命令參數,以便決定每個輸入檔案使用的個別語言編譯器,並為輸出程式碼使用適合此硬體平台的組合語言編譯器,並且選擇性地執行連結器以製造可執行的程式。
每個語言編譯器都是獨立程式,此程式可處理輸入的原始碼,並輸出組合語言碼。全部的語言編譯器都擁有共通的中介架構:一個前端解析符合此語言的原始碼,並產生一抽象語法樹,以及一翻譯此語法樹成為GCC的暫存器轉換語言《RTL》的後端。編譯器最佳化與靜態程式碼解析技術(例如FORTIFY_SOURCE[1],一個試圖發現緩衝區溢位《buffer overflow》的編譯器)在此階段應用於程式碼上。最後,適用於此硬體架構的組合語言程式碼以Jack Davidson與Chris Fraser發明的演算法產出。
幾乎全部的GCC都由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》選項。
[编辑] 參考書目及註釋
- 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
- ^ Stallman, Richard M.(1986年2月1日).GNU 状态.GNU的公告版,1(1).自由軟體基金會.
- ^ Stallman, Richard M. (2001) "GCC貢獻者名單" 於 使用及移植GCC 2.95版 (Cambridge, Mass.: Free Software Foundation)
[编辑] 參閱
GCC目前包含了 Boehm GC,一個為 C/C++ 所設計的垃圾回收器。
- distcc - 為分散式編譯所設計的軟體,以 GCC 為協同軟體。
- LLVM - 低層虛擬機器編譯器架構。
- MinGW - 將 GNU 開發工具移植到 Win32 平臺下的計畫
- Cygwin - 在 Windows 上執行 GNU 程式的模擬軟體。
- GCC Summit
- OpenWatcom - 另一個開放原碼的 C++/Fortran 編譯器。
- Code Sourcery - 一個 GCC 顧問公司。
- ggcc - 全球化 GCC 專案。
[编辑] 更多閱讀
- 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年4月22日.
- Kerner, Sean Michael.New GCC Heavy on Optimization,internetnews.com,2006年3月2日.
[编辑] 外部链接
|
|
||
|---|---|---|
| 历史 | GNU宣言 · GNU计划 · 自由软件基金会 · 自由软件历史 | |
| GNU许可证 | GNU通用公共许可证 · GNU宽通用公共许可证 · GNU自由文档许可证 · GPL linking exception | |
| 软件 | GNU (变种) · GNOME · Gnuzilla · Gnash · Bash · GCC · GNU Emacs · GNU C 函式庫 · Coreutils · GNU build system · 其他GNU软件 | |
| 发言人 | Robert J. Chassell · Loïc Dachary · Ricardo Galli · Georg C. F. Greve · Federico Heinz · Benjamin Mako Hill · Bradley M. Kuhn · 伊本·莫格林 · Brett Smith · 理查德·斯托曼 · John Sullivan | |

