Π Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΈ 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 a.a * b.a + a.b * b.b + a.c * b.c
}

Π² Ρ‚ΠΎ врСмя ΠΊΠ°ΠΊ ΠΏΡ€Π΅ΠΎΠ±Ρ€Π°Π·ΠΎΠ²Π°Π½ΠΈΠ΅ Π² тСкстовый Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ «.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