1. 程式人生 > >LLVM編譯器

LLVM編譯器

操作 多模塊 stream 歷史 ace 例如 流程 自動啟動 ive

LLVM

1. 說說 LLVM(Low Level Virtual Machine)到底是什麽吧

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

  • 再談 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中,目標文件的二進制格式、程序庫等等。

LLVM編譯器