GCC(GNU Compiler Collection,GNU編譯(yi)器(qi)套件)是(shi)由GNU開發的編程(cheng)語(yu)言(yan)(yan)譯(yi)器(qi)。GNU編譯(yi)器(qi)套件包(bao)括(kuo)C、C++、Objective-C、 Fortran、Java、Ada和Go語(yu)言(yan)(yan)前端,也包(bao)括(kuo)了這些(xie)語(yu)言(yan)(yan)的庫(如(ru)libstdc++,libgcj等。)
GCC的(de)(de)初衷是(shi)(shi)為GNU操作系(xi)統專門編(bian)寫的(de)(de)一款(kuan)編(bian)譯器。GNU系(xi)統是(shi)(shi)徹(che)底的(de)(de)自由軟(ruan)件。此處(chu),“自由”的(de)(de)含(han)義是(shi)(shi)它(ta)尊重用(yong)戶的(de)(de)自由。
GCC的(de)外部接口長得像(xiang)一(yi)個(ge)(ge)標(biao)準的(de)Unix編(bian)譯器(qi)(qi)。使(shi)用者在命令列下鍵入(ru)gcc之(zhi)程(cheng)序名,以(yi)及(ji)一(yi)些(xie)命令參數,以(yi)便決定每個(ge)(ge)輸入(ru)檔案(an)使(shi)用的(de)個(ge)(ge)別語言編(bian)譯器(qi)(qi),并為輸出程(cheng)序碼使(shi)用適合此硬件平臺的(de)組合語言編(bian)譯器(qi)(qi),并且選擇性(xing)地執行(xing)連(lian)接器(qi)(qi)以(yi)制造可執行(xing)的(de)程(cheng)序。
每個(ge)(ge)語言編(bian)譯(yi)器(qi)(qi)都是獨立程(cheng)序,此(ci)程(cheng)序可處(chu)理(li)輸入的(de)(de)(de)原始碼,并輸出(chu)組合(he)語言碼。全部的(de)(de)(de)語言編(bian)譯(yi)器(qi)(qi)都擁有共(gong)通的(de)(de)(de)中介架(jia)構(gou):一個(ge)(ge)前端解(jie)析符(fu)合(he)此(ci)語言的(de)(de)(de)原始碼,并產(chan)生(sheng)一抽象語法樹,以及一翻譯(yi)此(ci)語法樹成為(wei)GCC的(de)(de)(de)暫(zan)存器(qi)(qi)轉換語言〈RTL〉的(de)(de)(de)后端。編(bian)譯(yi)器(qi)(qi)最佳化與(yu)靜(jing)態程(cheng)序碼解(jie)析技術(例(li)如FORTIFY_SOURCE,一個(ge)(ge)試圖發現緩沖區溢(yi)位〈buffer overflow〉的(de)(de)(de)編(bian)譯(yi)器(qi)(qi))在此(ci)階段應用(yong)于(yu)程(cheng)序碼上。最后,適用(yong)于(yu)此(ci)硬件架(jia)構(gou)的(de)(de)(de)組合(he)語言程(cheng)序碼以Jack Davidson與(yu)Chris Fraser發明的(de)(de)(de)算法產(chan)出(chu)。
幾乎(hu)全部(bu)的GCC都(dou)由(you)C寫(xie)成,除了Ada前(qian)端大部(bu)分以Ada寫(xie)成。
前(qian)端的功能在(zai)于(yu)產生一個可讓(rang)后端處理之語法(fa)(fa)樹。此語法(fa)(fa)解(jie)析器是(shi)手寫之遞歸語法(fa)(fa)解(jie)析器。
直到(dao)2004年,程序的(de)語法(fa)樹結(jie)構(gou)尚無法(fa)與欲產出的(de)處理器(qi)架構(gou)脫(tuo)鉤。而語法(fa)樹的(de)規(gui)則有(you)時在不(bu)同的(de)語言前(qian)端也不(bu)一樣,有(you)些前(qian)端會(hui)提(ti)供它們特別(bie)的(de)語法(fa)樹規(gui)則。
在(zai)2005年,兩(liang)種與(yu)語(yu)(yu)言(yan)脫鉤的(de)(de)新型(xing)態(tai)(tai)語(yu)(yu)法(fa)樹納入(ru)GCC中。它們稱為(wei)GENERIC與(yu)GIMPLE。語(yu)(yu)法(fa)解析變成(cheng)產生(sheng)與(yu)語(yu)(yu)言(yan)相關的(de)(de)暫時語(yu)(yu)法(fa)樹,再將它們轉成(cheng)GENERIC。之(zhi)后再使用"gimplifier"技術降低GENERIC的(de)(de)復(fu)雜結構,成(cheng)為(wei)一較簡單的(de)(de)靜態(tai)(tai)唯一形式(Static Single Assignment form,SSA)基礎的(de)(de)GIMPLE形式。此形式是一個與(yu)語(yu)(yu)言(yan)和處理器架構脫鉤的(de)(de)全域最佳化通用語(yu)(yu)言(yan),適用于大(da)多數的(de)(de)現代(dai)編程語(yu)(yu)言(yan)。
一(yi)般編譯器作者會將(jiang)語(yu)法樹的(de)最佳(jia)化放(fang)在前(qian)端(duan),但其(qi)實(shi)此(ci)(ci)步驟并不(bu)看語(yu)言(yan)的(de)種類(lei)而有不(bu)同,且不(bu)需(xu)要(yao)用到語(yu)法解(jie)析器。因此(ci)(ci)GCC作者們將(jiang)此(ci)(ci)步驟歸入通稱為(wei)中(zhong)介階段的(de)部分里(li)。此(ci)(ci)類(lei)的(de)最佳(jia)化包括消解(jie)死碼、消解(jie)重復運算與(yu)全域數值重編碼等。許(xu)多最佳(jia)化技(ji)巧(qiao)也正在實(shi)作中(zhong)。
GCC后(hou)(hou)端(duan)的行為因(yin)不同(tong)的前(qian)處理器宏和特(te)定(ding)架構的功(gong)能而不同(tong),例如不同(tong)的字符尺寸、呼叫(jiao)方式(shi)與大小尾序等。后(hou)(hou)端(duan)接(jie)口的前(qian)半(ban)部利(li)用這些訊(xun)息決定(ding)其RTL的生成(cheng)形(xing)式(shi),因(yin)此雖然GCC的RTL理論上不受(shou)處理器影響,但在(zai)此階段(duan)其抽象指令(ling)已(yi)被轉換成(cheng)目標架構的格式(shi)。
GCC的(de)(de)最(zui)佳(jia)化(hua)技巧依其釋出版本(ben)而(er)有很大不(bu)同,但都包(bao)含了標準的(de)(de)最(zui)佳(jia)化(hua)算法(fa),例如循環最(zui)佳(jia)化(hua)、執行(xing)緒(xu)跳(tiao)躍、共通(tong)程(cheng)序(xu)子句消減、指令排程(cheng)等(deng)等(deng)。而(er)RTL的(de)(de)最(zui)佳(jia)化(hua)由于可(ke)用(yong)的(de)(de)情形較少,且(qie)缺(que)乏較高(gao)階的(de)(de)資訊,因此相(xiang)比(bi)較起(qi)來,增(zeng)加的(de)(de)GIMPLE語(yu)法(fa)樹形式(shi),便(bian)顯得比(bi)較不(bu)重(zhong)要。
后(hou)端經由一次重(zhong)讀取(qu)步驟后(hou),利用描述(shu)目(mu)標(biao)處(chu)理(li)器(qi)的(de)指(zhi)令集(ji)時所取(qu)得的(de)信息,將抽象暫存器(qi)替換成處(chu)理(li)器(qi)的(de)真實暫存器(qi)。此階段非常復雜,因為它必須關注所有(you)GCC可移植平臺的(de)處(chu)理(li)器(qi)指(zhi)令集(ji)的(de)規格與技(ji)術細(xi)節。
后(hou)端的(de)最(zui)后(hou)步驟相當公式化,僅僅將前一階段得(de)到的(de)匯編語言代碼(ma)藉由簡單的(de)子例程(cheng)轉(zhuan)換其暫存器(qi)與內存位置(zhi)成相對應的(de)機器(qi)碼(ma)。
以2006年(nian)5月24日(ri)釋出的4.1.1版(ban)為準,本(ben)編譯器版(ban)本(ben)可處(chu)理下列語言:
Ada〈GNAT〉
C〈GCC〉
C++(G++)
Fortran〈Fortran77:G77,Fortran90:GFORTRAN〉
Java〈編譯器(qi):GCJ;解釋器(qi):GIJ〉
Objective-C〈GOBJC〉
Objective-C++
先(xian)前版(ban)本納入的CHILL前端由(you)于缺(que)乏維護而(er)被廢棄。
Fortran前端(duan)在4.0版(ban)之(zhi)前是G77,此前端(duan)僅支援Fortran77。在本版(ban)本中,G77被廢(fei)棄而采用(yong)更(geng)新的GFortran,因為此前端(duan)支援Fortran95。
下(xia)列(lie)前端依(yi)然存(cun)在:
Modula-2
Modula-3
Pascal
PL/I
D語言
Mercury
VHDL