跳至內容

LLVM

出自Taiwan Tongues 台語維基
於 2025年8月23日 (六) 11:06 由 TaiwanTonguesApiRobot留言 | 貢獻 所做的修訂 (從 JSON 檔案批量匯入)

(差異) ←上個修訂 | 已批准修訂 (差異) | 最新修訂 (差異) | 下個修訂→ (差異)

LLVM是一套編譯器基礎設施專案,為自由軟體,以 C + + 寫做,有包含一系列模組化的編譯器組件佮工具鏈,用來開發編譯器前端佮後端。伊是為著任意一種程式語言來寫的程式,利用虛擬的技術創造出編譯時期、鏈到時期、執行時期以及「荒廢時期」的最佳化。

伊上早以 C / C + + 為實作物件,抑若目前伊爾支援包括 ActionScript、Ada、D 語言、Fortran、GLSL、Haskell、Java 位元組碼、Objective-C、Swift、Python、Ruby、Crystal、Rust、Scala 以及 C # 等語言。

歷史

LLVM 專案的發展起源就佇二空空年他利嗎他大學厄巴納-檳榔分校維克拉姆 ・ 艾夫(Vikram Adve)佮克里斯 ・ 拉特納(Chris Lattner)的研究,𪜶想欲為所有靜態佮動態語言創造出動態的編譯技術。LLVM 是以 BSD 授權來發展的開源軟體。二空空五年,蘋果電腦倩克里斯 ・ 拉特納佮伊的團隊為蘋果電腦開發應用程式系統,LLVM 為現今 macOS 佮 iOS 開發伊的工具的一部份。

LLVM 的號名上早源自於底層虛擬機器LowLevelVirtualMachine)首字母縮寫,因為這个專案的範圍並無侷限建立一个虛擬機器,這个縮寫致使著廣泛的疑惑。LLVM 開始起來了後,成做真濟編譯工具佮低階工具技術的統稱,予這个名變甲閣較無對同,開發者就決定放棄這个縮寫的意涵,現今 LLVM 已經單純成做一个品牌,適用佇咧 LLVM 下的所有的案件,包含 LLVM 中介碼(LLVM IR)、 LLVM 除毋著工具、LLVM C + + 標準函式庫等。

因為 LLVM 對產業的貢獻,電腦協會佇二空一二年將 ACM 軟體系統獎授佮維克拉姆 ・ 艾夫、克里斯 ・ 拉特納佮 Evan Cheng。

自九孵零 . 零版本開始,LLVM 使用帶有 LLVM 另外條款的 Apache 授權條款二交零進行授權。而且對二空一九年十月開始,LLVM 專案的代碼代管正式徙去矣 GitHub。

是咧講

LLVM 提供一套適合編譯器系統的中央語言(Intermediate Representation,IR), 有大量變換佮最佳化攏圍踅其實現此時。經過變換佮最佳化了後的中央語言,會當轉換做目標平台相關的組合語言代碼。LLVM 會當和 GCC 工具鏈做伙做工課,允准伊佮為這个專案來編寫的大量現有編譯器做伙來使用。LLVM 閣會當編譯、結時生會當重新定位的程式碼(Relocatable Code), 甚至佇執行的時生做二進位機器碼。

LLVM 的中央語言佮具體的語言、指令集、型別系統無關係,其中逐條指令攏是靜態單純形式(SSA), 隨逐个變數干焦予人加值一改。對簡化的變數之間的依賴分析。LLVM 允准靜態編譯代碼,或者是通過即時編譯(JIT)機制共中央表示轉換做機器碼(類似 Java)。

LLVM 支援佮語言無關係的指令集架構佮類型系統。逐个佇靜態單才有形式(SSA)的指令集代表著講,逐个變數(予人號做是有型別的暫存器)干焦予人價值一改,這簡化了變數間相依性的分析。LLVM 允准程式碼被靜態的編譯,包含著佇傳統的 GCC 系統下底,抑是類似 JAVA 等尾仔編譯才將 IF 編譯做機械碼所使用的即時編譯(JIT)技術。伊的型別系統包括基本型別(整數抑是浮點數)佮五个複合型別(指標、陣列、向量、結構佮函式), 佇咧 LLVM 具體語言的這个型別建制會當結合基本型別來表示,比如講伊,C + + 所使用的 class 會當予人表示做結構、函式佮函式指標的陣列所組成。

LLVM JIT 編譯器會當最佳化咧執行的時期時程式所無需要的靜態分支,這佇一寡部份求值(Partial Evaluation)的案例中相當有效,即當程式有真濟選項,佇咧特定的環境之下其中多數會當判斷做是無需要。這特色予人使用佇咧 Mac OS X Leopard(v 十人五)下底 OpenGL 的管線,當硬體無支援某一个功能的時猶閣會當予成功來運作。OpenGL 疊落來的繪圖程式予人編譯做 IR,閣紲咧機器頂懸執行的時予人編譯,當系統有高階 GPU 時,這段程式會進行真少修改閣將傳遞指令予 GPU,當系統有低階的 GPU 時,LLVM 將會編譯閣較濟程式,使這段 GPU 無法度執行的指令佇本地捀的中央處理器執行。LLVM 增進了使用 Intel GMA 晶片等低階機器的效能。一个類似的系統發展佇 Gallium 三 D LLVMpipe,伊已經合做伙 GNOME,使其可運行無 GPU 的環境。

