V8 JavaScript ์์ง ๊ฐ๋ฐ์ ์ ์ ๊ณต์ต์ฌ์
wasm ๋์ปดํ์ผ, ์ด๋ฅผ ํตํด ์ค๊ฐ ๋ฐ์ด๋๋ฆฌ ํํ์ ๋์ปดํ์ผํ ์ ์์ต๋๋ค. WebAssembly JavaScript์ C๋ฅผ ์ฐ์์ํค๋ ์ฝ๊ธฐ ์ฌ์ด ์์ฌ ์ธ์ด๋ก ๋ณํ๋ฉ๋๋ค. ์ ์๋ ์์ฌ ์ธ์ด๋ ".wat" ํ์์ WebAssembly ํ
์คํธ ํํ๋ณด๋ค ์ดํดํ๊ธฐ ํจ์ฌ ์ฝ๊ณ ์๋ ๊ตฌ๋ฌธ ๋ถ์์ ๋ ์ ํฉํฉ๋๋ค. ์ด๋ ๊ณ ๊ธ ์ธ์ด๋ณด๋ค ์ด์
๋ธ๋ฆฌ ์ธ์ด์ ๋ ๊ฐ๊น์ต๋๋ค. ์ด ๊ฒฝ์ฐ ๋์ปดํ์ผ์ Wasm ํํ์ ์ต๋ํ ์๋ฒฝํ๊ฒ ๋ฐ์ํฉ๋๋ค.
๋์ปดํ์ผ๋ฌ ํฌํจ๋จ ํดํท์ ํฌํจ๋จ WABT, WebAssembly์ ๋ฐ์ด๋๋ฆฌ์ ํ
์คํธ ํํ ๊ฐ ๋ณํ์ ๋ฌผ๋ก wasm ํ์ผ์ ๊ตฌ๋ฌธ ๋ถ์, ์ฒ๋ฆฌ, ์์ ๋ฐ ๊ฒ์ฆ๋ ์ ๊ณตํฉ๋๋ค. WABT๋ ๋ํ ์ ํธ๋ฆฌํฐ๋ฅผ ๊ฐ๋ฐํ๊ณ ์์ต๋๋ค. wasm2c๋ฅผ ์ฌ์ฉํ๋ฉด wasm ํ์ผ์ C ์ปดํ์ผ๋ฌ๋ก ์ปดํ์ผํ ์ ์๋ ๋๋ฑํ C ์ฝ๋๋ก ๋์ปดํ์ผํ ์ ์์ง๋ง "wat"์ ํ
์คํธ ํํ๊ณผ ๊ฐ๋
์ฑ ์ธก๋ฉด์์ ํฌ๊ฒ ๋ค๋ฅด์ง ์์ต๋๋ค.
์๋ฅผ ๋ค์ด, wasm์ผ๋ก ์ปดํ์ผ๋ ์๋ C ํจ์๋
typedef struct { float x, y, z; } vec3;
float dot(const vec3 *a, const vec3 *b) {
a->x * b->x +๋ฅผ ๋ฐํํฉ๋๋ค.
a->y * b->y +
a->z * b->z;
}
wasm-decompile ์ ํธ๋ฆฌํฐ์ ์ํด ์์ฌ ์ธ์ด๋ก ๋์ปดํ์ผ๋ฉ๋๋ค.
ํจ์ ๋ํธ(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.์ถ๊ฐ
(f32.์ถ๊ฐ
(f32.mul
(f32.๋ก๋
(local.get 0))
(f32.๋ก๋
(local.get 1)))
(f32.mul
(f32.๋ก๋ ์คํ์
=4
(local.get 0))
(f32.๋ก๋ ์คํ์
=4
(local.get 1))))
(f32.mul
(f32.๋ก๋ ์คํ์
=8
(local.get 0))
(f32.๋ก๋ ์คํ์
=8
(local.get 1))))))
์ถ์ฒ : opennet.ru