Utilia

WebAssembly-disassembler

Zet een .wasm-bestand om naar leesbare WAT-tekst, valideer het en bekijk secties, imports, exports en functies in je browser, zonder de module uit te voeren.

De module wordt alleen gelezen en naar tekst omgezet: hij wordt nooit gecompileerd, geïnstantieerd of uitgevoerd.

Zo zet je WASM om naar WAT

  1. Sleep een .wasm-bestand naar het sleepvak, of klik erop om er een te kiezen (tot 20 MB). Je kunt ook op Voorbeeldmodule laden klikken om een kleine demo te zien.
  2. De tool controleert het binaire bestand, valideert het en toont het resultaat: ✓ De module is geldig., of de reden waarom niet.
  3. Bekijk de tellers: Functies (geïmporteerd en gedefinieerd), Imports, Exports, Typen, Geheugens, Tabellen en Globals.
  4. Lees de disassembly in WebAssembly-tekstformaat (WAT) en klik daarna op Kopiëren of .wat downloaden.
  5. Pas de uitvoer aan met de opties Namen uit de name-sectie gebruiken, Geneste expressies (S-expressies) en Exports inline.
  6. Open de tabellen Secties, Imports en Exports voor de opbouw van het bestand: elke sectie met haar byte-offset, grootte en aantal items.

De module wordt nooit gecompileerd, geïnstantieerd of uitgevoerd. De tool leest alleen de bytes en zet ze om in tekst, dus je kunt ook een bestand bekijken dat je niet vertrouwt.

Wat de WAT-uitvoer laat zien

WebAssembly heeft twee gelijkwaardige formaten: het compacte binaire .wasm dat browsers en runtimes laden, en het tekstformaat .wat, dat voor mensen bedoeld is. De disassembler schrijft elk deel van de module in tekstvorm: functietypen, imports, functie-inhoud, tabellen, geheugens, globals, exports, de startfunctie, elementsegmenten en datasegmenten.

Standaard staan de instructies één per regel in stackvolgorde, zoals ze zijn opgeslagen:

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

Met Geneste expressies (S-expressies) worden de operanden genest binnen de instructie die ze gebruikt, zoals in (i32.add (local.get $a) (local.get $b)), wat vaak makkelijker te volgen is. Exports inline schrijft (export "add") binnen de functie in plaats van in een aparte lijst.

Namen, debuginformatie en validatie

Een .wasm-bestand verwijst naar alles via een index. Heeft de compiler een aangepaste sectie name behouden (gebruikelijk bij debugbuilds), dan toont Namen uit de name-sectie gebruiken de oorspronkelijke namen, zoals $factorial. Anders maakt wabt namen als $f2 of $t0, zodat de tekst leesbaar blijft. Bij productiebuilds zijn de namen vaak verwijderd, dus een geminificeerde module toont alleen gegenereerde namen.

De validatie volgt de WebAssembly-specificatie: typen op de operandstack moeten kloppen, indexen moeten bestaan, enzovoort. Een ongeldige module wordt toch gedisassembleerd als de structuur leesbaar is, met de validatiefout erbij. Dat helpt als je een compiler of een met de hand geschreven binair bestand debugt. Post-MVP-functies zoals SIMD, threads, bulk memory, reference types, multi-value, tail calls, exception handling, memory64 en garbage collection zijn ingeschakeld om te kunnen lezen.

Deze tool gebruikt wabt.js, de JavaScript-build van de WebAssembly Binary Toolkit (wasm2wat). Die wordt pas geladen als je een bestand opent.

Veelgestelde vragen

Kan ik de oorspronkelijke C-, C++- of Rust-broncode terugkrijgen?

Nee. WAT is een leesbare vorm van het gecompileerde binaire bestand, geen decompiler: de broncode, het commentaar en de meeste type-informatie zijn na het compileren verdwenen. Functienamen blijven alleen bewaard als de name-sectie behouden is.

Wordt mijn bestand geüpload?

Nee. Het bestand wordt in je browser gelezen en gedisassembleerd; er wordt niets naar een server gestuurd.

Waarom zegt de tool dat het bestand geen WebAssembly-binair bestand is?

Elke module begint met de vier bytes \0asm, gevolgd door versie 1. Een bestand met andere inhoud, een bestand dat met gzip of Brotli is gecomprimeerd, of een WebAssembly-component (het nieuwere componentmodel) wordt geweigerd.

Waarom is het tekstvak afgekapt?

Heel grote modules kunnen miljoenen regels opleveren. Het tekstvak toont het eerste deel, zodat de pagina vlot blijft reageren; .wat downloaden slaat de volledige tekst op.

Kan ik de module hier uitvoeren of testen?

Nee. De module wordt bewust nooit geïnstantieerd, dus de code kan niet in de pagina draaien. Wil je hem testen, laad hem dan in je eigen project of in een runtime zoals wasmtime of Node.js.