IOS開發(fā)者,為什么都該懂點LLVM

當然,因為LLVM實在太強大,你會聽到許多其他特性(它可以是個JIT;支持了一大批非類C語言;還是App Store上的一種新的發(fā)布方式等等)。這些都是真的,不過就這篇文章而言,還是上面的定義更重要。

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

LLVM的“中間表示”(IR)是一項大創(chuàng)新。LLVM的程序表示方法真的“可讀”(如果你會讀匯編)。雖然看上去這沒什么要緊,但要知道,其他編譯器的中間表示大多是種內存中的復雜數據結構,以至于很難寫出來,這讓其他編譯器既難懂又難以實現。

然而LLVM并非如此。其架構遠比其他編譯器要模塊化得多。這種優(yōu)點可能部分來自于它的最初實現者。

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

為什么人人需要懂點兒LLVM?

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

答:只要你和程序打交道,了解編譯器架構就會令你受益,而且從我個人經驗來看,非常有用。利用它,可以分析程序要多久一次來完成某項工作;改造程序,使其更適用于你的系統(tǒng),或者模擬一個新的處理器架構或操作系統(tǒng)——只需稍加改動,而不需要自己燒個芯片,或者寫個內核。對于計算機科學研究者來說,編譯器遠比他們想象中重要。建議你先試試LLVM,而不用hack下面這些工具(除非你真有重要的理由):

架構模擬器;

動態(tài)二進制分析工具,比如Pin;

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

修改內核來干預系統(tǒng)調用;

任何和虛擬機管理程序相似的東西。

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

下面是一些巧妙利用了LLVM,而又不是在做編譯器的研究項目:

UIUC的Virtual Ghost,展示了你可以用編譯器來保護掛掉的系統(tǒng)內核中的進程。

UW的CoreDet利用LLVM實現了多線程程序的確定性。

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

重要的話說三遍:LLVM不是只用來實現編譯優(yōu)化的!LLVM不是只用來實現編譯優(yōu)化的!LLVM不是只用來實現編譯優(yōu)化的!

組成部分

LLVM架構的主要組成部分如下(事實上也是所有現代編譯器架構):

前端,流程(Pass),后端

下面分別來解釋:

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

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

后端部分可以生成實際運行的機器碼。你幾乎肯定不想動這部分了。

雖然當今大多數編譯器都使用了這種架構,但是LLVM有一點值得注意而與眾不同:整個過程中,程序都使用了同一種中間表示。在其他編譯器中,可能每一個流程產出的代碼都有一種獨特的格式。LLVM在這一點上對hackers大為有利。我們不需要擔心我們的改動該插在哪個位置,只要放在前后端之間某個地方就足夠了。

開始

讓我們開干吧。

獲取LLVM

首先需要安裝LLVM。Linux的諸發(fā)行版中一般已經裝好了LLVM和Clang的包,你直接用便是。但你還是需要確認一下機子里的版本,是不是有所有你要用到的頭文件。在OS X系統(tǒng)中,和XCode一起安裝的LLVM就不是那么完整。還好,用CMake從源碼構建LLVM也沒有多難。通常你只需要構建LLVM本身,因為你的系統(tǒng)提供的Clang已經夠用(只要版本是匹配的,如果不是,你也可以自己構建Clang)。

具體在OS X上,Brandon Holt有一個不錯的指導文章。用Homebrew也可以安裝LLVM。

去讀手冊

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

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

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

《開發(fā)者手冊》描述了一些LLVM特有的數據結構的工具,比如高效字符串,vector和map的替代品等等。它還描述了一些快速類型檢查工具isa、cast和dyn_cast),這些你不管在哪都要跑。

?如果你不知道你的流程可以做什么,讀《編寫LLVM流程》。不過因為你只是個研究人員而不是浸淫于編譯器的大牛,本文的觀點可能和這篇教程在一些細節(jié)上有所不同。(最緊急的是,別再用基于Makefile的構建系統(tǒng)了。直接開始用CMake構建你的程序吧,讀讀《“源代碼外”指令》)盡管上面這些是解決流程問題的官方材料,

不過在在線瀏覽LLVM代碼時,這個GitHub鏡像有時會更方便。











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

作者:Adrian Sampson

譯者:張洵愷

覺得很有用,就轉載到這里,但有些地方不太明白,望高手進行深入解讀!!!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發(fā)布,文章內容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 228,505評論 6 533
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 98,556評論 3 418
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事。” “怎么了?”我有些...
    開封第一講書人閱讀 176,463評論 0 376
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 63,009評論 1 312
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,778評論 6 410
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 55,218評論 1 324
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,281評論 3 441
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,436評論 0 288
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體,經...
    沈念sama閱讀 48,969評論 1 335
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,795評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,993評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,537評論 5 359
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 44,229評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,659評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,917評論 1 286
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,687評論 3 392
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,990評論 2 374

推薦閱讀更多精彩內容

  • 前言 2000年,伊利諾伊大學厄巴納-香檳分校(University of Illinois at Urbana-...
    星光社的戴銘閱讀 15,935評論 8 180
  • 編譯器做些什么? 本文主要探討一下編譯器主要做些什么,以及如何有效的利用編譯器。 簡單的說,編譯器有兩個職責:把 ...
    評評分分閱讀 1,148評論 1 5
  • LLVM 簡介 LLVM 全稱是 Low Level Virtual Machine,它是源自 the Unive...
    juniway閱讀 38,066評論 0 21
  • 老劉就是以前的劉老。“誰能料想老天爺會如此捉弄自己”,老劉現在時常這么想。 事情還得從五年前講起。 那年八月份,陽...
    我心天涯閱讀 445評論 0 0
  • 時間就像胡同口的風,一刀一刀刻在我的臉上。 今天是12月1日,我在辦公桌前寫下這些零零碎碎的文字。 美好的一天。 ...
    李鐵蛋兒閱讀 195評論 0 0