Slide 1

Slide 1 text

RustでWasm Runtimeを書いた

Slide 2

Slide 2 text

QSPGJMF \ OBNFΰϦϥ KPC< ΤϯδχΞ ձࣾܦӦ > MJLFT< 3VTU (P 5ZQF4DSJQU %FOP 7JN 8BTN %PDLFS LT > TOT< 9 5XJUUFS IUUQTUXJUUFSDPNHPSJMMB (JU)VCIUUQTHJUIVCDPNTLBOFIJSB [FOOIUUQT[FOOEFWTLBOFIJSB > >

Slide 3

Slide 3 text

Wasm(WebAssembly)を ご存知ですか?

Slide 4

Slide 4 text

https://developer.mozilla.org/ja/docs/WebAssembly より

Slide 5

Slide 5 text

Wasmは... 
 ブラウザでも動く仮想命令セット

Slide 6

Slide 6 text

命令セットはCPU命令の集まり x86・ARMなどがある

Slide 7

Slide 7 text

仮想命令セットは CPUに依存しない命令セット

Slide 8

Slide 8 text

RubyやJVMといった仮想マシンで動作する言語は それぞれが定義した仮想命令セットで動いている

Slide 9

Slide 9 text

Wasmの仮想命令セットは 
 ただのバイトコード

Slide 10

Slide 10 text

00000000: 0061 736d 0100 0000 0106 0160 017f 017f .asm.......`.... 00000010: 0302 0100 0707 0103 6669 6200 000a 1e01 ........fib..... 00000020: 1c00 2000 4101 4d04 7f41 0105 2000 4102 .. .A.M..A.. .A. 00000030: 6b10 0020 0041 016b 1000 6a0b 0b0a k.. .A.k..j... Wasm Runtimeで動くフィボナッチ関数のバイトコード

Slide 11

Slide 11 text

No content

Slide 12

Slide 12 text

Ruby VMやJVMのような仮想マシン を実装するのと大まか同じ(はず)

Slide 13

Slide 13 text

Wasm Runtimeは スタックベースの仮想マシン

Slide 14

Slide 14 text

というわけで実装してみた 
 https://github.com/skanehira/chibiwasm ※https://www.w3.org/TR/wasm-core-1/ の仕様まで

Slide 15

Slide 15 text

デモ

Slide 16

Slide 16 text

*.wasmが実行されるまでの流れ

Slide 17

Slide 17 text

1. wasmバイナリからRustのデータ構造に落とし込む 
 2. 1のデータ構造から実行用のデータ構造を生成する 
 3. Wasmのメモリの確保や命令処理などを行う

Slide 18

Slide 18 text

バイナリ内のデータはセクションと いう単位で別れている 例) 
 code_section 
 関数の命令群 
 memory_section メモリサイズの定義 
 data_section メモリの初期データ

Slide 19

Slide 19 text

セクションごとのデコード処理を行う デコード処理はバイナリを読み取ってRustの構造体に変換していく

Slide 20

Slide 20 text

バイナリを表現したデータ構造から実行 用のデータ構造を生成 Store 実行時に必要なインスタンスを持つ 
 例)関数やメモリのインスタンス Runtime Store以外に、値を保持するスタックと 関数呼び出しフレームを持つ VMそのものと考えてもらってOK stack 処理時の値を保持する call_stack 関数フレーム 
 関数の命令郡や引数の値、スタックポ インタなどを持つ

Slide 21

Slide 21 text

命令処理の実装を説明する前に…

Slide 22

Slide 22 text

スタックマシン 10 + 13 をスタックマシンを使って表現する場合

Slide 23

Slide 23 text

これをRustで表現する

Slide 24

Slide 24 text

*OTUSVDUJPO 
 8BTNͷ໋ྩ܈ 7BMVF 
 8BTNͰѻ͑Δ஋ 
 J΍JɺGͳͲ 3VOUJNFTUBDL 
 ॲཧ࣌ͷ஋Λอ࣋͢Δ഑ྻ 3VOUJNFFYFDVUF 
 ໋ྩΛॲཧ͢Δؔ਺ QD 
 ϓϩάϥϜΧ΢ϯλ 
 ࣍ͷ໋ྩͷ൪஍ʢΠϯσοΫεʣ

Slide 25

Slide 25 text

'SBNF 
 ؔ਺ͷݺͼग़͠ͷ౓ʹੜ੒͢Δ 
 
 ྫ͑͹ɺ" # ͷΑ͏ͳؔ਺ݺͼग़͠ 
 ͕͋Δ৔߹ɺ" ͷॲཧதʹ# ͷ໋ྩΛ 
 ॲཧ͠ɺͦΕ͕ऴΘͬͨΒ" ʹ໭Δࡍʹ 
 " ͷQDʹ໭͢ඞཁ͕͋Δ 
 ؔ਺͝ͱʹQDͱ໋ྩΛ·ͱΊͯ'SBNFͰ 
 ؅ཧ͢Δ͜ͱͰɺݺͼग़͠ݩʹ໭Δͱ͖ 
 ͷॲཧ͸'SBNFΛ੾Γସ͑Δ͚ͩͰࡁΉ

Slide 26

Slide 26 text

ͪͳΈʹ໋ྩͷ਺͸Ҏ্͋Δ 
 ͷͰϚΫϩΛۦ࢖࣮ͯ͠૷ྔΛ཈͑ͨํ ͕ྑ͍ 3VTUͷϚΫϩ͸͜͏͍͏ͱ͖ʹศརͩ ͳͱࢥ͏

Slide 27

Slide 27 text

他にも細々とした話は↓を読んで見てください https://zenn.dev/skanehira/articles/ 2023-04-23-rust-wasm-runtime

Slide 28

Slide 28 text

宣伝 同人誌「作って理解 Wasm Runtimeのしくみ」を執筆中です Rustで"Hello World"を出力できるWasm RuntimeをRustで実装し ていく本になります 来年のどこかの技術書典などに出せたらと思っています

Slide 29

Slide 29 text

ありがとうございました