Bringing the Web up to Speed with WebAssembly
要約
読みメモ
2017
Google, Mircrosoft, Apple, Mozillaの人の共著
JSはコンパイルターゲットとして問題点がある
WebAssembly
高速
事前コンパイルによって、最適化される
安全
モバイル上でメモリ安全で高速でないといけない
移植可能を目指す
言語やプラットフォームに依存しない
deterministic and easy to reason about
ファイルサイズが小さい
フェッチ、ロードの時間を短縮できる
JSコードはでかい
デコードが簡単
並列化
Emscripten
C/C++をJS(というかasm.js)にコンパイル
function
ファーストクラスではない
JSがembedder
JSとwasmで呼びあえる
ローカル変数と、グローバル変数
リンカはjsで書く
関数の中身
スタックに対する命令
goto命令がない
if elseコマンドがある
これのみが条件分岐
ブロック命令
do, end
loop, end
branch
ブロックに対して脱出したりするやつ
型システム
型システムのおかげで、オペランドスタックのレイアウトを静的に決定できる
ので、わざわざオペランドスタックを具体化(matelializing)せずに命令間のデータフローをコンパイルできる
いまいちわからんmrsekut.icon
traps
trapを生成する命令がある
現在の計算を中止する
全てが型を持っている
型チェックで検証
loopとかも
返り値の型
loopに入った時に新しいスタックを作るイメージ
ループを抜けた時にトップにある値を返す
残ってるスタックは破棄
自分でpopしないでいい
バイナリコードだが、可読性がある
構文と構造を持つ
ファイルサイズ、デコードの容易さを保ちながら
メモリアクセス
特徴
線形メモリ
ページ(64KiB)で一単位
最大4GiB
スタックマシン
gotoは使わなず、条件分岐など一般的なプログラミング言語のような構造化制御フローを行う
関数テーブルを持っている
indirect call
関数テーブルのn番目の関数を呼ぶ
テーブルの型は決まってない
関数を呼び出すときは型がわからない
ここは動的にチェックする
virtual callみたいな
ポリモーフィズムを実現?
shared library
vtable
load, store
nan boxing
MVP
ローンチできる最小単位まで削って出した
spider moneky
firefox のjsエンジン
v8とspidermonkeyで評価
Cの機械ごと
ロードはasm.jsより早くなった
パースとか
バイナリなので
jsと比較した
VSCodeで.wasmファイルを開く
tree viewから.wasmファイルを、右クリック>「Show WebAssembly」で開ける
関連ツールチェイン
binayen
ams.js, アセンブリ→wast
sexpr-wasm-prototype
wast → wasm
頻出人物
wastはwasmの中間言語
LLVM IRとは違うのか
LLVMのバックエンドとして、LLVM IRからasm, wastとたどってWebAssemblyを吐く abi
WebAssemblyのコンセプト
未読
gzip圧縮されたJSコードはネイティブコードと比較して十分小さい
なので、これ以上小さくすることは難しい
wasmはサイズが小さくなることを念頭に設計されたのでgzipされたものとくらべて10~20%のサイズダウンをした
WebAssemblyのコードには専用のメモリ空間が割り当てられる
JSからもArrayBufferオブジェクトとして参照できる
EmscriptenでLLVMからwasmに変換できる
Binaryen
ってなに?
設計
GC
JSのGCとは別のNative GCを実装する予定
wasmのデザインに関して
最終的にはWeb以外でも使えるようにする、など