GCC-維基百科
GCC(GNU Compiler Collection,GNU編譯器套裝),是一套由GNU開(kāi)發(fā)的編程語(yǔ)言編譯器。它是一套以GPL及LGPL許可證所發(fā)行的自由軟件,也是GNU計劃的關(guān)鍵部分,亦是自由的類(lèi)Unix及蘋(píng)果電腦Mac OS X 操作系統的標準編譯器。GCC(特別是其中的C語(yǔ)言編譯器)也常被認為是跨平臺編譯器的事實(shí)標準。
本文引用地址:http://dyxdggzs.com/article/257969.htmGCC原名為GNU C語(yǔ)言編譯器(GNU C Compiler),因為它原本只能處理C語(yǔ)言。GCC很快地擴展,變得可處理C++。之后也變得可處理Fortran、Pascal、Objective-C、Java,以及Ada與其他語(yǔ)言。
目錄 [隱藏]
1 概觀(guān)
2 目前支持的語(yǔ)言
2.1 內嵌OpenMP支持
3 支持的處理器架構
4 結構
4.1 前端界面
4.2 中介界面
4.3 后端界面
5 替GCC程序除錯
6 參考書(shū)目及注釋
7 參閱
8 更多閱讀
9 外部鏈接
概觀(guān)
GCC是由理查德·馬修·斯托曼在1985年開(kāi)始的。他首先擴增一個(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專(zhuān)案的編譯器。GCC的建立者由自由軟件基金會(huì )直接管理[3]。
在1997年,一群不滿(mǎn)GCC緩慢且封閉的創(chuàng )作環(huán)境者,組織了一個(gè)名為EGCS《Experimental/Enhanced GNU Compiler System》的專(zhuān)案,此專(zhuān)案匯整了數項實(shí)驗性的分支進(jìn)入某個(gè)GCC專(zhuān)案的分支中。EGCS比起GCC的建構環(huán)境更有活力,且EGCS最終也在1999年四月成為GCC的官方版本。
GCC目前由世界各地不同的數個(gè)程序設計師小組維護。它是移植到中央處理器架構以及操作系統最多的編譯器。
由于GCC已成為GNU系統的官方編譯器(包括GNU/Linux家族),它也成為編譯與建立其他操作系統的主要編譯器,包括BSD家族、Mac OS X、NeXTSTEP與BeOS。
GCC通常是跨平臺軟件的編譯器首選。有別于一般局限于特定系統與運行環(huán)境的編譯器,GCC在所有平臺上都使用同一個(gè)前端處理程序,產(chǎn)生一樣的中介碼,因此此中介碼在各個(gè)其他平臺上使用GCC編譯,有很大的機會(huì )可得到正確無(wú)誤的輸出程序。
目前支持的語(yǔ)言
以2006年5月24日釋出的4.1.1版為準,本編譯器版本可處理下列語(yǔ)言:
Ada 《GNAT》
C 《GCC》
C++(G++)
Fortran 《Fortran 77: G77,Fortran 90: GFORTRAN》
Java 《編譯器:GCJ;解釋器:GIJ》
Objective-C 《GOBJC》
Objective-C++
先前版本納入的CHILL前端由于缺乏維護而被廢棄。
Fortran前端在4.0版之前是G77,此前端僅支持Fortran 77。在本版本中,G77被廢棄而采用更新的GFortran,因為此前端支持Fortran 95。
下列前端依然存在:
Modula-2
Modula-3
Pascal
PL/I
D語(yǔ)言
Mercury
VHDL
[編輯] 內嵌OpenMP支持
OpenMP是一種跨語(yǔ)言的對稱(chēng)多處理器(SMP)多線(xiàn)程并行程序的編程工具,也非常適合當今越來(lái)越流行的單CPU多核硬件環(huán)境,因此從gcc4.2開(kāi)始,OpenMP成為其內嵌支持的并行編程規范,可以直接編譯內嵌OpenMP語(yǔ)句的C/C++/Fortran95的源代碼。gcc4.2之前如果想在C/C++/Fortran中嵌入OpenMP語(yǔ)句的話(huà),需要額外安裝庫和預處理器才能識別和正確處理這些語(yǔ)句。
gcc 4.2.0開(kāi)始支持OpenMP v2.5
gcc 4.4.0開(kāi)始支持OpenMP v2.5及v3.0
參見(jiàn)GNU的GOMP計劃
支持的處理器架構
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個(gè)別維護的GCC處理器架構:
D10V
MicroBlaze
PDP-10
MSP430
Z8000
當GCC需要移植到一個(gè)新平臺上,通常使用此平臺固有的語(yǔ)言來(lái)撰寫(xiě)其初始階段。
結構
GCC的外部界面長(cháng)得像一個(gè)標準的Unix編譯器。用戶(hù)在命令行下鍵入gcc之程序名,以及一些命令參數,以便決定每個(gè)輸入文件使用的個(gè)別語(yǔ)言編譯器,并為輸出代碼使用適合此硬件平臺的匯編語(yǔ)言編譯器,并且選擇性地運行鏈接器以制造可運行的程序。
每個(gè)語(yǔ)言編譯器都是獨立程序,此程序可處理輸入的源代碼,并輸出匯編語(yǔ)言碼。全部的語(yǔ)言編譯器都擁有共通的中介架構:一個(gè)前端解析符合此語(yǔ)言的源代碼,并產(chǎn)生一抽象語(yǔ)法樹(shù),以及一翻譯此語(yǔ)法樹(shù)成為GCC的寄存器轉換語(yǔ)言《RTL》的后端。編譯器優(yōu)化與靜態(tài)代碼解析技術(shù)(例如FORTIFY_SOURCE[1],一個(gè)試圖發(fā)現緩存溢出《buffer overflow》的編譯器)在此階段應用于代碼上。最后,適用于此硬件架構的匯編語(yǔ)言代碼以Jack Davidson與Chris Fraser發(fā)明的算法產(chǎn)出。
幾乎全部的GCC都由C寫(xiě)成,除了Ada前端大部分以Ada寫(xiě)成。
前端界面
前端的功能在于產(chǎn)生一個(gè)可讓后端處理之語(yǔ)法樹(shù)。此語(yǔ)法解析器是手寫(xiě)之遞歸語(yǔ)法解析器。
直到最近,程序的語(yǔ)法樹(shù)結構尚無(wú)法與欲產(chǎn)出的處理器架構脫鉤。而語(yǔ)法樹(shù)的規則有時(shí)在不同的語(yǔ)言前端也不一樣,有些前端會(huì )提供它們特別的語(yǔ)法樹(shù)規則。
在2005年,兩種與語(yǔ)言脫鉤的新型態(tài)語(yǔ)法樹(shù)納入GCC中。它們稱(chēng)為GENERIC與GIMPLE。語(yǔ)法解析變成產(chǎn)生與語(yǔ)言相關(guān)的暫時(shí)語(yǔ)法樹(shù),再將它們轉成GENERIC。之后再使用gimplifier技術(shù)降低GENERIC的復雜結構,成為一較簡(jiǎn)單的靜態(tài)唯一形式(Static Single Assignment form,SSA)基礎的GIMPLE形式。此形式是一個(gè)與語(yǔ)言和處理器架構脫鉤的全局優(yōu)化通用語(yǔ)言,適用于大多數的現代函數編程語(yǔ)言。
中介界面
一般編譯器作者會(huì )將語(yǔ)法樹(shù)的優(yōu)化放在前端,但其實(shí)此步驟并不看語(yǔ)言的種類(lèi)而有不同,且不需要用到語(yǔ)法解析器。因此GCC作者們將此步驟歸入通稱(chēng)為中介階段的部分里。此類(lèi)的優(yōu)化包括消解死碼、消解重復計算與全局數值重編碼等。許多優(yōu)化技巧也正在實(shí)現中。
后端界面
GCC后端的行為因不同的前處理器宏和特定架構的功能而不同,例如不同的字符尺寸、調用方式與大小尾序等。后端界面的前半部利用這些消息決定其RTL的生成形式,因此雖然GCC的RTL理論上不受處理器影響,但在此階段其抽象指令已被轉換成目標架構的格式。
GCC的優(yōu)化技巧依其釋出版本而有很大不同,但都包含了標準的優(yōu)化算法,例如循環(huán)優(yōu)化、線(xiàn)程跳躍、共通程序子句消減、指令調度等等。而RTL的優(yōu)化由于可用的情形較少,且缺乏較高級的信息,因此比較起近來(lái)增加的GIMPLE語(yǔ)法樹(shù)形式[2],便顯得比較不重要。
后端經(jīng)由一重讀取步驟后,利用描述目標處理器的指令集時(shí)所取得的信息,將抽象寄存器替換成處理器的真實(shí)寄存器。此階段非常復雜,因為它必須關(guān)照所有GCC可移植平臺的處理器指令集的規格與技術(shù)細節。
后端的最后步驟相當公式化,僅僅將前一階段得到的匯編語(yǔ)言碼借由簡(jiǎn)單的副函數轉換其寄存器與存儲器位置成相對應的機器代碼。
替GCC程序除錯
為GCC除錯的首選工具當然是GNU除錯器。其他特殊用途的除錯工具是Valgrind,用以發(fā)現存儲器泄漏 (Memory leak)。而GNU測量器(gprof)可以得知程序中某些函數花費多少時(shí)間,以及其調用頻率;此功能需要用戶(hù)在編譯時(shí)選定測量《profiling》選項。
評論