clang常用語法介紹

前言

clang提供了一些命令,讓我們可以對編譯的過程進行一些配置和查看,下面我們就對一些常用的指令進行一個基本的介紹.

常用指令

  • 查看編譯的步驟
    clang -ccc-print-phases main.m
    輸出結(jié)果
0: input, “main.m”, objective-c
1: preprocessor, {0}, objective-c-cpp-output
2: compiler, {1}, ir
3: backend, {2}, assembler
4: assembler, {3}, object
5: linker, {4}, image
6: bind-arch, “x86_64”, {5}, image
  • 查看編譯結(jié)果 : clang -rewrite-objc main.m

  • 查看操作內(nèi)部命令,可以使用 -### 命令

clang -### main.m -o main

  • 想看清clang的全部過程,可以先通過-E查看clang在預編譯處理這步做了什么。

clang -E main.m

clang基本語法介紹

針對下面會用到的語法進行分析

  • -fmodules
    允許modules的語言特性

  • -fsyntax-only
    防止編譯器生成代碼,只是語法級別的說明和修改

  • -Xclang <arg>
    clang編譯器傳遞參數(shù)

  • -dump-tokens
    運行預處理器,拆分內(nèi)部代碼段為各種token

  • -ast-dump
    構(gòu)建抽象語法樹AST,然后對其進行拆解和調(diào)試

  • -S
    只運行預處理和編譯步驟

  • -fobjc-arc
    為OC對象生成retainrelease的調(diào)用

  • -emit-llvm
    使用LLVM描述匯編和對象文件

  • -o <file>
    輸出到目標文件

  • -c
    只運行預處理,編譯和匯編步驟

其余的就不多贅述了, 查看更多的clang使用方法可以在終端輸入clang --hep查看,也可以點擊如下鏈接: clang options

代碼編譯的執(zhí)行步驟拆解

下面我們對iOS代碼編譯的步驟進行一個簡單的拆解,看看內(nèi)部是如何實現(xiàn)的.

預處理完成后就會進行詞法分析,這里會把代碼切成一個個 Token,比如大小括號,等于號還有字符串等。
clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m

然后是語法分析,驗證語法是否正確,然后將所有節(jié)點組成抽象語法樹 AST 。
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m

完成這些步驟后就可以開始IR(intermediate representation)中間代碼的生成了,CodeGen 會負責將語法樹自頂向下遍歷逐步翻譯成 LLVM IR,IR 是編譯過程的前端的輸出后端的輸入。
clang -S -fobjc-arc -emit-llvm main.m -o main.ll

這里 LLVM 會去做些優(yōu)化工作,在 Xcode 的編譯設(shè)置里也可以設(shè)置優(yōu)化級別-01,-03,-0s,還可以寫些自己的 Pass,官方有比較完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation
clang -O3 -S -fobjc-arc -emit-llvm main.m -o main.ll

Pass 是 LLVM 優(yōu)化工作的一個節(jié)點,一個節(jié)點做些事,一起加起來就構(gòu)成了 LLVM 完整的優(yōu)化和轉(zhuǎn)化。
如果開啟了 bitcode 蘋果會做進一步的優(yōu)化,有新的后端架構(gòu)還是可以用這份優(yōu)化過的 bitcode 去生成。
clang -emit-llvm -c main.m -o main.bc

生成匯編
clang -S -fobjc-arc main.m -o main.s

生成目標文件
clang -fmodules -c main.m -o main.o

生成可執(zhí)行文件,這樣就能夠執(zhí)行看到輸出結(jié)果

clang main.o -o main
執(zhí)行./main
輸出starming rank 14
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 前言 2000年,伊利諾伊大學厄巴納-香檳分校(University of Illinois at Urbana-...
    星光社的戴銘閱讀 16,263評論 8 180
  • 編譯器做些什么? 本文主要探討一下編譯器主要做些什么,以及如何有效的利用編譯器。 簡單的說,編譯器有兩個職責:把 ...
    評評分分閱讀 1,233評論 1 5
  • LLVM 簡介 LLVM 全稱是 Low Level Virtual Machine,它是源自 the Unive...
    juniway閱讀 38,803評論 0 21
  • LLVM是Low Level Virtual Machine的簡稱。這個庫提供了與編譯器相關(guān)的支持,能夠進行程序語...
    小貓仔閱讀 17,031評論 0 9
  • 我沒有很想你 只是常??村e背影 即使離得很近 江南的夜太短雨太急 除了做夢就是天明 沒時間回憶 沒時間后悔莫及 昨...
    安靜的復蘇918閱讀 161評論 2 5

友情鏈接更多精彩內(nèi)容