LLVM編譯器

LLVMjava

1. 說說 LLVM(Low Level Virtual Machine)究竟是什麼吧c++

  • 先說編譯器:編譯器是把程序員的代碼翻譯成機器能夠理解的語言的工具;程序員

  • 再談 LLVM:一個模塊化和可重用的編譯器和工具鏈技術的集合,Clang 是 LLVM 的子項目,是 C,C++ 和 Objective-C 編譯器,由於多模塊的複用,因此提供了驚人的快速編譯,比 GCC 快3倍。架構

2. LLVM 是一開始就做爲一個完整的編譯工具來使用的嗎?仍是有什麼其餘故事模塊化

LLVM 當時是爲了解決一個小問題而開發的:當使用OpenGL 函數庫的時候(Mac OS 10.4 和 10.5環境下),好比你要調用這個函數,glVertex3f(),編譯器必須將其轉化爲特定的GPU能夠理解的數據。可是這帶來一個問題:市面上有海量的GPU,每一個GPU的性能和參數也不盡相同,所要求的數據格式也不一樣。這時 LLVM 能夠產生很小的一部分代碼去解決這個問題,這是 LLVM 誕生的初衷。函數

3. LLVM 的 bytecode 和 Apple 如今的 bitcode 有什麼不一樣?工具

這是歷史遺留問題。一開始 LLVM 是開源的,全部代碼在轉成二進制時就叫作 bytecode -- 由於 java 當年就是這麼叫的。當時這一部分有不少問題:好比不能擴展,沒法兼容,很是脆弱佈局

而後就到了 LLVM 2.0,當時我從新設計了架構,採用的就是 Bitcode 機制。LLVM 2.0 將全部代碼以比特流(bit stream)而不是字節流(byte stream)的形式來編碼。這就是 bitcode 這一術語的由來。性能

主要的工做流程就是現將代碼轉成比特流,而後相應處理。處理完後再將編碼傳到其餘地方去。優化

4. Bitcode 這個機制比直接傳輸二進制有什麼好處

好處那是多了去了。首先 編譯器工做起來會愈來愈好。由於經過Bitcode機制,它能夠經過編譯不一樣代碼來存儲各類優化方法,這樣下次碰到相似代碼,它就會自動啓動相關優化機制,使得效率提高。還有個好處是 LLVM 可讓芯片的兼容性變得很好。由於 Apple 每一年都在芯片上推陳出新,它們轉化爲二進制的規則都不盡相同,LLVM 只要每次從新編碼並傳輸成比特流就行了。

固然 Bitcode 也不是萬能的。好比它不能解決 32位的 APP 在64位機器上的兼容問題。這個問題其實應該依靠代碼邏輯。

補充

補充:LLVM的三層結構

  • 第一層:Clang 編譯器,負責編譯各類語言

  • 第二層:代碼優化器,經過模塊化操做優化代碼,是 Bitcode 邏輯的主要部分

  • 第三層:代碼翻譯器,針對不一樣平臺和 GPU 將代碼翻譯成機器語言

補充:LLDB,llbc++,compile rt

  • LLDB: 一個有着 REPL 的特性和 C++ ,Python 插件的開源調試器。LLDB 綁定在 Xcode 內部,存在於主窗口底部的控制檯中;

  • libc++,libc++ ABI: 高性能 C++ 標準庫實現,支持 C++ 11

  • compiler-rt:爲 LLVM 和 Clang 設計的編譯器擴展函數庫。針對 __fixunsdfdi 和其餘目標機器上沒有一個核心 IR (intermediate representation) 對應的短原生指令序列時,提供高度調優過的底層代碼生成支持。

ABI 是什麼?

  • Application Binary Interface,中文名:應用二進制接口。是 APP 和 操做系統、其餘應用之間的二進制接口。它包括如下細節:

  • 數據類型的大小、佈局和對齊;

  • 調用約定(控制着函數的參數如何傳送以及如何接受返回值),例如,是全部的參數都經過棧傳遞,仍是部分參數經過寄存器傳遞;哪一個寄存器用於哪一個函數參數;經過棧傳遞的第一個函數參數是最早push到棧上仍是最後;

  • 系統調用的編碼和一個應用如何向操做系統進行系統調用;

  • 以及在一個完整的操做系統ABI中,目標文件的二進制格式、程序庫等等。

相關文章
相關標籤/搜索