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
.
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 для его инициализации.
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 для доступа к функциональности ОС.