WebAssembly
https://upload.wikimedia.org/wikipedia/commons/3/30/WebAssembly_Logo.png
「wasm」は「わずむ」と濁るっぽいmrsekut.icon
ブラウザ上で動作する低水準言語
ブラウザ外で実行する動きもある
事前にコンパイルし、バイナリ形式で配布するので速い
2つの形式がある
wasmをサポートしているブラウザに組み込まれている
用途の例
軽くまとめたもの
module
配布する単位
オブジェクトファイルみたいな
関数のリスト、グローバル(変数?),テーブル、メモリなどの定義
import, exportが可能
classみたいなもの
ここからinstanceを作成する
moduleを実体化したもの
型システム
WASMモジュールの構造
のとこ
型にはそれぞれidが振られている
このidを用いて関数を型付けする
型は4種類
以下の組み合わせ
int, float
32bit, 64bit
オブジェクト、文字列は無理
論文のセクション4に書いてる
JSとの共存
以下はできる
JSからWebAssemblyのロード、実行
WebAssemblyからJS関数の呼び出し
wabt
JSファイルから読み込む
wasmファイルがブラウザ上でコンパイルして機械語に翻訳される
サイズが大きくなるとコンパイル時間も大きくなるが、従来のJSに比べれば高速
V8 v7.5からは、このコンパイル済みのモジュールがキャッシュされる
WebAssembly.compile
WebAssembly.instantiate(module)
moduleをインスタンス化したものを返す
誰かの実装してみた記事
関連ツール
以下を比較できる
C, C++のコード
wast
FireFox右上の三角をクリック
Cからwasmを作って実際にブラウザで実行するところまでできる wasmのplayground
JSとwasmを実行して比較する
サイドバーから選んで「run」する
フィボナッチとか良い感じに2倍くらい差が出る
C, Rust, AssemblyScript対応のオンラインIDE
「Build」した後に「Run」
つまりコンパイルしてwasmを吐けるビジュアルプログラミング言語
wasmの分析
WebAssemblyコンパイラを自作する ref ファイルサイズ
rust vs go
rustだいぶちいさい
fetch()などを使って動的にロードする
https://youtu.be/Ga8P_buwXnw?t=3918
wasmはめちゃくちゃ速くなるわけではないが、JSと比較して処理速度のブレが小さくなる
ブラウザをまたいでも
実際に使われているケースでは、パフォーマンス目的と言うよりは、既存のC実装のライブラリをブラウザで使用したい、といったものが多い
参考
実際はJSよりそんな爆速になるわけではない、など
jsのfetch,parse,最適化など順番にwasmと比較していてわかりやすい