近日 Oracle 開源了其在GraalVM中實現的 WebAssembly 引擎GraalWasm,開發團隊介紹,GraalWasm 當前實現了 WebAssembly MVP(最小可行產品)規范,并且可以以二進制格式運行 WebAssembly 程序,該程序是由諸如 Emscripten 之類的編譯器后端生成的。
支持 WebAssembly 擴展了GraalVM 與其它支持的語言一起執行的能力,進一步有望使其成為通用編程語言執行平臺。不過目前 GraalWasm 還是一個非常早期的實現,并且處于實驗模式。
為了實現 GraalWasm,開發團隊使用GraalVM作為提供有效局部評估引擎的平臺,使用 GraalVM 的Truffle API,首先實現了 WebAssembly 二進制文件的解釋器。
WebAssembly 的半結構化格式能夠輕松地恢復程序的控制流結構,從而使存儲代碼的內存數據結構可以表示為 AST。用 AST 表示的程序的解釋器可以用非常簡單的方式編寫,但是,盡管基于 AST 的數據結構更易于檢查和操作,但它們確實存在引入額外內存開銷的缺點。
另一方面,基于位碼的代碼表示不需要為每個基本指令實例化樹節點,這就是基于位碼的 GraalVM 解釋器通常具有更小的內存占用的原因。
由于每個 WebAssembly 塊僅包含線性指令序列,因此 GraalWasm 能夠結合兩種解釋器方法中的最佳方法:AST 疊加在 WebAssembly 的控制流指令之上,如 if 和 loop。但是每個塊都用一個Truffle AST 節點,稱之為Wasm 塊節點,這減少了內存占用,因為每個塊中的單個指令不需要單獨的節點對象。
此外,GraalWasm 塊節點不會復制原始指令流的各個部分,而是僅將指針包含在 WebAssembly 二進制文件的字節數組中。
文本 WebAssembly、二進制 WebAssembly 與 GraalWasm AST 之間的對應關系
在此數據結構之上實現的解釋器是基于 AST 的解釋器和基于位碼的解釋器之間的混合體。在較高的控制流級別上,它在適當的基本塊之間分配。在每個基本塊中,解釋器在迭代該基本塊的操作碼的解釋循環內完成。這種設計使轉譯更容易理解,并簡化了部分評估。
運行時,解釋器和程序將傳遞到 Truffle 的局部評估引擎,然后該引擎將解釋器專門用于程序,并將專門的代碼傳遞給 GraalVM 編譯器,最終為目標平臺生成高效的匯編代碼。
關于 GraalWasm 的更多技術細節可以查看官方博客:
https://medium.com/graalvm/announcing-graalwasm-a-webassembly-engine-in-graalvm-25cd0400a7f2
開發團隊還介紹了項目接下來的發展規劃,其表示,GraalWasm 的動機之一是擴展GraalVM 的 node.js 實現支持的 API 集,WebAssembly 支持的增加將使其能夠實現加載 WebAssembly 二進制文件的 V8 兼容 API 功能。
下一步將是實現WebAssembly 系統接口(WASI),這對于在 Web 上下文外部運行 WebAssembly 程序是必需的。WASI 是一組 API,用于抽象化對各種操作系統功能的訪問,例如文件 API、網絡套接字和時鐘。
同時 GraalWasm 將專注于提高性能,初步實驗和對多個 C 微基準的性能調整表明,與以最高優化水平進行編譯的本地 GCC 二進制文件相比,GraalWasm 當前可實現約 0.5 倍至 0.75 倍的峰值性能。
另一方面是改善 GraalWasm 中的調試支持,并將其與 GraalVM 的其余部分集成。