WebAssemblyざっくり概要
2019/5/24
tryangle勉強会
動機
kansai.ts (6/10) で何を発表するか迷ってる
WebAssembly関連
コンパイラなど言語処理系周り
Reactなど実践的なもの
○○作ってみた
etc.
WebAssemblyあまりしらないので調べてみた
WebAssemblyの概要
ブラウザ上で動作する低水準言語
主要ブラウザベンダーが協働で使用策定
Google, MS, Mozilla, Apple, LLVM, Unityなど
WebAssemblyをサポートした言語で書かれたコードをWebブラウザ上で実行できる
関連
Documet
github
WASI
歴史
JavaScriptが遅いと言われた
asm.jsが登場
WebAssemblyが登場
JavaScriptが遅いと言われた
動的型付け
実行前にコンパイルできず、実行時に逐一
フェッチ時間やコンパイル時間が大きくなった
JS自体の最適化の難しさが顕在化
asm.jsが登場
2013年
上の問題を解決するためにMozillaが開発
JavaScriptのサブセット
型の付け方が面白い
+hogeはdouble
hoge | 0はint
Emscriptenを使ってC, C++コードをasm.jsにコンパイルできる
頑張れば手書きもできる
asm.jsを実行の直前にネイティブコードにコンパイルして実行する
asm.jsの課題
Emscriptenを使って生成されたasm.jsのファイルサイズが大きくなりがち
ファイルサイズ増大による
通信量の増加
構文解析時間の増加
ネイティブコードへのコンパイル時間の増加
Mozilla以外も頑張ってた
GoogleのPNaCl
MicroSoftのActiveX
etc.
そして、所要ブラウザベンダーが協力してWebAssemblyの仕様を策定した
Google, Mircrosoft, Apple, Mozillaの人が共著した論文
FireFox 52, Google Chrome 57でサポートされた
たしか、EdgeやSafariもすでに動くはず
コードを見てみる
アセンブリ言語よりも可読性がある
Lispのような括弧でノードを表すS式
code:wast
(func $func (param i32 i32) (result i32) (local.get 0))
(type $check (func (param i32 i32) (result i32)))
(table funcref (elem $func))
(func (export "as-call_indirect-first") (result i32)
(block (result i32)
(call_indirect (type $check)
(loop (result i32) (i32.const 1)) (i32.const 2) (i32.const 0)
)
)
)
wasm自体の特徴
スタックマシン
全てに型がある
型は4種類のみ
整数、浮動小数点数
それぞれ32bit, 64bit
goto命令がない
if, elseで条件分岐
単位はmodule
JSとwasmで相互にやりとりができる
なんで速いのか
ファイルサイズが軽量
バイナリ形式で配布する
構文解析をする時間がいらない
ロードタイムを速くする
事前にコンパイル
事前に型が決まるので高速
この過程で最適化ができる
用途
JS以外の言語のプログラムをブラウザで実行したい
フロント、バックエンドを同じ言語で書ける
再利用とかうれしい
https://nulab.com/ja/blog/nulab/rust-yew-webassembly-kanban-app/
Rustのyewというフレームワークを使ってフロントもバックもRustで作ったものの記事
Canvas, WebGL
重たい計算処理
圧縮、暗号、画像処理
ゲームプラットフォームのブラウザ上への構築
サポートしている言語
C, C++
Emscriptenを使う
Rust
rustc
Swift
LLVMを使った言語はemscriptenで生成可能
asm.js
binaryenでコンパイル
C#
Go
Kotlin]Native
TypeScript
AssemblyScript
Python
pyodide
関連ツール
The WASM Explorer
以下を比較できる
C, C++のコード
wast
FireFox x86 アセンブリ言語
LLVM x86 アセンブリ言語
JavaScript vs WebAssembly easy benchmark
JSとwasmを実行して比較する
WebAssembly Studio
Mozilla製のC, Rust, AssemblyScript対応のオンラインIDE
Blockly  |  Google Developers
Blockly向けのAssemblyScriptコードジェネレータ
つまりコンパイルしてwasmを吐けるビジュアルプログラミング言語
AssemblyScriptとは
TypeScriptのコードをWebAssemblyに変換できる
TypeScriptのサブセット
AssemblyScriptを試す
examplesにライフゲームが用意されているのでやってみる
cloneしてくるのが面倒なのでgitpodを使う
素直にやるとエラーが出るので、issueにあったやり方で進める
$ npm install --save-dev github:AssemblyScript/assemblyscript
$ npm run asbuild
$ npm run server
うごかんやんけ!mrsekut.icon
おわり