WebAssembly - JavaScript API: 基礎者のガイド
こんにちは、未来のプログラミングスーパースター!? 今日は、WebAssemblyとそのJavaScript APIの世界に興味深い旅に出発します。プログラムを書いたことがないとしても心配しないでください - 私があなたの親切なガイドとして、ステップバイステップで進めます。このチュートリアルの終わりには、WebAssemblyで何をできるか驚くことでしょう!
WebAssemblyとは?
JavaScript APIに詳しくなる前に、まずWebAssemblyとは何か簡単に理解しましょう。超高速のレーシングカー(それがWebAssembly)をイメージして、あなたのウェブブラウザで爆速で走らせ、ウェブアプリケーションが雷速で動作するものです。しかし、この車を運転するには特別な鍵が必要です - それがJavaScript APIなのです。JavaScript(ウェブ開発でよく使う言語)がWebAssemblyと話し合い、制御するためのインターフェースです。
では、このAPIの異なる部分を探ってみましょう。まず、私たちのWebAssemblyコードをウェブページに取り込む方法から始めます。
fetch()ブラウザAPI: WebAssemblyモジュールを取得する
WebAssemblyを使うための最初のステップは、WebAssemblyモジュールを取得することです。これを、レーシングカーを店で買うことに例えるとします。ブラウザのAPIであるfetch()
関数を使ってこれを行います。
以下に例を示します:
fetch('my_wasm_module.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes))
.then(result => {
// WebAssemblyモジュールを使います
});
これを分解してみましょう:
-
fetch('my_wasm_module.wasm')
:この行はブラウザにWebAssemblyファイルを取得するよう指示します。 -
.then(response => response.arrayBuffer())
:レスポンスを取得すると、それをArrayBufferに変換します(ファイルの(raw)データを考えます)。 -
.then(bytes => WebAssembly.instantiate(bytes))
:そのバイト列を取り出し、WebAssemblyインスタンスを作成します(後ほど詳しく説明します)。 -
.then(result => { ... })
:最後に、私たちのWebAssemblyモジュールを使えます!
WebAssembly.compile(): モジュールを準備する
WebAssemblyファイルを取得したら、それをコンパイルする必要があります。これは、レーシングカーを組み立てて運転する前にするのと同じです。
WebAssembly.compile(wasmBuffer)
.then(module => {
// コンパイルされたモジュールを使います
});
この例では、wasmBuffer
はfetch()
コールから取得したArrayBufferです。compile()
関数はこのバッファを取り出し、使用可能なWebAssemblyモジュールに変換します。
WebAssembly.Instance: 準備が整ったモジュール
インスタンスは、運転できる準備が整った車のようです。初期化され、実行可能なWebAssemblyモジュールです。
WebAssembly.instantiate(wasmModule)
.then(instance => {
// インスタンスを使います
let result = instance.exports.myFunction(5, 3);
console.log(result);
});
ここで、wasmModule
は先ほどコンパイルしたモジュールです。instantiate()
関数はこのモジュールのインスタンスを作成します。その後、myFunction
のようなWebAssemblyモジュールのエクスポートされた関数を使うことができます。
WebAssembly.instantiate: 一括アプローチ
WebAssembly.instantiate
は、一括ショッピングのようです。バイナリコード(ArrayBuffer)またはコンパイルされたモジュールを受け取り、コンパイルされたモジュールとインスタンスの両方を返します。
WebAssembly.instantiate(wasmBuffer, importObject)
.then(result => {
const instance = result.instance;
const module = result.module;
// インスタンスとモジュールを使います
});
この例では、wasmBuffer
は我们的生のWebAssemblyコードで、importObject
はWebAssemblyモジュールにインポートされる値を含むオブジェクトです(WebAssemblyコードが呼び出すJavaScript関数など)。
WebAssembly.instantiateStreaming: スピードデーモン
最後に、instantiateStreaming
があります。これは、レーシングカーがあなたの家に届き、組み立てられて運転準備が整うのと同じです!
WebAssembly.instantiateStreaming(fetch('my_wasm_module.wasm'), importObject)
.then(result => {
const instance = result.instance;
// インスタンスを使います
});
この関数は、fetch()
とインスタンス化のステップを一つにまとめ、WebAssemblyモジュールを最速で起動する方法です。
メソッドのまとめ
ここで学んだメソッドの摘要を以下に示します:
メソッド | 説明 |
---|---|
fetch() |
WebAssemblyファイルを取得します |
WebAssembly.compile() |
WebAssemblyモジュールをコンパイルします |
WebAssembly.Instance |
WebAssemblyインスタンスを表します |
WebAssembly.instantiate |
WebAssemblyモジュールをコンパイルおよびインスタンス化します |
WebAssembly.instantiateStreaming |
フェッチ、コンパイル、インスタンス化を一つのステップで行います |
そして、ここまで!あなたはWebAssemblyとそのJavaScript APIの世界に初めてのステップを踏み出しました。コードを書くことは運転することと同じで、練習が必要ですが、すぐにプロのように情報のスーパーハイウェイを駆け巡るでしょう!
実験を続け、学びを続け、最も重要なのは、楽しむことです!もしかしたら、次回はあなたがこのクラスを教えるかもしれません!?
Credits: Image by storyset