Closed5
「RustでWasm Runtimeを実装する」で遊ぶ

-
rust - rustc 1.80.0-nightly (b1ec1bd65 2024-05-18)
- ちょっと古い
Nightly
だと以下のエラーが出た
error[E0658]: use of unstable library feature 'proc_macro_c_str_literals'
- ちょっと古い
あと、色々環境いじりすぎたせいか、rustup update
で以下のようなエラー出た。
~/.cargo/bin/rustup-init': No such file or directory (os error 2)
以下のissue
に従い、rustup self update
で回避した。

9章終了時点
-
丁寧に記述されていたため、そのまま写経で問題なく動いた。
ただ、最後にテストだとミスった時のダメージがでかいので、ユニットテストは小さめに刻んだ。
13章までで
- スタックとコールスタックはLinkedListにしてみた
- ループは可能な限りIteratorを使うようにしてみた。
-
i32.store
で書き込み先を指定する際、以下のようにすると簡易に記述できることを知ってそっちを採用した。
memory[from..][..to]
14章
-
fd
経由で標準入出力を使う関係で、ヒープにキャッシュする作りとなっている(っぽい)。-
File
の破棄で、fd
も破棄される
-
-
IntoRawFd
を使って、File
からfd
はぎ取ることで破棄の回避方法が見つかったため、キャッシュしない方向で実装した。- 都度都度、
fd
からFile
を作り、終わったらfd
はぎ取る。 -
fd
からのFile
構築は対してコスト高そうじゃなかったため。
- 都度都度、
- ユニットテスト目的のため、
fd_write
の第一引数にStore
を詰めたコンテキストを渡した。
14章
最後まで進めたところで大ポカに気づく。
-
Store
の関数を構成する際、import
セクション ->Code
セクションの順に行わないと、順序が狂う。- 11章をよくよく見ると、その順になっていたが全く気づいてなかった。

WASM Playground
WAT
フォーマットで入力すると、コンパイル結果を表示してくれる
WASM Opcode一覧

番外編
- 書籍とは手順を変え、
i32.sub
、i32.lt_s
、、if
、return
return
、if
の順に、ひとつずつデコードと実行の組みを実装していく。-
return
があるとif
のテストが書きやすくなるため順番を入れ替えた。
-

写経結果
- FrameとStackはmoveセマンティクス(引数と戻り値の一方通行)にした。
- Runtimeからは取り外し
- コールスタックの巻き戻しは、Return/Endではなく、executeのループ抜け出した際に。
- 関数を呼び出すごとに無限ループに囚われ、実コールスタックが深くなり続けるため。
-
clap
でコマンドライン引数を受け付けるようにした。
このスクラップは2024/05/23にクローズされました