Π Π°Π·ΡΠ°Π±ΠΎΡΡΠΈΠΊΠΈ 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