LLVM是Low Level Virtual Machine的簡(jiǎn)稱秧秉。這個(gè)庫(kù)提供了與編譯器相關(guān)的支持,能夠進(jìn)行程序語(yǔ)言的編譯期優(yōu)化纬凤、鏈接優(yōu)化福贞、在線編譯優(yōu)化、代碼生成停士⊥诹保可以作為多種語(yǔ)言編譯器的后臺(tái)來(lái)使用完丽。
Clang是一個(gè)C++編寫的基于LLVM、發(fā)布于LLVM BSD許可證下的C/C++/Object-C/Object-C++ 編譯器拇舀。
GCC:(GNU Compiler Collection)縮寫逻族,一個(gè)編程語(yǔ)言編譯器,是GNU(自由軟件理事會(huì))的關(guān)鍵部分骄崩。也是GNU工具鏈的一部分聘鳞。GCC常被認(rèn)為是夸平臺(tái)編譯器的事實(shí)標(biāo)準(zhǔn),特別是它的C語(yǔ)言編譯器要拂。GCC原本只能處理C語(yǔ)言抠璃。但是面對(duì)Clang的競(jìng)爭(zhēng),很快作出了擴(kuò)展脱惰,現(xiàn)在已經(jīng)可以處理C++搏嗡,F(xiàn)ortran、Pascal拉一、Object-C采盒、Java、Ada蔚润,以及Go語(yǔ)言磅氨。許多操作系統(tǒng),包括許多Unix系統(tǒng)嫡纠,如Linux及BSD家族都采用GCC作為標(biāo)準(zhǔn)編譯器烦租。MacOSX也是采用這個(gè)編譯器。
? ? ? ?有了GCC在前為何還有Clang的出現(xiàn)除盏?原因如下:Apple使用LLVM在不支持全部OpenGL特性的GPU(Intel低端顯卡)上生成代碼JIT左权,令程序仍然能正常運(yùn)行。之后LLVM與GCC的集成過(guò)程發(fā)生了一些不快痴颊,GCC系統(tǒng)龐大兒笨重,而Apple大量使用的Object-C在GCC中優(yōu)先級(jí)很低屡贺。此外GCC作為一個(gè)純粹的編譯系統(tǒng)蠢棱,與IDE配合很差。加上許可證方面的要求甩栈,Apple無(wú)法使用修改版GCC而閉源泻仙。于是Apple決定從0開(kāi)始寫C family的前端,也就是基于LLVM的Clang了量没。
Clang的特性:
1玉转、快:通過(guò)編譯OSX上幾乎包含了所有C頭文件的carbon.h的測(cè)試,包括預(yù)處理(Pregrocess)殴蹄、語(yǔ)法(lex)究抓、解析(parse)猾担,語(yǔ)義分析(semantic Analysis),抽象語(yǔ)法樹(shù)生成(Abstract syntax Tree)的時(shí)間,Clang是Apple GCC 4.0的2.5x快刺下。
2绑嘹、內(nèi)存占用小:Clang內(nèi)存占用是源碼的130%橘茉,AppleGCC則超過(guò)10x工腋。
3、診斷信息可讀性強(qiáng):Clang中錯(cuò)誤的語(yǔ)法不但有源碼提示畅卓,還會(huì)在錯(cuò)誤的調(diào)用和相關(guān)上下文有~~~~和^提示擅腰,GCC看不懂。
4翁潘、設(shè)計(jì)清晰簡(jiǎn)單趁冈,容易理解,易于擴(kuò)展增強(qiáng)唐础。學(xué)習(xí)容易箱歧。
5、基于庫(kù)的模塊化設(shè)計(jì)一膨,易于IDE集成及其他用途的重用呀邢。由于歷史原因,GCC是一個(gè)單一的可執(zhí)行程序編譯器豹绪,其內(nèi)部完成預(yù)處理到代碼生成的全部過(guò)程价淌,中間諸多信息都無(wú)法被其他程序重用。Clang將編譯過(guò)程分成彼此分離的幾個(gè)階段瞒津,AST信息可序列化蝉衣。通過(guò)庫(kù)的支持,程序能夠獲取到AST級(jí)別的信息巷蚪,將大大增強(qiáng)對(duì)代碼的操控能力病毡。對(duì)于IDE而已,代碼補(bǔ)全屁柏、重構(gòu)是重要的功能啦膜,然而如果沒(méi)有底層的支持,只使用tags分析或者正則表達(dá)式匹配很難達(dá)成淌喻。
當(dāng)然GCC也有優(yōu)勢(shì):
1僧家、支持JAVA/ADA/Fortran
2、GCC支持平臺(tái)多
3裸删、GCC更流行八拱,廣泛使用,支持完備
4、GCC基于C肌稻,不需要C++編譯器就可以編譯
? ? ? ? ?相信介紹到這里大家能夠?qū)?Clang 和 LLVM 有所了解了清蚀。除去 Clang 之外,LLVM 還被用在 Gallium3D 中進(jìn)行 JIT 優(yōu)化灯萍,Xorg 中的 pixman 也有考慮使用 LLVM 來(lái)優(yōu)化執(zhí)行速度轧铁,llvm-lua使用 LLVM 來(lái)編譯 Lua 代碼,gpuocelot使用 LLVM 可以令 CUDA 程序無(wú)需重新編譯即可運(yùn)行在多核 X86CPU旦棉、IBM Cell齿风、支持 OpenCL 的設(shè)備之上...
LLVM是編譯器的工具鏈的集合,Clang是使用LLVM的編譯器绑洛,Clang必須調(diào)用連接器LLDB來(lái)產(chǎn)生可執(zhí)行文件救斑。
用Clang編譯OC的程序
我們用Clang編譯一次OC的程序就可以加深對(duì)Clang的理解。
1真屯、創(chuàng)建程序脸候,我們不用XCode工具,就用普通文本編輯器绑蔫,內(nèi)容如下:
#import<Foundation/Foundation.h>
int main (intargc,constchar* argv[])
{
@autoreleasepool
? {
printf("Hello, World!\n");
NSLog(@"Hello, Objective-C!");
? ? ? }
return0;
}
2运沦、保存為純文本格式,文件名和路徑隨意配深,例如 test.m携添。
3、編譯生成可執(zhí)行文件篓叶,用命令行
? ? 1)打開(kāi)終端(應(yīng)用程序->使用工具->終端)
? ? 2)cd命令進(jìn)入test.m文件所在的目錄烈掠;
notes:在iOS5之前,可以通過(guò)GCC對(duì)源碼進(jìn)行編譯缸托,但是在iOS5中添加了新的特性左敌,例如ARC以及新的指令,需要LLVM clang編譯器俐镐。GCC不認(rèn)識(shí)新的指令矫限,無(wú)法通過(guò)編譯。
? ? 3)在終端中輸入以下命令:clang -fobjc-arc -framework Foundation test.m ?-o test
命令解釋:-fobjc-arc 表示編譯器需要支持ARC特性佩抹,這樣才能理解新添加的指令
? ? ? ? ? ? ? ? ? ?-framework Foundation 表示引用Foundation框架奇唤,這個(gè)框架定義了很多基本的類,是程序的基礎(chǔ)框架匹摇。
? ? ? ? ? ? ? ? ? ?test.m ?編譯的源代碼文件名。
? ? ? ? ? ? ? ? ? ? -o test 表示輸出的可執(zhí)行為難的文件名字是test甲葬。
? ? ? ? 4)編譯完成之后會(huì)在當(dāng)前目錄生成test
? ? ? ? 5)在終端執(zhí)行該文件廊勃,輸入命令:./test
? ? ? ? 6)點(diǎn)擊回車,在終端中得到如下的輸出:
Hello,World!
2017-10-11 16:46:37.532 test[75632:707] Hello,Objective-C!
參考:https://linuxtoy.org/archives/llvm-and-clang.html
? ? ? ? ? ?http://blog.csdn.net/lovechris00/article/details/72190496