GCC,LLVM懦铺,Clang編譯器對比(轉)

GCC,LLVM支鸡,Clang編譯器對比

在XCode中冬念,我們經常會看到這些編譯選項(如下圖),有些人可能會有些茫然牧挣,本文將對GCC4.2急前、LLVM GCC 4.2、LLVM compliler 2.0三個編譯選項進行一個詳細的介紹瀑构。

GCC

GCC(GNU Compiler Collection裆针,GNU編譯器套裝),是一套由 GNU 開發(fā)的編程語言編譯器寺晌。它是一套以GPLLGPL許可證所發(fā)行的自由軟件世吨,也是 GNU計劃的關鍵部分,亦是自由的類Unix及蘋果電腦 Mac OS X操作系統(tǒng)的標準編譯器呻征。

GCC 原名為 GNU C 語言編譯器耘婚,因為它原本只能處理 C語言。GCC 很快地擴展陆赋,變得可處理 C++沐祷。之后也變得可處理 Fortran嚷闭、Pascal、Objective-C赖临、Java, 以及 Ada與其他語言胞锰。

LLVM

LLVM是 Low Level Virtual Machine 的簡稱,這個庫提供了與編譯器相關的支持兢榨,能夠進行程序語言的編譯期優(yōu)化嗅榕、鏈接優(yōu)化、在線編譯優(yōu)化色乾、代碼生成誊册。簡而言之,可以作為多種語言編譯器的后臺來使用暖璧。如果這樣還比較抽象的話案怯,介紹下Clang就知道了:Clang 是一個 C++ 編寫、基于 LLVM澎办、發(fā)布于 LLVM BSD 許可證下的 C/C++/Objective C/Objective C++ 編譯器嘲碱,其目標(之一)就是超越 GCC。

LLVM歷史

Apple(包括中后期的NeXT) 一直使用GCC作為官方的編譯器局蚀。GCC作為開源世界的編譯器標準一直做得不錯麦锯,但Apple對編譯工具會提出更高的要求。

一方面琅绅,是Apple對Objective-C語言(甚至后來對C語言)新增很多特性扶欣,但GCC開發(fā)者并不買Apple的帳——不給實現(xiàn),因此索性后來兩者分成兩條分支分別開發(fā)千扶,這也造成Apple的編譯器版本遠落后于GCC的官方版本料祠。另一方面,GCC的代碼耦合度太高澎羞,不好獨立髓绽,而且越是后期的版本,代碼質量越差妆绞,但Apple想做的很多功能(比如更好的IDE支持)需要模塊化的方式來調用GCC顺呕,但GCC一直不給做。甚至最近括饶,《GCC運行環(huán)境豁免條款 (英文版)》從根本上限制了LLVM-GCC的開發(fā)株茶。 所以,這種不和讓Apple一直在尋找一個高效的巷帝、模塊化的忌卤、協(xié)議更放松的開源替代品,于是Apple請來了編譯器高材生Chris Lattner(2000年楞泼,本科畢業(yè)的Chris Lattner像中國多數(shù)大學生一樣驰徊,按部就班地考了GRE笤闯,最終前往UIUC(伊利諾伊大學厄巴納香檳分校),開始了艱苦讀計算機碩士和博士的生涯棍厂。在這階段颗味,他不僅周游美國各大景點,更是努力學習科學文化知識牺弹,翻爛了“龍書”(《Compilers: Principles, Techniques, and Tools》)浦马,成了GPA牛人【注:最終學分積4.0滿分】,以及不斷地研究探索關于編譯器的未知領域张漂,發(fā)表了一篇又一篇的論文晶默,是中國傳統(tǒng)觀念里的“三好學生”。他的碩士畢業(yè)論文提出了一套完整的在編譯時航攒、鏈接時磺陡、運行時甚至是在閑置時優(yōu)化程序的編譯思想,直接奠定了LLVM的基礎漠畜。LLVM在他念博士時更加成熟币他,使用GCC作為前端來對用戶程序進行語義分析產生IF(Intermidiate Format),然后LLVM使用分析結果完成代碼優(yōu)化和生成憔狞。這項研究讓他在2005年畢業(yè)時蝴悉,成為小有名氣的編譯器專家,他也因此早早地被Apple相中瘾敢,成為其編譯器項目的骨干)拍冠。

