WebAssemblyとは
WebAssembly(ウェブアセンブリー)は、ブラウザなどで高速かつ安全に実行できるよう設計された、低水準のバイナリ命令形式です。短くWasm(ワズム)と呼びます。
C、C++、Rust等のコンパイラー対象として使われるほか、任意の言語ツールチェーンがモジュールを生成できます。小型なバイナリー形式の.wasmと、人がツールで確認するテキスト形式の.watがあります。
WebAssemblyモジュールは単独でOSやファイル、ネットワークへ自由に触れません。ホストから明示的に取り込みされた機能やメモリーを通して能力を受け取ります。

モジュールを八つの要素で読む
種類、機能、メモリー、表、グローバル、取り込み、書き出し等の区間を持ちます。
種類、スタック、索引、命令の規則を満たすモジュールだけを受け入れます。
パラメーターと結果種類を持ち、オペランドスタックで値を受け渡します。
負荷・保存でアクセスし、範囲外アクセスはトラップになります。
間接呼び出し等で使う参照を索引付きの表へ置きます。
変更不可または変更可能な型付き値をインスタンス内で共有します。
機能、メモリー、表、グローバルをモジュール外から明示的に注入します。
インスタンスの機能等をJavaScriptや別モジュールから呼べるようにします。
ダウンロードから実行まで四段階ある
ブラウザーはモジュールバイトを取得し、バイナリー構造と種類のvalidation(バリデーション)を行い、ネイティブコード等へコンパイルします。次に取り込みオブジェクトと結び付けてinstantiate(インスタンシエート)し、インスタンスの書き出しを呼び出します。
ストリーミングコンパイルを使えばダウンロード完了前から検証・コンパイルを進められます。MIME種類、CORS、キャッシュ、Content Security PolicyもWeb上の読込条件です。
線形メモリーは安全なオブジェクトメモリーではない
線形メモリーは連続したバイト配列として見え、コンパイラーがスタック、ヒープ、配列、構造をその中へ配置します。命令はメモリー境界を検査し、範囲外アクセスをトラップします。
ただしモジュール内部のC・C++ プログラムに解放後使用やロジック不具合がなくなるわけではありません。サンドボックス外へ直接エスケープしにくいことと、モジュール内データが正しいことは別です。
取り込みが能力の境界になる
コアWebAssemblyは周囲環境なファイルシステム、ソケット、時計、DOMを定義しません。ブラウザーではJavaScript機能を取り込みしてDOMやWeb APIと連携し、ブラウザー外実行時ではWASI等のインターフェースと権限モデルを使う場合があります。
不要な取り込みを渡さず、引数とメモリー範囲を検証します。ホスト機能が強い権限を持てば、モジュールはその入口を通じて影響を与えられます。
JavaScriptを置き換えるものではない
JavaScriptはDOM操作、イベント処理、UI ロジック、動的データに適し、WebAssemblyは既存ネイティブコードの移植、コーデック、シミュレーション、ゲームエンジン、画像処理等の計算量の多い部分に向きます。両者は同じページで相互に呼び出せます。
文字列、オブジェクト、DOMノードを境界越しに渡すには変換や複製、共有メモリー設計が必要です。小さな呼び出しを大量に往復するとオーバーヘッドが目立つことがあります。
必ずJavaScriptより速いわけではない
バイナリーの型と構造は高速コンパイル・予測可能な実行に向きますが、アルゴリズム、メモリーアクセス、境界変換、ダウンロード大きさ、JITウォームアップ、機器によって結果は変わります。JavaScriptエンジンも高度に最適化されます。
実処理負荷で解析・コンパイル、実行、メモリー、JavaScript連携を測り、WebAssembly化によるまとめ増加とデバッグ難度も比較します。
可搬は「すべての環境で同じ外部機能」の意味ではない
コア命令とモジュール意味は可搬ですが、取り込みされるホストAPI、スレッド、SIMD、メモリー上限、セキュリティ方針は実行時の対応に依存します。機能検出と代替処理を用意します。
WebAssemblyは検証可能な可搬バイナリーモジュールです。サンドボックス、型付き命令、線形メモリー、明示的取り込み・書き出しを理解すると、速さと安全性を過大評価せず使えます。
WebAssembly 3.0のmodule、validation、execution、memory、table、import・export semantics:WebAssembly Core Specification。browserへ統合するJavaScript API:W3C「WebAssembly JavaScript Interface」