編譯器

編譯器就是將“一種語(yǔ)言(通常為高級(jí)語(yǔ)言)”翻譯為“另一種語(yǔ)言(通常為低級(jí)語(yǔ)言)”的程序。一個(gè)現(xiàn)代編譯器的主要工作流程:源代碼 (source code) → 預(yù)處理器 (preprocessor) → 編譯器 (compiler) → 目標(biāo)代碼 (object code) → 鏈接器(Linker) → 可執(zhí)行程序 (executables)

傳統(tǒng)編譯器的工作原理基本上都是三段式的,可以分為前端(Frontend)垂券、優(yōu)化器(Optimizer)要门、后端(Backend)形导。前端負(fù)責(zé)解析源代碼婉烟,檢查語(yǔ)法錯(cuò)誤鼻弧,并將其翻譯為抽象的語(yǔ)法樹(shù)(Abstract Syntax Tree)设江。優(yōu)化器對(duì)這一中間代碼進(jìn)行優(yōu)化,試圖使代碼更高效攘轩。后端則負(fù)責(zé)將優(yōu)化器優(yōu)化后的中間代碼轉(zhuǎn)換為目標(biāo)機(jī)器的代碼叉存,這一過(guò)程后端會(huì)最大化的利用目標(biāo)機(jī)器的特殊指令,以提高代碼的性能度帮。

GCC(GNU Compiler Collection歼捏,GNU編譯器套裝)

GCC原名為GNU C語(yǔ)言編譯器GNU C Compiler)稿存,因?yàn)樗局荒芴幚鞢語(yǔ)言。GCC很快地?cái)U(kuò)展瞳秽,變得可處理C++瓣履。之后也變得可處理Fortran、Pascal练俐、Objective-C袖迎、Java、Ada腺晾,以及Go與其他語(yǔ)言燕锥。
GCC通常是跨平臺(tái)軟件的編譯器首選。有別于一般局限于特定系統(tǒng)與運(yùn)行環(huán)境的編譯器悯蝉,GCC在所有平臺(tái)上都使用同一個(gè)前端處理程序归形,產(chǎn)生一樣的中介碼,因此此中介碼在各個(gè)其他平臺(tái)上使用GCC編譯鼻由,有很大的機(jī)會(huì)可得到正確無(wú)誤的輸出程序暇榴。
總結(jié): mac之前的cocoa框架便是用GCC編譯的,所以ios與mac os都是默認(rèn)使用的GCC編譯器(現(xiàn)在是clang與llvm蕉世,下面會(huì)有介紹) android的系統(tǒng)層因?yàn)槭莑inux內(nèi)核蔼紧,自然也是GCC編譯的,但是android的app因?yàn)槭沁\(yùn)行在Dalvik虛擬機(jī)讨彼,所以用的不是GCC歉井。 windows的應(yīng)用柿祈,大部分都是使用的vs系列的編譯器哈误,畢竟是windows自家的編譯器,用到GCC的不多躏嚎。

Clang

Clang 是一個(gè)C蜜自、C++、Objective-C和Objective-C++編程語(yǔ)言的編譯器前端卢佣。它采用了底層虛擬機(jī)(LLVM)作為其后端重荠。
它的目標(biāo)是提供一個(gè)GNU編譯器套裝(GCC)的替代品。 Clang項(xiàng)目包括Clang前端和Clang靜態(tài)分析器等虚茶。
這個(gè)軟件項(xiàng)目在2005年由蘋果電腦發(fā)起戈鲁,是LLVM編譯器工具集的前端(front-end),目的是輸出代碼對(duì)應(yīng)的抽象語(yǔ)法樹(shù)(Abstract Syntax Tree, AST)嘹叫,并將代碼編譯成LLVM Bitcode婆殿。接著在后端(back-end)使用LLVM編譯成平臺(tái)相關(guān)的機(jī)器語(yǔ)言 。Clang支持C罩扇、C++婆芦、Objective C怕磨。

