clang常用語法介紹
前言
clang提供了一些命令,讓我們可以對編譯的過程進行一些配置和檢視,下面我們就對一些常用的指令進行一個基本的介紹.
常用指令
- 檢視編譯的步驟
clang -ccc-print-phases main.m
輸出結果
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
檢視編譯結果 :
clang -rewrite-objc main.m
檢視操作內部命令,可以使用
-###
命令
clang -### main.m -o main
- 想看清clang的全部過程,可以先通過
-E
檢視clang
在預編譯處理這步做了什麼。
clang -E main.m
clang
基本語法介紹
針對下面會用到的語法進行分析
-fmodules
允許modules
的語言特性-fsyntax-only
防止編譯器生成程式碼,只是語法級別的說明和修改-Xclang <arg>
向clang
編譯器傳遞引數-dump-tokens
執行前處理器,拆分內部程式碼段為各種token
-ast-dump
構建抽象語法樹AST,然後對其進行拆解和除錯-S
只執行預處理和編譯步驟-fobjc-arc
為OC物件生成retain
和release
的呼叫-emit-llvm
使用LLVM
描述彙編和物件檔案-o <file>
輸出到目標檔案-c
只執行預處理,編譯和彙編步驟
其餘的就不多贅述了, 檢視更多的clang
使用方法可以在終端輸入clang --hep
檢視,也可以點選如下連結: clang options
程式碼編譯的執行步驟拆解
下面我們對iOS程式碼編譯的步驟進行一個簡單的拆解,看看內部是如何實現的.
預處理完成後就會進行詞法分析,這裡會把程式碼切成一個個 Token,比如大小括號,等於號還有字串等。clang -fmodules -fsyntax-only -Xclang -dump-tokens main.m
然後是語法分析,驗證語法是否正確,然後將所有節點組成抽象語法樹 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 會去做些優化工作,在 Xcode 的編譯設定裡也可以設定優化級別-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 優化工作的一個節點,一個節點做些事,一起加起來就構成了 LLVM 完整的優化和轉化。
如果開啟了 bitcode 蘋果會做進一步的優化,有新的後端架構還是可以用這份優化過的 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
生成可執行檔案,這樣就能夠執行看到輸出結果
clang main.o -o main
執行./main
輸出starming rank 14
相關文章
- PostCSS 常用外掛與語法介紹CSS
- shell 語法介紹
- JavaScript 語法介紹JavaScript
- DNS常用術語介紹DNS
- clang-format的介紹和使用ORM
- javascript字串的語法介紹JavaScript字串
- 使用 nodejs 寫爬蟲(-): 常用模組介紹和前置JS語法NodeJS爬蟲
- logstash 配置檔案語法介紹
- 關於PHP的語法介紹,新手必看PHP
- Jenkins系列之pipeline語法介紹與案例Jenkins
- Go彙編語法和MatrixOne使用介紹Go
- 簡單介紹Go語言常用的打log方式Go
- etcd 常用操作介紹
- Flutter 常用 Widget 介紹Flutter
- JavaScript常用物件介紹JavaScript物件
- linux常用指令介紹Linux
- saltstack常用語法
- markdown 常用語法
- 常用MySQL語法MySql
- Perl常用語法
- markdown常用語法
- Ansible自動化部署工具-元件及語法介紹元件
- CMakeLists.txt 語法介紹與例項演練
- oracle常用函式介紹Oracle函式
- logstash常用外掛介紹
- rematch常用外掛介紹REM
- Flutter 常用功能介紹Flutter
- HTML常用標籤介紹HTML
- SpringCloud-常用元件介紹SpringGCCloud元件
- Go語言介紹Go
- Python學習手冊之Python介紹、基本語法(一)Python
- TDengine3.0 流式計算引擎語法規則介紹
- python 常用的語法Python
- vue 常用語法糖Vue
- Golang常用語法糖Golang
- sftp常用命令介紹FTP
- Linux常用命令介紹Linux
- 【Redis】常用命令介紹Redis
- RPM常用命令介紹