iOS ~?編譯 Clang 、swiftc 、LLVM

推薦閱讀:

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

Presentation Slides (PDF) 下載


圖解編譯

“front end”?—?“back end”.jpeg

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++

編譯.png
編譯 鏈接.png

What is swiftc?

屏幕快照 2019-01-23 下午12.18.53.png
屏幕快照 2019-01-23 下午12.23.12.png
image.png

在xcode按下cmd+B之后的工作流程:

image.png
  • 預(yù)處理(Pre-process):他的主要工作就是將宏替換,刪除注釋展開頭文件,生成.i文件。
  • 詞法分析 (Lexical Analysis):將代碼切成一個個 token,比如大小括號,等于號還有字符串等。是計算機(jī)科學(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 蘋果會做進(jìn)一步的優(yōu)化,有新的后端架構(gòu)還是可以用這份優(yōu)化過的 bitcode 去生成。
  • 生成目標(biāo)文件(Assemble):生成Target相關(guān)Object(Mach-o)
  • 鏈接(Link):生成 Executable 可執(zhí)行文件
    經(jīng)過這一步步,我們用各種高級語言編寫的代碼就轉(zhuǎn)換成了機(jī)器可以看懂可以執(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ù)的集合。包含多個子項目。其中包括我們熟悉的ClangLLDB

  • 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代碼(用于大型超級)電腦。

最后編輯于
?著作權(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)容

  • 引言 維基百科:編譯語言(英語:Compiled language)是一種以編譯器來實現(xiàn)的編程語言。它不像解釋型語...
    Flame_Dream閱讀 8,701評論 5 52
  • http://www.starming.com/index.php?v=index&view=107 http:/...
    111浪子111閱讀 3,275評論 0 11
  • iOS app的編譯過程 在 iOS 開發(fā)的過程中,Xcode 為我們提供了非常完善的編譯能力,正常情況下,我們只...
    帽子和五朵玫瑰閱讀 2,961評論 0 17
  • 在 iOS 開發(fā)的過程中,Xcode 為我們提供了非常完善的編譯能力,正常情況下,我們只需要 Command + ...
    CoderLF閱讀 13,265評論 0 17
  • LLVM 簡介 LLVM 全稱是 Low Level Virtual Machine,它是源自 the Unive...
    juniway閱讀 38,803評論 0 21

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