Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Rustからwasmを生成してみた話

rchaser53
October 27, 2017
600

 Rustからwasmを生成してみた話

rchaser53

October 27, 2017
Tweet

Transcript

  1. Rust
    からwasm
    を作成してみた話
    @rchaser53

    View full-size slide

  2. CAUTION!
    発表内容は発表者の独自調査によるものです
    間違ってたらすみません

    View full-size slide

  3. TL;DR;
    現状Emscripten
    でwasm
    を作成したいのであれば
    LLVM
    やemcc
    の知識が大なり小なり必要

    View full-size slide

  4. はじめに
    勉強ついでに作ったRust
    のゲーム
    Emscripten
    でWeb Assembly(wasm)
    に変換してみました

    View full-size slide

  5. 出てくる単語の概要
    SDL2
    ゲームエンジンとして使用
    Rust wasm
    の変換元のアプリを作るのに使用
    Cargo Rust
    からwasm
    を作成するのに使用
    Emscripten wasm
    に変換するのに使用
    LLVM
    コンパイラ基盤。中間コード作成に使用

    View full-size slide

  6. SDL2
    Simple DirectMedia Layer 2
    クロスプラットフォームの開発ライブラリ
    OpenGl
    や様々なハードウェアへアクセスに使用
    例.
    オーディオ,
    キーボード,
    マウス etc...

    View full-size slide

  7. Rust
    今回重要なこと
    LLVM
    上に構築されている言語
    公式がwasm
    やasm.js
    にビルドする機能を提供

    View full-size slide

  8. Cargo
    Rust
    のビルドシステム兼パッケージマネージャ
    以下のような形でビルド対象を変更することができる
    (Rust
    付属のrustc
    でもできる)

    View full-size slide

  9. Rust
    単体でwasm
    のビルドは不可
    bit code
    からwasm
    に変換するEmscripten
    が必要

    View full-size slide

  10. Emscripten
    bit code
    からasm.js
    やwasm
    に変換できるコンパイラー

    View full-size slide

  11. Emscripten Compiler Frontend (emcc)
    標準的なコンパイラーの代替を目指したもの
    C
    とかC++
    からwasm
    を作る際にはこれ単体でOK

    View full-size slide

  12. Emscripten Ports
    Emscripten
    用の便利ライブラリ集
    現在12
    個しかない…
    使用する際は以下のようにport
    を開ける

    View full-size slide

  13. LLVM
    様々な言語に対応可能なコンパイラ基盤
    VM
    やClang
    など様々なサブプロジェクトが存在
    今回はRust
    の中間コード(*.bc,*.o)
    への変換に使用

    View full-size slide

  14. Rust
    製 wasm

    View full-size slide

  15. 色々おかしい
    BGM
    、効果音がない
    そもそも円じゃない

    View full-size slide

  16. 問題点
    BGM
    、効果音がない
    => emcc
    が正しく変換できていないっぽい
    そもそも円じゃない
    =>
    必要な依存ライブラリがEmscripten Ports
    にない

    View full-size slide

  17. BGM
    、効果音がない
    Emscripten
    が上手く動いていない
    File
    の読み込みまでは成功
    rwops
    がnull
    になってしまっている模様

    View full-size slide

  18. ちなみに…
    作成したアプリはtxt
    ファイルからmap
    を作成している
    任意にmap
    は変更できる
    =>
    ファイルを読み込むこと自体はできている模様

    View full-size slide

  19. FS
    Emscripten
    が提供する仮想FileSystem
    Linux/POSIX File System
    とほぼ同様のinterface
    C
    やC++
    なら以下のような形でemcc
    が使える
    emcc
    単体ではRust
    からwasm
    に変換できない…
    rustc
    やcargo
    などで中間コードを作成する必要がある

    View full-size slide

  20. しかし…
    cargo
    から--preload-file
    のオプションをemcc
    に渡せない
    => js
    上からファイルを読み込ませる
    var Module = {
    prerun: [function () {
    FS.createPreloadedFile(
    '/',
    'text1.txt',
    '/text2.txt',
    true,
    false
    )
    }]
    }

    View full-size slide

  21. 公式の見解は?
    Emscripten
    用のビルドスクリプトは作ってくれている
    新しいversion
    がrust-sdl2
    に取り込まれれば動くだろう

    View full-size slide

  22. そもそも円じゃない
    Emscripten Ports

    線や円などを描画するライブラリ「SDL2_gfx
    」がない
    => SDL2_gfx
    を外してSDL2
    が描画できる矩形で代用

    View full-size slide

  23. 自力でemscripten
    用のビルドスクリプトを書くしかない
    cargo
    はrustc
    でを実行した後にemcc
    を呼び出している
    emcc
    が読めるインプット(*.bc, *.o
    など)
    にrustc
    で変換
    emcc
    が読めるライブラリをビルドして読み込ませる

    View full-size slide

  24. まとめというか感想
    単純な変換なら特に問題なさそう
    ただし使えるライブラリがほぼない
    自力でEmscripten
    用ライブラリをビルドする必要あり
    LLVM
    とemcc
    の知識が必須

    View full-size slide

  25. まとめというか感想
    リベンジとして後日、別途公開します

    View full-size slide

  26. ご静聴ありがとうございました!

    View full-size slide