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
RustでWasm Runtimeを書いた in UV_Study
Search
skanehira
September 13, 2023
Programming
1
460
RustでWasm Runtimeを書いた in UV_Study
skanehira
September 13, 2023
Tweet
Share
More Decks by skanehira
See All by skanehira
build-debugger-in-rust.pdf
skanehira
1
210
Findy感謝祭2024 LT
skanehira
0
110
Rustではじめる負荷試験
skanehira
6
1.7k
Wellcome Vim World
skanehira
3
630
VimConf 2023 Tiny
skanehira
1
700
Deno Fest 2023
skanehira
0
220
RustでWasm Runtimeを書いた in WebAssembly night #11
skanehira
0
800
New Docker Compose
skanehira
5
1.3k
Vim/NeovimでGitHubを使う
skanehira
0
160
Other Decks in Programming
See All in Programming
動作確認やテストで漏れがちな観点3選
starfish719
6
1k
AWS Organizations で実現する、 マルチ AWS アカウントのルートユーザー管理からの脱却
atpons
0
130
Amazon Bedrock Multi Agentsを試してきた
tm2
1
280
『品質』という言葉が嫌いな理由
korimu
0
160
ファインディLT_ポケモン対戦の定量的分析
fufufukakaka
0
490
Grafana Loki によるサーバログのコスト削減
mot_techtalk
1
120
AWS Lambda functions with C# 用の Dev Container Template を作ってみた件
mappie_kochi
0
240
苦しいTiDBへの移行を乗り越えて快適な運用を目指す
leveragestech
0
340
Honoとフロントエンドの 型安全性について
yodaka
5
330
sappoRo.R #12 初心者セッション
kosugitti
0
240
Software Architecture
hschwentner
6
2.1k
SRE、開発、QAが協業して挑んだリリースプロセス改革@SRE Kaigi 2025
nealle
3
4.2k
Featured
See All Featured
Why Our Code Smells
bkeepers
PRO
336
57k
Put a Button on it: Removing Barriers to Going Fast.
kastner
60
3.7k
RailsConf 2023
tenderlove
29
1k
Adopting Sorbet at Scale
ufuk
74
9.2k
Speed Design
sergeychernyshev
26
790
Save Time (by Creating Custom Rails Generators)
garrettdimon
PRO
29
1k
Why You Should Never Use an ORM
jnunemaker
PRO
55
9.2k
Producing Creativity
orderedlist
PRO
343
39k
Building Better People: How to give real-time feedback that sticks.
wjessup
366
19k
The MySQL Ecosystem @ GitHub 2015
samlambert
250
12k
Site-Speed That Sticks
csswizardry
3
370
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
7
630
Transcript
RustでWasm Runtimeを書いた
QSPGJMF \ OBNFΰϦϥ KPC< ΤϯδχΞ ձࣾܦӦ >
MJLFT< 3VTU (P 5ZQF4DSJQU %FOP 7JN 8BTN %PDLFS LT > TOT< 9 5XJUUFS IUUQTUXJUUFSDPNHPSJMMB (JU)VCIUUQTHJUIVCDPNTLBOFIJSB [FOOIUUQT[FOOEFWTLBOFIJSB > >
Wasm(WebAssembly)を ご存知ですか?
https://developer.mozilla.org/ja/docs/WebAssembly より
Wasmは... ブラウザでも動く仮想命令セット
命令セットはCPU命令の集まり x86・ARMなどがある
仮想命令セットは CPUに依存しない命令セット
RubyやJVMといった仮想マシンで動作する言語は それぞれが定義した仮想命令セットで動いている
Wasmの仮想命令セットは ただのバイトコード
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で動くフィボナッチ関数のバイトコード
None
Ruby VMやJVMのような仮想マシン を実装するのと大まか同じ(はず)
Wasm Runtimeは スタックベースの仮想マシン
というわけで実装してみた https://github.com/skanehira/chibiwasm ※https://www.w3.org/TR/wasm-core-1/ の仕様まで
デモ
*.wasmが実行されるまでの流れ
1. wasmバイナリからRustのデータ構造に落とし込む 2. 1のデータ構造から実行用のデータ構造を生成する 3. Wasmのメモリの確保や命令処理などを行う
バイナリ内のデータはセクションと いう単位で別れている 例) code_section 関数の命令群 memory_section メモリサイズの定義
data_section メモリの初期データ
セクションごとのデコード処理を行う デコード処理はバイナリを読み取ってRustの構造体に変換していく
バイナリを表現したデータ構造から実行 用のデータ構造を生成 Store 実行時に必要なインスタンスを持つ 例)関数やメモリのインスタンス Runtime Store以外に、値を保持するスタックと 関数呼び出しフレームを持つ VMそのものと考えてもらってOK
stack 処理時の値を保持する call_stack 関数フレーム 関数の命令郡や引数の値、スタックポ インタなどを持つ
命令処理の実装を説明する前に…
スタックマシン 10 + 13 をスタックマシンを使って表現する場合
これをRustで表現する
*OTUSVDUJPO 8BTNͷ໋ྩ܈ 7BMVF 8BTNͰѻ͑Δ JJɺGͳͲ 3VOUJNFTUBDL
ॲཧ࣌ͷΛอ࣋͢Δྻ 3VOUJNFFYFDVUF ໋ྩΛॲཧ͢Δؔ QD ϓϩάϥϜΧϯλ ࣍ͷ໋ྩͷ൪ʢΠϯσοΫεʣ
'SBNF ؔͷݺͼग़͠ͷʹੜ͢Δ ྫ͑ɺ" # ͷΑ͏ͳؔݺͼग़͠
͕͋Δ߹ɺ" ͷॲཧதʹ# ͷ໋ྩΛ ॲཧ͠ɺͦΕ͕ऴΘͬͨΒ" ʹΔࡍʹ " ͷQDʹ͢ඞཁ͕͋Δ ؔ͝ͱʹQDͱ໋ྩΛ·ͱΊͯ'SBNFͰ ཧ͢Δ͜ͱͰɺݺͼग़͠ݩʹΔͱ͖ ͷॲཧ'SBNFΛΓସ͑Δ͚ͩͰࡁΉ
ͪͳΈʹ໋ྩͷҎ্͋Δ ͷͰϚΫϩΛۦ࣮ͯ͠ྔΛ͑ͨํ ͕ྑ͍ 3VTUͷϚΫϩ͜͏͍͏ͱ͖ʹศརͩ ͳͱࢥ͏
他にも細々とした話は↓を読んで見てください https://zenn.dev/skanehira/articles/ 2023-04-23-rust-wasm-runtime
宣伝 同人誌「作って理解 Wasm Runtimeのしくみ」を執筆中です Rustで"Hello World"を出力できるWasm RuntimeをRustで実装し ていく本になります 来年のどこかの技術書典などに出せたらと思っています
ありがとうございました