Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
WebAssemblyインタプリタを書く ~Component Modelを添えて~
Search
ruccho
August 09, 2025
Programming
1
670
WebAssemblyインタプリタを書く ~Component Modelを添えて~
https://kernelvm.connpass.com/event/355100/
ruccho
August 09, 2025
Tweet
Share
More Decks by ruccho
See All by ruccho
URP の 2D Renderer と たわむれる
ruccho
0
9
Colonies
ruccho
0
640
タイルマップ拡張のススメ / Recommendation of Unity Tilemap Gotanda.unity #14
ruccho
0
3.5k
Other Decks in Programming
See All in Programming
Jakarta EE Meets AI
ivargrimstad
0
620
대규모 트래픽을 처리하는 프론트 개발자의 전략
maryang
0
120
リッチエディターを安全に開発・運用するために
unachang113
1
360
技術的負債で信頼性が限界だったWordPress運用をShifterで完全復活させた話
rvirus0817
0
670
Nuances on Kubernetes - RubyConf Taiwan 2025
envek
0
110
GitHub Copilotの全体像と活用のヒント AI駆動開発の最初の一歩
74th
7
2.2k
0から始めるモジュラーモノリス-クリーンなモノリスを目指して
sushi0120
0
250
MCP連携で加速するAI駆動開発/mcp integration accelerates ai-driven-development
bpstudy
0
280
Amazon Q CLI開発で学んだAIコーディングツールの使い方
licux
3
180
LLMは麻雀を知らなすぎるから俺が教育してやる
po3rin
3
2k
GUI操作LLMの最新動向: UI-TARSと関連論文紹介
kfujikawa
0
640
No Install CMS戦略 〜 5年先を見据えたフロントエンド開発を考える / no_install_cms
rdlabo
0
470
Featured
See All Featured
Speed Design
sergeychernyshev
32
1.1k
Dealing with People You Can't Stand - Big Design 2015
cassininazir
367
26k
A designer walks into a library…
pauljervisheath
207
24k
個人開発の失敗を避けるイケてる考え方 / tips for indie hackers
panda_program
110
19k
Stop Working from a Prison Cell
hatefulcrawdad
271
21k
Embracing the Ebb and Flow
colly
86
4.8k
Side Projects
sachag
455
43k
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
131
19k
The Language of Interfaces
destraynor
158
25k
BBQ
matthewcrist
89
9.8k
Docker and Python
trallard
45
3.5k
Why Our Code Smells
bkeepers
PRO
337
57k
Transcript
WebAssemblyインタプリタを書く ~Component Modelを添えて~ るっちょ @ruccho_vector
作ったもの • Unity (.NET) 上で動く、C#製WebAssembly?インタプリタ • Component Model?に対応 • ゲームにおける会話イベントやカットシーンなどをWasmで動かす
ゲーム開発における「スクリプト」 • ゲーム開発はエンジンの上に軽量なスクリプト環境を作りがち • アプリケーション寄りのロジックを書く • 動的なロードや実行、ホットリロードなどをサポート • 非エンジニアが書けるようにする目的も エンジン
(C++) スクリプト (C#, Lua, …)
Unityの場合 • エンジンはC++、ユーザーコードとしてC#がサポートされている • しかし、C#はスクリプトとして難点あり ◦ 一部プラットフォームではAOT制約がある (JITができない) ◦ ホットリロード機能はあるが、
よく壊れるので実質機能していない ◦ コンパイル時間が長い • 新たなスクリプトレイヤーが欲しい! C++ C# スクリプト (WebAssembly)
WebAssembly (Wasm) • 特定のOSやCPUに依存しない仮想の命令セットとバイナリ形式 • Rust, C/C++, Java, Go, C#など様々な言語をWasmにコンパイルできる
👉言語非依存なスクリプト環境をUnity上に作れるのではないか
余談:ほかの選択肢 • Lua ◦ 組み込みが容易で、昔からゲーム向けスクリプト環境として人気 ◦ 動的型付け、エディタ補完の弱さから敬遠 • ビジュアルスクリプティング ◦
これを作る前に3回ビジュアルスクリプティング環境を自作した 結論、なんだかんだでテキストは強い
WebAssemblyインタプリタを書く
① モジュールのデコード • ヘッダ+セクションのシンプルな構成 • LEB128 (整数の可変長バイナリ表現) が多用される • 仕様見ながら地道に書く
ヘッダ Type Section Import Section Function Section Table Section Memory Section Global Section Export Section Start Section Code Section Data Section
② 命令のデコード・挙動の実装 • 数が多いのでデコーダは自動生成で実装 • とりあえずWasm 1.0まで実装 ◦ 2.0にはSIMDなど含まれる https://pengowray.github.io/wasm-ops/
③ VM • ハーバードアーキテクチャ ◦ 関数にはインデックスベースで飛ぶ • スタックマシン • ブロック単位の遷移
• 型はi32, i64, f32, f64の4種類 ◦ ※Wasm 1.0の場合 • 独自機能としてプリエンプティブなグリーンスレッドをサポート ◦ C#側の非同期関数をWasmから同期的に呼べる ◦ 会話イベントなど作るうえで便利
④テスト • 公式テストスイートがある
動いた!しかし…… • 素のWebAssemblyはFFIがたいへんやりにくい! • FFIでの引数・戻り値の型はi32, i64, f32, f64の4種類のみ ◦ それ以外のデータは線形メモリを介して渡す必要がある
• 線形メモリを介した任意長データの渡し方が十分に定義されていない ◦ 線形メモリ上のデータレイアウト、確保・解放の方法やタイミングなど ◦ つまり標準的なABIがない • 実用的には、FFI用のグルーコード生成が必要になる
その悩み、 WebAssembly Component Modelが 解決します
WebAssembly Component Model • Wasmのハイレベルなinteroperabilityを実現するための仕様 • 文字列、配列、構造体など複雑な値を扱うためのCanonical ABIがある ◦ 引数や戻り値はCanonical
ABIに従ってやりとりされる • WASI preview 2以降はComponent Modelに則って定義される • 将来的にはWasmコンポーネントをレジストリに公開して依存解決する、 みたいなのも目指している ◦ wa.devというパッケージレジストリが既にあったりする
利用者から見たComponent Model • WITという専用のDSLを使う ◦ Wasmコンポーネントが公開する関数のシグネチャや、そこで使われる データ型を定義するもの
利用者から見たComponent Model • WITから各言語向けのバインディングを自動生成する • コンパイルしたWasmモジュールにメタデータを付与してコンポーネントに 変換する WIT ゲストソース (Rust,
Go, …) バインディング 素のWasm Wasm Component
ランタイムから見たComponent Model • Wasmコンポーネントは独自のバイナリ仕様を定義している ◦ 素のWasmバイナリに様々なメタデータを付与する ◦ つまり、新たにデコーダが必要 • FFIでCanonical
ABIを実装する必要がある ◦ 配列や構造体、複雑な値をWasmの線形メモリにシリアライズしたり、 逆にデシリアライズしたり
Component Modelに対応できた! • 文字列とかカジュアルに渡せるようになった ◦ ゲームの会話イベントで必須なメッセージ本文の受け渡しなど活用範囲は広い • Component Model 対応の詳しい話は記事に書いています
◦ Component Model な Wasm ランタイムを作った https://zenn.dev/ruccho/articles/7aad0b660377ae
👈 Unity (C++) の上で動く C# の上で 動く Rust (Wasm)
Component Modelの普及状況 • ゲスト言語向けのツーリングは充実しつつある ◦ Rust, Go, C/C++, C#あたりは動く ◦
moonbit (Wasmをメインターゲットとした新興言語) も注目 • 実行環境のサポートはまだまだ ◦ wasmtime ◦ ブラウザはまだ非対応
WebAssemblyインタプリタを書く ~Component Modelを添えて~ るっちょ @ruccho_vector