一款人人都需要懂一點的酷炫編譯器——LLVM

一款人人都需要懂一點的酷炫編譯器——LLVM

LLVM簡介

LLVM是構架編譯器(compiler)的框架系統,以C++編寫而成,用於優化以任意程序語言編寫的程序的編譯時間(compile-time)、鏈接時間(link-time)、運行時間(run-time)以及空閒時間(idle-time),對開發者保持開放,併兼容已有腳本。

一款人人都需要懂一點的酷炫編譯器——LLVM

發展歷史

2000年LLVM開始開發。

2005年Apple僱了Chris Lattner,LLVM也相當於成了Apple的官方支持的編譯器。

2011年12月 LLVM3.0發佈,LLVM包括了一系列子項目,並且同步發佈了新版本,如C/C++/Objective-C前端Clang 3.0改進了C++程序編譯支持;改進C++ 2011標準支持;實現支持即將發佈的C1x標準的某些特性;更快的生成代碼,更快的編譯,等等。

LLVM榮獲2012年ACM軟件系統獎。

一款人人都需要懂一點的酷炫編譯器——LLVM

LLVM與眾不同的原因

  • LLVM的“中間表示”(IR)是一項大創新。LLVM的程序表示方法真的“可讀”。雖然看上去這沒什麼要緊,但要知道,其他編譯器的中間表示大多是種內存中的複雜數據結構,以至於很難寫出來,這讓其他編譯器既難懂又難以實現。
  • LLVM架構遠比其他編譯器要模塊化得多。
  • LLVM給狂熱的學術黑客提供了一種研究工具的選擇,它還是一款有大公司做後臺的工業級編譯器。這意味著你不需要去在“強大的編譯器”和“可玩的編譯器”之間做妥協——不像你在Java世界中必須在HotSpot和Jikes之間權衡那樣。
一款人人都需要懂一點的酷炫編譯器——LLVM

LLVM在不同語言中使用

使用 LLVM 的典型方式是通過你所熟悉的語言來編寫代碼

兩種常見的可選語言是 C 和 C++:

  • LLVM 本身是用 C++ 編寫的
  • LLVM 的 API 以 C 和 C++ 版本提供
  • 大量的語言開發往往會以 C/C++ 作為一個基礎

不過,這兩種語言並不是唯一的選擇。許多語言都可以原生調用 C 語言庫,所以理論上可以用任何這樣的語言進行 LLVM 開發。但需要有一個實際的語言庫可以很好地封裝 LLVM API。

一款人人都需要懂一點的酷炫編譯器——LLVM

需要注意的是,一些與 LLVM 的語言綁定可能不完整,例如 Python ,有多種綁定選擇,但每個選項的完整性和實用性各不相同:

  • LLVM 項目維護著自己的一套到 LLVM 的 C API 的綁定,但是目前他們沒有繼續維護。
  • llvmpy 在 2015 年後就沒有進行維護了 —— 這對軟件項目都是不利的,因為每個版本的 LLVM 都有一些變化,所以在使用 LLVM 時便是如此。
  • 由創建 Numba 的團隊開發的 llvmlite 已經成為當前在 Python 中的 LLVM 的競爭者。它只實現了 LLVM 功能的一個子集,正如 Numba 項目的需求所規定的那樣。但是這個子集滿足了絕大多數 LLVM 用戶所需。
  • llvmcpy 旨在為 C 庫帶來最新的 Python 綁定,以自動化的方式保持更新,並使用 Python 的習慣用法來訪問它們。

LLVM 的創建者撰寫的使用 C++ 或 OCAML 語言的教程能夠一步步指導你創建一種簡單的名為 Kaleidoscope 的語言:

  • Haskell:參考原始教程的直接移植。
  • Python:在此網站的教程和原始版本非常相近,而另一個版本則是用交互式命令行進行更為雄心勃勃的重寫。這兩種版本都使用 llvmlite 作為到 LLVM 的綁定。
  • Rust 和 Swift:不可避免地,我們不得不將該教程移植到這兩種語言之上,它們都是由 LLVM 自身幫助使其誕生的。

最後,這個教程也有其他國家語言版本的。這裡有中文版,分別是使用原始的 C++ 和 Python 版本。


分享到:


相關文章: