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-unknown erzeugt eine Wasm-Binärdatei; die Bindings an JavaScript liefert wasm-bindgen.
  • C/C++: emcc aus 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 build erzeugt 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.