Bringing the Web up to Speed with WebAssembly
#論文
spec/pldi2017.pdf at master · WebAssembly/spec
要約
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.icon
traps
trapを生成する命令がある
現在の計算を中止する
全てが型を持っている
型チェックで検証
loopとかも
返り値の型
loopに入った時に新しいスタックを作るイメージ
ループを抜けた時にトップにある値を返す
残ってるスタックは破棄
自分でpopしないでいい
バイナリコードだが、可読性がある
構文と構造を持つ
ファイルサイズ、デコードの容易さを保ちながら
wasm32のバイトオーダはリトルエンディアン
https://qiita.com/chikoski/items/c430e7db26b1d5d3d07d
メモリアクセス
特徴
線形メモリ
ページ(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
頻出人物
kripken
wastはwasmの中間言語
可読性の高いS式
wasmの中間使用ってどこのことだ #??
LLVM IRとは違うのか
LLVMのバックエンドとして、LLVM IRからasm, wastとたどってWebAssemblyを吐く
abi
https://keens.github.io/slide/webassemblytoabi/
WebAssemblyのコンセプト
https://developer.mozilla.org/ja/docs/WebAssembly/Concepts
未読
gzip圧縮されたJSコードはネイティブコードと比較して十分小さい
http://mozakai.blogspot.com/2011/11/code-size-when-compiling-to-javascript.html
なので、これ以上小さくすることは難しい
wasmはサイズが小さくなることを念頭に設計されたのでgzipされたものとくらべて10~20%のサイズダウンをした
https://qiita.com/chikoski/items/cd59df64b4d820125864#起動の高速化
WebAssemblyのコードには専用のメモリ空間が割り当てられる
Cなどのメモリ操作はそこに対して行われる
JSからもArrayBufferオブジェクトとして参照できる
EmscriptenでLLVMからwasmに変換できる
Binaryen
ってなに?
設計
ポータブルなスタックマシン
JavaScriptに比べ、構文解析と実行が高速
GC
JSのGCとは別のNative GCを実装する予定
wasmのデザインに関して
https://github.com/WebAssembly/design
最終的にはWeb以外でも使えるようにする、など
ArrayBuffer