Die WebAssembly-Unterstützung ist in 1.6.0 experimentell.
| Sie haben | Verwenden Sie | Ergebnis |
|---|---|---|
| Einen WASI-Befehl | elide run app.wasm | Führt das Modul mit WASI-Preview-1-Importen aus. |
| Eine WASM-Bibliothek | Die WebAssembly-API oder einen ES-Modul-Import aus JS/TS | Stellt die Exporte des Moduls bereit. |
Wie Sie Java oder Kotlin nach WebAssembly kompilieren, beschreibt WebImage; die Ausgabe
benötigt ihren eigenen JavaScript-Loader, nicht elide run. Anleitungen für einzelne Ziele:
Browser WASM und Edge WASM.
Eine WASM-Datei ausführen
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 ruft das exportierte _start auf, oder _main, falls _start fehlt. Ein Modul, das keine der beiden
Funktionen exportiert, laden Sie aus JavaScript.
| Verhalten | Wert |
|---|---|
| Argument null | Der absolute Pfad des Moduls. |
| Exit-Status | Wird durch WASI proc_exit gesetzt, nicht durch den Rückgabewert einer Funktion. |
| Traps, fehlerhafte Binärdateien | Exit-Status ungleich null. |
--timeout | Umfasst Instanziierung und Ausführung; beendet sich mit 124. |
Projekt-Einstiegspunkte
Legen Sie das Modul in elide.pkl als Einstiegspunkt fest und führen Sie dann elide run aus:
amends "elide:project.pkl"
name = "wasm-app"
entrypoint { "app.wasm" }Siehe Projekteinrichtung.
WASI
Befehle erhalten WASI-Preview-1-Importe unter wasi_snapshot_preview1: Standardströme, Argumente, Exit-Status und
Dateisystemoperationen. Aus JavaScript geladene Bibliotheken erhalten kein WASI.
Verzeichniszugriff
WASI-Befehle sehen keine Host-Verzeichnisse, bis Sie eines zuordnen:
elide -Xpolyglot.wasm.WasiMapDirs=work::./data run app.wasmDamit wird ./data dem Gastverzeichnis work zugeordnet. Mehrere Zuordnungen trennen Sie durch Kommas:
work::./data,output::./results.
Die Sandbox gilt weiterhin. Über WASI geöffnete Dateien benötigen Lese- und Schreibberechtigung, auch wenn nur gelesen wird:
elide -Xpolyglot.wasm.WasiMapDirs=work::./data run \
--sandbox --allow-read=./data --allow-write=./data app.wasmSiehe Sandbox und Limits.
Interop mit JavaScript und TypeScript
Die globale WebAssembly-API braucht kein Flag:
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));Aus JavaScript geladene Module führen weder _start noch _main aus. Das zweite Argument liefert die Importe des
Moduls:
const imports = { env: { log: (value) => console.log(value) } };
const { instance } = await WebAssembly.instantiate(bytes, imports);Die API umfasst validate, compile, Module, Instance, Memory, Table, Global sowie die Untersuchung von
Importen und Exporten. Ein kompiliertes Module lässt sich mehrfach instanziieren. Lesezugriffe auf Dateien
unterliegen den üblichen Berechtigungen.
ES-Modul-Importe
import { add } from "./math.wasm";
console.log(add(20, 22));const math = await import("./math.wasm");
console.log(math.add(20, 22));Spezifizierer können Pfade, file:-URLs oder Paket-Exporte sein, die auf .wasm auflösen. Ein Source-Phase-Import
liefert das kompilierte Modul, das Sie selbst instanziieren:
import source mathModule from "./math.wasm";
const math = await WebAssembly.instantiate(mathModule, {});
console.log(math.exports.add(20, 22));Unterstützte WebAssembly-Proposals
Standardmäßig aktiviert, für Befehle und JS/TS-Interop:
- Veränderliche Globals und Operatoren zur Vorzeichenerweiterung
- Float-zu-Integer-Konvertierungen ohne Trap
- Mehrere Ergebniswerte für Funktionen und Blöcke
- Bulk-Speicheroperationen und Referenztypen
- Mehrere Speicher
- Erweiterte Konstantenausdrücke
- Ausnahmebehandlung
- Typisierte Funktionsreferenzen
- Typen mit Garbage Collection (WasmGC)
- Tail Calls
- SIMD mit fester Breite (
v128) und Relaxed SIMD, außer bei installiertem Python
Standardmäßig deaktiviert:
| Proposal | Option | Hinweise |
|---|---|---|
| Memory64 | wasm.Memory64 | Erfordert zusätzlich wasm.UseUnsafeMemory. |
| Threads und Atomics | wasm.Threads | Eine WASI-Host-API zum Starten von Threads wird nicht bereitgestellt. |
| Arithmetik mit breiten Integern | wasm.WideArithmetic | Unabhängig von der gewöhnlichen i64-Arithmetik. |
| Alte Ausnahmebehandlung | wasm.LegacyExceptions | Das neuere Proposal zur Ausnahmebehandlung ist standardmäßig aktiviert. |
Aktivieren Sie eines mit -Xpolyglot.<option>=true, zum Beispiel -Xpolyglot.wasm.WideArithmetic=true. Die
Host-Importe, die ein Modul benötigt, werden dadurch nicht bereitgestellt.
Einschränkungen
- Nur Binärmodule. Kein
.wat, kein Kompilieren von C oder Rust, keine WASM-REPL. - Nur WASI Preview 1. Kein WASI Preview 2, kein Komponentenmodell, kein
node:wasi; kein allgemeiner Netzwerkzugriff. - Host-Importe.
elide runstellt nur WASI bereit, keine Browser-APIs und keinen Emscripten-Glue-Code. - SIMD mit Python. Bei installiertem Python werden SIMD-Module abgelehnt. Verwenden Sie eine Installation ohne Python oder einen skalaren Build des Moduls.