LLVM編譯器

LLVM編譯器的基礎知識

1.LLVM編譯器是什么妹孙?

LLVM是 Illinois 大學發(fā)起的一個開源項目,LLVM 是 Low Level Virtual Machine (低級虛擬機)的簡稱静檬,這個庫提供了與編譯器相關的支持查邢,可以作為多種語言編譯器的后臺來使用鄙才。能夠進行程序語言的編譯期優(yōu)化、鏈接優(yōu)化择吊、在線編譯優(yōu)化李根、代碼生成LLVM的項目是一個模塊化和可重復使用的編譯器和工具技術的集合几睛。

2.框架結構

LLVM編譯器架構

(1)不同的前端后端使用統(tǒng)一的中間代碼LLVM Intermediate Representation (LLVM IR)
(2)如果需要支持一種新的編程語言房轿,那么只需要實現(xiàn)一個新的前端
(3)如果需要支持一種新的硬件設備,那么只需要實現(xiàn)一個新的后端
(4)優(yōu)化階段是一個通用的階段所森,它針對的是統(tǒng)一的LLVM IR囱持,不論是支持新的編程語言,還是支持新的硬件設備焕济,都不需要對優(yōu)化階段做修改
(5)相比之下纷妆,GCC的前端和后端沒分得太開,前端后端耦合在了一起晴弃。所以GCC為了支持一門新的語言掩幢,或者為了支持一個新的目標平臺逊拍,就 變得特別困難
(6)LLVM現(xiàn)在被作為實現(xiàn)各種靜態(tài)和運行時編譯語言的通用基礎結構(GCC家族、Java际邻、.NET芯丧、Python、Ruby世曾、Scheme缨恒、Haskell、D等)

3.什么是Clang

LLVM項目的一個子項目轮听,基于LLVM架構的C/C++/Objective-C編譯器前端

相比于GCC骗露,Clang具有如下優(yōu)點

編譯速度快:在某些平臺上,Clang的編譯速度顯著的快過GCC(Debug模式下編譯>OC速度比GGC快3倍)
占用內(nèi)存小:Clang生成的AST所占用的內(nèi)存是GCC的五分之一左右
模塊化設計:Clang采用基于庫的模塊化設計蕊程,易于 IDE 集成及其他用途的重用
診斷信息可讀性強:在編譯過程中椒袍,Clang 創(chuàng)建并保留了大量詳細的元數(shù)據(jù) >(metadata)驼唱,有利于調(diào)試和錯誤報告
設計清晰簡單藻茂,容易理解,易于擴展增強

圖2
編譯過程:

源代碼(c/c++)經(jīng)過clang--> 中間代碼(經(jīng)過一系列的優(yōu)化玫恳,優(yōu)化用的是Pass) --> 機器碼

4.LLVM與Clang的關系

    對應到這個圖2中辨赐,可以非常明確的找出它們的對應關系。LLVM與Clang是C/C++編譯器套件京办。對于整個LLVM的框架來說掀序,包含了Clang,因為Clang是LLVM的框架的一部分惭婿,是它的一個C/C++的前端不恭。Clang使用了LLVM中的一些功能,目前知道的就是針對中間格式代碼的優(yōu)化财饥,或許還有一部分生成代碼的功能换吧。從源代碼角度來講,clang是基于LLVM的一個工具钥星。而功能的角度來說沾瓦,LLVM可以認為是一個編譯器的后端,而clang是一個編譯器的前端谦炒,他們的關系更加的明了贯莺,一個編譯器前端想要程序最終變成可執(zhí)行文件,是缺少不了對編譯器后端的介紹的宁改。

5.LLVM編譯流程

?LLVM編譯一個源文件的過程:預處理 -> 詞法分析 -> Token -> 語法分析 -> AST -> 代碼生成 -> LLVM IR -> 優(yōu)化 -> 生成匯編代碼 -> Link -> 目標文件


2.png

?????完全需要我們手工缕探,或者依靠其他工具如lex, yacc來做的事情,是從源代碼到token的詞法分析和從token到AST的語法分析还蹲;詞法分析的輸出是將源代碼解析成一個個的token爹耗。這些token就是有類型和值的一些小單元豁鲤,比如是關鍵字,還是數(shù)字鲸沮,還是標識符琳骡,從AST轉(zhuǎn)LLVM開始,LLVM就開始提供一系列的工具幫助我們快速開發(fā)讼溺。從IR(中間指令代碼)到DAG(有向無環(huán)圖)再到機器指令楣号,針對常用的平臺,LLVM有完善的后端怒坯。也就是說炫狱,我們只要完成了到IR這一步,后面的工作我們就享有和Clang一樣的先進生產(chǎn)力了剔猿。

?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末视译,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子归敬,更是在濱河造成了極大的恐慌酷含,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,042評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件汪茧,死亡現(xiàn)場離奇詭異椅亚,居然都是意外死亡,警方通過查閱死者的電腦和手機舱污,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 89,996評論 2 384
  • 文/潘曉璐 我一進店門呀舔,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人扩灯,你說我怎么就攤上這事媚赖。” “怎么了珠插?”我有些...
    開封第一講書人閱讀 156,674評論 0 345
  • 文/不壞的土叔 我叫張陵惧磺,是天一觀的道長。 經(jīng)常有香客問我丧失,道長豺妓,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,340評論 1 283
  • 正文 為了忘掉前任布讹,我火速辦了婚禮琳拭,結果婚禮上,老公的妹妹穿的比我還像新娘描验。我一直安慰自己白嘁,他們只是感情好,可當我...
    茶點故事閱讀 65,404評論 5 384
  • 文/花漫 我一把揭開白布膘流。 她就那樣靜靜地躺著絮缅,像睡著了一般鲁沥。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上耕魄,一...
    開封第一講書人閱讀 49,749評論 1 289
  • 那天画恰,我揣著相機與錄音,去河邊找鬼吸奴。 笑死允扇,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的则奥。 我是一名探鬼主播考润,決...
    沈念sama閱讀 38,902評論 3 405
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼读处!你這毒婦竟也來了糊治?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,662評論 0 266
  • 序言:老撾萬榮一對情侶失蹤罚舱,失蹤者是張志新(化名)和其女友劉穎井辜,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體馆匿,經(jīng)...
    沈念sama閱讀 44,110評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡抑胎,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,451評論 2 325
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了渐北。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,577評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡铭拧,死狀恐怖赃蛛,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情搀菩,我是刑警寧澤呕臂,帶...
    沈念sama閱讀 34,258評論 4 328
  • 正文 年R本政府宣布,位于F島的核電站肪跋,受9級特大地震影響歧蒋,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜州既,卻給世界環(huán)境...
    茶點故事閱讀 39,848評論 3 312
  • 文/蒙蒙 一谜洽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧吴叶,春花似錦阐虚、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,726評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽奥秆。三九已至,卻和暖如春咸灿,著一層夾襖步出監(jiān)牢的瞬間构订,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,952評論 1 264
  • 我被黑心中介騙來泰國打工避矢, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留鲫咽,地道東北人。 一個月前我還...
    沈念sama閱讀 46,271評論 2 360
  • 正文 我出身青樓谷异,卻偏偏與公主長得像分尸,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子歹嘹,可洞房花燭夜當晚...
    茶點故事閱讀 43,452評論 2 348