V8 ๊ฐœ๋ฐœ์ž๋Š” WebAssembly์šฉ ๋””์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์„ ๋ณด์˜€์Šต๋‹ˆ๋‹ค.

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

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€