generated at
Bringing the Web up to Speed with WebAssembly

要約
Google, MicroSoft, Apple, Mozillaの人たちの共著
ブラウザ上でバイトコードを実行する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
ブロックに対して脱出したりするやつ
breakみたいなやつ #??
型システム
型システムのおかげで、オペランドスタックのレイアウトを静的に決定できる
ので、わざわざオペランドスタックを具体化(matelializing)せずに命令間のデータフローをコンパイルできる
いまいちわからんmrsekut
traps
trapを生成する命令がある
現在の計算を中止する
全てが型を持っている
型チェックで検証
loopとかも
返り値の型
loopに入った時に新しいスタックを作るイメージ
ループを抜けた時にトップにある値を返す
残ってるスタックは破棄
自分でpopしないでいい






バイナリコードだが、可読性がある
構文と構造を持つ
ファイルサイズ、デコードの容易さを保ちながら





wasm32のバイトオーダはリトルエンディアン

メモリアクセス
特徴
線形メモリ
ページ(64KiB)で一単位
最大4GiB

スタックマシン
だが、一般的なスタックマシンとは異なる制御フローを行う
gotoは使わなず、条件分岐など一般的なプログラミング言語のような構造化制御フローを行う
spec 2.3節ちゃんと読むとおもろそう


関数テーブルを持っている
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の中間言語
可読性の高いS式
wasmの中間使用ってどこのことだ #??
LLVM IRとは違うのか

LLVMのバックエンドとして、LLVM IRからasm, wastとたどってWebAssemblyを吐く

abi

WebAssemblyのコンセプト
未読

gzip圧縮されたJSコードはネイティブコードと比較して十分小さい
なので、これ以上小さくすることは難しい
wasmはサイズが小さくなることを念頭に設計されたのでgzipされたものとくらべて10~20%のサイズダウンをした


WebAssemblyのコードには専用のメモリ空間が割り当てられる
Cなどのメモリ操作はそこに対して行われる
JSからも ArrayBuffer オブジェクトとして参照できる

EmscriptenでLLVMからwasmに変換できる


Binaryen
ってなに?

設計
ポータブルなスタックマシン
JavaScriptに比べ、構文解析と実行が高速


GC
JSのGCとは別のNative GCを実装する予定

wasmのデザインに関して
最終的にはWeb以外でも使えるようにする、など