Розробники V8 представили декомпілятор для WebAssembly

Розробники JavaScript-движка V8 представили утиліту wasm-decompile, що дозволяє декомпілювати проміжне бінарне подання WebAssembly в псевдомову, що нагадує JavaScript і Сі. Запропонована псевдомова суттєво простіше для сприйняття і більш придатна для ручного розбору, ніж текстове представлення WebAssembly у форматі «.wat», яке ближче до асемблера, ніж до високорівневих мов. При цьому декомпіляція наскільки можна повністю відображає уявлення Wasm.

Декомпілятор включений до складу інструментарію WABT, що забезпечує трансляцію між бінарним та текстовим уявленням WebAssembly, а також розбір, обробку, модифікацію та перевірку wasm-файлів. У складі WABT також розвивається утиліта wasm2c, що дозволяє декомпілювати файли wasm в еквівалентний код мовою Сі, який може бути скомпілюваний Сі-компілятором, але в плані читання мало чим відрізняється від текстового представлення «wat».

Наприклад, скомпільована в wasm вихідна Си-функція

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

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

буде декомпільована утилітою wasm-decompile у псевдомову

function dot(a:{ a:float, b:float, c:float },
b:{ a:float, b:float, c:float }):float {
return aa*ba+ab*bb+ac*bc
}

в той час як перетворення на текстовий формат «.wat» буде виглядати наступним чином

(func $dot (type 0) (param i32 i32) (result f32)
(f32.add
(f32.add
(f32.mul
(f32.load
(local.get 0))
(f32.load
(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

Додати коментар або відгук