LLVM 專案是一個模組化且可重複使用的編譯器和工具鏈技術的集合。 儘管名稱如此,但 LLVM 與傳統的虛擬機器幾乎沒有關係。 「LLVM」這個名稱本身並不是縮寫;它是專案的全名。
LLVM 最初是伊利諾大學的一個研究專案,目標是提供一種現代的、基於 SSA 的編譯策略,能夠支援任意程式語言的靜態和動態編譯。 從那時起,LLVM 已發展成為一個包含許多子專案的傘形專案,其中許多子專案正被各種商業和開放原始碼專案用於生產環境,並且被廣泛用於學術研究。LLVM 專案中的程式碼採用「Apache 2.0 授權(含 LLVM 例外條款)」授權。
LLVM 的主要子專案是
LLVM 核心函式庫提供了一個現代的、獨立於來源和目標的優化器,以及對許多主流 CPU(以及一些不太常見的 CPU!)的程式碼生成支援。這些函式庫是圍繞一個稱為 LLVM 中間表示(「LLVM IR」)的規範良好的程式碼表示法構建的。LLVM 核心函式庫有完善的說明文件,而且發明您自己的語言(或移植現有的編譯器)以使用LLVM 作為優化器和程式碼生成器特別容易。
Clang 是一個「LLVM 原生」的 C/C++/Objective-C 編譯器,旨在提供驚人的快速編譯速度、極其有用的 錯誤和警告訊息,並為建構出色的原始碼層級工具提供一個平台。Clang 靜態分析器 和 clang-tidy 是自動找出程式碼中錯誤的工具,並且是使用 Clang 前端作為函式庫來解析 C/C++ 程式碼所能建構的工具類型的絕佳範例。
LLDB 專案建構在 LLVM 和 Clang 提供的函式庫之上,以提供一個出色的原生偵錯器。它使用 Clang AST 和表達式解析器、LLVM JIT、LLVM 反組譯器等,因此它提供了一種「開箱即用」的體驗。它在載入符號時也比 GDB 快得多,而且記憶體效率也高得多。
libc++ 和 libc++ ABI 專案提供了一個符合標準且高效能的 C++ 標準函式庫實作,包括對 C++11 和 C++14 的完整支援。
compiler-rt 專案提供高度調校的低階程式碼產生器支援常式的實作,例如「__fixunsdfdi」以及當目標沒有簡短的原生指令序列來實作核心 IR 操作時產生的其他呼叫。它也為動態測試工具(例如 AddressSanitizer、ThreadSanitizer、MemorySanitizer 和 DataFlowSanitizer)提供執行階段函式庫的實作。
MLIR 子專案是一種建構可重複使用和可擴展編譯器基礎架構的新穎方法。MLIR 旨在解決軟體碎片化問題、改進異構硬體的編譯、顯著降低建構特定領域編譯器的成本,並協助將現有編譯器連接在一起。
OpenMP 子專案提供了一個 OpenMP 執行階段,可用於 Clang 中的 OpenMP 實作。
polly 專案使用多面體模型實作了一套快取局部性最佳化,以及自動平行化和向量化。
libclc 專案旨在實作 OpenCL 標準函式庫。
klee 專案實作了一個「符號虛擬機器」,它使用定理證明器嘗試評估程式中的所有動態路徑,以找出錯誤並證明函式的屬性。klee 的一個主要特點是,如果它偵測到錯誤,它可以產生一個測試案例。
LLD 專案是一個新的連結器。它可以直接替換系統連結器,並且執行速度快得多。
BOLT 專案是一個連結後最佳化器。它透過根據採樣分析器收集的執行效能檔案來最佳化應用程式的程式碼佈局,從而實現改進。
除了 LLVM 的官方子專案之外,還有各種各樣的其他專案使用 LLVM 的元件來執行各種任務。透過這些外部專案,您可以使用 LLVM 來編譯 Ruby、Python、Haskell、Rust、D、PHP、Pure、Lua、Julia 以及許多其他語言。LLVM 的一個主要優勢是它的多功能性、靈活性和可重複使用性,這就是為什麼它被用於如此廣泛的不同任務的原因:從對 Lua 等嵌入式語言進行輕量級 JIT 編譯,到為大型超級電腦編譯 Fortran 程式碼,應有盡有。
與其他專案一樣,LLVM 擁有一個廣泛而友善的社群,成員們都致力於構建出色的底層工具。如果您有興趣參與其中,一個好的開始是瀏覽LLVM 部落格並加入LLVM 論壇。有關如何提交修補程式、取得提交權限以及版權和授權主題的資訊,請參閱LLVM 開發者政策。