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.2k
1
Share
WebAssemblyインタプリタを書く ~Component Modelを添えて~
https://kernelvm.connpass.com/event/355100/
ruccho
August 09, 2025
More Decks by ruccho
See All by ruccho
URP の 2D Renderer と たわむれる
ruccho
0
13
Colonies
ruccho
0
670
タイルマップ拡張のススメ / Recommendation of Unity Tilemap Gotanda.unity #14
ruccho
0
3.6k
Other Decks in Programming
See All in Programming
PicoRuby for IoT: Connecting to the Cloud with MQTT
yuuu
2
710
20年以上続くプロダクトでも使い続けられる静的解析ツールを求めて
matsuo_atsushi
0
100
AIエージェントで業務改善してみた
taku271
0
550
ハーネスエンジニアリングにどう向き合うか 〜ルールファイルを超えて開発プロセスを設計する〜 / How to approach harness engineering
rkaga
24
16k
Kingdom of the Machine
yui_knk
2
1.3k
Making the RBS Parser Faster
soutaro
0
630
Vibe NLP for Applied NLP
inesmontani
PRO
0
550
🦞OpenClaw works with AWS
licux
1
310
AIベース静的検査器の偽陽性率を抑える工夫3選
orgachem
PRO
4
380
Spec-driven Development: How AI Changes Everything (And Nothing)
simas
PRO
0
500
From Formal Specification to Property Based Test
ohbarye
0
550
ソフトウェア設計の結合バランス #phperkaigi
kajitack
0
170
Featured
See All Featured
Learning to Love Humans: Emotional Interface Design
aarron
275
41k
How to Get Subject Matter Experts Bought In and Actively Contributing to SEO & PR Initiatives.
livdayseo
0
110
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
49
3.4k
I Don’t Have Time: Getting Over the Fear to Launch Your Podcast
jcasabona
34
2.7k
Raft: Consensus for Rubyists
vanstee
141
7.4k
GraphQLの誤解/rethinking-graphql
sonatard
75
12k
Sharpening the Axe: The Primacy of Toolmaking
bcantrill
46
2.8k
Applied NLP in the Age of Generative AI
inesmontani
PRO
4
2.2k
Testing 201, or: Great Expectations
jmmastey
46
8.1k
How to Create Impact in a Changing Tech Landscape [PerfNow 2023]
tammyeverts
55
3.3k
SEO for Brand Visibility & Recognition
aleyda
0
4.5k
16th Malabo Montpellier Forum Presentation
akademiya2063
PRO
0
110
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