編譯器:GCC、LLVM、Clang

LLVM是Low Level Virtual Machine的簡稱。這個(gè)庫提供了與編譯器相關(guān)的支持,能夠進(jìn)行程序語言的編譯期優(yōu)化、鏈接優(yōu)化、在線編譯優(yōu)化、代碼生成??梢宰鳛槎喾N語言編譯器的后臺(tái)來使用。

Clang是一個(gè)C++編寫的基于LLVM、發(fā)布于LLVM BSD許可證下的C/C++/Object-C/Object-C++ 編譯器。

GCC:(GNU Compiler Collection)縮寫,一個(gè)編程語言編譯器,是GNU(自由軟件理事會(huì))的關(guān)鍵部分。也是GNU工具鏈的一部分。GCC常被認(rèn)為是夸平臺(tái)編譯器的事實(shí)標(biāo)準(zhǔn),特別是它的C語言編譯器。GCC原本只能處理C語言。但是面對(duì)Clang的競爭,很快作出了擴(kuò)展,現(xiàn)在已經(jīng)可以處理C++,F(xiàn)ortran、Pascal、Object-C、Java、Ada,以及Go語言。許多操作系統(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的集成過程發(fā)生了一些不快,GCC系統(tǒng)龐大兒笨重,而Apple大量使用的Object-C在GCC中優(yōu)先級(jí)很低。此外GCC作為一個(gè)純粹的編譯系統(tǒng),與IDE配合很差。加上許可證方面的要求,Apple無法使用修改版GCC而閉源。于是Apple決定從0開始寫C family的前端,也就是基于LLVM的Clang了。

Clang的特性:

1、快:通過編譯OSX上幾乎包含了所有C頭文件的carbon.h的測試,包括預(yù)處理(Pregrocess)、語法(lex)、解析(parse),語義分析(semantic Analysis),抽象語法樹生成(Abstract syntax Tree)的時(shí)間,Clang是Apple GCC 4.0的2.5x快。

2、內(nèi)存占用?。篊lang內(nèi)存占用是源碼的130%,AppleGCC則超過10x。

3、診斷信息可讀性強(qiáng):Clang中錯(cuò)誤的語法不但有源碼提示,還會(huì)在錯(cuò)誤的調(diào)用和相關(guān)上下文有~~~~和^提示,GCC看不懂。

4、設(shè)計(jì)清晰簡單,容易理解,易于擴(kuò)展增強(qiáng)。學(xué)習(xí)容易。

5、基于庫的模塊化設(shè)計(jì),易于IDE集成及其他用途的重用。由于歷史原因,GCC是一個(gè)單一的可執(zhí)行程序編譯器,其內(nèi)部完成預(yù)處理到代碼生成的全部過程,中間諸多信息都無法被其他程序重用。Clang將編譯過程分成彼此分離的幾個(gè)階段,AST信息可序列化。通過庫的支持,程序能夠獲取到AST級(jí)別的信息,將大大增強(qiáng)對(duì)代碼的操控能力。對(duì)于IDE而已,代碼補(bǔ)全、重構(gòu)是重要的功能,然而如果沒有底層的支持,只使用tags分析或者正則表達(dá)式匹配很難達(dá)成。

當(dāng)然GCC也有優(yōu)勢:

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 來優(yōu)化執(zhí)行速度,llvm-lua使用 LLVM 來編譯 Lua 代碼,gpuocelot使用 LLVM 可以令 CUDA 程序無需重新編譯即可運(yùn)行在多核 X86CPU、IBM Cell、支持 OpenCL 的設(shè)備之上...

LLVM是編譯器的工具鏈的集合,Clang是使用LLVM的編譯器,Clang必須調(diào)用連接器LLDB來產(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)打開終端(應(yīng)用程序->使用工具->終端)

? ? 2)cd命令進(jìn)入test.m文件所在的目錄;

notes:在iOS5之前,可以通過GCC對(duì)源碼進(jìn)行編譯,但是在iOS5中添加了新的特性,例如ARC以及新的指令,需要LLVM clang編譯器。GCC不認(rèn)識(shí)新的指令,無法通過編譯。

? ? 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容