Closed5

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

ktz_aliasktz_alias

https://zenn.dev/skanehira/books/writing-wasm-runtime-in-rust

  • 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で回避した。

https://github.com/rust-lang/rustup/issues/671#issuecomment-311552541

ktz_aliasktz_alias

9章終了時点

  • 丁寧に記述されていたため、そのまま写経で問題なく動いた。

    ただ、最後にテストだとミスった時のダメージがでかいので、ユニットテストは小さめに刻んだ。

13章までで

  • スタックとコールスタックはLinkedListにしてみた
  • ループは可能な限りIteratorを使うようにしてみた。
  • i32.storeで書き込み先を指定する際、以下のようにすると簡易に記述できることを知ってそっちを採用した。
memory[from..][..to]

https://users.rust-lang.org/t/idomatic-partial-copy-with-offset/35435/2

14章

  • fd経由で標準入出力を使う関係で、ヒープにキャッシュする作りとなっている(っぽい)。
    • Fileの破棄で、fdも破棄される
  • IntoRawFdを使って、Fileからfdはぎ取ることで破棄の回避方法が見つかったため、キャッシュしない方向で実装した。
    • 都度都度、fdからFileを作り、終わったらfdはぎ取る。
    • fdからのFile構築は対してコスト高そうじゃなかったため。

https://stackoverflow.com/questions/54858018/how-do-i-write-to-a-specific-raw-file-descriptor-from-rust

  • ユニットテスト目的のため、fd_writeの第一引数にStoreを詰めたコンテキストを渡した。

14章

最後まで進めたところで大ポカに気づく。

  • Storeの関数を構成する際、importセクション -> Codeセクションの順に行わないと、順序が狂う。
    • 11章をよくよく見ると、その順になっていたが全く気づいてなかった。
ktz_aliasktz_alias

番外編

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

写経結果

https://github.com/ritalin/tiny-wasm-runtime

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