Поддержка WebAssembly в версии 1.6.0 экспериментальная.
| Что у вас есть | Что использовать | Результат |
|---|---|---|
| Команда WASI | elide run app.wasm | Запускает модуль с импортами WASI Preview 1. |
| Библиотека WASM | API WebAssembly или импорт ES-модуля из JS/TS | Делает доступными экспорты модуля. |
О компиляции 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 secondsElide вызывает экспортированную функцию _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
Выключены по умолчанию:
| Предложение | Параметр | Примечания |
|---|---|---|
| Memory64 | wasm.Memory64 | Также требует wasm.UseUnsafeMemory. |
| Потоки и атомарные операции | wasm.Threads | API хоста 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 или скалярную сборку модуля.