V8-utvecklare introducerade en dekompilator för WebAssembly

V8 JavaScript-motorutvecklare presenteras verktyg wasm-dekompilera, som tillåter dekompilering av en mellanliggande binär representation WebAssembly till ett läsbart pseudospråk som påminner om JavaScript och C. Det föreslagna pseudospråket är mycket lättare att förstå och mer lämpat för manuell analys än den textuella representationen av WebAssembly i ".wat"-formatet, vilket är närmare assembler än högnivåspråk. Samtidigt återspeglar dekompileringen, om möjligt, Wasm-representationen fullt ut.

Dekompilator ingår i verktygslådan WABT, som tillhandahåller översättning mellan binära och textuella representationer av WebAssembly, samt att analysera, bearbeta, ändra och kontrollera wasm-filer. Ett verktyg utvecklas också som en del av WABT wasm2c, som gör att wasm-filer kan dekompileras till motsvarande C-kod som kan kompileras av en C-kompilator, men som inte skiljer sig mycket från textrepresentationen av "wat" när det gäller läsbarhet.

Till exempel, den ursprungliga C-funktionen kompilerad till wasm

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

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

kommer att dekompileras av verktyget wasm-decompile till ett pseudospråk

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

medan konvertering till ".wat" textformat skulle se ut så här

(func $dot (typ 0) (param i32 i32) (resultat f32)
(f32.add
(f32.add
(f32.mul
(f32.load
(local.get 0))
(f32.load
(local.get 1)))
(f32.mul
(f32.belastningsoffset=4
(local.get 0))
(f32.belastningsoffset=4
(local.get 1))))
(f32.mul
(f32.belastningsoffset=8
(local.get 0))
(f32.belastningsoffset=8
(local.get 1))))))

Källa: opennet.ru

Lägg en kommentar