Skip to content

Node.js с WebAssembly

WebAssembly — это высокопроизводительный язык, похожий на ассемблер, который может быть скомпилирован из различных языков, включая C/C++, Rust и AssemblyScript. В настоящее время он поддерживается Chrome, Firefox, Safari, Edge и Node.js!

Спецификация WebAssembly описывает два формата файлов: бинарный формат, называемый WebAssembly Module с расширением .wasm, и соответствующее текстовое представление, называемое WebAssembly Text format с расширением .wat.

Ключевые концепции

  • Модуль — скомпилированный бинарный файл WebAssembly, то есть файл .wasm.
  • Память — изменяемый ArrayBuffer.
  • Таблица — изменяемый типизированный массив ссылок, не хранящихся в памяти.
  • Экземпляр — экземпляр Модуля с его Памятью, Таблицей и переменными.

Для использования WebAssembly необходим бинарный файл .wasm и набор API для взаимодействия с WebAssembly. Node.js предоставляет необходимые API через глобальный объект WebAssembly.

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

Генерация модулей WebAssembly

Существует несколько способов генерации бинарных файлов WebAssembly, включая:

  • Написание WebAssembly (.wat) вручную и преобразование в бинарный формат с помощью таких инструментов, как wabt.
  • Использование emscripten с приложением C/C++.
  • Использование wasm-pack с приложением Rust.
  • Использование AssemblyScript, если вы предпочитаете опыт, похожий на TypeScript.

TIP

Некоторые из этих инструментов генерируют не только бинарный файл, но и код «склейки» на JavaScript и соответствующие HTML-файлы для запуска в браузере.

Как использовать

После получения модуля WebAssembly можно использовать объект WebAssembly Node.js для его инициализации.

javascript
const fs = require('node:fs')
const wasmBuffer = fs.readFileSync('/path/to/add.wasm')
WebAssembly.instantiate(wasmBuffer).then(wasmModule => {
  // Экспортированные функции находятся в wasmModule.instance.exports
  const { add } = wasmModule.instance.exports
  const sum = add(5, 6)
  console.log(sum) // Выводит: 11
})

Взаимодействие с ОС

Модули WebAssembly сами по себе не могут напрямую обращаться к функциональности ОС. Для доступа к этой функциональности можно использовать сторонний инструмент Wasmtime. Wasmtime использует API WASI для доступа к функциональности ОС.

Ресурсы