根據二空一一年的一項測試,GCC 咧執行的時期的效能平均比 LLVM 懸百分之十。二空一三年測試顯示,LLVM 會當編譯出誠近 GCC 仝款效能的執行碼。

編譯器

LLVM 已經成做真濟編譯器佮代碼生做相關囝專案的母專案。

前端

LLVM 頭仔用來取代 GCC 中的程式碼產生器,真濟 GCC 的前端已經會當佮其運行,LLVM 目前支援 Ada、C 語言、C + +、D 語言、Fortran、Haskell、Julia、Objective-C、Rust 佮 Swift 的編譯,伊使用真濟的編譯器,有的來自四配零 . 一佮四配二的 GCC。

LLVM 引發一寡人來為著濟濟的語言開發新的編譯器,其中一个上引發注意的就是 Clang,伊是一个新的編譯器,同時支援 C、Objective-C 以及 C + +。主要來自蘋果電腦的支援,Clang 的目的用取代的 GCC 系統下底的 C / Objective-C 編譯器,佇當代的系統,伊較容易佮整合式開發環境(IDE)整合,而且對執行緒有閣較好的支援。Clang 對三鋪八版本開始已經支援 OpenMP。GCC 下底 Objective-C 的開發已經停起來,蘋果電腦已經共其支援徙到其他的維護分支。

Utrecht Haskell 編譯器會當產生 LLVM 用的程式碼,毋過伊猶佇初期的開發階段,並且佇足濟案例,展示伊比起來 C 程式碼產生器有閣較好的效率 Glasgow Haskell Compiler(GHC)有一个會當運作的 LLVM 後端,程式執行效能對比較原先的編譯器會當達到百分之三十的催落去,伊干焦比一个由 GHC 所實現,並且有濟項最佳化技術的編譯器閣慢慢仔猶閣有其他的元件佇咧無仝款的開發階段,包含(但無限於講)Java bytecode、通用中央語言(CIL)、 MacRuby(實現 Ruby 一孵九)、 Standard ML 佮新的 graph coloring 暫存器組態 .

中央捀

LLVM 的核心是中央端表達式(Intermediate Representation,IR), 一種類似組譯的底層語言。IR 是一種強型別的精簡指令集(Reduced Instruction Set Computing,RISC), 並且對目標指令集進行了抽象。比如講,目標指令集的函式呼叫慣例被抽象為 _ call _ 和 _ ret _ 指令加上明確的參數。另外咧,IR 採用無限個數的暫存器,使用如 % 零,% 一等形式表達。LLVM 支援三種表達形式:人類可讀的組譯,佇咧 C + + 中物件的形式和序列化了後的 bitcode 形式。

比如講,一个簡單的 Hello World 程式會當表達做下的組譯形式。著 IR 語言的完整描述請參考 LLVM 官方文件:

後端

到十一鋪零版本,LLVM 已經支援真濟種後端指令集,包括講 ARM、Qualcomm Hexagon、MIPS、Nvidia 並列指令集(LLVM 中稱做 NVPTX), PowerPC、AMD TeraScale、AMDGPU、SPARC、SystemZ、RISC-V、WebAssembly、x 八十六、x 八十六鼻六十四佮 XCore。

LLVM 包含一个專門的 MC 模組,將機器指令佇文字形式佮機器碼形式間相換。佇進前 LLVM 靠系統或者是平台專門的工具鏈將組譯翻譯為機器碼。LLVM 機器碼的整合組譯器已經支援絕大多數 LLVM 的目標平台。

連結器

lld 連結器子專案旨咧為 LLVM 開發一个內建的,平台獨立的連結器,去除著所有第三方連結器的依賴。佇咧二空一七年五月,lld 已經支援 ELF、PE / COFF、和 Mach-O。佇咧 lld 支援無完全的狀況下,使用者會使用其他的專案,如 GNU ld 連結器。 lld 支援連結的時最佳化。當 LLVM 連結的時最佳化予人啟用的時,LLVM 會當輸出 bitcode 毋是本機的代碼,啊若本機代碼生做由連結器最佳化處理。

C + + 標準庫

LLVM 專案包括一个 C + + 標準庫的實現(libcxx), 具有 MIT 授權條款佮 UIUC 授權條款的雙授權條款。

另見

  • Clang C / C + + 編譯器
  • GNU lightning
  • GNU Compiler Collection(GCC)
  • OpenGL

參考文獻

外部連結

  • LLVM 計劃官方網站
  • LLVM Project Blog
  • LLVM : A Compilation Framework for Lifelong Program Analysis & Transformation—a published paper by Chris Lattner and Vikram Adve .
  • LLVM Language Reference Manual—describes the LLVM intermediate representation .
  • LLVM 二孵空 Presentation—Google Tech Talk Presentation on LLVM 二孵空
  • Discussion of LLVM by John Siracusa at Ars Technica
  • LLVM 內部結構(The Architecture of Open Source Applications , Volume II-ISBN 九九石七千八百一十一鋪空五百五十七刣一千八百一十七)
  • LLVMLinux 專案