LLVM 專案是一個模組化和可重複使用的編譯器與工具鏈技術的集合。儘管名稱如此,LLVM 與傳統虛擬機器幾乎沒有關係。「LLVM」這個名稱本身並非縮寫;它是專案的全名。
LLVM 最初是伊利諾大學的研究專案,目標是提供一種現代、基於 SSA 的編譯策略,能夠支援任意程式語言的靜態和動態編譯。從那時起,LLVM 已成長為一個包含許多子專案的總括專案,其中許多子專案正在被各種商業和開源專案用於生產,並廣泛應用於學術研究。LLVM 專案中的程式碼根據 「Apache 2.0 授權條款與 LLVM 例外」授權。
LLVM 的主要子專案包括
LLVM Core 函式庫提供了一個現代、獨立於來源和目標的最佳化器,以及對許多流行的 CPU(以及一些不太常見的 CPU!)的程式碼產生支援。這些函式庫圍繞著一個完善指定的程式碼表示形式,稱為 LLVM 中間表示形式(「LLVM IR」)建構而成。LLVM Core 函式庫有完善的文件記錄,並且將您自己的語言(或移植現有的編譯器)用於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 的完整支援。
libc 專案提供 C 標準函式庫的高效能、符合標準的實作,與 LLVM 完全整合。它提供最佳化的效能和對現代 C 標準的全面支援,確保 C 應用程式的可靠且有效率的基礎。
compiler-rt 專案提供低階程式碼產生器支援常式(例如「__fixunsdfdi」)以及在目標沒有一小段原生指令序列來實作核心 IR 運算時產生的其他呼叫的高度調整實作。它還為動態測試工具(例如 AddressSanitizer、ThreadSanitizer、MemorySanitizer 和 DataFlowSanitizer)提供執行階段函式庫的實作。
MLIR 子專案是一種建構可重複使用和可擴充編譯器基礎架構的新穎方法。MLIR 旨在解決軟體碎片化問題、改進異質硬體的編譯、大幅降低建構特定領域編譯器的成本,並協助將現有編譯器連結在一起。
OpenMP 子專案為 Clang 中的 OpenMP 實作提供 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 Discourse。有關如何提交補丁、取得提交權限以及著作權和授權主題的資訊,請參閱 LLVM 開發人員政策。