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 を使用できます。Wasmtime は WASI API を利用して OS の機能にアクセスします。