V8-kehittäjät esittelivät WebAssemblyn purkajan

V8 JavaScript -moottorin kehittäjät esitetty hyödyllisyys wasm-decompile, joka mahdollistaa välimuotoisen binääriesityksen purkamisen WebAssembly luettavaan JavaScriptiä ja C:tä muistuttavaan pseudokieleen. Ehdotettu pseudokieli on huomattavasti helpompi ymmärtää ja sopii paremmin manuaaliseen jäsentämiseen kuin WebAssemblyn tekstimuotoinen esitys ".wat"-muodossa, joka on lähempänä assemblyä kuin korkean tason kieliä. Lisäksi dekompilointi vastaa mahdollisimman pitkälle Wasm-esitystä.

Dekompilaattori mukana osana työkalupakkia WABT, joka tarjoaa muunnoksen WebAssemblyn binääri- ja tekstiesitysten välillä sekä .wasm-tiedostojen jäsentämisen, käsittelyn, muokkaamisen ja varmentamisen. Osana WABT:tä kehitetään myös apuohjelmaa. wasm2c, joka mahdollistaa wasm-tiedostojen purkamisen vastaavaksi C-koodiksi, jonka C-kääntäjä voi kääntää, mutta joka ei ole luettavuudeltaan paljon erilainen kuin "wat"-komennon tekstimuoto.

Esimerkiksi alkuperäinen C-funktio käännettiin wasm-muotoon

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

float piste(vakio vec3 *a, vakio vec3 *b) {
return a->x * b->x +
a->y * b->y +
a->z * b->z;
}

wasm-decompile-apuohjelma purkaa sen pseudokielelle

funktio piste(a:{ a:float, b:float, c:float },}
b:{ a:float, b:float, c:float }):float {
paluu aa * ba + ab * bb + ac * bc
}

tekstimuotoon muunnettaessa ".wat" näyttää tältä

(func $dot (tyyppi 0) (parametri i32 i32) (tulos f32)
(f32.lisää
(f32.lisää
(f32.mul
(f32.load
(paikallinen.get 0))
(f32.load
(paikallinen.hae 1)))
(f32.mul
(f32.load offset=4
(paikallinen.get 0))
(f32.load offset=4
(paikallinen.hae 1))))
(f32.mul
(f32.load offset=8
(paikallinen.get 0))
(f32.load offset=8
(paikallinen.hae 1)))))))

Lähde: opennet.ru