9月18日、WebAssembly仕様の最新版「Wasm 3.0」がリリースされた。
Wasm 3.0は、これまでのアップデートに比べて大幅に拡張された仕様である。6年から8年にわたり準備されてきた複数の機能がついに完成に至った。以下では、主な新機能を整理する。
本記事は、以下のエキスパートに監修していただきました:
Rustエキスパート、chikoskiさんをTechFeedでフォローしよう!
Wasm 3.0の主な新機能
64ビットアドレス空間
メモリやテーブルにi64
を用いたアドレス指定が可能になり、理論上は16エクサバイトまで拡張できる。Webでは16GBに制限されるが、非Web環境では大規模アプリケーションやデータ処理に有効である。複数メモリのサポート
1つのモジュール内で複数のメモリを定義・インポート可能になり、直接コピーも可能となった。静的リンクやセキュリティ分離、バッファリングなどの用途に道を開く。ガベージコレクション(GC)
Wasmランタイムが自動管理する新しいメモリ領域を導入。低レベルながら構造体や配列型を扱えるため、JavaやKotlinなど高級言語の効率的な移植を支える基盤となる。型付き参照(Typed References)
ヒープ上の値の構造を型として正確に表現でき、ランタイムチェックを削減。関数参照にも対応し、call_ref
命令により安全かつ効率的な間接呼び出しが可能になる。末尾呼び出し(Tail Calls)
スタック消費を抑える呼び出し形式を標準化。関数型言語やランタイム内部処理の実装で重要な機構である。例外処理(Exception Handling)
これまで複雑な回避策で対応していた例外処理を、Wasmネイティブでサポート。タグ付きデータとハンドラにより効率的で移植性の高い例外処理が可能となった。Relaxed SIMD
SIMD命令に実装依存の緩やかなバリエーションを追加し、ハードウェアごとの性能最適化を実現。決定的実行プロファイル(Deterministic Profile)
浮動小数点演算やNaNの扱いなど、非決定的動作を排除。ブロックチェーンやリプレイ可能なシステムにおいて再現性と移植性を保証する。カスタム注釈構文(Custom Annotations)
テキスト形式に注釈記法を導入。バイナリのカスタムセクションを人間可読な形で表現可能になり、後方規格による拡張を容易にする。
JavaScript連携の拡張
- 文字列組み込みの深化
JavaScriptの文字列を参照型(externref
)として受け渡せるだけでなく、新しい文字列ライブラリにより、Wasm内部で直接操作できるようになった。
高級言語のターゲットとしての進化
Java、OCaml、Scala、Kotlin、Scheme、Dartなどの言語が、新しいGC機能を活用してWasmをターゲットにしやすくなった。これにより、Wasmはより幅広い言語の共通基盤としての役割を強めている。
仕様策定ツールと実装状況
今回の標準化は、新しいSpecTecツールチェーンによって策定され、信頼性が向上した。Wasm 3.0はすでに主要ブラウザに実装されており、Wasmtimeなどスタンドアロンエンジンでも対応が進んでいる。
Wasm 3.0の完成は、WebAssemblyがウェブを超えて幅広い分野で利用されるための大きな前進である。詳細はWasm 3.0 Completedを参照していただきたい。