天天看點

資料庫必知詞彙:LLVM

LLVM命名最早源自于底層虛拟機(Low Level Virtual Machine)的縮寫,由于命名帶來的混亂,目前LLVM就是該項目的全稱。LLVM 核心庫提供了與編譯器相關的支援,可以作為多種語言編譯器的背景來使用。能夠進行程式語言的編譯器優化、連結優化、線上編譯優化、代碼生成。

LLVM是一個自由軟體項目,其起源于 2000 年伊利諾伊大學厄巴納-香槟分校維克拉姆·艾夫(Vikram Adve)與克裡斯·拉特納(Chris Lattner)的研究發展而成,他們想要為所有靜态及動态語言創造出動态的編譯技術。LLVM 是以 BSD 授權來發展的開源碼軟體。在2005年,蘋果電腦雇用了克裡斯·拉特納及他的團隊,為了蘋果電腦開發應用程式系統,LLVM 為現今 Mac OS X 及iOS開發工具的一部分。

LLVM提供一個現代化的,基于SSA的編譯政策能夠同時支援靜态和動态的任意程式設計語言的編譯目标。自那時以來,已經成長為LLVM的主幹項目,由不同的子項目組成,其中許多正在生産中使用的各種商業和開源的項目,以及被廣泛用于學術研究。

LLVM的項目是一個子產品化和可重複使用的編譯器和工具技術的集合。LLVM和大家所熟知的JVM 以及 .net Runtime這樣的虛拟機不同,這個虛拟系統提供了一套中立的中間代碼和編譯基礎設施,并圍繞這些設施提供了一套全新的編譯政策(使得優化能夠在編譯、連接配接、運作環境執行過程中,以及安裝之後以有效的方式進行)和其他一些非常有意思的功能。

随着LLVM 這幾年快速普及,其還具有很多優秀特性:

  • LLVM 也可以在編譯時期、連結時期,甚至是運作時期産生可重新定位的代碼(Relocatable Code);
  • LLVM 支援與語言無關的指令集架構及類型系統。LLVM 可以提供完整編譯器系統的中間層,從編譯器擷取中間表示(IR)代碼并發出優化的 IR。然後可以将這個新的 IR 轉換并連結到目标平台的依賴于機器的彙編語言代碼。在我們的應用場景中,使用 LLVM API 會生成中間代碼 IR。存放在記憶體或外部檔案中。在目标平台執行時,針對對應的平台再生成對應的機器碼再執行。這意味着我們在 IR 層程式設計,在不同的 CPU 上執行,會生目前硬體平台生成最優的機器碼。即使是 intel 的 x86 平台,不同代的 CPU 優化程度也不同。例如 LLVM 會充分利用新 CPU 上的指令集,例如 SIMD。這一點在資料倉庫做浮點數計算時會用到。
  • LLVM 有一套完整的 API 可以用于編碼,并生成 LLVM IR 中間代碼。支援很多種編碼語言,C/C++ 都覆寫到了。我們主要的工作都在這了。
  • LLVM 的前端編譯器 clang 相容 gcc, 且性能相當。相關代碼使用編譯器 clang 編譯,能和 gcc 編譯的二進制互相連結。

資料來源:

編譯器架構 LLVM

https://www.oschina.net/p/llvm

The LLVM Compiler Infrastructure

https://llvm.org/

The Architecture of Open Source Applications: LLVM

http://www.aosabook.org/en/llvm.html

PgSQL · 特性分析· JIT 在資料倉庫中的應用價值

http://mysql.taobao.org/monthly/2016/11/10/?spm=a2c4e.10696291.0.0.779f19a4sj5A7r