概要
- WASI 0.3 が公式リリースされ、 WebAssembly Components でasyncがネイティブ対応
- WASI Subgroup がWASI 0.3.0を承認、仕様は安定版として確定
- Component Model のasyncプリミティブに基づく新しいABI設計
- 言語バインディング 生成やマイクロサービス連携が大幅に簡素化
- 今後、各種ツールチェーンやランタイムで WASI 0.3 サポートが拡大予定
WASI 0.3正式リリースとネイティブAsync対応
- WASI 0.3.0 が公式リリース、WebAssembly Component Modelの asyncプリミティブ に基づく設計
- 仕様が 安定版 となり、今後のプログラム互換性が保証
- wasi:io (WASI 0.2で利用されていたpollables、input-streams、output-streams)は、Component Modelの 標準ABI に統合
- これにより、 インターフェースの記述や署名が簡素化、ほとんどの変更は機械的なもの
- asyncプリミティブ (stream<T>、future<T>、async)がComponent Modelの標準ABIとして導入
Component ModelのAsync ABIとイベントループの統合
- WASI 0.2では 各コンポーネントが独自のイベントループ/asyncランタイム を必要とした
- WASI 0.3では ホスト側が単一イベントループ を管理し、全コンポーネントで共有
- stream<T> と future<T> はリソース型のように所有権を持つハンドルとして動作
- ランタイムがスケジューリング を制御し、値がfutureに届いた時点で対応タスクを実行
- asyncモデルは完了ベース であり、Linuxのio_uringやWindowsのIOCP/IoRingに類似
- async関数のエクスポート/インポート が直接可能となり、WASI 0.2のstart/finish/subscribe手順が不要に
WASI 0.2から0.3へのインターフェース変更
- 0.2でのasync対応のための複雑な記述が、 0.3ではネイティブasync化により大幅に簡素化
- 例:
- WASI 0.2 :resource pollable → WASI 0.3 :future<T>
- WASI 0.2 :resource input-stream/output-stream → WASI 0.3 :stream<u8>
- WASI 0.2 :pollやsubscribe → WASI 0.3 :futureへのawaitやasync関数の直接返却
- ストリームの状態管理 も改善され、エラーとクローズの区別が容易に
言語バインディングの進化
- Component Model により、各言語向けの asyncバインディング生成 が容易に
- 例: wasi:http/handler インターフェースはasync関数としてRustのtraitにマッピング
- Rustでは wit-bindgen クレートでasync fnとして実装可能
- Python、JavaScript、C#、C などでもasync対応バインディングが進行中
- Go ではgoroutineによる仮想スレッドで非同期/同期呼び出しの変換が可能
- componentize-go を利用し、HTTPサーバの非同期ストリーミング実装が可能
WASI 0.3でのwasi:httpインターフェースの刷新
- wasi:http は機械的な変換だけでなく、 コア抽象の再設計 を実施
- wasi:http/service と wasi:http/middleware の2つのworldを提供
- service :HTTPクライアント/ハンドラの基礎
- middleware :他のハンドラへリクエストを転送できる拡張
- サービスチェイニング が可能となり、 マイクロサービス間の連携が高効率化
- 通信遅延がミリ秒単位からナノ秒単位へと大幅短縮
今後の展望とまとめ
- WASI 0.3 は WASI Subgroup の承認を経て安定版リリース
- Wasmtime 45/46 や jco など主要ランタイム・ツールチェーンが順次対応
- Rust、Go、JavaScript、Python など多様な言語でのサポート拡大見込み
- WebAssembly Components の学習には「Wasm Component Model book」が推奨
- 詳細な変更点 はWASI 0.3.0リリースノートを参照
- 今後のロードマップ や1.0化の情報は「The Road to Component Model 1.0」で確認可能
- コミュニティ主導 による開発、ツールチェーン・ランタイム貢献者やユーザーに感謝
- ネイティブasync と コンポーザビリティ が標準となり、あらゆる言語で同じプリミティブが利用可能な新時代の到来