Wasmtime 47でGCと例外をデフォルト有効化
原題: GC and Exceptions in Wasmtime
なぜ重要か
GCと例外のデフォルト有効化により、JavaやKotlin、Dartなど多数の言語がWebAssemblyをより効率的に活用できる基盤が整い、Wasmのエコシステム拡大が加速する。
Bytecode AllianceはWebAssemblyランタイム「Wasmtime 47」を2026年7月20日にリリースし、Wasm GCプロポーザルとWasm例外プロポーザルの両方をデフォルトで有効化した。これにより、ガベージコレクションや例外処理を必要とする多数のプログラミング言語がWebAssemblyをより効率的なコンパイルターゲットとして利用できるようになる。
Bytecode Allianceは2026年7月20日、WebAssemblyランタイム「Wasmtime 47」をリリースし、Wasm GCおよびWasm例外の両プロポーザルをデフォルトで有効化したと発表した。これは複数年にわたるエンジニアリング作業の集大成だとしている。
**Wasm GCの背景と意義**
WebAssemblyの初期バージョンでは、オブジェクトと参照モデルを採用する高水準言語は、独自のガベージコレクタを.wasmバイナリに組み込む必要があった。これによりバイナリサイズの肥大化が生じ、スタックマップやスタックウォーキングなどネイティブコードで一般的なコレクタ実装技術も利用不可能だった。Wasm GCプロポーザルはこの問題を解決し、WebAssemblyに構造体・配列型とサブタイプ関係の定義を追加する。インスタンスのライフタイム管理は全てランタイムが担うため、言語ツールチェーンはランタイムのコレクタを活用できる。
**Wasm例外プロポーザルの効果**
例外機能のないWebAssemblyでは、ツールチェーンが独自の呼び出し規約を実装し、全コールサイトで正常復帰か例外スローかを判定するブランチを挿入する必要があった。これがバイナリの肥大化と実行時オーバーヘッドを招いていた。例外プロポーザルによってthrow/try/catchスタイルの構文が導入され、ランタイムは古典的なスタックアンワインド方式で実装できる。これにより正常リターンパスにゼロオーバーヘッドを実現し、実行速度の向上と.wasmバイナリサイズの縮小が可能になる。
**WasmtimeのGC実装詳細**
WasmtimeはCheney方式のセミスペースコピーコレクタを採用した。GCヒープはオブジェクト割り当て用の「アクティブ」半空間と「アイドル」半空間に分割される。コレクション時には生存オブジェクトをアイドル空間から新しいアクティブ空間にコピーし、Wasmスタックフレーム内のGCルート参照を更新する。割り当てはアクティブ半空間内のバンプポインタで行い、読み書きバリアは不要。GCヒープの実装にはWebAssemblyリニアメモリを再利用してサンドボックスを維持し、GCオブジェクトへの参照はネイティブポインタではなく32ビットインデックスで表現される。