Распрацоўнікі 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

Дадаць каментар