IOS開發(fā)者犬第,為什么都該懂點(diǎn)LLVM

當(dāng)然锦积,因?yàn)長LVM實(shí)在太強(qiáng)大,你會聽到許多其他特性(它可以是個(gè)JIT歉嗓;支持了一大批非類C語言丰介;還是App Store上的一種新的發(fā)布方式等等)。這些都是真的,不過就這篇文章而言哮幢,還是上面的定義更重要带膀。

下面是一些讓LLVM與眾不同的原因:

LLVM的“中間表示”(IR)是一項(xiàng)大創(chuàng)新。LLVM的程序表示方法真的“可讀”(如果你會讀匯編)橙垢。雖然看上去這沒什么要緊垛叨,但要知道,其他編譯器的中間表示大多是種內(nèi)存中的復(fù)雜數(shù)據(jù)結(jié)構(gòu)柜某,以至于很難寫出來嗽元,這讓其他編譯器既難懂又難以實(shí)現(xiàn)。

然而LLVM并非如此喂击。其架構(gòu)遠(yuǎn)比其他編譯器要模塊化得多剂癌。這種優(yōu)點(diǎn)可能部分來自于它的最初實(shí)現(xiàn)者。

盡管LLVM給我們這些狂熱的學(xué)術(shù)黑客提供了一種研究工具的選擇翰绊,它還是一款有大公司做后臺的工業(yè)級編譯器佩谷。這意味著你不需要去在“強(qiáng)大的編譯器”和“可玩的編譯器”之間做妥協(xié)——不像你在Java世界中必須在HotSpot和Jikes之間權(quán)衡那樣。

為什么人人需要懂點(diǎn)兒LLVM监嗜?

是谐檀,LLVM是一款酷炫的編譯器,但是如果不做編譯器研究裁奇,還有什么理由要管它稚补?

答:只要你和程序打交道,了解編譯器架構(gòu)就會令你受益框喳,而且從我個(gè)人經(jīng)驗(yàn)來看课幕,非常有用。利用它五垮,可以分析程序要多久一次來完成某項(xiàng)工作乍惊;改造程序,使其更適用于你的系統(tǒng)放仗,或者模擬一個(gè)新的處理器架構(gòu)或操作系統(tǒng)——只需稍加改動润绎,而不需要自己燒個(gè)芯片,或者寫個(gè)內(nèi)核诞挨。對于計(jì)算機(jī)科學(xué)研究者來說莉撇,編譯器遠(yuǎn)比他們想象中重要。建議你先試試LLVM惶傻,而不用hack下面這些工具(除非你真有重要的理由):

架構(gòu)模擬器棍郎;

動態(tài)二進(jìn)制分析工具,比如Pin银室;

源代碼變換(簡單的比如sed涂佃,復(fù)雜一些的比如抽象語法樹的分析和序列化)励翼;

修改內(nèi)核來干預(yù)系統(tǒng)調(diào)用;

任何和虛擬機(jī)管理程序相似的東西辜荠。

就算一個(gè)編譯器不能完美地適合你的任務(wù)汽抚,相比于從源碼到源碼的翻譯工作,它可以節(jié)省你九成精力伯病。

下面是一些巧妙利用了LLVM造烁,而又不是在做編譯器的研究項(xiàng)目:

UIUC的Virtual Ghost,展示了你可以用編譯器來保護(hù)掛掉的系統(tǒng)內(nèi)核中的進(jìn)程午笛。

UW的CoreDet利用LLVM實(shí)現(xiàn)了多線程程序的確定性惭蟋。

在我們的近似計(jì)算工作中,我們使用LLVM流程來給程序注入錯(cuò)誤信息季研,以模仿一些易出錯(cuò)的硬件。

重要的話說三遍:LLVM不是只用來實(shí)現(xiàn)編譯優(yōu)化的誉察!LLVM不是只用來實(shí)現(xiàn)編譯優(yōu)化的与涡!LLVM不是只用來實(shí)現(xiàn)編譯優(yōu)化的!

組成部分

LLVM架構(gòu)的主要組成部分如下(事實(shí)上也是所有現(xiàn)代編譯器架構(gòu)):

前端持偏,流程(Pass)驼卖,后端

下面分別來解釋:

