このページはコミュニティーの尽力で英語から翻訳されました。MDN Web Docsコミュニティーについてもっと知り、仲間になるにはこちらから。
WebAssembly
WebAssembly は現代のウェブブラウザーで実行できるコードの一種です。ネイティブに近いパフォーマンスで動作する、コンパクトなバイナリー形式の低レベルなアセンブリー風言語です。さらに、 C/C++、C# や Rust などの言語のコンパイル先となり、それらの言語をウェブ上で実行することができます。また、JavaScript と並べて実行するように設計されており、両方を一緒に動作させることができます。
WebAssembly は、 JavaScript を補完し、並べて実行するように設計されています。WebAssembly JavaScript API を使用すると、 WebAssembly モジュールを JavaScript アプリに読み込み、両者の間で機能を共有することができます。これにより、 WebAssembly のコードの書き方を知らなくても、同じアプリ内で WebAssembly のパフォーマンスとパワー、および JavaScript の表現力と柔軟性を活用することができます。
WebAssembly は、ウェブプラットフォームに大きな影響を与えます。複数の言語で記述されたコードをネイティブに近い速度でウェブ上で実行する方法を提供するだけでなく、これまで不可能だったクライアントアプリをウェブ上で実行することができるようになります。
さらに、W3C WebAssembly Working Group とコミュニティグループを介して、ウェブ標準として開発されており、主要なブラウザーベンダーも積極的に参加しています。
In this article
ガイド
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 リポジトリーを参照してください。