Les développeurs V8 ont présenté un décompilateur pour WebAssembly

Développeurs du moteur JavaScript V8 soumis utilitaire wasm-décompiler, qui permet de décompiler la représentation binaire intermédiaire WebAssembly en un pseudo-langage lisible rappelant JavaScript et C. Le pseudo-langage proposé est beaucoup plus facile à comprendre et plus adapté à l'analyse manuelle que la représentation textuelle de WebAssembly au format « .wat », qui est plus proche du langage assembleur que des langages de haut niveau. Dans ce cas, la décompilation reflète le plus complètement possible la représentation Wasm.

Décompilateur allumé inclus dans la boîte à outils WABT, qui fournit la traduction entre les représentations binaires et textuelles de WebAssembly, ainsi que l'analyse, le traitement, la modification et la vérification des fichiers wasm. WABT développe également un utilitaire wasm2c, qui permet de décompiler les fichiers wasm en code C équivalent pouvant être compilé par un compilateur C, mais qui n'est pas très différent en termes de lisibilité de la représentation textuelle de "wat".

Par exemple, la fonction C originale compilée dans wasm

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

point flottant (const vec3 *a, const vec3 *b) {
retourner a->x * b->x +
a->y * b->y +
a->z * b->z;
}

sera décompilé par l'utilitaire wasm-decompile en un pseudo-langage

fonction point(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
retourner a.a * b.a + a.b * bb + a.c * b.c
}

tandis que la conversion au format texte ".wat" ressemblerait à ceci

(func $dot (type 0) (param i32 i32) (résultat f32)
(f32.ajouter
(f32.ajouter
(f32.mul
(f32.charger
(local.get 0))
(f32.charger
(local.get 1)))
(f32.mul
(f32.load offset=4
(local.get 0))
(f32.load offset=4
(local.get 1))))
(f32.mul
(f32.load offset=8
(local.get 0))
(f32.load offset=8
(local.get 1))))))

Source: opennet.ru

Ajouter un commentaire