前端獲取你的源代碼然后將它轉(zhuǎn)變?yōu)槟撤N中間表示。這種翻譯簡化了編譯器其他部分的工作鸿秆,這樣它們就不需要面對比如C++源碼的所有復(fù)雜性了酌畜。作為一個(gè)豪邁人,你很可能不想再做這部分工作卿叽;可以不加改動地使用Clang來完成桥胞。

“流程”將程序在中間表示之間互相變換。一般情況下考婴,流程也用來優(yōu)化代碼:流程輸出的(中間表示)程序和它輸入的(中間表示)程序相比在功能上完全相同贩虾,只是在性能上得到改進(jìn)。這部分通常是給你發(fā)揮的地方沥阱。你的研究工具可以通過觀察和修改編譯過程流中的IR來完成任務(wù)缎罢。

后端部分可以生成實(shí)際運(yùn)行的機(jī)器碼。你幾乎肯定不想動這部分了考杉。

雖然當(dāng)今大多數(shù)編譯器都使用了這種架構(gòu)策精,但是LLVM有一點(diǎn)值得注意而與眾不同:整個(gè)過程中,程序都使用了同一種中間表示崇棠。在其他編譯器中咽袜,可能每一個(gè)流程產(chǎn)出的代碼都有一種獨(dú)特的格式。LLVM在這一點(diǎn)上對hackers大為有利枕稀。我們不需要擔(dān)心我們的改動該插在哪個(gè)位置酬蹋,只要放在前后端之間某個(gè)地方就足夠了及老。

開始

讓我們開干吧。

獲取LLVM

首先需要安裝LLVM范抓。Linux的諸發(fā)行版中一般已經(jīng)裝好了LLVM和Clang的包骄恶,你直接用便是。但你還是需要確認(rèn)一下機(jī)子里的版本匕垫,是不是有所有你要用到的頭文件僧鲁。在OS X系統(tǒng)中,和XCode一起安裝的LLVM就不是那么完整象泵。還好寞秃,用CMake從源碼構(gòu)建LLVM也沒有多難。通常你只需要構(gòu)建LLVM本身偶惠,因?yàn)槟愕南到y(tǒng)提供的Clang已經(jīng)夠用(只要版本是匹配的春寿,如果不是,你也可以自己構(gòu)建Clang)忽孽。

具體在OS X上绑改,Brandon Holt有一個(gè)不錯(cuò)的指導(dǎo)文章。用Homebrew也可以安裝LLVM兄一。

去讀手冊

你需要對文檔有所了解厘线。我找到了一些值得一看的鏈接:

自動生成的Doxygen文檔頁非常重要。要想搞定LLVM出革,你必須要以這些API的文檔維生造壮。這些頁面可能不太好找,所以我推薦你直接用Google搜索骂束。只要你在搜索的函數(shù)或者類名后面加上“LLVM”耳璧,你一般就可以用Google找到正確的文檔頁面了。(如果你夠勤奮展箱,你甚至可以“訓(xùn)練”你的Google楞抡,使得在不輸入LLVM的情況下它也可以把LLVM的相關(guān)結(jié)果推到最前面)雖然聽上去有點(diǎn)逗,不過你真的需要這樣找LLVM的API文檔——反正我沒找到其他的好方法析藕。

《語言參考手冊》也非常有用召廷,如果你曾被LLVM IR dump里面的語法搞糊涂的話。

《開發(fā)者手冊》描述了一些LLVM特有的數(shù)據(jù)結(jié)構(gòu)的工具账胧,比如高效字符串竞慢,vector和map的替代品等等。它還描述了一些快速類型檢查工具isa治泥、cast和dyn_cast)筹煮,這些你不管在哪都要跑。

?如果你不知道你的流程可以做什么居夹,讀《編寫LLVM流程》败潦。不過因?yàn)槟阒皇莻€(gè)研究人員而不是浸淫于編譯器的大牛本冲,本文的觀點(diǎn)可能和這篇教程在一些細(xì)節(jié)上有所不同。(最緊急的是劫扒,別再用基于Makefile的構(gòu)建系統(tǒng)了檬洞。直接開始用CMake構(gòu)建你的程序吧,讀讀《“源代碼外”指令》)盡管上面這些是解決流程問題的官方材料沟饥,

