//聯(lián)系人:石虎?QQ:1224614774?昵稱:嗡嘛呢叭咪哄
一、概念
?1.為了更好的理解什么是 Bitcode,我們簡短的看一下編譯器編譯的過程:
? ? * Lexer :讀入源文件,并將其轉(zhuǎn)化成字符流。
? ? * Parser :將字符流轉(zhuǎn)換成 AST(抽象語法樹)。
? ? * Semantic Analysis :對輸入的 AST 進行語法檢查。
? ? * Code Generation :代碼生成,將 AST 轉(zhuǎn)換成低層次的IR指令。
? ? * Optimization :分析 IR 指令,將其中潛在會拖慢運行速度的指令干掉。
? ? * AsmPrinter :通過 IR(中間碼)生成特定 CPU 架構(gòu)的匯編代碼。
? ? * Assemble :將匯編代碼轉(zhuǎn)化成二進制。
? ? * Linker :通常程序會引用其他的二進制文件(.a 或者 framework),但是這些鏈接在程序中沒有正確的地址,只是個占位符。Linker 的工作就是給這些占位符正確的地址。
? ? * 更多信息可以參考:The Compiler
二、真實的編譯器構(gòu)架
? 1.真實的編譯器構(gòu)架,會將上述過程分成前端和后端兩部分來處理:
? ? * 在前后端之間傳遞的就是 IR(中間碼),而 Bitcode 就是一種特殊形式的中間碼。原本前后端的工作都是在本地 LLVM 中完成,雖然 Apple 沒有給出具體的 Bitcode 實現(xiàn),但是通過他們的文檔可以猜測,是將一部分后端的工作移到了服務(wù)器進行。從 Xcode 上傳 IR 到服務(wù)器,服務(wù)器來真對不同的機型進行后續(xù)操作。從而達到真對不同機型生成對應(yīng)指令集的二進制,而減小包體積的目的。