iOS底層探索(一) - 從零開始認識Clang與LLVM

iOS底層探索(二) - 寫給小白看的Clang編譯過程原理html

寫在前面:

本系列爲 『iOS底層探索系列』第一篇,本文源自本人的學習記錄整理與理解,其中參考閱讀了部分優秀的博客和書籍,儘可能以通俗簡單的語句轉述。引用到的地方若有遺漏或未能一一列舉原文出處還望見諒與指出,另,文章內容若有不妥之處還望指教。十分感謝。前端

隨機配圖

入門起步


從編譯器提及

  • 爲何須要編譯?git

    • 你們都知道,咱們的計算機CPU只能讀懂機器碼(machine code,也就是由一堆0和1組成的編碼);
    • 但咱們如今編寫的代碼並非機器碼,而是高級編程語言(Objective-C、Swift、Java、...),最終也能夠被計算機所執行,
    • 這就須要編譯了,在編譯的過程當中,編譯器的做用即是把咱們的高級編程語言經過一系列的操做轉化成可被計算機執行的機器語言。 ps:[更詳細的解析能夠自行百度]
  • 編譯器是如何設計的?github

    • 經典的三段式設計(three phase design): 前端(Frontend)--優化器(Optimizer)--後端(Backend) (見下圖) 編程

      原圖來自http://www.aosabook.org

      • 其中前端負責分析源代碼,能夠檢查語法級錯誤,並構建針對該語言的抽象語法樹(AST)
      • 抽象語法樹能夠進一步轉換爲優化,最終轉爲新的表示方式, 而後再交給讓優化器和後端處理
      • 最終由後端生成可執行的機器碼
    • 爲何要使用三段式設計?優點在哪?後端

      • 首先解決了一個很大的問題:假若有N種語言(C、OC、C++、Swift...)的前端,同時也有M個架構(模擬器、arm6四、x86...)的Target,是否就須要 N × M 個編譯器?
      • 三段式架構的價值就體現出來了,經過共享優化器的中轉,很好的解決了這個問題。
      • 假如你須要增長一種語言,只須要增長一種前端;假如你須要增長一種處理器架構,也只須要增長一種後端,而其餘的地方都不須要改動。這複用思想很牛逼吧。(以下圖)
        原圖來自http://www.aosabook.org
  • 編譯源文件有哪些主要步驟?bash

    • 先列舉一些整個編譯過程的主要步驟,後面再詳細介紹每一個步驟都作了哪些事情。
    • 主要編譯步驟以下:
      1. 源代碼(source code) ->  
      2. 預處理器(preprocessor) ->   
      3. 編譯器(compiler) ->  
      4. 彙編程序(assembler) ->  
      5. 目標代碼(object code) ->   
      6. 連接器(Linker) ->  
      7. 可執行文件(executables)
      複製代碼

Xcode編譯器發展簡史

Xcode3 之前: GCC; Xcode3: 增長LLVM,GCC(前端) + LLVM(後端); Xcode4.2: 出現Clang - LLVM 3.0成爲默認編譯器; Xcode4.6: LLVM 升級到4.2版本; Xcode5: GCC被廢棄,新的編譯器是LLVM 5.0,從GCC過渡到Clang-LLVM的時代正式完成架構

  • 爲何蘋果的Xcode會使用Clang+LLVM取代GCC?
    • 這裏面有些歷史緣由。畢竟GCC是第三方開源的,不屬於蘋果維護也不能徹底掌控其開發進程,Apple爲Objective-C增長許多新特性,但GCC開發者對這些支持卻不友好;Apple須要作模塊化,GCC開發者卻拖着遲遲不實現。這能忍?
    • 隨着Apple對其IDE(也就是Xcode)性能的要求愈來愈高,最終仍是從零開發了一個Clang前端加LLVM後端的編譯器,這個編譯器的做者是大名鼎鼎的Swift之父Chris Lattner。
  • Clang比GCC優秀在哪些方面?
    • 傳說新的Clang編譯器編譯Objective-C代碼速度比GCC快3倍
    • 而且提供了友好的代碼提示

Clang 的簡介


「Clang: a C language family frontend for LLVM」 LLVM的C語言家族(C、C++、OC)前端。---- Clangfrontend

  • 上面是官網對於Clang的一句話介紹,其實 Clang 就是上文所提到的編譯器前端
  • 用途:輸出代碼對應的抽象語法樹(Abstract Syntax Tree, AST),並將代碼編譯成LLVM Bitcode。接着在後端(back-end)使用LLVM編譯成平臺相關的機器語言。

LLVM 的簡介


  • LLVM :顧名思義是(Low Level Virtual Machine)底層虛擬機?注意了,已經不是了!
  • 官網都說了:LLVM就是這個項目的全稱,包含LLVM中介碼(LLVM IR)、LLVM除錯工具、LLVM C++標準庫等一套工具,和傳統底層虛擬機並沒什麼關係。
PS:下一篇將介紹Clang與LLVM的詳細編譯過程,歡迎關注。

參考文檔

http://clang.llvm.org/ http://www.aosabook.org/en/llvm.html http://history.programmer.com.cn/9436/ https://zh.wikipedia.org/wiki/Clang https://zh.wikipedia.org/wiki/LLVM編程語言

相關文章
相關標籤/搜索