WebAssembly
WebAssembly はモダンなウェブブラウザーで実行できる新しいタイプのコードです。ネイティブに近いパフォーマンスで動作するコンパクトなバイナリー形式の低レベルなアセンブリ風言語です。さらに、 C/C++ や Rust のような言語のコンパイル対象となって、それらの言語をウェブ上で実行することができます。 WebAssembly は JavaScript と並行して動作するように設計されているため、両方を連携させることができます。
概要
WebAssembly はウェブプラットフォームに大きな影響を与えます — 以前ではできなかったようなウェブ上で動作するクライアントアプリケーションのために、複数の言語で記述されたコードをウェブ上でネイティブに近いスピードで実行する方法を提供します。
WebAssembly は JavaScript を補完、並行して動作するように設計されています — WebAssembly JavaScript API を使用して、 WebAssembly モジュールを JavaScript アプリケーションにロードし、2 つの間で機能を共有できます。これにより、WebAssembly コードの記述方法を知らなくても、 WebAssembly のパフォーマンスとパワー、JavaScript の表現力と柔軟性を同じアプリケーションで活用できます。
さらに、W3C WebAssembly Working Group と Community Group を介して、ウェブ標準として開発されており、主要なブラウザーベンダーも積極的に参加しています。
ガイド
- WebAssembly のコンセプト
- まずは WebAssembly の高レベルなコンセプト— WebAssembly とはなにか、有用性、ウェブプラットフォーム (またはそれ以上) にどのように適合するか、どのように使用するか — の理解から始めてください。
- C/C++ から WebAssembly にコンパイルする
- C/C++ で書いたコードを Emscripten のようなツールを使って .wasm にコンパイルできます。どのように動作するか確認してみましょう。
- 既存の C モジュール から WebAssembly へのコンパイル
- WebAssembly のコアユースケースは、既存のCライブラリのエコシステムを利用し、開発者が Web 上でそれらを使用できるようにすることです。
- Rust から WebAssembly へのコンパイル
- Rust コードを書いていれば、WebAssembly にコンパイルすることができます!このチュートリアルでは、Rust プロジェクトをコンパイルして既存の Web アプリケーションで使用するために知っておく必要があるすべてのことを説明します。
- WebAssembly コードのロードと実行
- .wasm を手に入れたら、この記事では、Fetch または XHR API と WebAssembly JavaScript API を組み合わせて、フェッチコンパイル、インスタンス化する方法について説明します。
- WebAssembly JavaScript API を使用する
- .wasm モジュールをロードしたら、それを使いたいでしょう。この記事では、WebAssembly JavaScript API を用いて WebAssembly を使用する方法を説明します。
- エクスポートされた WebAssembly 関数
- エクスポートされた WebAssembly 関数は、WebAssembly 関数の JavaScript リフレクションであり、JavaScript から WebAssembly コードを呼び出すことができます。 この記事では、それらが何なのか説明します。
- WebAssembly テキストフォーマットを理解する
- この記事では wasm テキスト形式について説明します。これは .wasm モジュールの低レベルなテキスト表現で、デバッグ時にブラウザーの開発者ツールに表示されます。
- WebAssembly テキストフォーマットから wasm に変換する
- この記事では、テキスト形式で書かれた WebAssembly モジュールを .wasm バイナリに変換する方法について説明します。
API リファレンス
WebAssembly
- このオブジェクトは、 WebAssembly に関連する全ての機能の名前空間として振る舞います。
WebAssembly.Global()
WebAssembly.Global
オブジェクトは JavaScript と1つ以上のWebAssembly.Module
インスタンス(のインポート/エクスポート可能な値)を横断してアクセスできるグローバル変数のインスタンスを表現します。これによって、複数モジュールでの動的リンクを実現できます。WebAssembly.Module()
WebAssembly.Module
オブジェクトにはブラウザーでコンパイルされたステートレスな WebAssembly コードが含まれており、効率的に Worker で共有したり、IndexedDB にキャッシュしたり、複数回インスタンス化したりすることができます。WebAssembly.Instance()
WebAssembly.Instance
オブジェクトはステートフルで、実行可能なModule
のインスタンスです。Instance
オブジェクトには JavaScript から WebAssembly コードを呼び出すことを許可されたエクスポートされた WebAssembly 関数が含まれます。WebAssembly.instantiateStreaming()
WebAssembly.instantiate()
関数は WebAssembly コードをコンパイル、インスタンス化するための主要な API で、Module
と、その最初のInstance
を返します。WebAssembly.Memory()
WebAssembly.Memory
オブジェクトはリサイズ可能なArrayBuffer
で、Instance
からアクセスされる生のバイト列を保持します。WebAssembly.Table()
WebAssembly.Table
オブジェクトはInstance
からアクセスされる関数参照などの不透明値のリサイズ可能な型付き配列です。WebAssembly.CompileError()
- WebAssembly
CompileError
オブジェクトを生成します。 WebAssembly.LinkError()
- WebAssembly
LinkError
オブジェクトを生成します。 WebAssembly.RuntimeError()
- WebAssembly
RuntimeError
オブジェクトを生成します。
例
- WASMSobel
- 他の多くの例については webassembly-examples レポジトリーを参照してください。
仕様書
仕様書 | 状態 | 備考 |
---|---|---|
WebAssembly JavaScript Interface | 草案 | JavaScript API の初回ドラフト定義。 |
ブラウザーの互換性
BCD tables only load in the browser