Clang本身性能優(yōu)異,其生成的AST所耗用掉的內(nèi)存僅僅是GCC的20%左右消约。FreeBSD 10將Clang/LLVM作為默認(rèn)編譯器.
測(cè)試證明Clang編譯Objective-C代碼時(shí)速度為GCC的3倍肠鲫,還能針對(duì)用戶發(fā)生的編譯錯(cuò)誤準(zhǔn)確地給出建議。
總結(jié): GCC目前作為跨平臺(tái)編譯器來(lái)說(shuō)它的兼容性無(wú)異是最強(qiáng)的或粮,兼容最強(qiáng)肯定是以犧牲一定的性能為基礎(chǔ)的导饲,蘋果為了提高性能,因此專門針對(duì)mac系統(tǒng)開(kāi)發(fā)了專用的編譯器clang與llvm被啼,clang用于編譯器前段帜消,llvm用于后端。

LLVM

LLVM浓体,它是一個(gè)編譯器的基礎(chǔ)建設(shè)泡挺,以C++寫成。它是為了任意一種編程語(yǔ)言寫成的程序命浴,利用虛擬技術(shù)娄猫,創(chuàng)造出編譯時(shí)期,鏈結(jié)時(shí)期生闲,運(yùn)行時(shí)期以及“閑置時(shí)期”的優(yōu)化媳溺。

在Xcode4之后,蘋果將Xcode的默認(rèn)編譯器變成了LLVM

Apple(包括中后期的NeXT) 一直使用GCC作為官方的編譯器碍讯。GCC作為開(kāi)源世界的編譯器標(biāo)準(zhǔn)一直做得不錯(cuò)悬蔽,但Apple對(duì)編譯工具會(huì)提出更高的要求。Apple大量使用的Objective-C在GCC中優(yōu)先級(jí)很低捉兴。此外GCC作為一個(gè)純粹的編譯系統(tǒng)蝎困,與IDE配合得很差。加之許可證方面的要求倍啥,Apple無(wú)法使用LLVM 繼續(xù)改進(jìn)GCC的代碼質(zhì)量禾乘。于是,Apple決定從零開(kāi)始寫 C虽缕、C++始藕、Objective-C語(yǔ)言的前端 Clang,完全替代掉GCC氮趋。
正像名字所寫的那樣伍派,Clang只支持C,C++和Objective-C三種C家族語(yǔ)言剩胁。2007年開(kāi)始開(kāi)發(fā)诉植,C編譯器最早完成,而由于Objective-C相對(duì)簡(jiǎn)單摧冀,只是C語(yǔ)言的一個(gè)簡(jiǎn)單擴(kuò)展倍踪,很多情況下甚至可以等價(jià)地改寫為C語(yǔ)言對(duì)Objective-C運(yùn)行庫(kù)的函數(shù)調(diào)用系宫,因此在2009年時(shí),已經(jīng)完全可以用于生產(chǎn)環(huán)境建车。C++的支持也熱火朝天地進(jìn)行著扩借。

總結(jié): 因?yàn)镚CC的編譯器已經(jīng)慢慢無(wú)法滿足蘋果的需求,因此缤至,蘋果開(kāi)發(fā)了Clang與LLVM來(lái)完全取代GCC潮罪,Xcode4之后,蘋果的默認(rèn)編譯器已經(jīng)是LLVM了领斥。Clang作為編譯器前端嫉到,LLVM作為編譯器后端。

后邊的話

隨著 Android P 的逐步應(yīng)用月洛,越來(lái)越多的客戶要求編譯庫(kù)時(shí)用 libc++ 來(lái)代替 libstdc++何恶。libc++ 和 libstdc++ 這兩個(gè)庫(kù)有關(guān)系呢?它們兩個(gè)都是 C++ 標(biāo)準(zhǔn)庫(kù)嚼黔,libc++ 是針對(duì) Clang 編譯器特別重寫的 C++ 標(biāo)準(zhǔn)庫(kù)细层,而 libstdc++ 則是 GCC 的對(duì)應(yīng) C++ 標(biāo)準(zhǔn)庫(kù)了。從 Android 市場(chǎng)來(lái)說(shuō)唬涧,Android NDK 已在具體應(yīng)用中放棄了 GCC疫赎,全面轉(zhuǎn)向 Clang

