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