V8-udviklere præsenterede en decompiler til WebAssembly

Udviklere af V8 JavaScript-motoren præsenteret nytte wasm-dekompilere, som giver dig mulighed for at dekompilere den mellemliggende binære repræsentation WebAssembly til et læsbart pseudosprog, der minder om JavaScript og C. Det foreslåede pseudosprog er meget lettere at forstå og mere velegnet til manuel parsing end den tekstlige repræsentation af WebAssembly i ".wat"-formatet, som er tættere på assemblersprog end på højt niveau sprog. I dette tilfælde afspejler dekompileringen Wasm-repræsentationen så fuldstændigt som muligt.

Decompiler inkluderet inkluderet i værktøjskassen WABT, som giver oversættelse mellem binære og tekstrepræsentationer af WebAssembly, samt parsing, behandling, modifikation og verifikation af wasm-filer. WABT er også ved at udvikle et hjælpeprogram wasm2c, som gør det muligt at dekompilere wasm-filer til ækvivalent C-kode, der kan kompileres af en C-compiler, men er ikke meget anderledes med hensyn til læsbarhed fra den tekstlige repræsentation af "wat".

For eksempel den oprindelige C-funktion kompileret 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 blive dekompileret af wasm-decompile-værktøjet til et pseudo-sprog

funktion prik(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" ville se sådan ud

(func $dot (type 0) (param i32 i32) (resultat f32)
(f32.add
(f32.add
(f32.mul
(f32.indlæs
(local.get 0))
(f32.indlæs
(local.get 1)))
(f32.mul
(f32.belastning offset=4
(local.get 0))
(f32.belastning offset=4
(local.get 1))))
(f32.mul
(f32.belastning offset=8
(local.get 0))
(f32.belastning offset=8
(local.get 1))))))

Kilde: opennet.ru

Tilføj en kommentar