2. llvm和clang

一条获、歷史

? ? LLVM 是一個模塊化和可重用的編譯器和工具鏈技術(shù)的集合疆栏,Clang 是 LLVM 的子項目贬媒,是 C洋魂,C++ 和 Objective-C 編譯器绷旗,因為多模塊的復(fù)用,所以提供了驚人的快速編譯副砍,據(jù)說比 GCC 快3倍衔肢。


LLVM的工作過程

解釋一下上圖:

1)Frontend(編譯器前端):編譯器前端的任務(wù)是解析源代碼。它會進(jìn)行:詞法分析豁翎,語法分析角骤,語義分析, 檢查源代碼是否存在錯誤,然后構(gòu)建抽象語法樹(Abstract Syntax Tree,AST) ,LLVM的前端還會生成中間代碼(intermediate representation , IR)心剥。

2)Optimizer(優(yōu)化器):優(yōu)化器負(fù)責(zé)進(jìn)行各種優(yōu)化邦尊。改善代碼的運(yùn)行時間,例如消除冗余計算等优烧。

3)Backend(后端):將代碼映射到目標(biāo)指令集胳赌。生成機(jī)器語言,并且進(jìn)行機(jī)器相關(guān)的代碼優(yōu)化

二匙隔、編譯過程

我們通過終端中輸入clang -ccc-print-phases main.m,得到如下打友妗:

? ? ? ? ? ? ? ? +- 0: input, "main.m", objective-c? //輸入

? ? ? ? ? ? +- 1: preprocessor, {0}, objective-c-cpp-output //預(yù)處理

? ? ? ? +- 2: compiler, {1}, ir //編譯

? ? ? +- 3: backend, {2}, assembler //后端

? +- 4: assembler, {3}, object //匯編

+- 5: linker, {4}, image //鏈接

6: bind-arch, "x86_64", {5}, image //綁定

得到了7步操作的簡要說明纷责,分別是:

0:導(dǎo)入文件:是為了找到源文件。

1:預(yù)處理階段:這個過程處理包括宏的替換撼短,頭文件的導(dǎo)入再膳,會生成 main.i 文件,其中 objective-c-cpp-output 中的 cpp 不是指 C++ 語言曲横,而是 c preprocessor 的縮寫喂柒。

2:編譯階段:進(jìn)行詞法分析不瓶、語法分析、檢測語法是否正確灾杰,最終生成IR蚊丐。

3:后端:這里L(fēng)LVM會通過一個一個的Pass去優(yōu)化,每個Pass做一些事情艳吠,最終生成匯編代碼麦备,生成一個 main.s 文件。

4:匯編:生成目標(biāo)文件昭娩,即為 main.o凛篙。

5:鏈接:鏈接需要的動態(tài)庫和靜態(tài)庫,生成可執(zhí)行文件栏渺,最終生成 image呛梆。

6:綁定:通過不同的架構(gòu),生成對應(yīng)的可執(zhí)行文件磕诊,默認(rèn)生成x86_64平臺填物。

具體每步驟的詳解請看參考教程4.?LLVM系列(二)Clang編譯過程詳解


三、常用命令

1. 無選項編譯鏈接

用法:#clang hello.c

作用:將hello.c預(yù)處理秀仲、匯編融痛、編譯并鏈接形成可執(zhí)行文件。這里未指定輸出文件神僵,默認(rèn)輸出為a.out雁刷。編譯成功后可以看到生成了一個a.out的文件。在命令行輸入./a.out 執(zhí)行程序保礼。./表示在當(dāng)前目錄沛励,a.out為可執(zhí)行程序文件名。

2. 選項 -o

用法:#clang hello.c -o hello

作用:將hello.c預(yù)處理炮障、匯編目派、編譯并鏈接形成可執(zhí)行文件hello.c。-o選項用來指定輸出文件的文件名胁赢。輸入./hello執(zhí)行程序企蹭。

3. 選項 -E

用法:#clang -E hello.c -o hello.i

作用:將hello.c預(yù)處理輸出hello.i文件。

4. 選項 -S

用法:#clang -S hello.i

作用:將預(yù)處理輸出文件hello.i匯編成hello.s文件智末。

5. 選項 -c

