Utilia

Disassembler WebAssembly

Preveď binárny súbor .wasm na čitateľný text WAT, over jeho platnosť a zobraz sekcie, importy, exporty a funkcie, v prehliadači bez spustenia modulu.

Modul sa len číta a prevádza na text: nikdy sa nekompiluje, neinštancuje ani nespúšťa.

Ako previesť WASM na WAT

  1. Presuň súbor .wasm do oblasti na presun alebo na ňu klikni a vyber ho (do 20 MB). Môžeš tiež stlačiť Načítať ukážkový modul a pozrieť si malú ukážku.
  2. Nástroj skontroluje binárny súbor, overí jeho platnosť a ukáže výsledok: ✓ Modul je platný. alebo dôvod, prečo nie je.
  3. Pozri si počítadlá: Funkcie (importované a definované), Importy, Exporty, Typy, Pamäte, Tabuľky a Globálne premenné.
  4. Rozložený kód si prečítaj v časti Textový formát WebAssembly (WAT), potom ho Kopírovať alebo stlač Stiahnuť .wat.
  5. Výstup uprav voľbami: Použiť názvy zo sekcie name, Zložené výrazy (S-výrazy) a Exporty v tele funkcie.
  6. Otvor tabuľky Sekcie, Importy a Exporty a uvidíš rozloženie súboru: každú sekciu s jej posunom v bajtoch, veľkosťou a počtom položiek.

Modul sa nikdy nekompiluje, neinštancuje ani nespúšťa. Nástroj len číta jeho bajty a mení ich na text, takže je bezpečné skúmať aj súbor, ktorému nedôveruješ.

Funguje v tvojom prehliadači. Nič, čo zadáš, sa neodosiela na server.

Čo ukazuje výstup WAT

WebAssembly má dva rovnocenné formáty: kompaktný binárny .wasm, ktorý načítavajú prehliadače a runtime, a textový formát .wat, určený pre ľudí. Disassembler vypíše každú časť modulu v textovej podobe: typy funkcií, importy, telá funkcií, tabuľky, pamäte, globálne premenné, exporty, štartovaciu funkciu, segmenty elementov a segmenty údajov.

Predvolene sa inštrukcie vypisujú po jednej na riadok v poradí zásobníka, tak ako sú uložené:

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

S voľbou Zložené výrazy (S-výrazy) sú operandy vnorené do inštrukcie, ktorá ich používa, ako v (i32.add (local.get $a) (local.get $b)), čo sa často sleduje ľahšie. Exporty v tele funkcie zapíše (export "add") priamo do funkcie namiesto samostatného zoznamu.

Názvy, ladiace informácie a validácia

Súbor .wasm odkazuje na všetko cez index. Ak kompilátor zachoval vlastnú sekciu name (bežné v ladiacich zostaveniach), Použiť názvy zo sekcie name ukáže pôvodné názvy, napríklad $factorial. Inak wabt vygeneruje názvy ako $f2 alebo $t0, aby text zostal čitateľný. Produkčné zostavenia majú názvy často odstránené, takže zmenšený modul ukáže iba vygenerované názvy.

Validácia sleduje špecifikáciu WebAssembly: typy na zásobníku operandov sa musia zhodovať, indexy musia existovať a podobne. Neplatný modul sa aj tak rozloží, ak sa jeho štruktúra dá prečítať, s chybou validácie vedľa neho, čo pomáha pri ladení kompilátora alebo ručne napísaného binárneho súboru. Funkcie po MVP, ako SIMD, vlákna, hromadná pamäť, referenčné typy, viacnásobné hodnoty, tail calls, spracovanie výnimiek, memory64 a garbage collection, sú pre čítanie zapnuté.

Tento nástroj používa wabt.js, verziu WebAssembly Binary Toolkit (wasm2wat) pre JavaScript. Načíta sa až pri otvorení súboru.

Často kladené otázky

Dá sa získať späť pôvodný zdrojový kód v C, C++ alebo Ruste?

Nie. WAT je čitateľná podoba skompilovaného binárneho súboru, nie dekompilátor: zdrojový kód, komentáre a väčšina informácií o typoch sa po kompilácii stratí. Názvy funkcií prežijú, len ak sa sekcia name zachovala.

Nahráva sa môj súbor?

Nie. Súbor sa číta a rozkladá v tvojom prehliadači; nič sa neodosiela na server.

Prečo nástroj hlási, že súbor nie je binárny súbor WebAssembly?

Každý modul začína štyrmi bajtmi \0asm a za nimi verziou 1. Súbor s iným obsahom, komprimovaný pomocou gzip alebo Brotli, alebo komponent WebAssembly (novší model komponentov) sa odmietne.

Prečo je textové pole useknuté?

Veľmi veľké moduly môžu vytvoriť milióny riadkov. Textové pole ukazuje prvú časť, aby stránka zostala citlivá; Stiahnuť .wat uloží úplný text.

Môžem tu modul spustiť alebo otestovať?

Nie. Modul sa zámerne nikdy neinštancuje, takže jeho kód sa na stránke nemôže spustiť. Ak ho chceš otestovať, načítaj ho vo vlastnom projekte alebo v runtime, ako je wasmtime alebo Node.js.