WebAssembly
WebAssembly (Wasm)
JavaScriptは遅いので、ネイティブコード並の速度を得るために作られた
特徴
仮想スタックマシンは各命令がスタックを操作する前提になってる感じのやつ
バイトコードは実行可能なバイト列
IR(Interpolation Representation; 中間表現)、中間コード
変換のルート
(任意言語)→WebAssembly(wasm)→機械語(ネイティブコード)
C/C++/Rust等のソース言語→wasm→x86 / ARM etc
アセンブリ風言語
実行ファイルサイズが小さい
言語非依存(Language Independent)
任意の言語からWebAssemblyに変換ができる仕様になっている
すべてを支配する1 つのバイナリ(one binaryto rule them all)ということが実現できるらしい
サンドボックスで実行されるので安全(Safe)
WebAssemblyといいながらブラウザじゃなくても動くように設計されている
アーキテクチャ
命令用メモリとデータメモリが分かれているもの
できないこと
DOM操作が出来ない
ファイルディスクリプタ、ネットワークソケット、システムクロック、乱数などの「OS」レベルのリソースへのアクセスは、通常Wasmからでは不可能
Wasmの仕様だけではできないので、OSの機能等にアクセスするためのツールが色々作られている。
WebAssermblyのメリット
パフォーマンス
コードサイズが小さい(Compact)
速い(Fast)
ブラウザ上でネイティブに近い実行速度
並列処理可能(Parallelizable)
デコード、検証、コンパイルを独立した並列タスクに分割できる
Streamable
意味: 《コ》〔データ形式が〕ストリーマブルな、ストリーミング可能な
動画のように一部だけダウンロードして実行といったことができる
Streamableであるということで以下が期待できる(内容が重複してそうだが列挙する)
実行の待ち時間減少、ロード時間減少
レスポンスタイムの改善
遅延が少なくなる
ポータブル(Portable)
ハードウェア非依存(Hardware Independent)
WASMにコンパイルすると、ブラウザ、デスクトップ、モバイル、サーバー等の様々な場所で動かせる
プラットフォーム非依存(Platform Independent)
ブラウザに埋め込んだり、スタンドアロン VM として実行したりできる?
言語非依存(Language Independent)
特定のプログラミング言語や、プログラミングモデル、オブジェクトモデルに依存しない
→特定のプログラミング言語や、プログラミング言語の機能等に依存しない設計になっている
→任意のプログラミング言語で実装できるように作られている
C、C++などのライブラリをブラウザで動かせる
セキュリティ
安全(Safety)
サンドボックスで実行されるので安全(Safe)
WASMのバイナリはホストから分離された環境で実行される
オープン(Open)
歴史
WebAssemblyの実装
WebAssemblyに向いているもの
その他
ここで議論しているらしい
WebAssemblyはそのままでは読めないので、人間が読めるリニアアセンブリバイトコード (Linear Assembly Bytecode) と呼ばれる既存のアセンブリ言語に相当するようなフォーマットが用意されている。
https://gyazo.com/afe402f6e97bb0bedddcc47b00a55a9a
WebAssemblyを始める
関連
確認用
Q. WebAssemblyとは
Q. WebAssemblyのメリット
Q. 仮想スタックマシン
Q. 言語非依存とはどういうことか
参考
2016-07-07
2017-08-02
2017-02-28
2017-08-02
2018-08-29
2018-11-25
2019-08-16(初出)
2019-12-10
2021-03-20
2022-02-10
2022-07-04
2022-09-30
2022-11-02
2022-12-08
メモ
2017-11-14
本