WebAssembly (kurz Wasm) ist ein kompaktes, plattformunabhängiges Bytecode-Format für den Browser. Seit Dezember 2019 ist die Kern-Spezifikation eine W3C-Empfehlung. WebAssembly ist keine Hochsprache, sondern ein Kompilationsziel: Programme aus C, C++, Rust oder Go werden zu .wasm-Dateien übersetzt und in der Browser-Engine nahezu nativ ausgeführt. Dieser Artikel stellt die wichtigsten Werkzeuge und Kommandos der Wasm-Toolchain vor.
WABT — WebAssembly Binary Toolkit
Das WABT (WebAssembly Binary Toolkit) enthält die zentralen Kommandozeilen-Werkzeuge, um Text- und Binärformat ineinander zu überführen:
wat2wasm add.wat -o add.wasm # Text (WAT) nach Binär (WASM)
wasm2wat add.wasm -o add.wat # Binär nach Text (Disassemblierung)
wasm-validate add.wasm # Validierung gegen die Spezifikation
wasm-objdump -x add.wasm # Sektionen, Importe, Exporte anzeigen
wasm-interp add.wasm --run-all-exports # interpretierende Ausführung
Binaryen — Optimierungen
Binaryen ist eine Compiler-Infrastruktur des WebAssembly-Projekts. Ihr bekanntestes Werkzeug ist wasm-opt, das Wasm-Binärdateien optimiert und verkleinert:
wasm-opt input.wasm -O2 -o output.wasm # Optimierungsstufe 2
wasm-opt input.wasm --minify -o out.wasm # Namen minifizieren
wasm2js input.wasm -o output.js # Wasm nach JS als Fallback
Runtimes außerhalb des Browsers
WebAssembly läuft nicht nur im Browser. Eigenständige Runtimes wie wasmtime (Bytecode Alliance, Rust) oder wasmer führen Wasm-Module als sichere, sandboxierte Prozesse aus und nutzen dafür die System-API WASI (WebAssembly System Interface):
wasmtime run hello.wasm
wasmer run hello.wasm
Kompilieren aus Hochsprachen
- Rust:
cargo build --target wasm32-unknown-unknownerzeugt eine Wasm-Binärdatei; die Bindings an JavaScript liefertwasm-bindgen. - C/C++:
emccaus dem Emscripten-Projekt kompiliert C- und C++-Code nach WebAssembly (Nachfolger von asm.js). - Clang:
clang --target=wasm32 -O3übersetzt C direkt nach Wasm. - Go:
GOOS=js GOARCH=wasm go builderzeugt ein Wasm-Modul.
Im Browser
Die JavaScript-API lädt und instanziiert Module direkt:
WebAssembly.instantiateStreaming(fetch('add.wasm')).then(({ instance }) => {
console.log(instance.exports.add(2, 3));
});
Verwandte Einträge: WAT — WebAssembly-Textformat, asm.js-Befehle, WebAssembly, WebGPU-Befehle, Rust-Befehle.