剛進入Apple,Chris Lattner就大展身手:首先在OpenGL小組做代碼優(yōu)化簇抵,把LLVM運行時的編譯架在OpenGL棧上倦微,這樣OpenGL棧能夠產出更高效率的圖形代碼。如果顯卡足夠高級正压,這些代碼會直接扔入GPU執(zhí)行。但對于一些不支持全部OpenGL特性的顯卡(比如當時的Intel GMA卡)责球,LLVM則能夠把這些指令優(yōu)化成高效的CPU指令焦履,使程序依然能夠正常運行。這個強大的OpenGL實現(xiàn)被用在了后來發(fā)布的Mac OS X 10.5上雏逾。同時嘉裤,LLVM的鏈接優(yōu)化被直接加入到Apple的代碼鏈接器上,而LLVM-GCC也被同步到使用GCC4代碼栖博。

Clang歷史

Apple吸收Chris Lattner的目的要比改進GCC代碼優(yōu)化宏大得多——GCC系統(tǒng)龐大而笨重屑宠,而Apple大量使用的Objective-C在GCC中優(yōu)先級很低。此外GCC作為一個純粹的編譯系統(tǒng)仇让,與IDE配合得很差典奉。加之許可證方面的要求躺翻,Apple無法使用LLVM 繼續(xù)改進GCC的代碼質量。于是卫玖,Apple決定從零開始寫 C公你、C++、Objective-C語言的前端 Clang假瞬,完全替代掉GCC陕靠。

正像名字所寫的那樣,Clang只支持C脱茉,C++和Objective-C三種C家族語言剪芥。2007年開始開發(fā),C編譯器最早完成琴许,而由于Objective-C相對簡單税肪,只是C語言的一個簡單擴展,很多情況下甚至可以等價地改寫為C語言對Objective-C運行庫的函數(shù)調用虚吟,因此在2009年時寸认,已經完全可以用于生產環(huán)境。C++的支持也熱火朝天地進行著串慰。

下面這張圖將顯示GCC偏塞、LLVM-GCC、LLVM Compiler這三個編譯選項的不同點:

對比

作為一種新的編譯器邦鲫,我們來看Clang和GCC各有什么優(yōu)缺點:

Clang特性

快:通過編譯 OS X 上幾乎包含了所有 C 頭文件的 carbon.h 的測試灸叼,包括預處理 (Preprocess),語法 (lex)庆捺,解析 (parse)古今,語義分析 (Semantic Analysis),抽象語法樹生成 (Abstract Syntax Tree) 的時間滔以,Clang 是 Apple GCC 4.0 的 2.5x 快捉腥。(2007-7-25)

內存占用小:Clang 內存占用是源碼的 130%你画,Apple GCC 則超過 10x抵碟。

診斷信息可讀性強:我不會排版,推薦去網站觀看坏匪。其中錯誤的語法不但有源碼提示拟逮,還會在錯誤的調用和相關上下文的下方有~~~~~和^的提示,相比之下 GCC 的提示很天書适滓。

GCC 兼容性敦迄。

設計清晰簡單,容易理解,易于擴展增強罚屋。與代碼基礎古老的 GCC 相比苦囱,學習曲線平緩。

基于庫的模塊化設計沿后,易于 IDE 集成及其他用途的重用沿彭。由于歷史原因,GCC 是一個單一的可執(zhí)行程序編譯器尖滚,其內部完成了從預處理到最后代碼生成的全部過程喉刘,中間諸多信息都無法被其他程序重用。Clang 將編譯過程分成彼此分離的幾個階段漆弄,AST 信息可序列化睦裳。通過庫的支持,程序能夠獲取到 AST 級別的信息撼唾,將大大增強對于代碼的操控能力廉邑。對于 IDE 而言,代碼補全倒谷、重構是重要的功能蛛蒙,然而如果沒有底層的支持,只使用 tags 分析或是正則表達式匹配是很難達成的渤愁。

當然牵祟,GCC 也有其優(yōu)勢:

支持 JAVA/ADA/FORTRAN

