V8 ծրագրավորողները ներկայացրել են Decompiler WebAssembly-ի համար

V8 JavaScript շարժիչի մշակողներ ներկայացվել է օգտակար wasm-decompile, որը թույլ է տալիս ապակոմպիլացնել միջանկյալ երկուական ներկայացում Վեբ-հավաքույթ վերածվել ընթեռնելի կեղծ լեզվի, որը հիշեցնում է JavaScript-ը և C. Առաջարկվող կեղծ լեզուն շատ ավելի հեշտ է հասկանալի և ավելի հարմար է ձեռքով վերլուծելու համար, քան WebAssembly-ի տեքստային ներկայացումը «.wat» ձևաչափով, որն ավելի մոտ է assembler-ին, քան բարձր մակարդակի լեզուներին: Միևնույն ժամանակ, ապակոմպիլյացիան, հնարավորության դեպքում, լիովին արտացոլում է Wasm-ի ներկայացումը:

Decompiler ներառված գործիքակազմում 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 +
ա->զ * բ->զ;
}

wasm-decompile utility-ի կողմից կկազմակերպվի կեղծ լեզվի

ֆունկցիան 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) (param i32 i32) (արդյունք 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))))))

Source: opennet.ru

Добавить комментарий