Dezvoltatorii V8 au prezentat un decompilator pentru WebAssembly

Dezvoltatorii motorului JavaScript V8 prezentat utilitate wasm-decompilare, permițându-vă să decompilați reprezentarea binară intermediară WebAssembly într-un pseudo-limbaj care amintește de JavaScript și C. Pseudo-limbajul propus este mult mai ușor de înțeles și mai potrivit pentru analiza manuală decât reprezentarea textuală a WebAssembly în formatul „.wat”, care este mai aproape de limbajul de asamblare decât de limbajele de nivel înalt. În acest caz, decompilarea reflectă reprezentarea Wasm cât mai complet posibil.

Decompilator pornit incluse în trusa de instrumente WABT, care oferă traducere între reprezentările binare și text ale WebAssembly, precum și analizarea, procesarea, modificarea și verificarea fișierelor wasm. WABT dezvoltă, de asemenea, un utilitar wasm2c, care permite decompilarea fișierelor wasm într-un cod C echivalent care poate fi compilat de un compilator C, dar nu este mult diferit în ceea ce privește lizibilitatea de reprezentarea textuală a lui „wat”.

De exemplu, funcția C originală compilată în wasm

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

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

va fi decompilat de utilitarul wasm-decompile într-un pseudo-limbaj

funcția punct(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
returnează aa * ba + ab * bb + ac * bc
}

în timp ce conversia în format text „.wat” ar arăta astfel

(func $dot (tip 0) (param i32 i32) (rezultat f32)
(f32.add
(f32.add
(f32.mul
(f32.încărcare
(local.get 0))
(f32.încărcare
(local.get 1)))
(f32.mul
(f32.offset de sarcină=4
(local.get 0))
(f32.offset de sarcină=4
(local.get 1))))
(f32.mul
(f32.offset de sarcină=8
(local.get 0))
(f32.offset de sarcină=8
(local.get 1))))))

Sursa: opennet.ru

Adauga un comentariu