Основні поняття
Deegen 是一種元編譯器,它能以類似於編寫簡單直譯器的工程成本,為動態語言自動生成具備高效能 JIT 功能的虛擬機器,從而解決了效能和工程成本之間的矛盾。
簡介
動態語言以其高生產力而廣泛應用,但由於無法靜態編譯成高效的原生代碼,因此也以速度慢而聞名。
即時編譯器 (JIT) 通過在運行時進行基於配置文件的推測性編譯來提高動態語言的性能,但構建一個良好的 JIT 虛擬機器 (VM) 非常困難。
現有的解決方案,如從其他語言中調整虛擬機器或使用 Truffle 框架,都存在著顯著的缺點。
Deegen 的解決方案
Deegen 是一種編譯器生成器,它可以在構建時從 C++ 位元組碼語義自動生成虛擬機器執行引擎。
Deegen 自動生成一個具有最先進直譯器、最先進基準 JIT 編譯器和連接這兩層的自適應系統的雙層虛擬機器執行引擎。
Deegen 的優勢
首次展示了 JIT 編譯器的自動生成,以及性能優於現有技術的直譯器的自動生成。
從單一事實來源(C++ 位元組碼語義)自動生成具備雙層 JIT 功能的虛擬機器以及相關的性能分析、層級提升和 OSR 入口邏輯。
自動生成最先進的直譯器,其代碼質量可以匹配甚至超越由專家手工編寫的彙編代碼。
自動生成最先進的基準 JIT 編譯器,該編譯器具有可忽略不計的啟動延遲,並生成可與現有最先進基準 JIT 相媲美的高質量機器代碼。
設計了一種位元組碼語義描述框架,該框架促進了位元組碼語義的構建時分析、轉換和優化;允許輕鬆表達常見的動態語言優化(例如,邏輯專用化、內聯緩存和類型推測);並具備直觀、靈活和用戶友好的界面。
LuaJIT Remake (LJR)
使用 Deegen 實現了 LuaJIT Remake (LJR),這是一個標準兼容的 Lua 5.1 虛擬機器。
在 44 個基準測試中,LJR 的直譯器平均比官方 PUC Lua 直譯器快 179%,比 LuaJIT 2.1 中的直譯器快 31%。
LJR 的基準 JIT 具有可忽略不計的啟動延遲,其執行性能平均比 PUC Lua 快 360%,比 LuaJIT 的優化 JIT 慢 33%(但在 44 個基準測試中有 13 個更快)。
Deegen 的架構和設計
文章詳細介紹了 Deegen 的架構和設計,包括位元組碼語義描述框架、類型推測、內聯緩存、性能分析、層級提升和 OSR 入口等關鍵組件和技術。
未來方向
Deegen 還有很多改進空間,例如垃圾回收、C 語言綁定、對更多硬件架構的支持以及併發編譯等。
總結
Deegen 為構建高性能動態語言虛擬機器提供了一種全新的方法,大大降低了工程成本,並為動態語言的未來發展帶來了新的可能性。
Статистика
在 44 個基準測試中,LJR 的直譯器平均比官方 PUC Lua 直譯器快 179%。
LJR 的直譯器比 LuaJIT 2.1 中的直譯器快 31%。
LJR 的基準 JIT 執行性能平均比 PUC Lua 快 360%。
LJR 的基準 JIT 比 LuaJIT 的優化 JIT 慢 33%,但在 44 個基準測試中有 13 個更快。