Node.js と WebAssembly

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

WebAssembly の仕様では、.wasm 拡張子を持つバイナリ形式である WebAssembly モジュールと、.wat 拡張子を持つ対応するテキスト表現である WebAssembly Text 形式の 2 つのファイル形式が詳述されています。

主要な概念

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

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

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

WebAssembly モジュールの生成

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

  • WebAssembly (.wat) を手で書き、wabt のようなツールを使ってバイナリ形式に変換する
  • C/C++ アプリケーションで emscripten を使用する
  • Rust アプリケーションで wasm-pack を使用する
  • TypeScript のような経験を好む場合は AssemblyScript を使用する

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

使用方法

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

// Assume add.wasm file exists that contains a single function adding 2 provided arguments
const  = ('node:fs');

// Use the readFileSync function to read the contents of the "add.wasm" file
const  = .('/path/to/add.wasm');

// Use the WebAssembly.instantiate method to instantiate the WebAssembly module
WebAssembly.().( => {
  // Exported function lives under instance.exports object
  const {  } = ..;
  const  = (5, 6);
  .(); // Outputs: 11
});

OS との対話

WebAssembly モジュールは、単独では OS の機能に直接アクセスできません。この機能にアクセスするために、サードパーティ製のツール Wasmtime を使用できます。WasmtimeWASI API を利用して OS の機能にアクセスします。

リソース