Zum Inhalt springen

WebAssembly mit Elide

Führen Sie WASI-Befehlsmodule mit Elide aus, ordnen Sie Host-Verzeichnisse zu, laden Sie WebAssembly-Bibliotheken aus JavaScript und TypeScript und prüfen Sie die unterstützten Proposals.

Auf dieser Seite

Die WebAssembly-Unterstützung ist in 1.6.0 experimentell.

Sie habenVerwenden SieErgebnis
Einen WASI-Befehlelide run app.wasmFührt das Modul mit WASI-Preview-1-Importen aus.
Eine WASM-BibliothekDie WebAssembly-API oder einen ES-Modul-Import aus JS/TSStellt die Exporte des Moduls bereit.
0:11 / 0:11

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 seconds

Elide ruft das exportierte _start auf, oder _main, falls _start fehlt. Ein Modul, das keine der beiden Funktionen exportiert, laden Sie aus JavaScript.

VerhaltenWert
Argument nullDer absolute Pfad des Moduls.
Exit-StatusWird durch WASI proc_exit gesetzt, nicht durch den Rückgabewert einer Funktion.
Traps, fehlerhafte BinärdateienExit-Status ungleich null.
--timeoutUmfasst 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.wasm

Damit 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.wasm

Siehe 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:

ProposalOptionHinweise
Memory64wasm.Memory64Erfordert zusätzlich wasm.UseUnsafeMemory.
Threads und Atomicswasm.ThreadsEine WASI-Host-API zum Starten von Threads wird nicht bereitgestellt.
Arithmetik mit breiten Integernwasm.WideArithmeticUnabhängig von der gewöhnlichen i64-Arithmetik.
Alte Ausnahmebehandlungwasm.LegacyExceptionsDas 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 run stellt 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.

Beispiele

War diese Seite hilfreich?