LLVM
做iOS的沒有不知道的不嗶嗶了
代碼寫完首先會經過編譯器來進行編譯
首先
- Frontend 就是編譯器先會通過 詞法分析 語法分析 語義分析 生成中間代碼(語言不同而選擇不同的編譯器)Clang 是基於LLVM 支持C、C++ 、OC的編譯器前端部分
- Optimizer 進行優化 比如查找更快 體積更小 (不論什麼語言什麼平臺 都一樣 LLVM IR 有點像政府 不論你什麼民族都歸它管)
- Backend 根據平臺生成對應的機器碼(會根據不同平臺而不同)
那直入主題 OC的編譯過程
clang -ccc-print-phases main.m
- 找到文件
- 宏定義 import都給換掉
- 編譯成中間代碼
- 交給LLVM 後端生成機器碼
- 目標代碼
- 鏈接動態庫
- 編譯成適合架構的代碼
看看預編譯的過程
clang -E main.m 編譯結果 宏已經被替換了
詞法分析
clange -fmodules -E -Xclang -dump-tokens main.m
代碼全部拆解分成一個一個的(哪一行的哪一個字符都有標記)
語法分析
clang -fmodules -fsyntax-only -Xclang -ast-dump main.m
生成語法樹
中間代碼長什麼樣
生成 .ll文件 clang -S -emit-llvm main.m
全局 @開頭 比如函數名
局部 %開頭 比如變量
alloc 棧空間分配內存
i32 32bit 4個字節的意思
align 內存對齊
store 寫入數據
load 讀取數據
生成 .bc文件 clang -c -emit-llvm main.m 二進制文件 看不懂
腦瓜疼歇了改日再繼續