WebAssemblyをウェブ上の第一級言語にする
概要
- WebAssemblyは進化を遂げてきたが、依然としてWebプラットフォームとの統合不足が課題。
- JavaScriptがWebの第一級言語であるため、WebAssemblyは二級市民的扱いを受けている現状。
- WebAssembly Component Modelの提案により、直接Web API利用やクロス言語連携の可能性が拡大。
- 開発者体験の向上と普及拡大のためには、さらなる標準化とツール整備が鍵。
- MozillaやGoogleなどが協力して仕様策定・実装を進行中。
WebAssemblyの現状と課題
- 2017年の初リリース以降、WebAssemblyは多くの機能拡張を実現
- 共有メモリ、SIMD、例外処理、GCサポートなど多岐にわたる
- C/C++などの低レベル言語には最初から適合し、多様なアプリケーション開発を可能に
- JavaScriptとの連携が必須であり、WebAssembly単体でWeb APIを直接利用できない現状
- 開発者体験の複雑さが普及の妨げ
- JSの“scriptタグ”による簡単なコード読み込みに比べ、WasmはJS API経由での手動ロードが必要
- Web API利用時は“バインディング”や“グルーコード”の自動生成・手動記述が不可避
- 言語ごとに異なるバインディング生成が必要で、ビルドプロセスも複雑化
WebAssemblyが“二級市民”である理由
- Webプラットフォームのスクリプト層構造
- JavaScriptはWeb APIへ直接アクセス可能
- WebAssemblyはJavaScriptを介さないとWeb APIにアクセスできない
- JavaScriptの特権機能
- コードの読み込みの容易さ
- Web APIの直接利用
- Wasmの読み込みが煩雑
- scriptタグ非対応
- 手動でのAPI呼び出しが必要
- Web API呼び出し時のグルーコード負担
- 文字列や構造体のエンコード・デコード処理
- ランタイムコスト発生
- RustやC++など言語ごとに異なる対応が必要
開発者体験の壁
- WebAssemblyの導入は“高い壁”
- JavaScriptは段階的な学習曲線
- WebAssemblyは初期段階から複雑な統合作業が必要
- 標準コンパイラではWeb向けWasm生成が困難
- 公式ツールチェーンではWeb API統合のためのJS生成がされない
- サードパーティ製ツールの利用が必須
- WebのドキュメントはJavaScript前提
- JSを知らないとWeb API活用が困難
- 言語ごとのドキュメント翻訳は非効率
- Web API呼び出し時のパフォーマンス低下
- JSグルーコードのオーバーヘッド
- DOM操作時のベンチマークで45%高速化の実例あり(グルーコード省略時)
- JavaScriptレイヤーの知識が必須
- 抽象化が“漏れる”ため、結局JSの知識が必要
- 開発者の負担増加
WebAssembly Component Modelの提案
- 標準化された自己完結型実行アーティファクト
- 複数言語・ツールチェーンでのサポート
- Wasmコードの読み込み・リンク処理を自動化
- Web API利用を直接サポート
- WebAssembly Componentsの特徴
- 高レベルAPIを低レベルWasmコードで実装
- 複数言語から生成・実行可能
- クロス言語連携・再利用性向上
- Web APIへの直接アクセス
- WIT(WebAssembly Interface Types)によるAPI仕様
- 例:Console APIの直接インポート
- Rust等の言語からネイティブに利用可能
- scriptタグから直接コンポーネントをロード可能
- ハイブリッドアプリケーションにも対応
- JavaScriptとWasmコンポーネントの相互利用
- 例:画像デコーダーコンポーネントのJSからの呼び出し
次のステップと展望
- MozillaやGoogleが中心となり仕様策定・実装を推進
- JcoやWasmtimeなどのツールで試験運用が可能
- 仕様策定リポジトリで開発進行中
- 開発者・コミュニティからのフィードバック歓迎
- 今後の展望
- “パワーユーザー向け”から“全開発者向け”への進化
- WebAssemblyの真の普及とWeb開発の多様化推進
著者:Ryan Hunt
https://eqrion.net/
Ryan Huntの他の記事も参照