推薦閱讀:
https://llvm.org
https://medium.com/@jyaunches/introduction-to-the-llvm-for-a-ios-engineer-8c00ed0f9ff0
https://swift.org/compiler-stdlib/#compiler-architecture
https://medium.com/@JMangia/swift-c-llvm-compiler-optimization-842012568bb7
https://zhuanlan.zhihu.com/p/49274308
https://juejin.im/post/5a352bb0f265da433562d5e3
https://blog.csdn.net/Hello_Hwc/article/details/53557308
https://developer.apple.com/videos/play/wwdc2018/415/
https://developer.apple.com/videos/play/wwdc2018/408
圖解編譯
Swift Abstract Syntax Tree (AST)
- swiftc –dump-ast main.swift
Swift Intermediate Language (SIL)
- swiftc –emit-sil main.swift
LLVM Intermediate Representation (LLVM IR)
- swiftc –emit-ir main.swift
Assembly Language
- swiftc –emit-assembly main.swift
What is Clang?
Apple’s official for the C language family
C
C++
Objective-C
Objective-C++
What is swiftc?
在xcode按下cmd+B之后的工作流程:
-
預(yù)處理
(Pre-process):他的主要工作就是將宏替換灿意,刪除注釋展開頭文件,生成.i文件崇呵。 -
詞法分析
(Lexical Analysis):將代碼切成一個個 token缤剧,比如大小括號,等于號還有字符串等域慷。是計算機科學(xué)中將字符序列轉(zhuǎn)換為標(biāo)記序列的過程荒辕。 -
語法分析
(Semantic Analysis):驗證語法是否正確汗销,然后將所有節(jié)點組成抽象語法樹 AST 。由 Clang 中 Parser 和 Sema 配合完成 -
靜態(tài)分析
(Static Analysis):使用它來表示用于分析源代碼以便自動發(fā)現(xiàn)錯誤抵窒。 -
中間代碼生成
(Code Generation):開始IR中間代碼的生成了弛针,CodeGen 會負(fù)責(zé)將語法樹自頂向下遍歷逐步翻譯成 LLVM IR,IR 是編譯過程的前端的輸出后端的輸入李皇。 -
優(yōu)化
(Optimize):LLVM 會去做些優(yōu)化工作削茁,在 Xcode 的編譯設(shè)置里也可以設(shè)置優(yōu)化級別-01,-03掉房,-0s付材,還可以寫些自己的 Pass,官方有比較完整的 Pass 教程: Writing an LLVM Pass — LLVM 5 documentation 圃阳。如果開啟了 bitcode 蘋果會做進一步的優(yōu)化,有新的后端架構(gòu)還是可以用這份優(yōu)化過的 bitcode 去生成璧帝。 -
生成目標(biāo)文件
(Assemble):生成Target相關(guān)Object(Mach-o) -
鏈接
(Link):生成 Executable 可執(zhí)行文件
經(jīng)過這一步步捍岳,我們用各種高級語言編寫的代碼就轉(zhuǎn)換成了機器可以看懂可以執(zhí)行的目標(biāo)代碼了。
What is LLVM?
The LLVM Project is a collection of modular and reusable compiler and toolchain technologies. Despite its name, LLVM has little to do with traditional virtual machines. The name "LLVM" itself is not an acronym; it is the full name of the project.
??注意
- 名稱“LLVM”本身不是首字母縮略詞; 它是項目的全名睬隶。
The LLVM Project 是模塊化锣夹、可重用的編譯器和工具鏈技術(shù)的集合。包含多個子項目苏潜。其中包括我們熟悉的Clang和 LLDB
- Clang is an "LLVM native" C/C++/Objective-C compiler,
- The LLDB project builds on libraries provided by LLVM and Clang to provide a great native debugger.
除了LLVM的官方子項目之外银萍,還有許多其他項目使用LLVM的組件來執(zhí)行各種任務(wù)。通過這些外部項目恤左,您可以使用LLVM來編譯Ruby贴唇,Python,Haskell飞袋,Java戳气,D,PHP巧鸭,Pure瓶您,Lua和許多其他語言。LLVM的主要優(yōu)勢在于其多功能性纲仍,靈活性和可重用性呀袱,這就是它被用于各種不同任務(wù)的原因:從輕量級JIT編譯嵌入式語言(如Lua)到編譯Fortran代碼(用于大型超級)電腦。