WAT (WebAssembly Text Format) ist die menschenlesbare Darstellung eines WebAssembly-Moduls. Jede .wat-Datei beschreibt exakt dasselbe Modul wie ihr binäres Gegenstück .wasm; das Werkzeug wat2wasm übersetzt zwischen beiden Formaten. WAT verwendet S-Ausdrücke — Klammern strukturieren Module, Funktionen und Anweisungen.

Modulaufbau

Ein Modul beginnt mit (module ...). Darin stehen Funktionen, Importe, Speicher, Tabellen und Exporte:

(module
  (func $add (param $a i32) (param $b i32) (result i32)
    local.get $a
    local.get $b
    i32.add)
  (export "add" (func $add)))

Stack-Maschine

WAT ist eine Stack-Maschine: Anweisungen legen Werte auf einen Operandenstapel und verarbeiten sie. Die wichtigsten Instruktionen:

  • Konstanten: i32.const 42, f64.const 3.14
  • Lokale Variablen: local.get, local.set, local.tee
  • Arithmetik: i32.add, i32.sub, i32.mul, i32.div_s, i64.add, f32.add
  • Kontrollfluss: call, return, if/else/end, block/loop/br/br_if
  • Speicherzugriff: i32.load, i32.store
  • Vergleiche: i32.eq, i32.lt_s, i32.gt_u

Importe, Speicher und Daten

(module
  (import "env" "log" (func $log (param i32)))
  (memory (export "memory") 1)
  (data (i32.const 0) "hallo")
  (func (export "run")
    i32.const 42
    call $log))

Ein Speicher wird in Seiten zu 64 KiB (65536 Bytes) angelegt. (data ...) schreibt Bytes an eine Speicheradresse — das ist die Grundlage für Strings und Puffer zwischen JavaScript und Wasm.

Werkzeuge für WAT

wat2wasm add.wat -o add.wasm          # Text nach Binär
wat2wasm add.wat -v                    # verbose: erklärt jedes Byte
wasm2wat add.wasm -o add.wat          # Binär zurück nach Text
wat2wasm --debug-names add.wat -o add.wasm  # Debug-Namen erhalten

Typen

Die Basis-Typen sind i32, i64, f32 und f64. Seit dem SIMD-Vorschlag kommen v128-Vektoren hinzu; Referenz-Typen (externref, funcref) ergänzen das Typsystem für die Integration mit JavaScript.

Verwandte Einträge: WebAssembly-Befehle, asm.js-Befehle, WebAssembly, JavaScript-Befehle.