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
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
ruccho
August 09, 2025
Programming
1.2k
1
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
WebAssemblyインタプリタを書く ~Component Modelを添えて~
https://kernelvm.connpass.com/event/355100/
ruccho
August 09, 2025
More Decks by ruccho
See All by ruccho
Roslyn でフロー解析してみる
ruccho
0
560
URP の 2D Renderer と たわむれる
ruccho
0
14
Colonies
ruccho
0
670
タイルマップ拡張のススメ / Recommendation of Unity Tilemap Gotanda.unity #14
ruccho
0
3.6k
Other Decks in Programming
See All in Programming
Make SRE Operations Easier with Azure SRE Agent
kkamegawa
0
4.7k
ふつうのFeature Flag実践入門
irof
7
3.6k
生成AI時代にこそ効くGo | Why Go Works in the Age of Generative AI
mom0tomo
8
3.2k
Lemonade + Foundry Toolkit でお手軽アプリ開発
seosoft
1
310
AI 時代のソフトウェア設計の学び方
masuda220
PRO
29
12k
技術記事、AIに書かせるか、自分で書くか? 〜それでも私が自分の手で書く理由〜 / #QiitaConference
jnchito
2
1.3k
ユニットテストの先へ:テスト技法で要求・仕様を整理するJava開発実践 / Beyond_Unit_Testing_Practical_Java_Development_Techniques_for_Organizing_Requirements_and_Specifications
shimashima35
0
370
AIで効率化できた業務・日常
ochtum
0
120
TypeScript+Orvalで実現する型安全かつ堅牢でスケーラブルなマルチチャネル通知基盤 / TSKaigi Night talks ~after conference~
d0riven
0
320
Javaの型とAI時代に型が大事な理由 / java types and type in AI era
kishida
2
120
Old Dog, New Tricks: The Java 25 Reinvention - JNation
bazlur_rahman
0
150
「AIで開発し、AIを届ける」をEvalでつなぐ 〜AIネイティブに始めるプロダクト開発の実践〜 / Connecting "Develop with AI, deliver AI" with Eval
rkaga
4
4.8k
Featured
See All Featured
Side Projects
sachag
455
43k
Done Done
chrislema
186
16k
Code Review Best Practice
trishagee
74
20k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
200
KATA
mclloyd
PRO
35
15k
Designing for humans not robots
tammielis
254
26k
How To Speak Unicorn (iThemes Webinar)
marktimemedia
1
480
Darren the Foodie - Storyboard
khoart
PRO
3
3.4k
Let's Do A Bunch of Simple Stuff to Make Websites Faster
chriscoyier
508
140k
Tell your own story through comics
letsgokoyo
1
950
Navigating Team Friction
lara
192
16k
SEO for Brand Visibility & Recognition
aleyda
0
4.6k
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