La compatibilidad con WebAssembly es experimental en la versión 1.6.0.
| Si tiene | Use | Resultado |
|---|---|---|
| Un comando WASI | elide run app.wasm | Ejecuta el módulo con las importaciones de WASI Preview 1. |
| Una biblioteca WASM | La API WebAssembly o una importación de módulo ES desde JS/TS | Expone las exportaciones del módulo. |
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 secondsElide 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.
| Comportamiento | Valor |
|---|---|
| Argumento cero | La ruta absoluta del módulo. |
| Código de salida | Lo establece proc_exit de WASI, no el valor de retorno de una función. |
| Traps, binarios mal formados | Código de salida distinto de cero. |
--timeout | Abarca 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.wasmEsto 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.wasmConsulte 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:
| Propuesta | Opción | Notas |
|---|---|---|
| Memory64 | wasm.Memory64 | También requiere wasm.UseUnsafeMemory. |
| Hilos y operaciones atómicas | wasm.Threads | No se proporciona ninguna API de host de WASI para crear hilos. |
| Aritmética de enteros anchos | wasm.WideArithmetic | Independiente de la aritmética i64 habitual. |
| Manejo de excepciones heredado | wasm.LegacyExceptions | La 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 runsolo 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.