iOS進階之路——理解 Xcode 編譯系統

本文來自 iOSTips ,做者 Vadim Bulavin
前端

任何 iOS 源代碼在設備上運行以前都須要編譯器的一系列處理,這個過程一般由 Xcode Build System 完成。在這篇文章中,我將介紹 Xcode Build System 的每個部分。程序員

爲什麼要學編譯知識

說說 OCLint 、SwiftLint 實現原理是怎樣的?
如何編寫 Clang 插件?
Obfuscator-LLVM 在 iOS 中如何實現混淆加固?
iOS 中 Bitcode 究竟是如何優化 IPA 包的?
若是以上問題你均可以說個大概,請忽略本文,若是你對以上問題只知其一;不知其二,但又很感興趣,那麼學習並掌握編譯原理相關知識的過程當中,你便會本身找到答案,好了接下來我將大概的介紹 iOS 開發中須要瞭解的編譯流程。面試

語言處理系統

語言處理系統讓本身輸出一個可執行程序的一組任意源語言編寫的指令。它容許程序員使用高級語言而不是寫做機器代碼大大減小了編程的複雜性。編程

咱們平常使用的語言處理系統 iOS 或 macOS 開發 叫作 Xcode Build System。swift

Xcode Build System

Xcode 構建系統的主要目的是協調執行各類構建任務,最終將產生一個可執行程序。後端

Xcode 經過運行一系列編譯器工具集將 iOS 源碼按必定的順序編譯連接生成可執行文件,而無需你手動操做,關心編譯連接背後複雜的過程。xcode

大部分的語言處理系統,包括 Xcode Build Sytem,包括如下 5 個部分:架構

  • Preprocessor函數

  • Compiler工具

  • Assembler

  • Linker

  • Loader

這五部分組合起來是下面的流程圖:

讓咱們仔細看看每個步驟。

Preprocessing

預處理步驟的目的是將你的程序作一些處理而後可提供給編譯器。它會處理宏定義、發現依賴關係、解決預處理器指令。

Xcode 解決依賴關係經過底層 llbuild 構建系統。它是開源的,你能夠在 Github swift-llbuild 頁面瞭解更多信息。

Compiler

編譯器是一個程序,將一種語言的源程序用另外一種語言映射到一個語義上等價的目標程序。換句話說,它轉換Swift、objective - C和C / C++ 代碼到機器碼。

Xcode 使用兩個不一樣的編譯器:一個用於 Swift ,另外一個用於Objective - C, Objective - C + +和 C / C++文件。

clang 是蘋果官方的 C 語言編譯器。它是開源在:swift-clang。

swiftc 是 Xcode 用來編譯和運行 Swift 源代碼的 Swift 編譯器。

編譯器工做流程以下:

編譯器由兩個主要部分:前端和後端。

前端負責詞法分析,語法分析,生成中間代碼;它還建立並管理符號表,收集關於源程序的信息。

符號表存儲名稱的變量,函數,類,你的名字,每一個符號映射到特定的數據。

編譯原理之美

Swift 編譯器,中間語言表示名爲 Swift Intermediate Language(SIL)。它是用於進一步分析和優化的代碼。不可能直接從 Swift 中間語言生成機器代碼,所以 SIL 經歷了一系列轉變到 LLVM 中間表示。

後端以中間代碼做爲輸入,進行行架構無關的代碼優化,接着針對不一樣架構生成不一樣的彙編代碼。

Assembler

Assembler 翻譯開發者可讀的彙編代碼爲可重定位的機器碼,最終生成包含數據和代碼的 Mach-O 文件。

機器代碼是一種數字語言,表示一組指令,能夠直接由 CPU 執行。它被是可重定位的,由於不管目標文件的地址空間在哪,它將執行的指令相對地址。

Mach-O 文件是一種特殊的 iOS 和 MacOS 文件格式,操做系統用它來描述對象文件、可執行文件和庫。它是一串字節組合造成的有意義的程序塊,將運行在 ARM 處理器上或英特爾處理器。

Linker

連接器將各類對象文件和庫連接合併爲一個能夠在 iOS 或 macOS 系統上運行的 Mach-O 可執行文件。連接器主要有兩種文件做爲輸入,包括這些對象文件的彙編程序和庫的幾種類型(.dylib, .tbd 和 .a)。

連接器的做用,就是完成變量、函數符號和其地址綁定這樣的任務。例如,若是在代碼中使用 printf , 連接器連接這個符號和 libc 庫 printf 函數實現的地方。一般在編譯階段經過建立符號表來解決不一樣對象文件和庫的引用。

Loader

最後,加載程序是操做系統的一部分,將一個程序加載到內存中,並運行執行它。加載程序負責分配運行程序內存空間和初始化寄存器所需的初始狀態。

總結

做爲 iOS 和 macOS 開發者咱們主要使用 Xcode Build System 編譯構建咱們的應用程序。它的主要組件是:預處理、編譯器、彙編器、鏈接器和加載程序。Xcode 使用不一樣的編譯器(swiftc 和 clang)編譯 Swift 和 Objective-C。

對於初學者和經驗豐富的開發人員來講學習掌握 編譯原理基礎知識都很有益處,這裏有一張宮文學老師《編譯原理之美》的關於編譯知識結構體系的思惟導圖,能夠拿來對每一個知識點系統學習。

做爲一個開發者,有一個學習的氛圍跟一個交流圈子特別重要,這是一個個人iOS交流羣:519832104 無論你是小白仍是大牛歡迎入駐,分享經驗,討論技術,你們一塊兒交流學習成長!

另附上一份各好友收集的大廠面試題,須要iOS開發學習資料、面試真題,能夠添加iOS開發學習交流羣,進羣可自行下載!

相關文章
相關標籤/搜索