- WebAssemblyとは
- なぜWebAssemblyが必要か
[[JavaScriptのパフォーマンス上の限界 (動的型付け、JITコンパイルのオーバーヘッド)]]
[[既存のC/C++/RustなどのコードベースのWebへの移植]]
[[Web上でのCPU負荷の高い処理 (ゲーム、動画編集、科学技術計算) の実現]]
[[予測可能なパフォーマンスの提供]]
- WebAssemblyの設計目標
[[高速性 (Fast) - ネイティブに近い実行速度]]
[[効率性 (Efficient) - コンパクトなバイナリフォーマット]]
[[安全性 (Safe) - サンドボックス化された実行環境]]
[[移植性 (Portable) - プラットフォーム非依存]]
[[デバッグ可能性 (Debuggable)]]
[[JavaScriptとの協調性 (Composable)]]
- WebAssemblyとJavaScriptの関係
- WebAssemblyの主なユースケース (概観)
- Wasmモジュールの定義 (コンパイル済みのWasmコードの単位)
- モジュールの構造
[[セクション (Sections)]] (Type, Import, Function, Table, Memory, Global, Export, Start, Element, Code, Dataなど)
- インポート (Imports) (ホスト環境(JSなど)から提供される機能)
- エクスポート (Exports) (ホスト環境に公開する機能 - 関数、メモリ、テーブル、グローバル変数)
- 関数 (Functions)
- メモリ (Memory)
- テーブル (Tables)
- グローバル (Globals)
- モジュールの検証 (Validation)
- モジュールのインスタンス化 (Instantiation)
- 線形メモリ (Linear Memory)
- JavaScriptとのメモリ共有
- ポインタの概念 (Wasmにおけるポインタは線形メモリへのインデックス)
- スタックと線形メモリの関係 (Wasmの実行スタックは線形メモリとは別)
- テーブル (Tables)
- テーブルの利用例
[[関数ポインタの実装 (C/C++などから)]]
[[動的リンクの実現]]
[[JSからWasmに渡した関数の管理]]
- Wasmモジュールのロードとインスタンス化
[[WebAssembly JavaScript API]]
[[WebAssembly.instantiateStreaming() (推奨)]]
[[WebAssembly.instantiate()]]
[[WebAssembly.compileStreaming()/compile()とWebAssembly.instantiate() の組み合わせ]]
[[インポートオブジェクトの提供]]
- Wasm関数の呼び出し
[[エクスポートされた関数をJavaScriptから呼び出す]]
- JavaScript関数の呼び出し
[[インポートオブジェクトを通じてJavaScript関数をWasmから呼び出す]]
- データの受け渡し
[[数値型 (i32, i64, f32, f64) の直接的な受け渡し]]
[[複雑なデータ型 (文字列、配列、オブジェクト) の受け渡し]]
[[線形メモリを介したデータ共有]]
[[文字列のエンコード/デコード (UTF-8, UTF-16)]]
[[データのシリアライズ/デシリアライズ (JSONなど)]]
- Glue Code (グルーコード) の役割
- Emscriptenツールチェイン MOC
- C++からWasmへのコンパイラ)
[[Emscriptenのインストールと設定]]
- [[コンパイルコマンド (
emcc)]]
[[基本的なコンパイルオプション]]
[[出力形式 (.js+.wasm, スタンドアロンWasm)]]
[[最適化レベル (-O1, -O2, -O3)]]
- Emscriptenが提供する機能
[[ファイルシステムエミュレーション (MEMFS, NODEFS)]]
[[C標準ライブラリ (libc) のサポート]]
[[C++標準ライブラリ (libc++) のサポート]]
[[SDL, OpenGL (WebGL経由) などのライブラリサポート]]
[[Embind と WebIDL Binder (C++とJSの連携)]]`
[[EmscriptenにおけるJSとC/C++の相互呼び出し]] (emscripten_run_script, EM_JSマクロ)
[[既存のC/C++プロジェクトのWasmへの移植]]
- RustとWebAssemblyの親和性 (メモリ安全性、パフォーマンス、低レベル制御)
- Rust Wasmツールチェイン MOC
[[wasm32-unknown-unknown ターゲット]]
[[wasm-pack の役割と使い方 (ビルド、テスト、パッケージング)]]
[[cargo-generate を用いたプロジェクトテンプレート]]
- wasm-bindgen MOC
[[wasm-bindgenの役割 (RustとJavaScript間の高レベルな相互作用)]]
[[#[wasm_bindgen] アトリビュート]]
[[Rustの構造体とJSのクラスのマッピング]]
[[文字列、ベクタ、クロージャなどのデータ型の扱い]]
[[DOM APIやWeb APIへのアクセス]]
[[Rust Wasmプロジェクトのビルドとnpmパッケージとしての公開]]
[[Rustにおけるパフォーマンスとコードサイズの最適化 (wee_alloc, LTO, etc.)]]
[[AssemblyScript (TypeScriptライクな言語)]]
[[Blazor (C#net|/.NET)]]
[[Pyodide (Python)]]
[[SwiftWasm (Swift)]]
- Wasmが高速な理由
[[高速なパースとデコード]] (バイナリフォーマット)
[[コンパイルと最適化の効率]] (静的型付け、シンプルな命令セット)
[[ネイティブに近い実行速度]]
[[ガベージコレクションの不在 (コア仕様)]]
- WasmとJavaScriptのパフォーマンス比較
- パフォーマンス最適化
[[コンパイラ最適化フラグの活用]]
[[コードサイズの削減 (Dead Code Elimination)]]
[[JS/Wasm間の呼び出し回数の最小化]]
[[メモリ管理の最適化]]
[[SIMDの活用 (将来機能)]]
[[ストリーミングコンパイルとインスタンス化]]
[[Web上での高性能ゲーム (Unity, Unreal Engine)]]
[[クリエイティブツール (Figma, AutoCAD Web, Adobe Photoshop Web)]]
[[動画・音声処理 (Zoom, Google Meetの背景ぼかし)]]
[[データ圧縮・解凍ライブラリ]]
[[暗号化・ハッシュ計算ライブラリ]]
[[物理シミュレーションと科学技術計算]]
[[レガシーアプリケーションのWeb移植]]
[[サーバーレスコンピューティング (Cloudflare Workers, Fastly Compute@Edge)]]
[[ブロックチェーンとスマートコントラクト]]
[[プラグインシステム (Envoy ProxyのWasmフィルタ)]]
[[IoTデバイスでの利用]]
- コンパイラとツールチェイン (再掲・集約)
[[Emscripten (C/C++)]]
[[Rust Wasm toolchain (wasm-pack, wasm-bindgen)]]
[[TinyGo (Go)]]
[[AssemblyScript (TypeScript-like)]]
- Wasmランタイム (再掲・集約)
[[ブラウザ内蔵エンジン]]
[[Wasmtime]]
[[Wasmer]]
[[WAVM]]
[[Node.js]]
- 関連ライブラリとフレームワーク
[[WASIライブラリ]]
[[JS連携を容易にするライブラリ]]
- デバッグとプロファイリングツール
- パッケージレジストリ (
[[WAPM (WebAssembly Package Manager)]]など)
- オンラインWasm/WATプレイグラウンド (WABT, WebAssembly Studioなど)
- W3C WebAssembly Working Group と Community Group
- 標準化プロセスとプロポーザルの段階
- 策定中の主要な将来機能 (Post-MVP Features)
- Wasmのブラウザ外でのさらなる応用
[[サーバーサイドWasm (Krustlet - Kubernetes Kubelet in Rust for Wasm)]]
[[データベース内での実行 (UDF)]]
[[OSとしてのWasm (概念)]]
- WebAssemblyの課題と展望