Node.js с WebAssembly

WebAssembly - это высокопроизводительный ассемблерный язык, который можно компилировать из различных языков, включая C/C++, Rust и AssemblyScript. В настоящее время он поддерживается Chrome, Firefox, Safari, Edge и Node.js!
В спецификации WebAssembly подробно описаны два формата файлов: двоичный формат, называемый модулем WebAssembly с .wasm расширением, и соответствующее текстовое представление, называемое текстовым форматом WebAssembly с .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.
Некоторые из этих инструментов генерируют не только двоичный файл, но и связывающий код JavaScript и соответствующие HTML-файлы для запуска в браузере.

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

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

// Предположим, что существует файл add.wasm, который содержит единственную функцию, складывающую два переданных аргумента
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
});

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

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

Ресурсы

Общая информация о веб-сборке
Документы MDN
Написание WebAssembly вручную

Обсуждение закрыто.