$30 off During Our Annual Pro Sale. View Details »

RustでWasm Runtimeを書いた in UV_Study

skanehira
September 13, 2023

RustでWasm Runtimeを書いた in UV_Study

skanehira

September 13, 2023
Tweet

More Decks by skanehira

Other Decks in Programming

Transcript

  1. RustでWasm Runtimeを書いた

    View Slide

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

    View Slide

  3. Wasm(WebAssembly)を


    ご存知ですか?

    View Slide

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

    View Slide

  5. Wasmは...

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

    View Slide

  6. 命令セットはCPU命令の集まり


    x86・ARMなどがある

    View Slide

  7. 仮想命令セットは


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

    View Slide

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

    View Slide

  9. Wasmの仮想命令セットは

    ただのバイトコード

    View Slide

  10. 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で動くフィボナッチ関数のバイトコード

    View Slide

  11. View Slide

  12. Ruby VMやJVMのような仮想マシン


    を実装するのと大まか同じ(はず)

    View Slide

  13. Wasm Runtimeは


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

    View Slide

  14. というわけで実装してみた

    https://github.com/skanehira/chibiwasm
    ※https://www.w3.org/TR/wasm-core-1/ の仕様まで

    View Slide

  15. デモ

    View Slide

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

    View Slide

  17. 1. wasmバイナリからRustのデータ構造に落とし込む



    2. 1のデータ構造から実行用のデータ構造を生成する

    3. Wasmのメモリの確保や命令処理などを行う

    View Slide

  18. バイナリ内のデータはセクションと
    いう単位で別れている


    例)

    code_section

    関数の命令群

    memory_section


    メモリサイズの定義

    data_section


    メモリの初期データ

    View Slide

  19. セクションごとのデコード処理を行う


    デコード処理はバイナリを読み取ってRustの構造体に変換していく

    View Slide

  20. バイナリを表現したデータ構造から実行
    用のデータ構造を生成


    Store


    実行時に必要なインスタンスを持つ

    例)関数やメモリのインスタンス


    Runtime


    Store以外に、値を保持するスタックと
    関数呼び出しフレームを持つ


    VMそのものと考えてもらってOK


    stack


    処理時の値を保持する


    call_stack


    関数フレーム

    関数の命令郡や引数の値、スタックポ
    インタなどを持つ

    View Slide

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

    View Slide

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

    View Slide

  23. これをRustで表現する

    View Slide

  24. *OTUSVDUJPO

    8BTNͷ໋ྩ܈
    7BMVF

    8BTNͰѻ͑Δ஋

    J΍JɺGͳͲ
    3VOUJNFTUBDL

    ॲཧ࣌ͷ஋Λอ࣋͢Δ഑ྻ
    3VOUJNFFYFDVUF

    ໋ྩΛॲཧ͢Δؔ਺
    QD

    ϓϩάϥϜΧ΢ϯλ

    ࣍ͷ໋ྩͷ൪஍ʢΠϯσοΫεʣ

    View Slide

  25. 'SBNF

    ؔ਺ͷݺͼग़͠ͷ౓ʹੜ੒͢Δ



    ྫ͑͹ɺ"
    #
    ͷΑ͏ͳؔ਺ݺͼग़͠

    ͕͋Δ৔߹ɺ"
    ͷॲཧதʹ#
    ͷ໋ྩΛ

    ॲཧ͠ɺͦΕ͕ऴΘͬͨΒ"
    ʹ໭Δࡍʹ

    "
    ͷQDʹ໭͢ඞཁ͕͋Δ

    ؔ਺͝ͱʹQDͱ໋ྩΛ·ͱΊͯ'SBNFͰ

    ؅ཧ͢Δ͜ͱͰɺݺͼग़͠ݩʹ໭Δͱ͖

    ͷॲཧ͸'SBNFΛ੾Γସ͑Δ͚ͩͰࡁΉ

    View Slide

  26. ͪͳΈʹ໋ྩͷ਺͸Ҏ্͋Δ

    ͷͰϚΫϩΛۦ࢖࣮ͯ͠૷ྔΛ཈͑ͨํ
    ͕ྑ͍
    3VTUͷϚΫϩ͸͜͏͍͏ͱ͖ʹศརͩ
    ͳͱࢥ͏

    View Slide

  27. 他にも細々とした話は↓を読んで見てください


    https://zenn.dev/skanehira/articles/
    2023-04-23-rust-wasm-runtime

    View Slide

  28. 宣伝
    同人誌「作って理解 Wasm Runtimeのしくみ」を執筆中です


    Rustで"Hello World"を出力できるWasm RuntimeをRustで実装し
    ていく本になります


    来年のどこかの技術書典などに出せたらと思っています

    View Slide

  29. ありがとうございました

    View Slide