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