GCC
GNU 編譯器套裝(英語:GNU Compiler Collection,縮寫為GCC)是 GNU 計畫製作的一種最佳化編譯器,支援各種程式語言、作業系統、電腦系統結構。該編譯器是以 GPL 佮 LGPL 授權條款所發行的自由軟體,嘛是啦 GNU 計劃的關鍵的部份,抑是 GNU 工具鏈的主要組成部份之一。GCC(特別是內底的 C 語言編譯器)也當被認為是跨平台編譯器的事實標準。一九八五年由理察 ・ 馬修 ・ 斯托曼開始發展,這陣由自由軟體基金會負責維護工課。截至二空一九年,GCC 大約有一千五百萬行代碼,是現存上大的自由程式之一。伊佇自由軟體的發展內底發揮矣重要的作用,毋但是一个工具,抑是一个典例。
原名做GNU C 語言編譯器(GNU C Compiler), 因為伊原本干焦會當處理 C 語言。仝年十二月,新的 GCC 編譯器會當編譯 C + + 語言。尾仔閣共 Fortran、Pascal、Objective-C、Java、Ada,Go 等其他的語言開發矣前端。C 和 C + + 編譯器嘛支援 OpenMP 和 OpenACC 規範。
GCC 編譯器已經予人徙栽去比其他編譯器閣較濟的平台和指令集架構頂懸,並且予廣泛部署佇咧開發自由佮專有軟體的工具內底。GCC 閣有通用誠濟躉入式的系統,包括是因為 ARM 和 Power ISA 的晶片。
GCC 毋但是 GNU 作業系統的官方編譯器,抑是真濟類 UNIX 系統佮 Linux 發行版的標準編譯器。BSD 家族內底的大部份作業系統嘛佇 GCC 釋出來了後轉用 GCC;猶毋過 FreeBSD、OpenBSD 和 Apple macOS 已經轉向矣 Clang 編譯器,主要是因為授權問題。GCC 嘛會當編譯 Windows、Android、iOS、Solaris、HP-UX、IBM AIX 和 DOS 系統的代碼乎。GCC 原本用 C 開發,尾仔是因為 LLVM、Clang 的崛起來,伊更快的共開發語言轉換做 C + +。真濟 C 的愛好者佇咧對 C + + 知半解的情形下主觀認定 C + + 的效能一定會輸予 C,猶毋過 Ian Lance Taylor 予出了無仝款的意見,並且表明 C + + 毋但效應會袂輸 C,而且會當設計出閣較好,閣較容易維護的程式。
歷史
一九八三年底,為著欲引𤆬 GNU 作業系統,理察 ・ 馬修 ・ 斯托曼向阿姆斯特丹編譯器套件(自由大學編譯器套件)的作者安德魯 ・ 塔能鮑姆請求佇 GNU 允准使用該編譯器;但是作者通知伊該編譯器干焦對大學免費。所以,伊拍算欲開發一个無仝的編譯器。伊拍算欲佮 Len Tower 佮其他的人共勞倫斯利佛摩國家實驗室的一个現有編譯器對 Pastel 寫做講 C。但是伊咧予利純莫爾編譯器寫一个新的 C 前端後,發現伊需要數百萬位元組的堆疊空間,干焦六十四 KB 的六桱八千 Unix 系統上無法度執行。所以,伊拍算家己對頭寫一个編譯器乎。總講一句,儘管斯托曼確實使用了伊家己寫的 C 前端,伊並無共任何 Pastel 編譯器的代碼共囥咧 GCC 中。
GCC 佇一九八七年三月二二佇麻省理工學院的檔案傳輸協定上釋出,斯托曼被列做作者,嘛講著其他的人並感謝𪜶的貢獻:Jack Davidson 和 Christopher Fraser 予出了使用暫存器傳達語言作為中央語言的思路;Paul Rubin 為預處理器貢獻良多;以及 Leonard Tower 寫了「部份解析器、RTL 生成器、RTL 定義佮 Vax 機器描述」。 予被 Peter H . Salus 譽為「自由軟體第一擊」的 GNU 編譯器釋出正值生陽電腦共伊作業系統佮其開發工具解縛,閣提出價單獨賣。這予真濟客戶買抑是下載 GCC 足濟工具足濟的。就算斯托曼認為 GNU Emacs 是伊的主要工程,毋過節甲一九九空年,GCC 支援十三種電腦架構,效能比其他編譯器優越並為商業咧用。
EGCS 克隆
因為 GCC 是佇咧 GPL 授權下授權的,其他為 C 以外語言編寫介面的程式設計師會當自由的開發其家己的編譯器分支,只要𪜶遵守 GPL 授權條款。猶毋過,加分叉佇日後體現出低效佮無方便的特點;而且人真歹予熱愛穩定性較贏過新特性的 GCC 官方專案接受𪜶的分支。FSF 嘿添加到 GCC 二 . x 這个官方版本(一九九二年開始開發)中的內容進行矣相當嚴格的控制,所以若予 Eric S . Raymond 佇咧《大教堂佮集市》中形容講 " 大教堂 " 開發模式。
佇一九九七年,一篷不滿 GCC 沓沓仔而且封閉的創作環境者,組織了一个名做實驗性 / 增強型 GNU 編譯器系統(Experimental / Enhanced GNU Compiler System)的這个案,將幾个實驗性分叉叉合併做一个專案。其基礎是 GCC 的開發緊照(大概取自二孵七 . 二,尾仔參進到二鋪八 . 一)。 合併的內容包括 g 七十七(Fortran)、 PGCC(P 五 Pentium 最佳化的 GCC), 真濟 C + + 的改進,猶閣有真濟新的架構佮作業系統變種。
這兩个案件攏誠密切觀察著彼此的動態,猶毋過 EGCS 的發展明顯閣較活跳,所以 FSF 正式停止𪜶對 GCC 二 . x 編譯器的開發並希望 EGCS 成做 GCC 的這个官方版本。佇咧一九九九年四月 EGCS 專案被任命為 GCC 的維護者。隨著一九九九年七月 GCC 二鋪九五的釋出,這兩个案閣再聯合起來。此後,GCC 佇一个指導委員會的指導之下,來自各國的程式設計師小組會對其進行維護。
因為欠缺維護,GCC 三 ( 兩千空二 ) 徙掉矣 CHILL 的前端支援。佇版本四配零進前,GCC 三中的 Fortran 前端是 ` g 七十七 `,干焦支援 FORTRAN 七十七。前端後來去予廢棄,取代之的是新 GNU Fortran 前端,支援 Fortran 九十五佮 Fortran 兩千空三及 Fortran 二千空八的大部份的內容。對 GCC 四配八版開始,GCC 由 C + + 語言編寫。對 GCC 五到 GCC 七攏保留矣著 Cilk Plus 的支援。
GCC 已經予人徙栽到各種指令集架構頂頭,並且予人廣泛部署做開發自由抑是專有軟體的工具。GCC 閣有通用誠濟躉入式的系統,包括講 Symbian(這號做 gcce)、 是因為 ARM 佮基於 Power ISA 的晶片。該編譯器會當佇各種平台頂面輸出,包括遊戲控制器中的 PS 二、Cell 微處理器架構的 PS 三以及 Dreamcast。佮其他編譯器比其他的編譯器比其他的編譯,GCC 編譯器予部署佇閣較濟作業系統佮處理器上。
目前支援的語言
截至二空二二年九月,GCC 十二孵二版的內含 C(` gcc `)、 C + +(` g + + `)、 Objective-C、Fortran(` gfortran `)、 Ada(GNAT)、 Go(` gccgo `)以及 D ( ` gdc `,對九嬸一版開始 ) 程式語言的前端。OpenMP 和 OpenACC 並列語言拓展按 GCC 五孵一開始支援。GCC 七進前的版本嘛支援 Java(` gcj `), 容允將 java 編譯做機械的語言。
有關 C + + 和 C 的語言版本支援,對 GCC 十一由一開始是預設 _ gnu + + 十七 _,C + + 十七的超集;以及 _ gnu 十一 _,C 十一的超集,閣提供嚴格的標準支援。GCC 嘛著 C + + 二十佮咧欲來矣 C + + 二十三標準提供實驗性部分支援。
有真濟替其他的語言編寫的第三方前端,比如講 Pascal(` gpc `)、 Modula 鋪二、Modula ma三、Mercury 語言佮 VHDL(` GHDL `)。 一寡實驗性分支可支援閣較濟語言,比如講 GCC UPC 編譯器閣支援 UPC 和 Rust。
支援的處理器架構
GCC 十一孵一版本支援的處理器包括:
標準版本支援的少見處理器如下:
非 FSF 維護的 GCC 版本支援的處理器如下:
GCJ Java 編譯器會當輸出機器語言或者是 Java 虛擬機器的 Java 位元組碼。當重新導向 GCC 到新的平台頂懸,定定用著自舉。Motorola 六桱八千,Zilog Z 八十佮其他處理器也會當為德州的儀器、惠普、夏普猶閣有卡西歐可程式化繪圖計算機設計的 GCC 編譯器上輸出。
設計的
GCC 外部介面遵循 UNIX 使用慣例。使用者輸入特定語言的驅動程式碼(C 語言為 ` gcc `,C + + 為 ` g + + `,按呢無一爾足), 這个程式解說命令語句,咻叫實際編譯器,佇輸出介面上執行組譯器,然後選擇性地執行連結器,產生一个完整的會當執行二進位檔案。
逐種語言的編譯器攏是一个獨立的程式,閣會讀得原始碼閣輸出機器碼。所有語言的編譯器攏有共通的中介架構:各語言頭前解破符合此語言的原始碼,並產生一抽象語法樹。如有必要,遮的代碼會予人轉換做中介端的輸入表示,人講的 _ GENERIC _ 形式;然後中介端會沓沓仔共程式轉換做最後的形式。編譯器最佳化佮靜態代碼分析技術(比如講 FORTIFY \ _ SOURCE,一種試發現消息溢位的編譯器指令)嘛會佇原始碼編譯的時陣應用。遮的操作攏是佇咧多種表示法上作穡,其中主要是獨立於架構的 GIMPLE 表示法佮獨立於架構的 RTL 表示法。終其尾,機器碼是由傑克 ・ 戴維森佮克里斯 ・ 霆雷澤發明的演算法產生。
除了 Ada 前端主要是以 Ada 寫做,GCC 大部份是用 C 語言編寫的。GCC 發行版包括主要是以各自語言編寫的 Ada 和 C + + 標準庫。佇咧一寡平台頂,GCC 發行版猶閣包括一个低階執行庫 ` libgcc ` 該執行庫由獨立於機器的 C 語言佮特定處理機器的機器碼組合編寫,會當處理目標處理器袂當直接執行的複雜算術運算。
GCC 使用足濟額外的工具。雖然講這家私咧 UNIX 和 Linux 發行版中基本為著預設安裝的,猶毋過 Windows 系統通常無。就是遮的工具包括 Perl、Flex、Bison 佮其他定用工具;閣需要另外的依賴庫 GMP、MPC 和 MPFR。
二空一空年五月,GCC 指導委員會決定允准使用 C + + 編譯器來編譯 GCC。編譯器計畫主要是用 C 語言編寫,並且加上 C + + 的一个子集特性。所以按呢做是為著欲予 GCC 的開發者會當使用 C + + 的解構器佮泛型功能。二空一二年八月,GCC 指導委員會宣佈講,GCC 將以 C + + 為源語言。這意味對,愛對原始碼編寫 GCC 編譯器,需要一个會當理解 ISO / IEC C + + 三標準的 C + + 編譯器。二空二空年五月十八,GCC 對 ISO / IEC C + + 三標準轉向 ISO / IEC C + + 十一標準(即需要覆寫編譯器本身;預設的情況下會當編譯 C + + 早期版本)。
頭前捀介面
逐个前端攏來使用一个破析器來產生予定的原始碼的一个抽象語法樹仔。因為語法樹仔的抽象性,無仝語言的原始碼攏會當予仝一个後端處理。GCC 一開始使用 bison 生成的 LALR 語法的分析器,毋過二空空四年漸漸轉向用 C + + 遞迴下降解析器,並且佇二空空六年用於 C 和 Objective-C。二空二一年開始,所有的前端攏使用遞迴下降解析器。
佇咧 GCC 四配空進前,程式的語法樹結構無完全獨立於輸出的目標處理器架構。對無仝語言的前端來講,語法樹的含義可能無仝款;而且頭前捀會使提供𪜶特別的語法樹規則。隨著 GENERIC 和 GIMPLE 的引入,這款情形著愛閣避免。這是兩種新的獨立於語言的語法樹形式,隨 GCC 四配空引入編譯器頭前。GENERIC 閣較複雜,是一種基於 GCC 三 . x Java 前端的中介表示。GIMPLE 是一个簡省的 GENERIC,其中各種結構予人簡化做真濟 GIMPLE 指令。C、C + + 和 Java 前端直接佇前端生成的 GENERIC。相反,其他的前端佇咧解析了後會有無仝的中介表示,這中央表示你會換做 GENERIC。前端生成 GENERIC 了後閣來使用「gimplifier」技術簡化 GENERIC 的複雜結構,成做一較簡單的 SSA 為基礎的 GIMPLE 形式,一種強大的,獨立於語言佮體系結構的全域(函式的範圍)最佳化的通用語言。
中介介面
GENERIC 和 GIMPLE
GENERIC 是一種中央表示語言,共原始碼編譯做會當執行二進位檔案的時用作「中介端」。 GCC 的所有的前端攏指向 GENERIC 的子集 GIMPLE。GCC 的中央階段進行所有的獨立於編譯語言佮目標架構的代碼分析佮最佳化,對 GENERIC 表示法開始共轉譯做暫存器傳遞語言(RTL)。 GENERIC 表示干焦包含中介端最佳化了後的指令式編程結構的子集。
咧共原始碼轉譯做 GIMPLE 表示的時陣,會使用臨時變數會複雜表達式拆分做三位址碼。這種表示法的靈感來自 Laurie J . Hendren 佇咧 McCAT 編譯器當中提出的 SIMPLE 表示法,用佇簡化指令式程式的分析佮最佳化。
最佳化
一般編譯器作者會將語法樹仔最佳化囥佇前端,毋過其實這步數並無看語言的種類才有無仝,而且無需要用著語法來解析器。所以 GCC 作者共這步驟入通稱做中介階段的部份內底。此類的最佳化包括消解死碼、消解重複運算和全域數值重編碼等等。真濟最佳化技巧嘛當佇咧實作中。
後端介面
GCC 的後端的部份是由預處理器宏和目標架構特有的函式指定的,譬如講定義其位元組序、字大小佮呼叫約束。後爿的頭前半部份使用遮的來決定 RTL 的生成形式,因此雖然 GCC 的 RTL 理論上無擋得處理器影響,毋過佇這个階段其抽象指令已經換做目標架構的格式。佇任何時陣,構成程式的實際 RTL 指令攏愛符合目標架構的機器描述標準。
機器描述檔案包含了 RTL 模式、運算元約束佮輸出最終組譯的代碼片段。遮的約束條件表明,一个特定的 RTL 模式可能干焦適用佇咧某一寡硬體暫存器,或者是某寡干焦允准有限大細的即時運算元偏徙(比如講十二、十六、二十四、. . . 位偏徙,等咧)彼个架構。佇咧 RTL 生成過程中,共定目標架構的約束條件會被檢查。為著欲釋出一个予定的 RTL 片段,伊必須佮機器描述檔案中的一个抑是濟个 RTL 模式相匹配,滿足該模式的約束條件;抑無,就無法度共上尾的 RTL 轉做機器碼。
咧編譯煞的時陣,有效 RTL 會予人簡化做嚴格的形式,其中逐條指令攏指向真實的機器暫存器、佮目標機器描述檔案中的一種模式。嚴格化 RTL 是一个足複雜的工課:代先是暫存器分配,選擇真實的硬體暫存器來取代上原初分配的偽暫存器;閣加載,無分配實際硬體暫存器的偽暫存器攏會予溢去到堆疊中,並且生做執行這溢位的 RTL。過大的偏移量無法度適合實際指令,故會予人分解做服對偏移量約束的 RTL 序列。
後端佇最後通過咻叫佮每一个模式相關聯的一段代碼來構建機器碼,使用佇咧加載時陣選擇的最終暫存器、偏移量佮位址對目標指令集中生做真正的指令。做組譯生做片段只是一字串的時陣,阮就會執行暫存器、偏移量佮 / 抑是徛真套的簡單字串替換。組譯生成片段嘛會當是一个簡短的 C 代碼箍,猶毋過最後嘛會倒轉一个有效組譯代碼的字捾。
C + + 標準庫
GCC 專案佇咧 CPLv 三的授權落實現矣 C + + 標準庫(libstdc + +)。 目前的上新版本是十一。
替 GCC 程式除錯
GNU 除錯器是一个為 GCC 除錯的程式。其他特殊的用途除毋著工具是 Valgrind,用發現記持體流失(memory leak)。 而且 GNU 測量器(gprof)會當著愛知程式中某一寡函式開偌濟時間唅,佮其呼叫頻率;這个功能需要使用者咧編譯的時陣選定測量(profiling)選項。
GCC 內嵌組譯
內嵌組譯嘛講行內組譯,是共組合語言代碼箍插佇咧 C 語言語句之間。詳細參見 GCC-Inline-Assembly-HOWTO . html
參考文獻
參照
來源
- Richard M . Stallman:_ Using and Porting the GNU Compiler Collection _ , Free Software Foundation,ISBN 空石五百九十五五五一鋪空三十五-X
- Richard M . Stallman : _ Using Gcc : The Gnu Compiler Collection Reference _ , Free Software Foundation , ISBN 一孵八十八孵兩千一百十四撨三十九孵六
- Brian J . Gough:_ An Introduction to GCC _ , Network Theory Ltd . , ISBN 空九百五十四抹一千六百一十七抹九九嬸三
閣較濟閱讀
- Arthur Griffith , _ GCC : The Complete Reference _ . McGrawHill / Osborne . ISBN 空抹七七二十二五二千四百空五五五 .
- Kerner , Sean Michael . Open Source GCC 四配零 : Older , Faster . internetnews . com . April 二十二 , 兩千空五 [二千空六孵十二孵二十七] .(原始內容存檔佇兩千空六鋪九九尻川十七).
- Kerner , Sean Michael . New GCC Heavy on Optimization . internetnews . com . March 二 , 二千空六 [二千空六孵十二孵二十七] .(原始內容存檔佇兩千空六鋪十二十二).
外部連結
- GCC 官方網站
- YouTube 上的淺談 GCC 編譯技術 Break Compilation Boundaries with GCC
- GCC Forum-由 Nabble 維持,整理所有 gcc 通訊討論串,並整合入一个會當揣介面中。
參見
- GCC 目前包含著貝姆糞埽收集器,一个為 C / C + + 所設計的糞埽回收器。
- distcc-為分散式編譯所設計的軟體,以 GCC 為協同軟體。
- ccache-用佇咧欲號編譯的中間結果,加緊重編譯的速度。
- LLVM-低層虛擬機器編譯器架構,內底的 clang ( Obj-) C ( + + ) 編譯器實現大部份 GNU C 拓展。
- MinGW-將 GNU 開發工具徙栽去到 Win 三十二平台跤的計畫
- Cygwin-佇咧 Windows 上執行 Unix 程式的類比軟體。
- GCC Summit
- OpenWatcom-另外一个開放原碼的 C + + / Fortran 編譯器。
- Code Sourcery-一个 GCC 顧問公司。
- ggcc-全球化 GCC 專案。