Utilia

WASM u WAT disassembler

Pretvori .wasm binarnu datoteku u čitljiv WAT tekst, provjeri je i prikaži njezine odjeljke, uvoze, izvoze i funkcije, u pregledniku bez izvođenja modula.

Modul se samo čita i pretvara u tekst: nikada se ne kompilira, ne instancira ni ne izvodi.

Kako pretvoriti WASM u WAT

  1. Ispusti datoteku .wasm na zonu za ispuštanje ili klikni na nju za odabir (do 20 MB). Možeš i pritisnuti Učitaj primjer modula da vidiš mali demo.
  2. Alat provjerava binarnu datoteku, validira je i prikazuje rezultat: ✓ Modul je ispravan. ili razlog zbog kojeg nije.
  3. Pročitaj brojače: Funkcije (uvezene i definirane), Uvozi, Izvozi, Tipovi, Memorije, Tablice i Globalne varijable.
  4. Pročitaj disassembly u Tekstualni format WebAssemblyja (WAT), zatim ga Kopiraj ili pritisni Preuzmi .wat.
  5. Prilagodi izlaz opcijama: Koristi nazive iz odjeljka name, Složeni izrazi (S-izrazi) i Izvozi u liniji.
  6. Otvori tablice Odjeljci, Uvozi i Izvozi za raspored datoteke: svaki odjeljak s pomakom u bajtovima, veličinom i brojem unosa.

Modul se nikada ne kompilira, ne instancira ni ne izvodi. Alat samo čita njegove bajtove i pretvara ih u tekst, pa je sigurno pregledati datoteku kojoj ne vjeruješ.

Što prikazuje WAT izlaz

WebAssembly ima dva ekvivalentna formata: kompaktni binarni .wasm koji učitavaju preglednici i runtimeovi te tekstualni format .wat, namijenjen ljudima. Disassembler ispisuje svaki dio modula u tekstualnom obliku: tipove funkcija, uvoze, tijela funkcija, tablice, memorije, globalne varijable, izvoze, početnu funkciju, segmente elemenata i segmente podataka.

Prema zadanim postavkama instrukcije se ispisuju jedna po retku u redoslijedu stoga, onako kako su pohranjene:

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

Uz Složeni izrazi (S-izrazi) operandi su ugniježđeni unutar instrukcije koja ih koristi, kao u (i32.add (local.get $a) (local.get $b)), što je često lakše pratiti. Izvozi u liniji piše (export "add") unutar funkcije umjesto u zasebnom popisu.

Nazivi, informacije za otklanjanje pogrešaka i validacija

Datoteka .wasm na sve upućuje indeksima. Kad je kompajler zadržao prilagođeni odjeljak name (uobičajeno u debug izgradnjama), Koristi nazive iz odjeljka name prikazuje izvorne nazive poput $factorial. Inače wabt generira nazive poput $f2 ili $t0 da tekst ostane čitljiv. Produkcijske izgradnje često su lišene naziva, pa će minificirani modul prikazivati samo generirane nazive.

Validacija slijedi WebAssembly specifikaciju: tipovi se moraju podudarati na stogu operanada, indeksi moraju postojati i tako dalje. Neispravan modul i dalje se disassemblira kad se njegova struktura može pročitati, uz pogrešku validacije pokraj njega, što pomaže pri otklanjanju pogrešaka kompajlera ili ručno napisane binarne datoteke. Značajke nakon MVP-a poput SIMD-a, dretvi, skupnih operacija s memorijom, referentnih tipova, višestrukih vrijednosti, repnih poziva, obrade iznimaka, memory64 i skupljanja smeća omogućene su za čitanje.

Alat koristi wabt.js, JavaScript izgradnju WebAssembly Binary Toolkita (wasm2wat). Učitava se samo kad otvoriš datoteku.

Česta pitanja

Mogu li dobiti izvorni C, C++ ili Rust kod natrag?

Ne. WAT je čitljiv oblik kompilirane binarne datoteke, a ne dekompajler: izvorni kod, komentari i većina informacija o tipovima nestaju nakon kompilacije. Nazivi funkcija preživljavaju samo ako je odjeljak name zadržan.

Šalje li se moja datoteka?

Ne. Datoteka se čita i disassemblira u tvom pregledniku; ništa se ne šalje na poslužitelj.

Zašto alat kaže da datoteka nije WebAssembly binarna datoteka?

Svaki modul počinje s četiri bajta \0asm, iza kojih slijedi verzija 1. Datoteka s drugim sadržajem, komprimirana pomoću gzipa ili Brotlija ili WebAssembly komponenta (noviji model komponenti) bit će odbijena.

Zašto je tekstualni okvir odrezan?

Vrlo veliki moduli mogu proizvesti milijune redaka. Tekstualni okvir prikazuje prvi dio da stranica ostane responzivna; Preuzmi .wat sprema cijeli tekst.

Mogu li ovdje pokrenuti ili testirati modul?

Ne. Modul se namjerno nikada ne instancira, pa se njegov kod ne može izvoditi na stranici. Za testiranje ga učitaj u vlastiti projekt ili u runtime poput wasmtimea ili Node.js-a.