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.