我很高興地宣布 watgo - 適用於 Go 的 WebAssembly 工具套件 - 正式推出。這個專案類似於 wabt (C++) 或 wasm-tools (Rust),但完全使用 Go 語言編寫,且沒有任何外部依賴。
watgo 包含一個命令列介面 (CLI) 和一個 Go API,用於解析 WAT (WebAssembly Text)、驗證它,並將其編碼為 WASM 二進位檔案;它也支援從二進位格式解碼 WASM。
所有功能的中心是 wasmir - 一個 WebAssembly 模組的語意表示,使用者可以檢查(和操作)它。此圖表顯示了 watgo 提供的功能:
watgo 包含一個 CLI,您可以透過發出此命令來安裝:
此 CLI 旨在與 wasm-tools [1] 相容,我已經將我的 wasm-wat-samples 專案切換為使用它;例如,用於解析 WAT 檔案、驗證它並將其編碼為二進位格式的命令:
wasmir 以易於使用的 API 在語意上表示 WASM 模組。以下是使用 watgo 解析簡單 WAT 程式並進行一些分析的範例:
一個重要的注意事項:WAT 格式支援幾種語法上的便利特性,這些特性在降低到 wasmir 時會被展平/標準化。例如,所有折疊的指令都會被降低為展開的指令(線性形式),函數和類型的名稱會解析為數字索引等。這與 WASM 及其二進位表示的驗證和執行語意相符。
這些語法細節存在於 watgo 的 textformat 套件中(它將 WAT 解析為 AST),並在降低到 wasmir 時被移除。目前 textformat 套件保持內部使用,但將來如果有人感興趣,我可能會考慮公開它。
儘管 watgo 仍處於早期階段,但我對其正確性相當有信心,這歸功於從一開始就採用了非常嚴格的測試策略。
WebAssembly 附帶一個大型官方測試套件,非常適合對新實作進行端對端測試。核心測試套件包含近 20 萬行 WAT 檔案,其中包含幾個具有預期執行語意的模組,並涵蓋了各種錯誤場景。這些檔案位於特別設計的 .wast 檔案中,並利用自訂的規範解釋器。
watgo 透過使用官方測試套件進行自身測試來利用這種方法。自訂的測試工具會解析 .wast 檔案,並使用 watgo 將其中的 WAT 轉換為二進位 WASM,然後由 Node.js [2] 執行;這個測試工具本身就是一項重大的努力,但非常值得 - 結果是出色的測試覆蓋率。watgo 通過了整個 WASM 規範核心測試套件。
類似地,我們利用 wabt 的 interp 測試套件,其中也包含端對端測試,使用一個更簡單的基於 Node 的測試工具來針對 watgo 進行測試。
最後,我維護了一個 wasm-wat-samples 儲存庫中用 WAT 編寫的真實程式範例集合;watgo 也使用這些範例來測試自身。