用法:#clang -c hello.s

作用:將匯編輸出文件hello.s編譯輸出hello.o文件谅摄。

6. 無選項鏈接

用法:#clang hello.o -o hello

作用:將編譯輸出文件hello.o鏈接成最終可執(zhí)行文件hello。輸入./hello執(zhí)行程序系馆。

如果想直接輸入hello就運(yùn)行送漠,需要把hello復(fù)制到目錄/usr/bin下

7. 選項-O

用法:#clang -O1 hello.c -o hello

作用:使用編譯優(yōu)化級別1編譯程序。級別為1~3由蘑,級別越大優(yōu)化效果越好闽寡,但編譯時間越長代兵。輸入./hello執(zhí)行程序。

8.編譯使用C++ std庫的程序

用法:#clang hello.cpp -o hello -l std c++ 作用:將hello.cpp編譯鏈接成test可執(zhí)行文件爷狈。-l? std? c++指定鏈接std c++庫植影。

9. 分別編譯各個源文件,之后對編譯后輸出的目標(biāo)文件鏈接淆院。 用法:

#clang -c hi.c? ? ? ? // 將hi.c編譯成hi.o

#clang -c hello.c? ? // 將hello.c編譯成hello.o


參考教程:

1.【基礎(chǔ)知識】LLVM與Clang簡要介紹

2.?clang&llvm簡介

3.?LLVM系列(一)致敬

4.?LLVM系列(二)Clang編譯過程詳解

5.?LLVM系列(三)Clang的常用命令

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末何乎,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子土辩,更是在濱河造成了極大的恐慌支救,老刑警劉巖,帶你破解...
    沈念sama閱讀 211,639評論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件拷淘,死亡現(xiàn)場離奇詭異各墨,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)启涯,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,277評論 3 385
  • 文/潘曉璐 我一進(jìn)店門贬堵,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人结洼,你說我怎么就攤上這事黎做。” “怎么了松忍?”我有些...
    開封第一講書人閱讀 157,221評論 0 348
  • 文/不壞的土叔 我叫張陵蒸殿,是天一觀的道長。 經(jīng)常有香客問我鸣峭,道長宏所,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,474評論 1 283
  • 正文 為了忘掉前任摊溶,我火速辦了婚禮爬骤,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘莫换。我一直安慰自己霞玄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,570評論 6 386
  • 文/花漫 我一把揭開白布拉岁。 她就那樣靜靜地躺著溃列,像睡著了一般。 火紅的嫁衣襯著肌膚如雪膛薛。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,816評論 1 290
  • 那天补鼻,我揣著相機(jī)與錄音哄啄,去河邊找鬼雅任。 笑死,一個胖子當(dāng)著我的面吹牛咨跌,可吹牛的內(nèi)容都是我干的沪么。 我是一名探鬼主播,決...
    沈念sama閱讀 38,957評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼锌半,長吁一口氣:“原來是場噩夢啊……” “哼禽车!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起刊殉,我...
    開封第一講書人閱讀 37,718評論 0 266
  • 序言:老撾萬榮一對情侶失蹤殉摔,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后记焊,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體逸月,經(jīng)...
    沈念sama閱讀 44,176評論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,511評論 2 327
  • 正文 我和宋清朗相戀三年遍膜,在試婚紗的時候發(fā)現(xiàn)自己被綠了碗硬。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,646評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瓢颅,死狀恐怖恩尾,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情挽懦,我是刑警寧澤翰意,帶...
    沈念sama閱讀 34,322評論 4 330
  • 正文 年R本政府宣布,位于F島的核電站巾兆,受9級特大地震影響猎物,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜角塑,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,934評論 3 313
  • 文/蒙蒙 一蔫磨、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧圃伶,春花似錦堤如、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,755評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至侥猩,卻和暖如春榔至,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背欺劳。 一陣腳步聲響...
    開封第一講書人閱讀 31,987評論 1 266
  • 我被黑心中介騙來泰國打工唧取, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留铅鲤,地道東北人。 一個月前我還...
    沈念sama閱讀 46,358評論 2 360
  • 正文 我出身青樓枫弟,卻偏偏與公主長得像邢享,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子淡诗,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,514評論 2 348

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