Slide 1

Slide 1 text

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

Slide 2

Slide 2 text

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

Slide 3

Slide 3 text

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

Slide 4

Slide 4 text

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

Slide 5

Slide 5 text

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

Slide 6

Slide 6 text

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

Slide 7

Slide 7 text

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

Slide 8

Slide 8 text

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

Slide 9

Slide 9 text

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

Slide 10

Slide 10 text

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

Slide 11

Slide 11 text

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

Slide 12

Slide 12 text

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

Slide 13

Slide 13 text

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

Slide 14

Slide 14 text

Rust 製 wasm

Slide 15

Slide 15 text

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

Slide 16

Slide 16 text

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

Slide 17

Slide 17 text

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

Slide 18

Slide 18 text

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

Slide 19

Slide 19 text

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

Slide 20

Slide 20 text

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

Slide 21

Slide 21 text

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

Slide 22

Slide 22 text

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

Slide 23

Slide 23 text

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

Slide 24

Slide 24 text

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

Slide 25

Slide 25 text

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

Slide 26

Slide 26 text

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