當前的 Clang 的 C++ 支持落后于 GCC,參見http://clang.llvm.org/cxx_status.html抖格。(近日 Clang 已經可以自編譯诺苹,見http://www.phoronix.com/scan.php?page=news_item&px=Nzk2Mw

GCC 支持更多平臺

GCC 更流行,廣泛使用雹拄,支持完備

GCC 基于 C收奔,不需要 C++ 編譯器即可編譯

要選擇哪個

那么三個編譯選項,要選擇哪一個呢滓玖?目前不推薦使用老的GCC4.2坪哄,因為蘋果不會維持它了,而且LLVM-GCC看起來會更好势篡。在項目中途改編譯選項可是一個大變動损姜,所以,如果你要改殊霞,當然需要經過慎重完整的測試。

對新的項目而言汰蓉,LLVM-GCC看起來應該是個安全的選擇绷蹲,蘋果公司認為它夠穩(wěn)定夠成熟,所以才把它當做Xcode 4的預設選項(你或許不會把穩(wěn)定成熟這兩個字眼跟Xcode 4本身畫上等號),而且祝钢,既然選項使用的是GCC parser比规,向后兼容性應該沒問題。

我說LLVM-GCC是個安全的選項拦英,但我并不是指Clang/LLVM比較不安全蜒什,只是成熟度還沒那么高效了,我將一些以前的代碼拿到Xcode 4上疤估,使用LLVM 2.0編譯器重新編譯灾常,到目前為止還沒發(fā)現(xiàn)任何問題。

參考文檔:

http://baike.baidu.com/view/4848.htm

http://hi.baidu.com/zhanghuikl/blog/item/71e8a6018172df0f728da53e.html

http://www.programmer.com.cn/9436/

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末铃拇,一起剝皮案震驚了整個濱河市钞瀑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌慷荔,老刑警劉巖雕什,帶你破解...
    沈念sama閱讀 211,123評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異显晶,居然都是意外死亡贷岸,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,031評論 2 384
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來一铅,“玉大人拧晕,你說我怎么就攤上這事』Ь矗” “怎么了?”我有些...
    開封第一講書人閱讀 156,723評論 0 345
  • 文/不壞的土叔 我叫張陵睁本,是天一觀的道長尿庐。 經常有香客問我,道長呢堰,這世上最難降的妖魔是什么抄瑟? 我笑而不...
    開封第一講書人閱讀 56,357評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮枉疼,結果婚禮上皮假,老公的妹妹穿的比我還像新娘。我一直安慰自己骂维,他們只是感情好惹资,可當我...
    茶點故事閱讀 65,412評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著航闺,像睡著了一般褪测。 火紅的嫁衣襯著肌膚如雪猴誊。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,760評論 1 289
  • 那天侮措,我揣著相機與錄音懈叹,去河邊找鬼。 笑死分扎,一個胖子當著我的面吹牛澄成,可吹牛的內容都是我干的。 我是一名探鬼主播畏吓,決...
    沈念sama閱讀 38,904評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼墨状,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了庵佣?” 一聲冷哼從身側響起歉胶,我...
    開封第一講書人閱讀 37,672評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎巴粪,沒想到半個月后通今,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,118評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡肛根,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,456評論 2 325
  • 正文 我和宋清朗相戀三年辫塌,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片派哲。...
    茶點故事閱讀 38,599評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡臼氨,死狀恐怖,靈堂內的尸體忽然破棺而出芭届,到底是詐尸還是另有隱情储矩,我是刑警寧澤,帶...
    沈念sama閱讀 34,264評論 4 328
  • 正文 年R本政府宣布褂乍,位于F島的核電站持隧,受9級特大地震影響,放射性物質發(fā)生泄漏逃片。R本人自食惡果不足惜屡拨,卻給世界環(huán)境...
    茶點故事閱讀 39,857評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望褥实。 院中可真熱鬧呀狼,春花似錦、人聲如沸损离。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,731評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽僻澎。三九已至她奥,卻和暖如春瓮增,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背哩俭。 一陣腳步聲響...
    開封第一講書人閱讀 31,956評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留拳恋,地道東北人凡资。 一個月前我還...
    沈念sama閱讀 46,286評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像谬运,于是被迫代替她去往敵國和親隙赁。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,465評論 2 348

推薦閱讀更多精彩內容