Софт

Запуск компонентов WebAssembly внутри Node.js с помощью Jco

Запуск компонентов WebAssembly внутри Node.js с помощью Jco

Jco 1.0 только что был анонсирован Bytecode Alliance. Это нативная цепочка инструментов JavaScript, WebAssembly и среда выполнения, которая запускает компоненты Wasm внутри Node.js. Почему это полезно?

Проще говоря, компонент Wasm - это как общая библиотека, которая может быть связана с другим кодом и так далее. Задача Jco заключается в том, чтобы брать такие библиотеки, написанные на различных языках программирования, и выполнять их из Node.js.

Таким образом, Jco состоит как из среды выполнения, которая придерживается спецификации WASI 0.2, так и из инструментария, который превращает программы на различных языках в компоненты интерфейса WASI. WASI (WebAssembly System Interface) - это модульный системный интерфейс для WebAssembly (Wasm), который позволяет разработчикам запускать программы Wasm на любой платформе, включая браузер, облако и периферию.

WASI разработан как безопасный, быстрый и портативный интерфейс, позволяющий разработчикам писать свои программы один раз и запускать их в любом месте. В соответствии с поверхностью API WASI 0.2, компоненты могут получать доступ к сети, файловой системе и другим системным API, доступным в среде выполнения.

Однако Wasm-компоненты не просто предоставляют JavaScript и Wasm возможность общаться друг с другом. Они могут использоваться для любого языка программирования. Смысл Wasm Components и WASI в том, что мы можем соединить любое количество языков друг с другом через сильно типизированный ABI, а Jco - это инструментарий, предназначенный специально для привязки JavaScript.

Возможности Jco включают:

  • Транспонирование двоичных файлов Wasm-компонентов в модули ES, которые могут работать в любой среде JS.
  • Поддержка WASI Preview2 в Node.js (находится на стадии стабилизации) и браузерах (экспериментально).
  • Компонентные сборки помощников Wasm Tools, доступные для использования в качестве библиотеки или CLI-команд для использования в родных JS-окружениях.
  • Запуск и обслуживание команд, таких как Wasmtime, в качестве JS-реализации миров Command и HTTP Proxy.
  • Команда "Componentize" для легкого создания компонентов, написанных на JavaScript (обертка ComponentizeJS).

Чтобы транспонировать компонент в JS из CLI, нужно сделать следующее:

jco transpile component.wasm -o out-dir

Полученный файл можно импортировать, обеспечивая привязки компонента, как если бы он импортировался напрямую:

import { fn } from './out-dir/component.js';

fn();

Для компонентов Wasm, реализующих мир WASI CLI, предусмотрена утилита jco run, позволяющая запускать эти приложения в Node.js:

jco run component.wasm

Конечно, вам придется написать компонент на каком-нибудь языке, например на Rust.

В этот момент важно отметить, что существует похожий проект Wasmer JS SDK, но не от Bytecode Alliance, а от Wasmer. Этот SDK поддерживает WASIX, собственное расширение WASI, которое также запускает приложения wasm как в браузере, так и на сервере. Дополнительным бонусом является то, что SDK может запускать любые UNIX-программы, которые могут использовать потоки, сигналы, подпроцессы и другие возможности POSIX, и все это в браузере!

Однако в последнее время WASIX оказался в центре событий: Альянс утверждает, что WASIX является нестандартным, а Альянс не поощряет нестандартные системные интерфейсы.

В любом случае, какой бы интерфейс вы ни выбрали, теперь вы можете перенести свои программы, написанные на любом языке, на WebAssembly и наслаждаться всеми преимуществами, которые несет в себе такой переход.

Читайте также