Разработчиците на V8 представиха декомпилатор за WebAssembly

Разработчици на V8 JavaScript двигателя представени полезност wasm-декомпилира, което ви позволява да декомпилирате междинното двоично представяне WebAssembly в четим псевдоезик, напомнящ на JavaScript и C. Предложеният псевдо-език е много по-лесен за разбиране и по-подходящ за ръчно анализиране от текстовото представяне на WebAssembly във формат „.wat“, който е по-близо до асемблерния език, отколкото до езиците от високо ниво. В този случай декомпилацията отразява представянето на Wasm възможно най-пълно.

Декомпилатор включен включени в инструментариума WABT, който осигурява превод между двоични и текстови представяния на WebAssembly, както и анализиране, обработка, модифициране и проверка на wasm файлове. WABT също разработва помощна програма wasm2c, което позволява файловете wasm да бъдат декомпилирани в еквивалентен C код, който може да бъде компилиран от C компилатор, но не се различава много по отношение на четимост от текстовото представяне на "wat".

Например оригиналната C функция, компилирана в wasm

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

float dot(const vec3 *a, const vec3 *b) {
върне a->x * b->x +
a->y * b->y +
a->z * b->z;
}

ще бъде декомпилиран от помощната програма wasm-decompile в псевдоезик

функция dot(a:{ a:float, b:float, c:float},
b:{ a:float, b:float, c:float }):float {
връщане aa * ba + ab * bb + ac * bc
}

докато преобразуването в текстов формат ".wat" ще изглежда така

(func $dot (тип 0) (параметър i32 i32) (резултат f32)
(f32.add
(f32.add
(f32.mul
(f32.зареждане
(local.get 0))
(f32.зареждане
(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))))))

Източник: opennet.ru

Добавяне на нов коментар