【うぇぶあせんぶりこんぽーねんともでる】

WebAssemblyコンポーネントモデル とは?

公開:
💡 Rustで作った部品とPythonで作った部品を、型安全に接続するWasmの「規格ソケット」
📌 このページのポイント
Wasmコンポーネントモデル Rust 画像処理 Python ML推論 JavaScript UI制御 .wasm .wasm .wasm WIT(WebAssembly Interface Types) process-image(data: list<u8>) → result<Image, Error> Wasmランタイム(wasmtime / Cloudflare Workers) 型安全な呼び出し 言語の壁なし ブラウザ外でも動作
WITでインターフェースを定義し、言語をまたいでWasmコンポーネントを型安全に連携させる
ひよこ ひよこ
ペンギン先生、WebAssemblyコンポーネントモデルって何なの?
ペンギン先生 ペンギン先生
普通のWebAssemblyモジュール同士が数値と線形メモリしかやり取りできないんだよ。でもコンポーネントモデルを使うと、文字列・リスト・構造体といった高レベルなデータをモジュール間で受け渡せるようになるんだ。
ひよこ ひよこ
それがないと何が困るの?
ペンギン先生 ペンギン先生
たとえばRustで書いた画像処理ライブラリPythonのWebアプリから使いたいとき、普通は「文字列の渡し方をどうするか」「メモリのどこに書き込むか」を手動で合わせないといけないんだよ。コンポーネントモデルがあればWITというインターフェース定義言語で「この関数はstring受け取ってbytes返す」と宣言するだけで自動的に正しく連携できるんだね。
ひよこ ひよこ
WITって何の略なの?
ペンギン先生 ペンギン先生
WebAssembly Interface Typesの略だよ。APIの形(引数・戻り値の型、インターフェース名)を `.wit` ファイルに書くと、Rustなら `wit-bindgen`、Pythonなら `componentize-py` といったツールが各言語向けのバインディングコードを自動生成してくれるんだよ。
ひよこ ひよこ
ブラウザ以外でも使えるの?
ペンギン先生 ペンギン先生
WASIと組み合わせると、サーバーエッジコンピューティング環境でも動くよ。CloudflareのWorkers、Fastlyのエッジ、wasmtimeなどのランタイムがコンポーネントモデルに対応し始めていて、「一度書いてどこでも動く」がより現実的になってきているんだ。
ひよこ ひよこ
ABIの問題を解決するって聞いたけど、ABIって何なの?
ペンギン先生 ペンギン先生
Application Binary Interfaceの略で、プログラム同士がバイナリレベルでどうやってやり取りするかの約束事だよ。C++RustPythonはそれぞれABIが違うから、コンパイルしたバイナリを直接組み合わせるのが難しかったんだ。Wasmコンポーネントモデルは共通のバイナリインターフェースを定義することで、どの言語でコンパイルしても正しく連携できる仕組みを作ったんだよ。
ペンギン
まとめ:ざっくりこれだけ覚えればOK!
Wasmコンポーネントモデル」って出てきたら「言語をまたいでWasmを型安全に組み合わせる仕様」と思えればだいたいOK!
📖 おまけ:英語の意味
「WebAssembly Component Model」 = WebAssemblyコンポーネントモデル
💬 バラバラなWebAssemblyモジュールを「コンポーネント」という統一単位にまとめて、言語の壁を越えて組み合わせられるようにしたモデルだよ。
← 用語集にもどる