Saltar al contenido

WebAssembly con Elide

Ejecute módulos de comando WASI con Elide, asigne directorios del host, cargue bibliotecas WebAssembly desde JavaScript y TypeScript, y consulte las propuestas admitidas.

En esta página

La compatibilidad con WebAssembly es experimental en la versión 1.6.0.

Si tieneUseResultado
Un comando WASIelide run app.wasmEjecuta el módulo con las importaciones de WASI Preview 1.
Una biblioteca WASMLa API WebAssembly o una importación de módulo ES desde JS/TSExpone las exportaciones del módulo.
0:11 / 0:11

Para compilar Java o Kotlin a WebAssembly, consulte WebImage; su salida necesita su propio cargador de JavaScript, no elide run. Guías por destino: Browser WASM y Edge WASM.

Ejecutar un archivo 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 llama a la función exportada _start, o a _main si _start no existe. Cargue desde JavaScript un módulo que no tenga ninguna de las dos.

ComportamientoValor
Argumento ceroLa ruta absoluta del módulo.
Código de salidaLo establece proc_exit de WASI, no el valor de retorno de una función.
Traps, binarios mal formadosCódigo de salida distinto de cero.
--timeoutAbarca la instanciación y la ejecución; sale con 124.

Puntos de entrada del proyecto

Defina el módulo como punto de entrada en elide.pkl y luego ejecute elide run:

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

Consulte Configurar un proyecto.

WASI

Los comandos reciben importaciones de WASI Preview 1 bajo wasi_snapshot_preview1: flujos estándar, argumentos, código de salida y operaciones del sistema de archivos. Las bibliotecas cargadas desde JavaScript no reciben WASI.

Acceso a directorios

Los comandos WASI no ven ningún directorio del host hasta que usted asigne uno:

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

Esto asigna ./data al directorio invitado work. Separe varias asignaciones con comas: work::./data,output::./results.

El sandbox sigue aplicándose. Abrir archivos desde WASI requiere permiso de lectura y escritura, incluso para leer:

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

Consulte Sandbox y límites.

Interoperabilidad con JavaScript y TypeScript

La API global WebAssembly no necesita ninguna opción:

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));

Los módulos cargados desde JavaScript no ejecutan _start ni _main. El segundo argumento proporciona las importaciones del módulo:

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

La API incluye validate, compile, Module, Instance, Memory, Table, Global e inspección de importaciones y exportaciones. Un Module compilado puede instanciarse más de una vez. Las lecturas de archivos siguen los permisos habituales.

Importaciones de módulos ES

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

Los especificadores pueden ser rutas, URL file: o exportaciones de paquetes que se resuelvan a .wasm. Una importación en fase de código fuente (source phase) devuelve el módulo compilado para que usted lo instancie:

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

Propuestas de WebAssembly admitidas

Activadas por defecto, para comandos e interoperabilidad con JS/TS:

  • Globales mutables y operadores de extensión de signo
  • Conversiones de coma flotante a entero sin trap
  • Resultados múltiples en funciones y bloques
  • Operaciones de memoria en bloque y tipos de referencia
  • Varias memorias
  • Expresiones constantes extendidas
  • Manejo de excepciones
  • Referencias de funciones tipadas
  • Tipos con recolección de basura (WasmGC)
  • Llamadas de cola
  • SIMD de ancho fijo (v128) y SIMD relajado, salvo con Python instalado

Desactivadas por defecto:

PropuestaOpciónNotas
Memory64wasm.Memory64También requiere wasm.UseUnsafeMemory.
Hilos y operaciones atómicaswasm.ThreadsNo se proporciona ninguna API de host de WASI para crear hilos.
Aritmética de enteros anchoswasm.WideArithmeticIndependiente de la aritmética i64 habitual.
Manejo de excepciones heredadowasm.LegacyExceptionsLa propuesta más reciente de manejo de excepciones está activada por defecto.

Active una con -Xpolyglot.<option>=true, por ejemplo -Xpolyglot.wasm.WideArithmetic=true. Esto no proporciona las importaciones del host que necesite un módulo.

Límites

  • Solo módulos binarios. Sin .wat, sin compilación de C ni Rust, sin REPL de WASM.
  • Solo WASI Preview 1. Sin WASI Preview 2, modelo de componentes ni node:wasi; sin acceso general a la red.
  • Importaciones del host. elide run solo proporciona WASI, no API del navegador ni código de enlace de Emscripten.
  • SIMD con Python. Con Python instalado, se rechazan los módulos SIMD. Use una instalación sin Python o una compilación escalar del módulo.

Ejemplos

¿Te resultó útil esta página?