Programiści V8 zaprezentowali dekompilator dla WebAssembly

Twórcy silnika JavaScript V8 przedstawione narzędzie dekompilacja wasm, co pozwala na dekompilację pośredniej reprezentacji binarnej WebAssembly na czytelny pseudojęzyk przypominający JavaScript i C. Proponowany pseudojęzyk jest znacznie łatwiejszy do zrozumienia i bardziej odpowiedni do ręcznego analizowania niż tekstowa reprezentacja WebAssembly w formacie „.wat”, który jest bliższy asemblerowi niż językom wysokiego poziomu. W tym przypadku dekompilacja odzwierciedla reprezentację Wasm tak dokładnie, jak to możliwe.

Dekompilator dołączony zawarte w zestawie narzędzi WABT, który zapewnia tłumaczenie między binarnymi i tekstowymi reprezentacjami WebAssembly, a także analizowanie, przetwarzanie, modyfikację i weryfikację plików wasm. WABT pracuje również nad narzędziem wasm2c, który umożliwia dekompilację plików wasm do równoważnego kodu C, który może zostać skompilowany przez kompilator C, ale nie różni się zbytnio pod względem czytelności od tekstowej reprezentacji „wat”.

Na przykład oryginalna funkcja C skompilowana w wasm

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

zmiennoprzecinkowa kropka(stała vec3 *a, stała vec3 *b) {
zwróć a->x * b->x +
a->y * b->y +
a->z * b->z;
}

zostanie zdekompilowany przez narzędzie wasm-decompile do pseudojęzyka

funkcja kropka(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
zwróć aa * ba + ab * bb + ac * bc
}

podczas gdy konwersja do formatu tekstowego „.wat” wyglądałaby tak

(funkcja $kropka (typ 0) (parametr i32 i32) (wynik f32)
(f32.dodaj
(f32.dodaj
(f32.mul
(f32.load
(local.get 0))
(f32.load
(lokalny.get 1)))
(f32.mul
(przesunięcie obciążenia f32.=4
(local.get 0))
(przesunięcie obciążenia f32.=4
(lokalny.get 1))))
(f32.mul
(przesunięcie obciążenia f32.=8
(local.get 0))
(przesunięcie obciążenia f32.=8
(lokalny.get 1))))))

Źródło: opennet.ru

Dodaj komentarz