
2026/04/11 4:03
**Watgo – Go 用 WebAssembly ツールキット**
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Summary
watgo は Go で書かれた WebAssembly ツールキットで、コマンドラインインターフェースとプログラム的 API の両方を提供し、WAT の解析、公式仕様に対する検証、WASM バイナリへのエンコード、およびバイナリからのデコードを行います。その中核コンポーネントである wasmir は、モジュールの意味的表現を提供し、再エンコードまたはソース(WAT)へ戻す前に検査・操作が可能です。
このツールキットは、カスタム Node.js ハーネスを使用して WebAssembly コアテストスイート全体(約 200 K 行の WAT)を通過し、wabt のインタープリター テストに対しても実行され、
の現実的なサンプルで試験されています。初期実験では wazero が新しい提案(Garbage Collection など)のサポート不足のため放棄されました。wasm-wat-samplesCLI の使用例:
を実行してインストールし、例えばgo install github.com/eliben/watgo/cmd/watgo@latestと実行します。watgo parse stack.wat -o stack.wasmAPI 例(示例):WAT ファイルを解析し、その関数を反復処理して i32 パラメータの数、local.get 命令、および i32.add 操作をカウントする。
内部の textformat パッケージは、WAT を AST にパースした後で wasmir に正規化しますが、現在は非公開ですが需要が高まれば公開される可能性があります。将来のリリースではテストカバレッジをさらに拡張し、追加の API 機能を導入する予定です。Go 開発者にとって、watgo はコンパイラ、ランタイム、分析ツールなど、WebAssembly モジュールを直接操作できるツールリングの可能性を開き、Go 中心プロジェクトでの WebAssembly の採用を加速させる可能性があります。
本文
Watgo – Go 用 WebAssembly ツールキット
一般公開
純粋Goで構築され、依存関係ゼロのツールキット watgo の一般公開をお知らせします。watgo は WAT(WebAssembly テキスト)を解析し、検証し、WASM バイナリにエンコードし、また WASM を内部表現へデコードすることができます。
コア概念
| 機能 | 説明 |
|---|---|
| Parse | WAT を wasmir(WebAssembly モジュールの意味的表現)に変換します。 |
| Validate | 公式 WebAssembly の検証規則を適用し、モジュールが正しく構成され安全であることを保証します。 |
| Encode | wasmir を WASM バイナリ形式へエミットします。 |
| Decode | WASM バイナリを再び wasmir に読み込みます。 |
CLI
インストールは次のコマンドで行います。
go install github.com/eliben/watgo/cmd/watgo@latest
CLI は
wasm-tools と互換性があるよう設計されています。以下は WAT ファイルを解析し、検証してバイナリ出力を書き込む例です。
watgo parse stack.wat -o stack.wasm
API
*wasmir* はモジュールの検査・操作に使えるクリーンな Go API を提供します。以下は簡単な WAT プログラムを解析し、基本的な分析を行うサンプルです。
package main import ( "fmt" "github.com/eliben/watgo" "github.com/eliben/watgo/wasmir" ) const wasmText = ` (module (func (export "add") (param i32 i32) (result i32) local.get 0 local.get 1 i32.add ) (func (param f32 i32) (result i32) local.get 1 i32.const 1 i32.add drop i32.const 0 ) )` func main() { m, err := watgo.ParseWAT([]byte(wasmText)) if err != nil { panic(err) } i32Params := 0 localGets := 0 i32Adds := 0 for _, fn := range m.Funcs { sig := m.Types[fn.TypeIdx] for _, param := range sig.Params { if param.Kind == wasmir.ValueKindI32 { i32Params++ } } for _, instr := range fn.Body { switch instr.Kind { case wasmir.InstrLocalGet: localGets++ case wasmir.InstrI32Add: i32Adds++ } } } fmt.Printf("module-defined funcs: %d\n", len(m.Funcs)) fmt.Printf("i32 params: %d\n", i32Params) fmt.Printf("local.get instructions: %d\n", localGets) fmt.Printf("i32.add instructions: %d\n", i32Adds) }
注記: WAT 形式は構文上の便利さ(折りたたみ命令、名前付き関数/型など)を持っていますが、wasmir に低減される際に正規化されます。これらの詳細は内部
パッケージに隠蔽されていますが、将来公開する可能性があります。textformat
テスト戦略
Watgo は広範なテストで高い信頼性を実現しています:
- 公式 WebAssembly テストスイート – 200 K 行近くの WAT を多数モジュールに渡し、期待される意味論とエラーケースを網羅。
カスタムハーネスは
ファイルを解析し、watgo でバイナリ WASM に変換後、Node.js で実行します。.wast - Wabt のインタープレータテストスイート – シンプルな Node ベースのハーネスで end‑to‑end テストを実施。
- 現実的プログラムサンプル –
リポジトリに保存され、内部テストでも利用。wasm-wat-samples
これらの取り組みにより、watgo は WebAssembly 仕様コアテストスイート全体を通過し、wabt のインタープレータテストとも整合性が取れています。
今後の予定
パッケージは現在内部ですが、ユーザー要望に応じて公開される可能性があります。textformat- CLI 機能を拡張し、
の機能とより近づけます。wasm-tools