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 オブジェクトを生成します。

プロジェクトの例

仕様書

Specification
WebAssembly JavaScript Interface
# webassembly-namespace
WebAssembly JavaScript Interface
# ref-for-syntax-numtype①⓪
Unknown specification
Unknown specification
Unknown specification
Unknown specification
WebAssembly Core: Garbage Collection
# garbage-collection①
Unknown specification
Unknown specification
WebAssembly JavaScript Interface
# dom-globaldescriptor-mutable
Unknown specification
Unknown specification
Unknown specification
Unknown specification
Unknown specification

ブラウザーの互換性

webassembly.api

webassembly.BigInt-to-i64-integration

webassembly.bulk-memory-operations

webassembly.exception-handling

webassembly.extended-constant-expressions

webassembly.fixed-width-SIMD

webassembly.garbage-collection

webassembly.multiMemory

webassembly.multi-value

webassembly.mutable-globals

webassembly.non-trapping-float-to-int-conversions

webassembly.reference-types

webassembly.sign-extension-operations

webassembly.tail-calls

webassembly.threads-and-atomics

関連情報