Skip to content

Node.jsとWebAssembly

WebAssemblyは、C/C++、Rust、AssemblyScriptなど様々な言語からコンパイルできる、高性能なアセンブリのような言語です。現在、Chrome、Firefox、Safari、Edge、そしてNode.jsでサポートされています!

WebAssembly仕様では、.wasm拡張子を持つWebAssemblyモジュールと呼ばれるバイナリ形式と、.wat拡張子を持つWebAssemblyテキスト形式と呼ばれる対応するテキスト表現の2つのファイル形式を詳細に説明しています。

主要概念

  • モジュール - コンパイルされたWebAssemblyバイナリ、つまり.wasmファイル。
  • メモリ - サイズ変更可能なArrayBuffer。
  • テーブル - メモリに保存されていない参照のサイズ変更可能な型付き配列。
  • インスタンス - モジュールとそのメモリ、テーブル、変数のインスタンス化。

WebAssemblyを使用するには、.wasmバイナリファイルと、WebAssemblyと通信するためのAPIセットが必要です。Node.jsはグローバルWebAssemblyオブジェクトを介して必要なAPIを提供します。

javascript
console.log(WebAssembly)
/*
Object [WebAssembly] {
  compile: [Function: compile],
  validate: [Function: validate],
  instantiate: [Function: instantiate]
}
*/

WebAssemblyモジュールの生成

WebAssemblyバイナリファイルを生成するには、複数の方法があります。これらには以下が含まれます。

  • wabtなどのツールを使用して、WebAssembly(.wat)を手動で記述し、バイナリ形式に変換する。
  • C/C++アプリケーションでemscriptenを使用する。
  • Rustアプリケーションでwasm-packを使用する。
  • TypeScriptのようなエクスペリエンスを好む場合は、AssemblyScriptを使用する。

TIP

これらのツールのいくつかは、バイナリファイルだけでなく、JavaScriptの「Glue」コードと、ブラウザで実行するための対応するHTMLファイルも生成します。

使い方

WebAssemblyモジュールがあれば、Node.jsのWebAssemblyオブジェクトを使用してインスタンス化できます。

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // エクスポートされた関数はinstance.exportsの下にあります
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // 出力: 11
})

OSとの連携

WebAssemblyモジュールは、それ自体ではOS機能に直接アクセスできません。サードパーティーツールであるWasmtimeを使用して、この機能にアクセスできます。WasmtimeWASI APIを使用してOS機能にアクセスします。

リソース