Clang 是一個(gè) C、C++碎节、Objective-C 和 Objective-C++ 編程語(yǔ)言的編譯器前端捧搞,采用底層虛擬機(jī)(LLVM)作為后端。至于為什么有了 GCC 還要開(kāi)發(fā) Clang狮荔?Clang 相比 GCC 又有什么優(yōu)勢(shì)呢胎撇?網(wǎng)上有很多信息可以參考,這里只簡(jiǎn)單提兩點(diǎn):(1)Clang 采用的是 BSD 協(xié)議的許可證轴合,而 GCC 采用的是 GPL 協(xié)議创坞,顯然前者更為寬松碗短;(2)Clang 是一個(gè)高度模塊化開(kāi)發(fā)的輕量級(jí)編譯器受葛,編譯速度快、占用內(nèi)存小偎谁、有著友好的出錯(cuò)提示总滩。

目前 LLVM 因其寬松的許可協(xié)議,更好的模塊化巡雨、更清晰的架構(gòu)闰渔,成為很多廠商或者組織的選擇,已經(jīng)被蘋果 IOS 開(kāi)發(fā)工具铐望、Facebook冈涧、Google 等各大公司采用茂附,像 Swift、Rust 等語(yǔ)言都選擇了以 LLVM 為后端督弓。


Clang-LLVM.jpg
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末营曼,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子愚隧,更是在濱河造成了極大的恐慌蒂阱,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,423評(píng)論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件狂塘,死亡現(xiàn)場(chǎng)離奇詭異录煤,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)荞胡,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評(píng)論 2 385
  • 文/潘曉璐 我一進(jìn)店門妈踊,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人泪漂,你說(shuō)我怎么就攤上這事响委。” “怎么了窖梁?”我有些...
    開(kāi)封第一講書人閱讀 157,019評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵赘风,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我纵刘,道長(zhǎng)邀窃,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書人閱讀 56,443評(píng)論 1 283
  • 正文 為了忘掉前任假哎,我火速辦了婚禮瞬捕,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘舵抹。我一直安慰自己肪虎,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,535評(píng)論 6 385
  • 文/花漫 我一把揭開(kāi)白布惧蛹。 她就那樣靜靜地躺著扇救,像睡著了一般。 火紅的嫁衣襯著肌膚如雪香嗓。 梳的紋絲不亂的頭發(fā)上迅腔,一...
    開(kāi)封第一講書人閱讀 49,798評(píng)論 1 290
  • 那天,我揣著相機(jī)與錄音靠娱,去河邊找鬼沧烈。 笑死,一個(gè)胖子當(dāng)著我的面吹牛像云,可吹牛的內(nèi)容都是我干的锌雀。 我是一名探鬼主播蚂夕,決...
    沈念sama閱讀 38,941評(píng)論 3 407
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼腋逆!你這毒婦竟也來(lái)了双抽?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書人閱讀 37,704評(píng)論 0 266
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤闲礼,失蹤者是張志新(化名)和其女友劉穎牍汹,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體柬泽,經(jīng)...
    沈念sama閱讀 44,152評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡慎菲,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,494評(píng)論 2 327
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了锨并。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片露该。...
    茶點(diǎn)故事閱讀 38,629評(píng)論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖第煮,靈堂內(nèi)的尸體忽然破棺而出解幼,到底是詐尸還是另有隱情,我是刑警寧澤包警,帶...
    沈念sama閱讀 34,295評(píng)論 4 329
  • 正文 年R本政府宣布撵摆,位于F島的核電站,受9級(jí)特大地震影響害晦,放射性物質(zhì)發(fā)生泄漏特铝。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,901評(píng)論 3 313
  • 文/蒙蒙 一壹瘟、第九天 我趴在偏房一處隱蔽的房頂上張望鲫剿。 院中可真熱鬧,春花似錦稻轨、人聲如沸灵莲。這莊子的主人今日做“春日...
    開(kāi)封第一講書人閱讀 30,742評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)政冻。三九已至,卻和暖如春粱挡,著一層夾襖步出監(jiān)牢的瞬間赠幕,已是汗流浹背俄精。 一陣腳步聲響...
    開(kāi)封第一講書人閱讀 31,978評(píng)論 1 266
  • 我被黑心中介騙來(lái)泰國(guó)打工询筏, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人竖慧。 一個(gè)月前我還...
    沈念sama閱讀 46,333評(píng)論 2 360
  • 正文 我出身青樓嫌套,卻偏偏與公主長(zhǎng)得像逆屡,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子踱讨,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,499評(píng)論 2 348

推薦閱讀更多精彩內(nèi)容