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 вручную