V8-utviklere introduserte en dekompiler for WebAssembly

Utviklere av V8 JavaScript-motoren presentert nytte wasm-dekompilere, som lar deg dekompilere den mellomliggende binære representasjonen WebAssembly til et lesbart pseudospråk som minner om JavaScript og C. Det foreslåtte pseudospråket er mye lettere å forstå og mer egnet for manuell parsing enn den tekstlige representasjonen av WebAssembly i ".wat"-formatet, som er nærmere assemblerspråk enn høynivåspråk. I dette tilfellet reflekterer dekompileringen Wasm-representasjonen så fullstendig som mulig.

Dekompiler inkludert inkludert i verktøysettet WABT, som gir oversettelse mellom binære og tekstrepresentasjoner av WebAssembly, samt parsing, prosessering, modifikasjon og verifisering av wasm-filer. WABT utvikler også et verktøy wasm2c, som gjør at wasm-filer kan dekompileres til ekvivalent C-kode som kan kompileres av en C-kompilator, men er ikke mye forskjellig når det gjelder lesbarhet fra den tekstlige representasjonen av "wat".

For eksempel, den opprinnelige C-funksjonen kompilert i wasm

typedef struct { float x, y, z; } vec3;

float dot(const vec3 *a, const vec3 *b) {
returner a->x * b->x +
a->y * b->y +
a->z * b->z;
}

vil bli dekompilert av wasm-dekompilere-verktøyet til et pseudospråk

function dot(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
returner aa * ba + ab * bb + ac * bc
}

mens konverteringen til tekstformatet ".wat" vil se slik ut

(func $dot (type 0) (param i32 i32) (resultat f32)
(f32.add
(f32.add
(f32.mul
(f32.last
(local.get 0))
(f32.last
(local.get 1)))
(f32.mul
(f32.lastforskyvning=4
(local.get 0))
(f32.lastforskyvning=4
(local.get 1))))
(f32.mul
(f32.lastforskyvning=8
(local.get 0))
(f32.lastforskyvning=8
(local.get 1))))))

Kilde: opennet.ru

Legg til en kommentar