WebAssembly
WebAssembly は現代のウェブブラウザーで実行できるコードの一種です。ネイティブに近いパフォーマンスで動作する、コンパクトなバイナリー形式の低レベルなアセンブリー風言語です。さらに、 C/C++、C# や Rust などの言語のコンパイル先となり、それらの言語をウェブ上で実行することができます。 また、JavaScript と並べて実行するように設計されており、両方を一緒に動作させることができます。
WebAssembly は、 JavaScript を補完し、並べて実行するように設計されています。WebAssembly JavaScript API を使用すると、 WebAssembly モジュールを JavaScript アプリに読み込み、両者の間で機能を共有することができます。これにより、 WebAssembly のコードの書き方を知らなくても、同じアプリ内で WebAssembly のパフォーマンスとパワー、および JavaScript の表現力と柔軟性を活用することができます。
WebAssembly は、ウェブプラットフォームに大きな影響を与えます。複数の言語で記述されたコードをネイティブに近い速度でウェブ上で実行する方法を提供するだけでなく、これまで不可能だったクライアントアプリをウェブ上で実行することができるようになります。
さらに、 W3C WebAssembly Working Group とコミュニティグループを介して、ウェブ標準として開発されており、主要なブラウザーベンダーも積極的に参加しています。
ガイド
WebAssembly ガイドでは、高水準の概念、さまざまな言語からのコンパイル、 Wasm バイナリー形式のテキスト表現、 WebAssembly の実行方法などのトピックについて説明しています。
- WebAssembly の概要
-
まずは WebAssembly の大まかな概念 — WebAssembly とはなにか、有用性、ウェブプラットフォーム (またはそれ以上) にどのように適合するか、どのように使用するか — の理解から始めてください。
- C/C++ から WebAssembly へのコンパイル
-
C/C++ で書いたコードを Emscripten のようなツールを使って Wasm にコンパイルできます。どのように動作するか確認してみましょう。
- 既存の C モジュールから WebAssembly へのコンパイル
-
WebAssembly のコアユースケースは、既存の C ライブラリーのエコシステムを利用し、開発者がウェブ上でそれらを使用できるようにすることです。
- Rust から WebAssembly へのコンパイル
-
Rust コードを書いていれば、WebAssembly にコンパイルすることができます。このチュートリアルでは、Rust プロジェクトを Wasm にコンパイルして、既存のウェブアプリケーションで使用するために知っておく必要があるすべてのことを説明します。
- WebAssembly コードの読み込みと実行
-
Wasm モジュールを手に入れた後で、この記事ではそれを読み取り、コンパイルし、インスタンス化する方法を説明します。 WebAssembly JavaScript API とフェッチまたは XHR 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 JavaScript インターフェイス
-
このオブジェクトは、 WebAssembly に関連する全ての機能の名前空間として振る舞います。
WebAssembly.Global()
-
WebAssembly.Global
オブジェクトは JavaScript と 1 つ以上のWebAssembly.Module()
インスタンス(のインポート/エクスポート可能な値)を横断してアクセスできるグローバル変数のインスタンスを表現します。これによって、複数モジュールでの動的リンクを実現できます。 WebAssembly.Module()
-
WebAssembly.Module
オブジェクトにはブラウザーでコンパイルされたステートレスな WebAssembly コードが含まれており、効率的にワーカーで共有したり、複数回インスタンス化したりすることができます。 WebAssembly.Instance()
-
WebAssembly.Instance
オブジェクトはステートフルで、実行可能なModule
のインスタンスです。Instance
オブジェクトには JavaScript から WebAssembly コードを呼び出すことを許可されたエクスポートされた WebAssembly 関数が含まれます。 WebAssembly.compile()
-
WebAssembly.compile()
関数は、WebAssembly バイナリコードをWebAssembly.Module
オブジェクトにコンパイルします。 WebAssembly.compileStreaming()
-
WebAssembly.compileStreaming()
関数は、ストリーミングされた基盤ソースからWebAssembly.Module
を直接コンパイルします。 WebAssembly.instantiate()
-
WebAssembly.instantiate()
関数を使用すると、WebAssembly コードをコンパイルしてインスタンス化することができます。 WebAssembly.instantiateStreaming()
-
WebAssembly.instantiateStreaming()
関数は WebAssembly コードをコンパイル、インスタンス化するための主要な API で、Module
と、その最初のInstance
を返します。 WebAssembly.validate()
-
WebAssembly.validate()
関数は、指定された型の WebAssembly バイナリコードの配列を検証します。 WebAssembly.Memory()
-
WebAssembly.Memory
オブジェクトはリサイズ可能なArrayBuffer
で、Instance
からアクセスされる生のバイト列を保持します。 WebAssembly.Table()
-
WebAssembly.Table
オブジェクトはInstance
からアクセスされる関数参照などの不透明値のリサイズ可能な型付き配列です。 WebAssembly.Tag()
-
WebAssembly.Tag
オブジェクトは、WebAssembly コードに対して、または WebAssembly コードから発生する WebAssembly 例外の型を定義します。 WebAssembly.Exception()
-
WebAssembly.Exception
オブジェクトは、WebAssembly から JavaScript へ、または JavaScript から WebAssembly 例外ハンドラーへ発生する実行時例外を表します。 WebAssembly.CompileError()
-
WebAssembly
CompileError
オブジェクトを生成します。 WebAssembly.LinkError()
-
WebAssembly
LinkError
オブジェクトを生成します。 WebAssembly.RuntimeError()
-
WebAssembly
RuntimeError
オブジェクトを生成します。
プロジェクトの例
- WASMSobel
- 他の多くの例については webassembly-examples リポジトリーを参照してください。