Перейти к содержимому

WebAssembly в Elide

Запускайте командные модули WASI в Elide, сопоставляйте каталоги хоста, загружайте библиотеки WebAssembly из JavaScript и TypeScript и проверяйте поддерживаемые предложения.

На этой странице

Поддержка WebAssembly в версии 1.6.0 экспериментальная.

Что у вас естьЧто использоватьРезультат
Команда WASIelide run app.wasmЗапускает модуль с импортами WASI Preview 1.
Библиотека WASMAPI WebAssembly или импорт ES-модуля из JS/TSДелает доступными экспорты модуля.
0:11 / 0:11

О компиляции Java или Kotlin в WebAssembly см. WebImage; результату нужен собственный загрузчик JavaScript, а не elide run. Руководства по целевым платформам: Browser WASM и Edge WASM.

Запуск файла WASM

elide run app.wasm
elide app.wasm
elide run app.wasm -- first second   # program arguments
elide run --timeout=5s app.wasm      # exit 124 after 5 seconds

Elide вызывает экспортированную функцию _start, а если её нет — _main. Модуль без обеих функций загружайте из JavaScript.

ПоведениеЗначение
Нулевой аргументАбсолютный путь к модулю.
Код завершенияЗадаётся вызовом WASI proc_exit, а не возвращаемым значением функции.
Ловушки (traps), некорректные бинарные файлыНенулевой код завершения.
--timeoutОхватывает создание экземпляра и выполнение; завершение с кодом 124.

Точки входа проекта

Укажите модуль как точку входа в elide.pkl, затем выполните elide run:

amends "elide:project.pkl"
name = "wasm-app"
entrypoint { "app.wasm" }

См. Настройка проекта.

WASI

Команды получают импорты WASI Preview 1 в пространстве wasi_snapshot_preview1: стандартные потоки, аргументы, код завершения и операции с файловой системой. Библиотеки, загруженные из JavaScript, WASI не получают.

Доступ к каталогам

Команды WASI не видят каталогов хоста, пока вы не сопоставите хотя бы один:

elide -Xpolyglot.wasm.WasiMapDirs=work::./data run app.wasm

Эта команда сопоставляет ./data гостевому каталогу work. Несколько сопоставлений разделяйте запятыми: work::./data,output::./results.

Песочница при этом продолжает действовать. Чтобы открыть файл через WASI, нужны права на чтение и запись, даже для чтения:

elide -Xpolyglot.wasm.WasiMapDirs=work::./data run \
  --sandbox --allow-read=./data --allow-write=./data app.wasm

См. Песочница и ограничения.

Взаимодействие с JavaScript и TypeScript

Глобальный API WebAssembly не требует флагов:

import { readFile } from "node:fs/promises";

const bytes = await readFile(new URL("./math.wasm", import.meta.url));
const { instance } = await WebAssembly.instantiate(bytes, {});
console.log(instance.exports.add(20, 22));

Для модулей, загруженных из JavaScript, _start и _main не вызываются. Второй аргумент передаёт импорты модуля:

const imports = { env: { log: (value) => console.log(value) } };
const { instance } = await WebAssembly.instantiate(bytes, imports);

API включает validate, compile, Module, Instance, Memory, Table, Global, а также просмотр импортов и экспортов. Из скомпилированного Module можно создать несколько экземпляров. Чтение файлов подчиняется обычным разрешениям.

Импорт ES-модулей

import { add } from "./math.wasm";
console.log(add(20, 22));
const math = await import("./math.wasm");
console.log(math.add(20, 22));

Спецификаторами могут быть пути, URL file: или экспорты пакетов, которые разрешаются в .wasm. Импорт в фазе исходного кода (source phase) возвращает скомпилированный модуль, экземпляр которого вы создаёте сами:

import source mathModule from "./math.wasm";
const math = await WebAssembly.instantiate(mathModule, {});
console.log(math.exports.add(20, 22));

Поддерживаемые предложения WebAssembly

Включены по умолчанию для команд и взаимодействия с JS/TS:

  • Изменяемые глобальные переменные и операции расширения знака
  • Преобразования чисел с плавающей точкой в целые без ловушек
  • Несколько результатов у функций и блоков
  • Массовые операции с памятью и ссылочные типы
  • Несколько областей памяти
  • Расширенные константные выражения
  • Обработка исключений
  • Типизированные ссылки на функции
  • Типы со сборкой мусора (WasmGC)
  • Хвостовые вызовы
  • SIMD фиксированной ширины (v128) и relaxed SIMD, если не установлен Python

Выключены по умолчанию:

ПредложениеПараметрПримечания
Memory64wasm.Memory64Также требует wasm.UseUnsafeMemory.
Потоки и атомарные операцииwasm.ThreadsAPI хоста WASI для запуска потоков не предоставляется.
Арифметика широких целыхwasm.WideArithmeticНе связана с обычной арифметикой i64.
Устаревшая обработка исключенийwasm.LegacyExceptionsНовое предложение по обработке исключений включено по умолчанию.

Чтобы включить предложение, передайте -Xpolyglot.<option>=true, например -Xpolyglot.wasm.WideArithmetic=true. Импорты хоста, которые нужны модулю, при этом не предоставляются.

Ограничения

  • Только бинарные модули. Нет .wat, компиляции C или Rust и REPL для WASM.
  • Только WASI Preview 1. Нет WASI Preview 2, компонентной модели и node:wasi; нет общего доступа к сети.
  • Импорты хоста. elide run предоставляет только WASI, без API браузера и связующего кода Emscripten.
  • SIMD и Python. Если установлен Python, модули с SIMD отклоняются. Используйте установку без Python или скалярную сборку модуля.

Примеры

Была ли эта страница полезной?