不過在在線瀏覽LLVM代碼時(shí)添怔,這個(gè)GitHub鏡像有時(shí)會更方便。











原文鏈接:http://adriansampson.net/blog/llvm.html

作者:Adrian Sampson

譯者:張洵愷

覺得很有用贤旷,就轉(zhuǎn)載到這里广料,但有些地方不太明白,望高手進(jìn)行深入解讀S资弧0印!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盅藻,一起剝皮案震驚了整個(gè)濱河市购桑,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌萧求,老刑警劉巖其兴,帶你破解...
    沈念sama閱讀 210,978評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件顶瞒,死亡現(xiàn)場離奇詭異夸政,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)榴徐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,954評論 2 384
  • 文/潘曉璐 我一進(jìn)店門守问,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人坑资,你說我怎么就攤上這事耗帕。” “怎么了袱贮?”我有些...
    開封第一講書人閱讀 156,623評論 0 345
  • 文/不壞的土叔 我叫張陵仿便,是天一觀的道長。 經(jīng)常有香客問我攒巍,道長嗽仪,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,324評論 1 282
  • 正文 為了忘掉前任柒莉,我火速辦了婚禮闻坚,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘兢孝。我一直安慰自己窿凤,他們只是感情好仅偎,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,390評論 5 384
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著雳殊,像睡著了一般橘沥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上相种,一...
    開封第一講書人閱讀 49,741評論 1 289
  • 那天威恼,我揣著相機(jī)與錄音,去河邊找鬼寝并。 笑死箫措,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的衬潦。 我是一名探鬼主播斤蔓,決...
    沈念sama閱讀 38,892評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼镀岛!你這毒婦竟也來了弦牡?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,655評論 0 266
  • 序言:老撾萬榮一對情侶失蹤漂羊,失蹤者是張志新(化名)和其女友劉穎驾锰,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體走越,經(jīng)...
    沈念sama閱讀 44,104評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡椭豫,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了旨指。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片赏酥。...
    茶點(diǎn)故事閱讀 38,569評論 1 340
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖谆构,靈堂內(nèi)的尸體忽然破棺而出裸扶,到底是詐尸還是另有隱情,我是刑警寧澤搬素,帶...
    沈念sama閱讀 34,254評論 4 328
  • 正文 年R本政府宣布呵晨,位于F島的核電站,受9級特大地震影響熬尺,放射性物質(zhì)發(fā)生泄漏摸屠。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,834評論 3 312
  • 文/蒙蒙 一猪杭、第九天 我趴在偏房一處隱蔽的房頂上張望餐塘。 院中可真熱鬧,春花似錦皂吮、人聲如沸戒傻。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,725評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽需纳。三九已至芦倒,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間不翩,已是汗流浹背兵扬。 一陣腳步聲響...
    開封第一講書人閱讀 31,950評論 1 264
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留口蝠,地道東北人器钟。 一個(gè)月前我還...
    沈念sama閱讀 46,260評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像妙蔗,于是被迫代替她去往敵國和親傲霸。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,446評論 2 348

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

  • 前言 2000年眉反,伊利諾伊大學(xué)厄巴納-香檳分校(University of Illinois at Urbana-...
    星光社的戴銘閱讀 15,873評論 8 180
  • 編譯器做些什么昙啄? 本文主要探討一下編譯器主要做些什么,以及如何有效的利用編譯器寸五。 簡單的說梳凛,編譯器有兩個(gè)職責(zé):把 ...
    評評分分閱讀 1,119評論 1 5
  • LLVM 簡介 LLVM 全稱是 Low Level Virtual Machine,它是源自 the Unive...
    juniway閱讀 37,717評論 0 21
  • 老劉就是以前的劉老梳杏∪途埽“誰能料想老天爺會如此捉弄自己”,老劉現(xiàn)在時(shí)常這么想秘狞。 事情還得從五年前講起叭莫。 那年八月份蹈集,陽...
    我心天涯閱讀 435評論 0 0
  • 時(shí)間就像胡同口的風(fēng)烁试,一刀一刀刻在我的臉上。 今天是12月1日拢肆,我在辦公桌前寫下這些零零碎碎的文字减响。 美好的一天。 ...
    李鐵蛋兒閱讀 190評論 0 0