LLVM
3 秒看懂
LLVM(不再是 Low Level Virtual Machine 的縮寫,它就是一個名字)是一個編譯器基礎設施架構。它不是一個具體的編譯器,而是一套用於建置編譯器的“樂高積木”,核心是定義了一種與具體程式語言和CPU架構都無關的中間表示(IR),極大地降低了開發新程式語言和適配新硬體晶片的難度。
3 分鐘產業解釋
想像一下造車。如果沒有標準化的零部件(如發動機介面、電氣匯流排),每造一款新車就要從頭設計所有零件。LLVM 就是程式設計世界的“標準化汽車平台”。
- 對於軟體開發者/程式語言設計者:只需專注於將程式碼翻譯成一種標準的“中間語言”(LLVM IR),無需關心最終要執行在 Intel、AMD 還是 ARM 的 CPU 上。這催生了 Swift、Rust、Julia 等新一代高效語言的繁榮。
- 對於晶片公司:無論是設計新的 CPU、GPU 還是 AI 加速器,只需為目標硬體開發一個“後端編譯器”,就能自動支援所有能編譯到 LLVM IR 的程式語言(如 C/C++、Python 通過科學計算庫)。這極大地降低了新硬體的生態建置門檻,是國產 GPU 和 AI 晶片能夠快速接入主流軟體生態的關鍵技術橋樑。
- 對於產業:LLVM 是一個開源的“製程”級別的基礎工具,是連線上層軟體智慧與下層硬體算力的核心樞紐。其生態的繁榮直接決定了一個計算平台(無論是通用CPU還是專用加速器)的生命力。
15 分鐘專家深入
LLVM 的核心價值在於其模組化與層解耦設計,這使其在 AI 時代地位愈發重要。
-
“三頭六臂”的解耦:傳統的編譯器(如老版本GCC)是“鐵板一塊”,前端(解析語言)、最佳化器、後端(生成機器碼)緊密耦合。LLVM 將其打散:
- 前端:負責理解不同語言(Clang 處理 C/C++/Objective-C, rustc 處理 Rust),輸出統一的 LLVM IR。
- 最佳化器:對 LLVM IR 進行一系列與語言和硬體無關的通用最佳化(如迴圈最佳化、內聯)。
- 後端:負責將最佳化後的 LLVM IR 翻譯成特定硬體(x86, ARM, RISC-V, 乃至 NVIDIA PTX)的機器碼。
- 影響:語言開發者可以複用最佳化器和後端,硬體廠商可以複用前端和最佳化器。這形成了強大的網路效應。
-
LLVM IR:生態的“世界語”:這是一種強型別的、低階的類 RISC 指令集表示,它既接近高階語言語義,又易於對映到硬體。所有最佳化和分析都在 IR 層面進行。可以將其視為一個“虛擬的、理想的 CPU 指令集”。
-
與 GPGPU 計算的關係:NVIDIA 的 CUDA 編譯器(
nvcc)內部就使用了定製化的 LLVM 版本來將 CUDA C++ 編譯成 PTX(一種中間表示)再到 SASS(機器碼)。這證明了 LLVM 架構在異構計算領域的強大適應性。對於其他 GPU 和 AI 晶片,基於 LLVM 開發編譯器是一條被驗證過的高效路徑。 -
MLIR:面向AI的新戰場:隨著 AI 模型複雜度飆升,傳統 LLVM IR 在表示張量、圖計算等高層語義時力不從心。MLIR(Multi-Level Intermediate Representation)應運而生,它是 LLVM 專案的一部分,旨在提供一個更靈活、可擴充套件的中間表示架構,用於統一機器學習生態系統中的多種編譯器基礎設施。這是 LLVM 生態面向未來的關鍵版面配置。
技術原理(最深)
LLVM 的核心架構可由下圖描述,體現了其基於 IR 的分層與傳遞設計:
+-------------------+ +-------------------+ +-------------------+
| Source Code | | LLVM IR | | Target Machine Code|
| (C++, Rust, etc.)| ---> | (Platform- | ---> | (x86, ARM, NVPTX) |
+-------------------+ | Independent) | +-------------------+
^ +-------------------+ ^
| | |
[Frontend] [Optimizer] [Backend]
(e.g. Clang) (Passes & Analyses) (e.g. X86, AArch64)
| | |
+---------------------------+---------------------------+
|
+-------------------+
| LLVM Libraries & Tools |
| (Assembler, Linker, etc.) |
+-------------------+
- 關鍵資料結構:LLVM Module 包含了整個編譯單元的資訊,內含 Functions, Functions 由 Basic Blocks 組成, Basic Blocks 由一系列 Instructions 組成。所有資料型別都是強型別的。
- Pass 管理架構:最佳化器的核心是 Pass(遍)。每個 Pass 完成一項特定的分析或變換任務(如死程式碼消除、暫存器分配)。Pass 可以自由組合,形成最佳化流水線。Pass 分為 Analysis Pass(只讀,分析資訊)和 Transform Pass(修改 IR)。
- 並行與 JIT:LLVM 支援多執行緒編譯(並行處理不同的模組或函式)。其 ORC JIT (On-Request Compilation) 架構允許在執行時動態地將 IR 編譯成機器碼,是高效能動態語言(如Julia)和資料庫查詢引擎(如Spark SQL)的加速核心。
技術演進史
- 2000-2003(誕生):由 Chris Lattner 在伊利諾大學攻讀博士期間發起,最初作為研究專案,旨在設計一個支援全程式最佳化的編譯器架構。名字“Low Level Virtual Machine”後來被棄用。
- 2007(關鍵轉折):Chris Lattner 加入Apple公司,開始主導將 LLVM 用於Apple的開發工具鏈。Clang(C/C++/Obj-C 前端)在此期間誕生並開源,旨在取代老舊的 GCC。
- 2011年12月(走向主流):LLVM 3.0 釋出,被視為一個穩定、可用於生產的版本。Apple全線工具鏈(Xcode)切換到基於 LLVM/Clang。
- 2015-2019(生態爆發):Rust 語言將 LLVM 作為其預設後端;Emscripten(將 C/C++ 編譯到 WebAssembly)基於 LLVM 建置;各大硬體廠商(包括 NVIDIA、Google、AMD)紛紛將 LLVM 整合到其編譯器中。
- 2019-今(AI與異構擴充套件):MLIR 子專案啟動並快速發展,旨在解決 AI 領域的編譯器碎片化問題。LLVM 成為 RISC-V 架構事實上的標準編譯器工具鏈。
技術路線對比(量化表)
| 特性 | LLVM/Clang | GCC (GNU Compiler Collection) | 備註 |
|---|---|---|---|
| 架構 | 高度模組化,基於庫的設計。 | 傳統單體架構,近年來也在改進。 | LLVM 的模組化是其最大技術優勢。 |
| 語言支援 | 前端可獨立開發。Clang 專注 C 族,Rust/Swift 等有獨立前端。 | 前端與後端耦合較深。 | LLVM 對新興語言更友好。 |
| 中間表示 | LLVM IR, 穩定、強型別、公開設計。 | GIMPLE/RTL, 內部表示。 | LLVM IR 的公開性促進了生態擴充套件。 |
| 最佳化能力 | 極強,在最佳化現代C++、連結時最佳化(LTO)方面領先。 | 極強,在 Fortran、傳統 HPC 領域積累深厚。 | 兩者最佳化水平處於同一梯隊,側重不同。 |
| 硬體支援 | x86, ARM, RISC-V, AMDGPU, NVPTX, WebAssembly, BPF 等,擴充套件性極佳。 | x86, ARM, RISC-V, 眾多專用架構,支援廣泛。 | 兩者都覆蓋主流架構,LLVM 在新興和專用架構(如BPF)上更活躍。 |
| 社群/開發模式 | 基於 Apache 2.0 with LLVM Exceptions, 由 LLVM 基金會管理,商業公司貢獻巨大(Apple、Google、輝達等)。 | GPLv3, 由自由軟體基金會管理,社群驅動。 | 許可證差異導致商業模式不同,LLVM 對商業整合更友好。 |
| 編譯速度 | 通常被認為在同等最佳化級別下編譯更快。 | 編譯速度稍慢,尤其在高最佳化級別。 | 這得益於 LLVM 的模組化設計和現代程式碼庫。 |
| 除錯支援 | 生成 DWARF 除錯資訊,支援良好。 | DWARF, 支援非常成熟。 | 兩者都支援標準除錯格式。 |
| 代表成就 | 成為Apple預設工具鏈、Android NDK 預設、Rust/Swift 後端、CUDA 編譯器核心。 | Linux 生態基石、GCC 是許多作業系統和科學計算軟體的傳統選擇。 | 兩者都在各自領域佔據主導地位,形成“雙巨頭”格局。 |
上下游
- 上游(輸入):
- 程式語言:C, C++, Rust, Swift, Objective-C, Julia, Scala (via GraalVM), 以及各種領域特定語言(DSL)。
- 硬體架構規範:x86, ARM, RISC-V, 以及各加速器(GPU, TPU, NPU)的指令集手冊。
- 演算法與最佳化理論:編譯器最佳化理論、圖形分析演算法等。
- 核心(LLVM本身):編譯器前端、最佳化器(一系列Pass)、後端、連結器、JIT引擎、MLIR等工具庫。
- 下游(輸出與消費者):
- 可執行程式:本地機器碼。
- 中間程式碼:WebAssembly (.wasm), SPIR-V (用於 Vulkan 圖形API), PTX (NVIDIA GPU)。
- 執行時環境:語言執行時(如 JVM、.NET 通過 LLVM 加速),資料庫查詢引擎,AI 架構編譯器(如 PyTorch/XLA, TVM 的部分後端)。
- 開發工具:IDE(程式碼補全、靜態分析)、偵錯程式、效能分析器。
- 終端使用者:所有使用上述語言和硬體的軟體開發者。
關鍵指標
- 前端語言支援數量:衡量生態廣度。官方與社群支援的語言/方言超過50種。
- 後端硬體目標支援數量:衡量硬體生態接入能力。活躍支援的目標超過15個。
- 編譯速度:單位時間內處理程式碼行數(LOC/s)或指令數。在-O0(無最佳化)級別通常顯著快於GCC。
- 生成程式碼效能:在標準基準測試(如SPEC CPU, Geekbench)中,與GCC生成的程式碼進行對比。兩者互有勝負,在不同測試集上領先。
- 最佳化級別效果:-O1, -O2, -O3, -Os, -Oz 等最佳化級別下,程式碼大小和執行時間的權衡。
- 社群活躍度:每月提交的程式碼補丁數、活躍開發者數量、郵件列表討論熱度。這是一個健康的頂級開源專案。
- 商業採用率:在雲端廠商(AWS, Azure, GCP)、晶片公司(所有主流CPU/GPU/AI晶片公司)、科技巨頭(FAANG)內部工具鏈中的滲透率。
供需與市場資料
- 供應:完全開源,由 LLVM 基金會管理。核心貢獻者來自Apple、Google、輝達、AMD、英特爾、華為等科技巨頭及學術機構。基金會通過舉辦開發者會議、管理商標和法律事務來支援社群。
- 需求:需求方是所有需要建置編譯器的實體。分為兩類:
- 直接需求:程式語言團隊(需要後端)、硬體公司(需要前端和最佳化器)、編譯器工具鏈供應商(如 IAR, Arm Compiler)。
- 衍生需求:依賴 LLVM 生態建置產品的企業,如AI 晶片公司(其軟體棧的核心)、高效能運算公司、雲端服務商。
- 市場資料:LLVM 本身不產生直接營收,其價值體現在賦能的龐大生態中。LLVM 工具鏈在現代軟體開發中佔據核心地位,但其精確的直接或間接依賴比例難以量化。在移動裝置(iOS/Android)和新興 RISC-V 領域,這一比例接近100%。其衍生出的商業支援、定製開發和培訓服務是一個小眾但穩定的市場。
代表公司與資本對映
- 深度貢獻與採用巨頭:
- Apple:最大使用者和早期關鍵推動者。Swift 和 Objective-C 編譯器、整個 macOS/iOS 開發工具鏈核心。(受益:自身生態粘性與競爭力)
- Google:Android NDK 預設編譯器、TensorFlow 編譯器後端(XLA)的部分使用、為 Clang/LLVM 貢獻大量程式碼。(受益:Android 生態、雲端 AI 服務)
- 輝達:CUDA 編譯器核心使用 LLVM,是其 GPU 計算生態的基石之一。(受益:CUDA 護城河)
- AMD:ROCm(對標CUDA)平台中的 GPU 編譯器基於 LLVM。(受益:追趕 CUDA 生態)
- 英特爾:ISPC(隱式 SPMD 程式編譯器)等工具基於 LLVM,OneAPI 工具鏈也深度整合。(受益:異構計算戰略)
- 關鍵生態受益方:
- 所有 AI 晶片初創公司(如寒武紀、地平線等):其軟體開發工具鏈幾乎必然基於 LLVM 建置,以降低開發成本,快速支援主流程式設計架構。(LLVM 是其“賣鏟子”的關鍵供應商)
- RISC-V 晶片公司(如 SiFive、平頭哥):LLVM 是 RISC-V 架構事實上的官方編譯器,是其建置軟體生態的生命線。(LLVM 是 RISC-V 生態的基石)
- 雲端服務商(AWS, Azure, GCP):在其自研晶片(如 AWS Graviton/Trainium, Google TPU)的軟體棧中廣泛使用 LLVM 相關工具。
投資邏輯
LLVM 的投資邏輯是 “基礎設施賦能”和“賣鏟子”邏輯,主要體現在以下幾個方面:
- AI 晶片競賽的“賣鏟人”:任何一家想進入 AI 加速器市場的公司,都必須建置基於 LLVM 的軟體棧。投資 LLVM 生態的成熟度,就是投資新硬體公司的成功機率。關注那些在 LLVM 社群有深厚技術積累和貢獻的團隊,以及為晶片公司提供 LLVM 相關定製開發服務的公司。
- 計算自主化的“作業系統”級工具:在追求供應鏈安全和計算自主的背景下(如中國的“信創”),基於 LLVM 建置自主可控的編譯器工具鏈是必經之路。投資相關編譯器技術公司,等同於投資底層軟體基礎設施的自主化。
- RISC-V 生態的核心:RISC-V 的崛起與 LLVM 的強大密不可分。投資 RISC-V 不可忽視 LLVM 工具鏈的成熟度和商業支援。同樣,基於 LLVM 的 RISC-V 工具鏈提供商具有明確價值。
- 軟體定義硬體的橋樑:隨著 MLIR 等技術的發展,LLVM 生態正在從“編譯到固定硬體”向“編譯並影響硬體設計”演進。在可重構計算、領域專用架構等領域,LLVM/MLIR 工具鏈將成為軟硬體協同設計的核心,這是長期的技術演進方向。
常見誤讀糾偏
- 誤讀一:“LLVM 是一個虛擬機器。”
- 糾正:這是其歷史名稱(Low Level Virtual Machine)帶來的最大誤解。LLVM 不是一個傳統意義上的、在執行時解釋執行位元組碼的虛擬機器(如 JVM)。它是一個編譯器基礎設施。其“虛擬”體現在它定義了一個理想化的、與具體硬體無關的 IR 虛擬指令集,但這個指令集最終都會被“編譯”成真實的機器碼直接執行,而非解釋執行。雖然它有 JIT 功能,但那只是其眾多工具之一。
- 誤讀二:“LLVM 只是給 CPU 用的。”
- 糾正:LLVM 的後端可以針對任何能執行指令的硬體,包括 GPU、DSP、FPGA 乃至專用的 AI 加速器。事實上,如前所述,NVIDIA 和 AMD 的 GPU 編譯器都大量使用了 LLVM。它的目標是成為所有計算硬體的通用編譯器前端與最佳化器。
- 誤讀三:“MLIR 是 LLVM IR 的替代品。”
- 糾正:MLIR 不是 LLVM IR 的替代品,而是補充和擴充套件。MLIR 的目標是處理比 LLVM IR 更高層、更領域特定(如機器學習張量圖、硬體描述)的表示。它最終可以降級到 LLVM IR,從而複用 LLVM 成熟的後端。兩者是協作關係,共同構成一個多層次的編譯棧。
學習路徑
- 概念入門:閱讀 LLVM 官網的 “Introduction to the LLVM Compiler” 和 “LLVM Tutorial: Kaleidoscope”,通過實現一個簡單語言來理解全流程。
- IR 精通:學習 LLVM IR Language Reference Manual。這是核心文件。手動編寫一些簡單的
.ll檔案,使用llc和lli工具進行編譯和執行。 - 實踐最佳化:編寫簡單的 C 程式,使用
clang -O0 -S -emit-llvm生成未最佳化 IR,再對比clang -O3生成的 IR,分析最佳化效果。學習編寫自定義的 LLVM Pass。 - 深入後端:選擇一個感興趣的目標(如 RISC-V),研究 LLVM 後端程式碼結構(位於
llvm/lib/Target/)。理解指令選擇、暫存器分配等關鍵步驟。 - 參與社群:訂閱 LLVM 的開發者郵件列表 (
llvm-dev),閱讀提交記錄,嘗試修復簡單的 bug(如標記為 “beginner” 的任務)。參加 LLVM 開發者大會。
一句話總結
LLVM 是建置現代計算生態的 “編譯器樂高”和“硬體適配層”,它通過標準化的中間表示(IR)解耦了軟體創新與硬體迭代,是 AI 晶片競賽、RISC-V 崛起和計算自主化背後看不見的基石。
延伸閱讀與來源
- 官方權威:LLVM 官網 —— 文件、教程、部落格、釋出版本。
- 核心論文:Chris Lattner, Vikram Adve. “LLVM: A Compilation Framework for Lifelong Program Analysis & Transformation” (2004). —— 描述最初架構的經典論文。
- 深度書籍:《Getting Started with LLVM Core Libraries》 by Bruno Cardoso Lopes, Rafael Auler. —— 實踐導向的入門書。
- MLIR 專題:MLIR 官網 —— 瞭解 LLVM 面向未來的新戰場。
- 行業視角:各晶片公司(如 NVIDIA, AMD, Intel, SiFive)的技術部落格,常有關於其如何使用或貢獻 LLVM 的深度文章。