V8 kūrėjai pristatė WebAssembly dekompiliatorių

V8 JavaScript variklio kūrėjai pateiktas naudingumas wasm-dekompiliuoti, kuri leidžia dekompiliuoti tarpinį dvejetainį vaizdą WebAssembly į skaitomą pseudokalbą, primenančią JavaScript ir C. Siūloma pseudo kalba yra daug lengviau suprantama ir tinkamesnė rankiniam analizavimui nei tekstinis WebAssembly atvaizdavimas „.wat“ formatu, kuris yra artimesnis asamblėjos kalbai nei aukšto lygio kalboms. Šiuo atveju dekompiliacija kuo geriau atspindi Wasm vaizdavimą.

Dekompiliatorius įjungtas įtraukta į įrankių rinkinį WABT, kuri teikia vertimą tarp dvejetainių ir tekstinių WebAssembly atvaizdų, taip pat analizuoja, apdoroja, modifikuoja ir tikrina wasm failus. WABT taip pat kuria naudingumą wasm2c, kuri leidžia iškompiliuoti wasm failus į lygiavertį C kodą, kurį gali sukompiliuoti C kompiliatorius, tačiau skaitomumu nedaug skiriasi nuo tekstinio „wat“ vaizdavimo.

Pavyzdžiui, originali C funkcija, sukompiliuota wasm

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

plūduriuojantis taškas(const vec3 *a, const vec3 *b) {
grąžinti a->x * b->x +
a->y * b->y +
a->z * b->z;
}

„Wasm-decompile“ programa bus iškompiliuota į pseudokalbą

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

o konvertavimas į teksto formatą „.wat“ atrodytų taip

(funkcija $dot (0 tipas) (param i32 i32) (rezultatas f32)
(f32.add
(f32.add
(f32.mul
(f32.load
(vietinis.gauti 0))
(f32.load
(local.get 1)))
(f32.mul
(f32.load offset=4
(vietinis.gauti 0))
(f32.load offset=4
(vietinis.gauti 1))))
(f32.mul
(f32.load offset=8
(vietinis.gauti 0))
(f32.load offset=8
(vietinis.gauti 1))))))

Šaltinis: opennet.ru

Добавить комментарий