Slide 1

Slide 1 text

WASI 0.2のinit処理 新宿御苑.wasm #2025.2.28

Slide 2

Slide 2 text

前提の話 2 ● WASI → WebAssembly System Interface ● WASI 0.1 (プレビュー1) ○ コマンドとリアクター (ライブラリ)の2つのモジュール ● WASI 0.2 (プレビュー2) ○ 機能ごとのコンポーネント WASIに関する情報がまとまってます

Slide 3

Slide 3 text

WASI 0.1 (プレビュー1) ● コマンドモジュール ○ プログラムを実行するためのモジュール ○ エントリポイント : _start ● リアクターモジュール ○ コマンドモジュールが利用する (ライブラリ)モジュール ○ エントリポイント : _initialize 3 ランタイム (wasmtime) コマンドモジュール cli.wasm リアクターモジュール lib.wasm $ wasmtime run --preload lib=./lib.wasm cli.wasm _start = main関数 (ランタイムが実行する ) _initialize = init関数 (ランタイムが実行する ) 利用

Slide 4

Slide 4 text

ランタイム (wasmtime) WASI 0.2 (プレビュー2) ● コンポーネントモデルをベースにAPIを再定義 ○ wasi:cli プログラムのエントリーポイントの定義 ○ wasi:filesystem ファイル操作に関するコンポーネント ○ wasi:clocks 時刻に関するコンポーネント ○ wasi:random 乱数に関するコンポーネント ○ wasi:http HTTPサーバーのエントリーポイントの定義 4 コンポーネント wasi:cli コンポーネント wasi:filesystem 利用 run = main関数 incoming-handler ≒http.Handler (Go)

Slide 5

Slide 5 text

そういえば... WASI 0.2の仕様には コンポーネントの初期化に関する説明がない 5

Slide 6

Slide 6 text

● コンポーネントモデル をベースにAPIを再定義 ○ WASI 0.2以降の仕様 : https://wa.dev/wasi WASI 0.2 (プレビュー2) 6 コンポーネントモデルではWasmのABIについて定義されている 初期化の情報はコンポーネントモデルにあるはず

Slide 7

Slide 7 text

コンポーネント import コンポーネントモデルの初期化処理 ● コンポーネント内でモジュールを実行用のインスタンスに変換する時にWasmの start関数が実行される 7 モジュールB (start $func) モジュールA (start $func) インスタンスA インスタンスB start関数を実行 start関数を実行 実行 Wasmに元々ある機能 (module (func $start) (start $start) ) モジュールのwat例

Slide 8

Slide 8 text

コンポーネント import コンポーネントモデルの初期化処理 ● コンポーネント内でモジュールを実行用のインスタンスに変換する時にWasmの start関数が実行される 8 モジュールB (start $func) モジュールA (start $func) インスタンスA インスタンスB start関数を実行 start関数を実行 実行 1. 複数のモジュールを内包できる 2. インスタンス化の方法を定義できる (component (core module $ModA (start $start)) (core module $ModB (start $start)) (core instance $mod_a (instantiate $ModA)) (core instance $mod_b (instantiate $ModB (with "mod_a" (instance $mod_a)))) ) コンポーネントのwat例

Slide 9

Slide 9 text

WASI 0.1ではなぜ_initialize関数を用意したのか ● start関数は元々Wasmにある機能 おそらく... モジュールを合成しようとした時の名前の衝突が原因 9 a.c b.c a.o b.o command.wasm compile どのstart関数を採用して良いかわからない 1つのモジュールにstart関数は1つだけ コンポーネント モジュールB モジュールA インスタンスA インスタンスB コンポーネントモデルは内部で モジュールが独立している (知っている人いたら教えて )

Slide 10

Slide 10 text

WASIの初期化処理 ● WASI 0.1では_initialize関数が用意されていた ● WASI 0.2ではコンポーネント内に個別のモジュールを持つことができる ○ → Wasmのstart関数を利用して初期化を行う 10

Slide 11

Slide 11 text

WHOAMI asuka ● 株式会社モニクル/SWE ○ 技術書典17: Monicle Techbook vol.1 ● Wasm関連の同人誌・商業誌を執筆 ○ ご注文はWASIですか?? ○ Wasm Cookbook vol.2 ○ 実践入門WebAssembly ○ WebAssembly System Interface入門 ● 技術書典18 (NEXT) ○ Wasm Cookbook vol.3予定 ○ (合同誌なので参加したい人募集してます ) 11 書いた本など

Slide 12

Slide 12 text

参考文献 ● lldでwasmをリンクするまで - Qiita ● 手書きで理解するWebAssembly Component Model | 株式会社ヌーラボ(Nulab inc.) ● component-model/design/mvp/Explainer.md at main 12