在XCode中,,我們經(jīng)常會(huì)看到這些編譯選項(xiàng)(如下圖),,有些人可能會(huì)有些茫然,本文將對(duì)GCC4.2,、LLVM GCC 4.2,、LLVM compliler 2.0三個(gè)編譯選項(xiàng)進(jìn)行一個(gè)詳細(xì)的介紹。
GCC GCC(GNU Compiler Collection,,GNU編譯器套裝),,是一套由 GNU 開發(fā)的編程語言編譯器。它是一套以 GPL 及 LGPL 許可證所發(fā)行的自由軟件,,也是 GNU計(jì)劃的關(guān)鍵部分,,亦是自由的類Unix及蘋果電腦 Mac OS X 操作系統(tǒng)的標(biāo)準(zhǔn)編譯器。 GCC 原名為 GNU C 語言編譯器,,因?yàn)樗局荒芴幚?C語言,。GCC 很快地?cái)U(kuò)展,變得可處理 C++,。之后也變得可處理 Fortran,、Pascal、Objective-C,、Java, 以及 Ada與其他語言,。
LLVM LLVM 是 Low Level Virtual Machine 的簡稱,這個(gè)庫提供了與編譯器相關(guān)的支持,,能夠進(jìn)行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化,、代碼生成,。簡而言之,,可以作為多種語言編譯器的后臺(tái)來使用。如果這樣還比較抽象的話,介紹下 Clang 就知道了:Clang 是一個(gè) C++ 編寫、基于 LLVM,、發(fā)布于 LLVM BSD 許可證下的 C/C++/Objective C/Objective C++ 編譯器,其目標(biāo)(之一)就是超越 GCC,。
LLVM歷史 Apple(包括中后期的NeXT) 一直使用GCC作為官方的編譯器,。GCC作為開源世界的編譯器標(biāo)準(zhǔn)一直做得不錯(cuò),但Apple對(duì)編譯工具會(huì)提出更高的要求,。 一方面,,是Apple對(duì)Objective-C語言(甚至后來對(duì)C語言)新增很多特性,但GCC開發(fā)者并不買Apple的帳——不給實(shí)現(xiàn),,因此索性后來兩者分成兩條分支分別開發(fā),,這也造成Apple的編譯器版本遠(yuǎn)落后于GCC的官方版本。另一方面,,GCC的代碼耦合度太高,,不好獨(dú)立,而且越是后期的版本,,代碼質(zhì)量越差,但Apple想做的很多功能(比如更好的IDE支持)需要模塊化的方式來調(diào)用GCC,,但GCC一直不給做,。甚至最近,《GCC運(yùn)行環(huán)境豁免條款 (英文版)》從根本上限制了LLVM-GCC的開發(fā),。 所以,,這種不和讓Apple一直在尋找一個(gè)高效的、模塊化的,、協(xié)議更放松的開源替代品,,于是Apple請(qǐng)來了編譯器高材生Chris Lattner(2000年,本科畢業(yè)的Chris Lattner像中國多數(shù)大學(xué)生一樣,,按部就班地考了GRE,,最終前往UIUC(伊利諾伊大學(xué)厄巴納香檳分校),開始了艱苦讀計(jì)算機(jī)碩士和博士的生涯,。在這階段,,他不僅周游美國各大景點(diǎn),更是努力學(xué)習(xí)科學(xué)文化知識(shí),,翻爛了“龍書”(《Compilers: Principles, Techniques, and Tools》),,成了GPA牛人【注:最終學(xué)分積4.0滿分】,,以及不斷地研究探索關(guān)于編譯器的未知領(lǐng)域,發(fā)表了一篇又一篇的論文,,是中國傳統(tǒng)觀念里的“三好學(xué)生”,。他的碩士畢業(yè)論文提出了一套完整的在編譯時(shí)、鏈接時(shí),、運(yùn)行時(shí)甚至是在閑置時(shí)優(yōu)化程序的編譯思想,,直接奠定了LLVM的基礎(chǔ)。LLVM在他念博士時(shí)更加成熟,,使用GCC作為前端來對(duì)用戶程序進(jìn)行語義分析產(chǎn)生IF(Intermidiate Format),,然后LLVM使用分析結(jié)果完成代碼優(yōu)化和生成。這項(xiàng)研究讓他在2005年畢業(yè)時(shí),,成為小有名氣的編譯器專家,,他也因此早早地被Apple相中,成為其編譯器項(xiàng)目的骨干),。 剛進(jìn)入Apple,,Chris Lattner就大展身手:首先在OpenGL小組做代碼優(yōu)化,把LLVM運(yùn)行時(shí)的編譯架在OpenGL棧上,,這樣OpenGL棧能夠產(chǎn)出更高效率的圖形代碼,。如果顯卡足夠高級(jí),這些代碼會(huì)直接扔入GPU執(zhí)行,。但對(duì)于一些不支持全部OpenGL特性的顯卡(比如當(dāng)時(shí)的Intel GMA卡),,LLVM則能夠把這些指令優(yōu)化成高效的CPU指令,使程序依然能夠正常運(yùn)行,。這個(gè)強(qiáng)大的OpenGL實(shí)現(xiàn)被用在了后來發(fā)布的Mac OS X 10.5上,。同時(shí),LLVM的鏈接優(yōu)化被直接加入到Apple的代碼鏈接器上,,而LLVM-GCC也被同步到使用GCC4代碼,。
Clang歷史 Apple吸收Chris Lattner的目的要比改進(jìn)GCC代碼優(yōu)化宏大得多——GCC系統(tǒng)龐大而笨重,而Apple大量使用的Objective-C在GCC中優(yōu)先級(jí)很低,。此外GCC作為一個(gè)純粹的編譯系統(tǒng),,與IDE配合得很差。加之許可證方面的要求,,Apple無法使用LLVM 繼續(xù)改進(jìn)GCC的代碼質(zhì)量,。于是,Apple決定從零開始寫 C,、C++,、Objective-C語言的前端 Clang,完全替代掉GCC,。 正像名字所寫的那樣,,Clang只支持C,,C++和Objective-C三種C家族語言。2007年開始開發(fā),,C編譯器最早完成,,而由于Objective-C相對(duì)簡單,只是C語言的一個(gè)簡單擴(kuò)展,,很多情況下甚至可以等價(jià)地改寫為C語言對(duì)Objective-C運(yùn)行庫的函數(shù)調(diào)用,,因此在2009年時(shí),已經(jīng)完全可以用于生產(chǎn)環(huán)境,。C++的支持也熱火朝天地進(jìn)行著,。
下面這張圖將顯示GCC、LLVM-GCC,、LLVM Compiler這三個(gè)編譯選項(xiàng)的不同點(diǎn):
對(duì)比 作為一種新的編譯器,,我們來看Clang和GCC各有什么優(yōu)缺點(diǎn): Clang特性
當(dāng)然,,GCC 也有其優(yōu)勢(shì):
要選擇哪個(gè) 那么三個(gè)編譯選項(xiàng),,要選擇哪一個(gè)呢?目前不推薦使用老的GCC4.2,,因?yàn)樘O果不會(huì)維持它了,,而且LLVM-GCC看起來會(huì)更好。在項(xiàng)目中途改編譯選項(xiàng)可是一個(gè)大變動(dòng),,所以,,如果你要改,當(dāng)然需要經(jīng)過慎重完整的測(cè)試,。 對(duì)新的項(xiàng)目而言,,LLVM-GCC看起來應(yīng)該是個(gè)安全的選擇,蘋果公司認(rèn)為它夠穩(wěn)定夠成熟,,所以才把它當(dāng)做Xcode 4的預(yù)設(shè)選項(xiàng)(你或許不會(huì)把穩(wěn)定成熟這兩個(gè)字眼跟Xcode 4本身畫上等號(hào)),,而且,既然選項(xiàng)使用的是GCC parser,,向后兼容性應(yīng)該沒問題,。
參考文檔: http://baike.baidu.com/view/4848.htm http://hi.baidu.com/zhanghuikl/blog/item/71e8a6018172df0f728da53e.html |
|