WebAssembly
WebAssembly (Wasm)
JavaScriptは遅いので、ネイティブコード並の速度を得るために作られた
asm.jsでは性能の限界があるため作られた(はず)
特徴
仮想スタックマシンなバイトコードフォーマットで、ネイティブコードを出力するための中間言語(IR)
仮想スタックマシンは各命令がスタックを操作する前提になってる感じのやつ
バイトコードは実行可能なバイト列
IR(Interpolation Representation; 中間表現)、中間コード
変換のルート
(任意言語)→WebAssembly(wasm)→機械語(ネイティブコード)
C/C++/Rust等のソース言語→wasm→x86 / ARM etc
アセンブリ風言語
≠ 機械語
実行ファイルサイズが小さい
前身のasm.jsでは字句解析が必要だったが、字句解析が不要になっている
GCが不要
言語非依存(Language Independent)
任意の言語からWebAssemblyに変換ができる仕様になっている
すべてを支配する1 つのバイナリ(one binaryto rule them all)ということが実現できるらしい
サンドボックスで実行されるので安全(Safe)
WebAssemblyといいながらブラウザじゃなくても動くように設計されている
design/NonWeb.md at main · WebAssembly/design
アーキテクチャ
ハーバード・アーキテクチャであるらしい
命令用メモリとデータメモリが分かれているもの
仮想スタックマシン
できないこと
DOM操作が出来ない
ファイルディスクリプタ、ネットワークソケット、システムクロック、乱数などの「OS」レベルのリソースへのアクセスは、通常Wasmからでは不可能
Wasmの仕様だけではできないので、OSの機能等にアクセスするためのツールが色々作られている。
WebAssembly System Interface(WASI)
WebAssermblyのメリット
Introduction — WebAssembly 2.0 (Draft 2023-07-24)から独自に分類する
パフォーマンス
コードサイズが小さい(Compact)
速い(Fast)
ブラウザ上でネイティブに近い実行速度
並列処理可能(Parallelizable)
デコード、検証、コンパイルを独立した並列タスクに分割できる
Streamable
意味: 《コ》〔データ形式が〕ストリーマブルな、ストリーミング可能な
動画のように一部だけダウンロードして実行といったことができる
Streamableであるということで以下が期待できる(内容が重複してそうだが列挙する)
実行の待ち時間減少、ロード時間減少
レスポンスタイムの改善
遅延が少なくなる
UXの向上
Well-defined
形式手法を使って破綻なく作られている
→WebAssembly 形式手法
ポータブル(Portable)
ハードウェア非依存(Hardware Independent)
WASMにコンパイルすると、ブラウザ、デスクトップ、モバイル、サーバー等の様々な場所で動かせる
プラットフォーム非依存(Platform Independent)
ブラウザに埋め込んだり、スタンドアロン VM として実行したりできる?
言語非依存(Language Independent)
特定のプログラミング言語や、プログラミングモデル、オブジェクトモデルに依存しない
→特定のプログラミング言語や、プログラミング言語の機能等に依存しない設計になっている
→任意のプログラミング言語で実装できるように作られている
C、C++などのライブラリをブラウザで動かせる
セキュリティ
安全(Safety)
サンドボックスで実行されるので安全(Safe)
WASMのバイナリはホストから分離された環境で実行される
メモリ安全
eBPFを安全に利用することができる?
オープン(Open)
歴史
→WebAssembly 歴史
WebAssemblyの実装
→WebAssemblyの実装
WebAssemblyに向いているもの
→WebAssemblyに向いているもの
その他
ここで議論しているらしい
WebAssembly Community Group
WasmExplorer
WATというS式なテキストフォーマットがある
WebAssemblyはそのままでは読めないので、人間が読めるリニアアセンブリバイトコード (Linear Assembly Bytecode) と呼ばれる既存のアセンブリ言語に相当するようなフォーマットが用意されている。
https://gyazo.com/afe402f6e97bb0bedddcc47b00a55a9a
ref: WebAssembly - Wikipedia
WebAssemblyを始める
WebAssemblyでHello World
WebAssembly 学習
WebAssemblyの概念
関連
『法律専門家のためのWebAssembly ライセンス・コンプライアンスにおける現在のパラメータを探る』
WAT
WABT
AOTコンパイラ
IEEE 754
Canonical ABI
WebAssembly Interface Type(WIT)
確認用
Q. WebAssemblyとは
Q. WebAssemblyのメリット
Q. 仮想スタックマシン
Q. 言語非依存とはどういうことか
参考
MDNのドキュメント: WebAssembly | MDN
WebAssembly -webassembly.org-
Use Cases - WebAssembly
WebAssembly High-Level Goals - WebAssembly
WebAssembly 2.0
Introduction — WebAssembly 2.0 (Draft 2023-07-24)
Text Format: Text Format — WebAssembly 2.0
WebAssembly 開発環境構築の本 | WebAssembly 入門
WebAssemblyのメカニズム
2016-07-07
Webブラウザで高速な演算を可能にする低水準言語asm.jsと、WebAssembly詳解ーJavaScript が動く仕組み | HTML5Experts.jp
2017-08-02
【WebAssembly初心者必読】バイナリコードを使って「 WebAssembly 」の基礎を徹底解説してみた! | 株式会社ヌーラボ(Nulab inc.)
2017-02-28
What makes WebAssembly fast? - Mozilla Hacks - the Web developer blog
2017-08-02
【WebAssembly初心者必読】バイナリコードを使って「 WebAssembly 」の基礎を徹底解説してみた! | 株式会社ヌーラボ(Nulab inc.)
2018-08-29
WebAssembly: 「なぜ」と「どうやって」 【翻訳記事】 - DEV Community
2018-11-25
コンパイルターゲット言語としてのWebAssembly、そしてLINEでの実践
2019-08-16(初出)
★WebAssemblyとは - Qiita
2019-12-10
WebAssemblyがW3Cの勧告に到達。「WebAssembly Core Specification 」「WebAssembly Web API」「WebAssembly JavaScript Interface 」の3つ - Publickey
2021-03-20
WebAssemblyはJVMやeBPFのリバイバルではない WasmがWeb以外でもアツい理由 - ログミーTech
WebAssemblyのWeb以外のことぜんぶ話す
[Mar 20]Kernel/VM探検隊online part2 - YouTube
2022-02-10
★WebAssembyについて - YouTube
2022-07-04
WebAssembly入門 ─ Webフロントエンドの現実的なユースケースを知り、Wasm製アプリケーションを体験してみよう! - エンジニアHub|Webエンジニアのキャリアを考える!
2022-09-30
興味のおもむくままにWASM/WASIらへん
2022-11-02
Wasmでできること、できそうなこと | κeenのHappy Hacκing Blog
2022-12-08
kateinoigakukunがプログラムに興味を持ったきっかけ、Wasmとの出会い。深掘りRubyKaigi 2022 with ko1 & kateinoigakukun 文字起こしレポートvol.1 - STORES Product Blog
メモ
Google - The Web Can Do What!? | Bring code from other platforms into the browser
WebAssembly Archives - Mozilla Hacks - the Web developer blog
WebAssemblyはなぜ速いのか | POSTD. 2017-11-14
本
★『入門WebAssembly』
『ハンズオンWebAssembly』
WEBASSEMBLY - What's the right thing to write? #WebAssembly - Qiita. 2023-05-26
ベテラン Kubernetes エンジニアの目から見た WebAssembly の未来 | HackerNoon. 2023-06-21.
#programming_language