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
1.1k
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
10
Colonies
ruccho
0
660
タイルマップ拡張のススメ / Recommendation of Unity Tilemap Gotanda.unity #14
ruccho
0
3.6k
Other Decks in Programming
See All in Programming
AgentCoreとHuman in the Loop
har1101
5
210
Fragmented Architectures
denyspoltorak
0
140
なるべく楽してバックエンドに型をつけたい!(楽とは言ってない)
hibiki_cube
0
140
組織で育むオブザーバビリティ
ryota_hnk
0
160
Kotlin Multiplatform Meetup - Compose Multiplatform 외부 의존성 아키텍처 설계부터 운영까지
wisemuji
0
180
re:Invent 2025 トレンドからみる製品開発への AI Agent 活用
yoskoh
0
720
Data-Centric Kaggle
isax1015
2
750
GISエンジニアから見たLINKSデータ
nokonoko1203
0
200
16年目のピクシブ百科事典を支える最新の技術基盤 / The Modern Tech Stack Powering Pixiv Encyclopedia in its 16th Year
ahuglajbclajep
5
970
高速開発のためのコード整理術
sutetotanuki
1
370
Rust 製のコードエディタ “Zed” を使ってみた
nearme_tech
PRO
0
110
CSC307 Lecture 04
javiergs
PRO
0
650
Featured
See All Featured
The AI Search Optimization Roadmap by Aleyda Solis
aleyda
1
5.2k
Have SEOs Ruined the Internet? - User Awareness of SEO in 2025
akashhashmi
0
270
State of Search Keynote: SEO is Dead Long Live SEO
ryanjones
0
110
Design and Strategy: How to Deal with People Who Don’t "Get" Design
morganepeng
133
19k
Exploring anti-patterns in Rails
aemeredith
2
240
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
170
AI Search: Implications for SEO and How to Move Forward - #ShenzhenSEOConference
aleyda
1
1.1k
Digital Projects Gone Horribly Wrong (And the UX Pros Who Still Save the Day) - Dean Schuster
uxyall
0
260
Fashionably flexible responsive web design (full day workshop)
malarkey
408
66k
Impact Scores and Hybrid Strategies: The future of link building
tamaranovitovic
0
200
コードの90%をAIが書く世界で何が待っているのか / What awaits us in a world where 90% of the code is written by AI
rkaga
59
42k
Odyssey Design
rkendrick25
PRO
1
480
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