WebAssembly์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ๋ช ๋ น์ด๋ฅผ ํ์ํ๊ณ ํจ์จ์ ์ด๊ณ ๊ณ ์ฑ๋ฅ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ฅผ ์ด๋ป๊ฒ ํ์ ํ๋์ง ์์๋ณด์ธ์. ๊ฐ๋ฐ์์๊ฒ ๋ฏธ์น๋ ์ํฅ๊ณผ ์น ๊ฐ๋ฐ์ ๋ฏธ๋๋ฅผ ๋ฐ๊ฒฌํ์ญ์์ค.
WebAssembly ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ: ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ฌ์ธต ๋ถ์
WebAssembly(Wasm)๋ ๊ณ ์ฑ๋ฅ ์น ์ ํ๋ฆฌ์ผ์ด์ ๋ฐ ๊ทธ ์ด์์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. Wasm ํจ์จ์ฑ์ ํต์ฌ ์ธก๋ฉด์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ๋ฎ์ ์์ค์ ์ ์ด์ ์์ต๋๋ค. WebAssembly ๋ช ๋ น์ด ์ธํธ์ ์ค์ํ ์ถ๊ฐ ๊ธฐ๋ฅ์ธ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด๋ฌํ ์ ์ด๋ฅผ ๋์ฑ ํฅ์์์ผ ๊ฐ๋ฐ์๊ฐ ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๋๋ก ํฉ๋๋ค. ์ด ๊ธฐ์ฌ์์๋ Wasm ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ, ๊ทธ ์ด์ ๋ฐ ์น ๊ฐ๋ฐ์ ๋ฏธ๋์ ๋ฏธ์น๋ ์ํฅ์ ๋ํ ํฌ๊ด์ ์ธ ํ์์ ์ ๊ณตํฉ๋๋ค.
WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ์ดํด
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์์ธํ ์ดํด๋ณด๊ธฐ ์ ์ Wasm์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. WebAssembly๋ ๊ธฐ๋ณธ์ ์ผ๋ก ์ฐ์๋ ๋ฐ์ดํธ ๋ฐฐ์ด์ธ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ฌ์ฉํฉ๋๋ค. ์ด ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ JavaScript์์ ArrayBuffer๋ก ํํ๋ฉ๋๋ค. Wasm ๋ชจ๋์ JavaScript์ ๊ฐ๋น์ง ์์ง ํ์ ์ค๋ฒํค๋๋ฅผ ์ฐํํ์ฌ ์ด ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ก์ธ์คํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค. ์ด ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ Wasm์ ์ฑ๋ฅ ์ด์ ์ ์ฃผ์ ์์ธ์
๋๋ค.
์ ํ ๋ฉ๋ชจ๋ฆฌ๋ ์ผ๋ฐ์ ์ผ๋ก ํฌ๊ธฐ๊ฐ 64KB์ธ ํ์ด์ง๋ก ๋๋ฉ๋๋ค. Wasm ๋ชจ๋์ ํ์์ ๋ฐ๋ผ ๋ ๋ง์ ํ์ด์ง๋ฅผ ์์ฒญํ์ฌ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋์ ์ผ๋ก ๋๋ฆด ์ ์์ต๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ํฌ๊ธฐ์ ๊ธฐ๋ฅ์ WebAssembly๊ฐ ์ด๋ค ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ํจ์จ์ ์ผ๋ก ์คํํ ์ ์๋์ง์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
WebAssembly ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ด๋ ๋ฌด์์ ๋๊น?
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ Wasm ๋ชจ๋์ด ๋์ฉ๋ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๋๋ก ํ๋ ๋ช ๋ น์ด ์ธํธ์ ๋๋ค. ์ด๋ค์ WebAssembly MVP(์ต์ ์คํ ๊ฐ๋ฅ ์ ํ)์ ์ผ๋ถ๋ก ๋์ ๋์์ผ๋ฉฐ ๋ฐ์ดํธ ๋จ์๋ก ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ํฅ์๋ ๊ธฐ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
ํต์ฌ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์๋ ๋ค์์ด ํฌํจ๋ฉ๋๋ค.
memory.copy: ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํ ์์น์์ ๋ค๋ฅธ ์์น๋ก ๋ณต์ฌํฉ๋๋ค. ์ด ์ฐ์ฐ์ Wasm ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ด์์ ๋ฐ์ดํฐ ์ด๋ ๋ฐ ์กฐ์์ ํ์์ ์ ๋๋ค.memory.fill: ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํน์ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ฑ์๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋ ๋ฐ์ดํฐ๋ฅผ ์ง์ฐ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.memory.init: ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํฉ๋๋ค. ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ ์์ ๋๋ ๊ธฐํ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ Wasm ๋ชจ๋์ ์ฝ๊ธฐ ์ ์ฉ ์น์ ์ ๋๋ค. ์ด๋ ๋ฌธ์์ด ๋ฆฌํฐ๋ด ๋๋ ๊ธฐํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ด๊ธฐํํ๋ ๋ฐ ๋งค์ฐ ์ผ๋ฐ์ ์ ๋๋ค.data.drop: ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํฉ๋๋ค.memory.init์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌ๋ ํ์๋ ๋ฆฌ์์ค๋ฅผ ํ๋ณดํ๊ธฐ ์ํด ์ญ์ ํ ์ ์์ต๋๋ค.
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ์ฌ์ฉ์ ์ด์
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋์ ์ผ๋ก WebAssembly์ ๋ช ๊ฐ์ง ์ฃผ์ ์ด์ ์ด ์๊ฒผ์ต๋๋ค.
์ฑ๋ฅ ํฅ์
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๊ฐ๋ณ ๋ฐ์ดํธ ๋จ์ ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋น ๋ฆ ๋๋ค. ์ด๋ Wasm ๋ฐํ์์ด ์ด๋ฌํ ์ฐ์ฐ์ ์ต์ ํํ ์ ์๊ธฐ ๋๋ฌธ์ด๋ฉฐ, ์ข ์ข SIMD(๋จ์ผ ๋ช ๋ น์ด, ๋ค์ค ๋ฐ์ดํฐ) ๋ช ๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๋ฐ์ดํธ๋ฅผ ๋ณ๋ ฌ๋ก ์ฒ๋ฆฌํฉ๋๋ค. ๋ฐ๋ผ์ ํนํ ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ ๋ ๋์ ๋๋ ์ฑ๋ฅ ํฅ์์ด ๋ฐ์ํฉ๋๋ค.
์ฝ๋ ํฌ๊ธฐ ๊ฐ์
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด Wasm ๋ชจ๋์ ํฌ๊ธฐ๋ฅผ ์ค์ผ ์ ์์ต๋๋ค. ์ปดํ์ผ๋ฌ๋ ๊ธด ๋ฐ์ดํธ ๋จ์ ๋ช ๋ น์ด ์ํ์ค๋ฅผ ์์ฑํ๋ ๋์ ๋จ์ผ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ๋ช ๋ น์ด๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. ์ด ๋ ์์ ์ฝ๋ ํฌ๊ธฐ๋ ๋ ๋น ๋ฅธ ๋ค์ด๋ก๋ ์๊ฐ๊ณผ ๊ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ผ๋ก ๋ณํ๋ฉ๋๋ค.
ํฅ์๋ ๋ฉ๋ชจ๋ฆฌ ์์
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ผ๋์ ๋๊ณ ์ค๊ณ๋์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ํจ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํ๊ธฐ ์ํด ๋ฒ์ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฐ ๋ณด์ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค.
๊ฐ์ํ๋ ์ฝ๋ ์์ฑ
์ปดํ์ผ๋ฌ๋ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํ์ฉํ์ฌ ๋ณด๋ค ํจ์จ์ ์ธ Wasm ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. ์ด๋ ์ฝ๋ ์์ฑ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํ๊ณ ์ปดํ์ผ๋ฌ ๊ฐ๋ฐ์์ ๋ถ๋ด์ ์ค์ ๋๋ค.
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ค์ ์
๋ช ๊ฐ์ง ์ค์ ์์ ๋ฅผ ํตํด ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉ์ ์ค๋ช ํด ๋ณด๊ฒ ์ต๋๋ค.
์์ 1: ๋ฐฐ์ด ๋ณต์ฌ
๋ฉ๋ชจ๋ฆฌ์ ์ ์ ๋ฐฐ์ด์ด ์๊ณ ์ด๋ฅผ ๋ค๋ฅธ ์์น๋ก ๋ณต์ฌํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ๋ฉด memory.copy ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
๋ฐฐ์ด์ด ๋ฉ๋ชจ๋ฆฌ ์ฃผ์ src_addr์์ ์์ํ๊ณ ์ด๋ฅผ dest_addr๋ก ๋ณต์ฌํ๋ ค๋ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค. ๋ฐฐ์ด์ ๊ธธ์ด๋ length ๋ฐ์ดํธ์
๋๋ค.
(module
(memory (export "memory") 1)
(func (export "copy_array") (param $src_addr i32) (param $dest_addr i32) (param $length i32)
local.get $dest_addr
local.get $src_addr
local.get $length
memory.copy
)
)
์ด Wasm ์ฝ๋ ์กฐ๊ฐ์ memory.copy๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐฐ์ด์ ๋ณต์ฌํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ์ฒ์ ๋ ๊ฐ์ local.get ๋ช
๋ น์ด๋ ๋์ ๋ฐ ์์ค ์ฃผ์๋ฅผ ์คํ์ ํธ์ํ๊ณ ๊ทธ ๋ค์ ๊ธธ์ด๊ฐ ์ต๋๋ค. ๋ง์ง๋ง์ผ๋ก memory.copy ๋ช
๋ น์ด๊ฐ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ์ฐ์ฐ์ ์ํํฉ๋๋ค.
์์ 2: ๊ฐ์ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฑ์ฐ๊ธฐ
0๊ณผ ๊ฐ์ ํน์ ๊ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ด๊ธฐํํ๋ ค๋ ๊ฒฝ์ฐ๋ฅผ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. memory.fill ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฅผ ํจ์จ์ ์ผ๋ก ์ํํ ์ ์์ต๋๋ค.
start_addr ์ฃผ์์์ ์์ํ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ length ๋ฐ์ดํธ ๋์ value ๊ฐ์ผ๋ก ์ฑ์ฐ๋ ค๋ ๊ฒ์ผ๋ก ๊ฐ์ ํฉ๋๋ค.
(module
(memory (export "memory") 1)
(func (export "fill_memory") (param $start_addr i32) (param $value i32) (param $length i32)
local.get $start_addr
local.get $value
local.get $length
memory.fill
)
)
์ด ์ฝ๋ ์กฐ๊ฐ์ memory.fill์ ์ฌ์ฉํ์ฌ ํน์ ๊ฐ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ด๊ธฐํํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. local.get ๋ช
๋ น์ด๋ ์์ ์ฃผ์, ๊ฐ ๋ฐ ๊ธธ์ด๋ฅผ ์คํ์ ํธ์ํ ๋ค์ memory.fill์ด ์ฑ์ฐ๊ธฐ ์ฐ์ฐ์ ์ํํฉ๋๋ค.
์์ 3: ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์์ ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ
๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ Wasm ๋ชจ๋ ๋ด์ ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. memory.init์ ์ฌ์ฉํ์ฌ ๋ฐํ์์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค.
(module
(memory (export "memory") 1)
(data (i32.const 0) "Hello, WebAssembly!")
(func (export "init_memory") (param $dest_addr i32) (param $offset i32) (param $length i32)
local.get $dest_addr
local.get $offset
local.get $length
i32.const 0 ;; ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ธ๋ฑ์ค
memory.init
i32.const 0 ;; ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ธ๋ฑ์ค
data.drop
)
)
์ด ์์ ์์ data ์น์
์ "Hello, WebAssembly!" ๋ฌธ์์ด์ ํฌํจํ๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ ์ํฉ๋๋ค. init_memory ํจ์๋ ์ด ๋ฌธ์์ด์ ์ผ๋ถ(offset ๋ฐ length๋ก ์ง์ ๋จ)๋ฅผ dest_addr ์ฃผ์์ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํฉ๋๋ค. ๋ณต์ฌ ํ data.drop์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ํด์ ํฉ๋๋ค.
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ์ฌ์ฉ ์ฌ๋ก
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ค์์ ํฌํจํ ๊ด๋ฒ์ํ ์๋๋ฆฌ์ค์์ ์ ์ฉํฉ๋๋ค.
- ๊ฒ์ ๊ฐ๋ฐ: ๊ฒ์์ ์ข ์ข ๋์ฉ๋ ํ ์ค์ฒ, ๋ฉ์ ๋ฐ ๊ธฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์กฐ์ํด์ผ ํฉ๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด๋ฌํ ์ฐ์ฐ์ ์ฑ๋ฅ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ์ ๋์ฉ๋ ํฝ์ ๋ฐ์ดํฐ ๋ฐฐ์ด์ ์กฐ์ํ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ฉ๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ๊ฐ์ํํ ์ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ์์ถ ๋ฐ ์์ถ ํด์ : ์์ถ ๋ฐ ์์ถ ํด์ ์๊ณ ๋ฆฌ์ฆ์ ์ข ์ข ๋์ฉ๋ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ณต์ฌํ๊ณ ์ฑ์ฐ๋ ๊ฒ๊ณผ ๊ด๋ จ๋ฉ๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด๋ฌํ ์๊ณ ๋ฆฌ์ฆ์ ๋ณด๋ค ํจ์จ์ ์ผ๋ก ๋ง๋ค ์ ์์ต๋๋ค.
- ๊ณผํ ์ปดํจํ : ๊ณผํ ์๋ฎฌ๋ ์ด์ ์ ์ข ์ข ๋์ฉ๋ ํ๋ ฌ ๋ฐ ๋ฒกํฐ๋ก ์๋ํฉ๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด๋ฌํ ์๋ฎฌ๋ ์ด์ ์ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
- ๋ฌธ์์ด ์กฐ์: ๋ฌธ์์ด ๋ณต์ฌ, ์ฐ๊ฒฐ ๋ฐ ๊ฒ์๊ณผ ๊ฐ์ ์ฐ์ฐ์ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ์ต์ ํํ ์ ์์ต๋๋ค.
- ๊ฐ๋น์ง ์ปฌ๋ ์ : WebAssembly๋ ๊ฐ๋น์ง ์ปฌ๋ ์ (GC)์ ์๋ฌดํํ์ง ์์ง๋ง WebAssembly์์ ์คํ๋๋ ์ธ์ด๋ ์ข ์ข ์์ฒด GC๋ฅผ ๊ตฌํํฉ๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ค์ ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ์ฒด๋ฅผ ํจ์จ์ ์ผ๋ก ์ด๋ํ ์ ์์ต๋๋ค.
WebAssembly ์ปดํ์ผ๋ฌ ๋ฐ ํด์ฒด์ธ์ ๋ฏธ์น๋ ์ํฅ
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋์ ์ WebAssembly ์ปดํ์ผ๋ฌ ๋ฐ ํด์ฒด์ธ์ ํฐ ์ํฅ์ ๋ฏธ์ณค์ต๋๋ค. ์ปดํ์ผ๋ฌ ๊ฐ๋ฐ์๋ ์ด๋ฌํ ์๋ก์ด ๋ช ๋ น์ด๋ฅผ ํ์ฉํ๊ธฐ ์ํด ์ฝ๋ ์์ฑ ๋ ผ๋ฆฌ๋ฅผ ์ ๋ฐ์ดํธํด์ผ ํ์ต๋๋ค. ์ด๋ก ์ธํด ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ต์ ํ๋ Wasm ์ฝ๋๊ฐ ์์ฑ๋์์ต๋๋ค.
๋ํ ํด์ฒด์ธ์ด ์ ๋ฐ์ดํธ๋์ด ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ง์ํฉ๋๋ค. ์ฌ๊ธฐ์๋ Wasm ๋ชจ๋๋ก ์์ ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ์ด์ ๋ธ๋ฌ, ๋์ค์ด์ ๋ธ๋ฌ ๋ฐ ๊ธฐํ ๋๊ตฌ๊ฐ ํฌํจ๋ฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต ๋ฐ ๋ฒํฌ ์ฐ์ฐ
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ WebAssembly์ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต์ ๋ํ ์๋ก์ด ๊ธธ์ ์ด์์ต๋๋ค. ๋ค์ํ ์ ๊ทผ ๋ฐฉ์๊ณผ ์ํธ ์์ฉํ๋ ๋ฐฉ์์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์์กดํ๋ C ๋ฐ C++์ ๊ฐ์ ์ธ์ด๋ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด์ ์ ํฌ๊ฒ ๋๋ฆด ์ ์์ต๋๋ค. ๊ฐ๋ฐ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น ๋ฐ ํด์ ๋ฅผ ์ ํํ๊ฒ ์ ์ดํ ์ ์์ผ๋ฉฐ memory.copy ๋ฐ memory.fill์ ์ฌ์ฉํ์ฌ ํ ๋น ํด์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๋กํ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ ๊ฐ์ ๋ฐ์ดํฐ ์ด๋๊ณผ ๊ฐ์ ์์
์ ์ํํ ์ ์์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ์ฉํ๋ฉด ์ธ๋ถํ๋ ์ต์ ํ๊ฐ ๊ฐ๋ฅํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ๋์ ๋ฐ ํ์ ํฌ์ธํฐ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ์ฃผ์๊ฐ ํ์ํฉ๋๋ค. ์ด๋ฌํ ์ ์์ค ์ธ์ด๋ WebAssembly๋ก ์ปดํ์ผํ๊ธฐ ์ํ ์ผ๋ฐ์ ์ธ ๋์์
๋๋ค.
๊ฐ๋น์ง ์์ง ์ธ์ด
Java, C# ๋ฐ JavaScript(Wasm ๊ธฐ๋ฐ ๋ฐํ์๊ณผ ํจ๊ป ์ฌ์ฉํ๋ ๊ฒฝ์ฐ)์ ๊ฐ์ ๊ฐ๋น์ง ์์ง๊ธฐ๊ฐ ์๋ ์ธ์ด๋ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ GC ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด GC ์ฃผ๊ธฐ ๋์ ํ์ ์์ถํ ๋ ๋์ฉ๋ ๊ฐ์ฒด ๋ธ๋ก์ ์ด๋ํด์ผ ํฉ๋๋ค. memory.copy๋ ์ด๋ฌํ ์ด๋์ ์ํํ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ์๋ก ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ๋ memory.fill์ ์ฌ์ฉํ์ฌ ๋น ๋ฅด๊ฒ ์ด๊ธฐํํ ์ ์์ต๋๋ค.
์๋ ๋ ํ ๋น
์๋ ๋ ํ ๋น์ ๊ฐ์ฒด๊ฐ ๋์ฉ๋์ ์ฌ์ ํ ๋น๋ ๋ฉ๋ชจ๋ฆฌ ์ฒญํฌ(์๋ ๋)์์ ํ ๋น๋๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ์ ์
๋๋ค. ์๋ ๋๊ฐ ๊ฐ๋ ์ฐจ๋ฉด ์ฌ์ค์ ํ์ฌ ๋ด๋ถ์ ๋ชจ๋ ๊ฐ์ฒด๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ ๋น ํด์ ํ ์ ์์ต๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ memory.fill์ ์ฌ์ฉํ์ฌ ์ฌ์ค์ ๋ ๋ ์๋ ๋๋ฅผ ํจ์จ์ ์ผ๋ก ์ง์ธ ์ ์์ต๋๋ค. ์ด ํจํด์ ์๋ช
์ด ์งง์ ๊ฐ์ฒด๊ฐ ์๋ ์๋๋ฆฌ์ค์ ํนํ ์ ์ฉํฉ๋๋ค.
๋ฏธ๋ ๋ฐฉํฅ ๋ฐ ์ต์ ํ
WebAssembly ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ๋ฐ์ ์ ๊ณ์ ์งํ ์ค์ ๋๋ค. ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ๊ณผ ๊ด๋ จ๋ ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฏธ๋ ๋ฐฉํฅ ๋ฐ ์ต์ ํ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ถ๊ฐ SIMD ํตํฉ
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ๋ด์์ SIMD ๋ช ๋ น์ด์ ์ฌ์ฉ์ ํ๋ํ๋ฉด ํจ์ฌ ๋ ํฐ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ฌ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์๋ ์ต์ CPU์ ๋ณ๋ ฌ ์ฒ๋ฆฌ ๊ธฐ๋ฅ์ ํ์ฉํ์ฌ ํจ์ฌ ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋์์ ์กฐ์ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
ํ๋์จ์ด ๊ฐ์
๋ฏธ๋์๋ WebAssembly ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํด ํน๋ณํ ์ค๊ณ๋ ์ ์ฉ ํ๋์จ์ด ๊ฐ์๊ธฐ๊ฐ ์ค๊ณ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์๋นํ ์ฑ๋ฅ ํฅ์์ ์ ๊ณตํ ์ ์์ต๋๋ค.
ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ
์๋ก์ด ํน์ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ Wasm ๋ช
๋ น์ด ์ธํธ์ ์ถ๊ฐํ๋ฉด ํน์ ์์
์ ์ถ๊ฐ๋ก ์ต์ ํํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ๋กํํ๋ ํน์ ๋ช
๋ น์ด๋ 0 ๊ฐ์ ์ฌ์ฉํ์ฌ memory.fill์ ์ฌ์ฉํ๋ ๊ฒ๋ณด๋ค ๋ ํจ์จ์ ์ผ ์ ์์ต๋๋ค.
์ค๋ ๋ ์ง์
WebAssembly๊ฐ ๋ค์ค ์ค๋ ๋ฉ์ ๋ ์ ์ง์ํ๋๋ก ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๋์ ์ก์ธ์ค๋ฅผ ์ฒ๋ฆฌํ๋๋ก ์กฐ์ ํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์๋ก์ด ๋๊ธฐํ ๊ธฐ๋ณธ ์์๋ฅผ ์ถ๊ฐํ๊ฑฐ๋ ๋ค์ค ์ค๋ ๋ ํ๊ฒฝ์์ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ๋ณด์ฅํ๊ธฐ ์ํด ๊ธฐ์กด ์ฐ์ฐ์ ๋์์ ์์ ํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฑ๋ฅ ์ด์ ์ ์ ๊ณตํ์ง๋ง ๋ณด์ ์ํฅ์ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ํ ๊ฐ์ง ์ฃผ์ ๋ฌธ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ ํจ ๋ฒ์ ๋ด์ ์๋์ง ํ์ธํ๋ ๊ฒ์ ๋๋ค. WebAssembly ๋ฐํ์์ ๋ฒ์๋ฅผ ๋ฒ์ด๋ ์ก์ธ์ค๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฒ์ ๊ฒ์ฌ๋ฅผ ์ํํ์ง๋ง ์ด๋ฌํ ๊ฒ์ฌ๊ฐ ๊ฐ๋ ฅํ๊ณ ์ฐํํ ์ ์๋์ง ํ์ธํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ ๋ค๋ฅธ ๋ฌธ์ ๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๊ฐ๋ฅ์ฑ์ ๋๋ค. Wasm ๋ชจ๋์ ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์์น์ ์ฐ๋๋ก ํ๋ ๋ฒ๊ทธ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉด ๋ณด์ ์ทจ์ฝ์ ์ด ๋ฐ์ํ ์ ์์ต๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์์ ํ๋ก๊ทธ๋๋ฐ ๋ฐฉ์์ ์ฌ์ฉํ๊ณ Wasm ์ฝ๋๋ฅผ ์ ์คํ๊ฒ ๊ฒํ ํ์ฌ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์๋ณํ๊ณ ์์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ธ๋ผ์ฐ์ ์ธ๋ถ์ WebAssembly
WebAssembly๋ ์น ๊ธฐ์ ๋ก ์ฒ์ ์ฃผ๋ชฉ์ ๋ฐ์์ง๋ง ๊ทธ ์์ฉ ๋ถ์ผ๋ ๋ธ๋ผ์ฐ์ ์ด์์ผ๋ก ๋น ๋ฅด๊ฒ ํ์ฅ๋๊ณ ์์ต๋๋ค. Wasm์ ์ด์์ฑ, ์ฑ๋ฅ ๋ฐ ๋ณด์ ๊ธฐ๋ฅ์ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก์ ๋งค๋ ฅ์ ์ธ ์ต์ ์ ๋๋ค.
- ์๋ฒ๋ฆฌ์ค ์ปดํจํ : Wasm ๋ฐํ์์ ์ฌ์ฉํ์ฌ ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ์ ํจ์จ์ ์ด๊ณ ์์ ํ๊ฒ ์คํํ ์ ์์ต๋๋ค.
- ์๋ฒ ๋๋ ์์คํ : Wasm์ ์์ ๊ณต๊ฐ๊ณผ ๊ฒฐ์ ๋ก ์ ์คํ์ ์๋ฒ ๋๋ ์์คํ ๋ฐ IoT ์ฅ์น์ ์ ํฉํฉ๋๋ค.
- ๋ธ๋ก์ฒด์ธ: Wasm์ ์ฌ๋ฌ ๋ธ๋ก์ฒด์ธ ํ๋ซํผ์์ ์ค๋งํธ ๊ณ์ฝ์ ์ํ ์คํ ์์ง์ผ๋ก ์ฌ์ฉ๋๊ณ ์์ต๋๋ค.
- ๋ ๋ฆฝ ์คํํ ์ ํ๋ฆฌ์ผ์ด์ : Wasm์ ์ฌ์ฉํ์ฌ ๋ค๋ฅธ ์ด์ ์ฒด์ ์์ ๊ธฐ๋ณธ์ ์ผ๋ก ์คํ๋๋ ๋ ๋ฆฝ ์คํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋น๋ํ ์ ์์ต๋๋ค. ์ด๋ ์ข ์ข WebAssembly ๋ชจ๋์ ๋ํ ํ์คํ๋ ์์คํ ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ WASI(WebAssembly System Interface)์ ๊ฐ์ ๋ฐํ์์ ์ฌ์ฉํ์ฌ ๋ฌ์ฑ๋ฉ๋๋ค.
๊ฒฐ๋ก
WebAssembly ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์น ๋ฐ ๊ทธ ์ด์์ ์ํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ์ค์ํ ๋ฐ์ ์ ๋ํ๋ ๋๋ค. ์ฑ๋ฅ ํฅ์, ์ฝ๋ ํฌ๊ธฐ ๊ฐ์, ๋ฉ๋ชจ๋ฆฌ ์์ ์ฑ ํฅ์ ๋ฐ ์ฝ๋ ์์ฑ ๊ฐ์ํ๋ฅผ ์ ๊ณตํฉ๋๋ค. WebAssembly๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ถ๊ฐ ์ต์ ํ ๋ฐ ์๋ก์ด ์์ฉ ํ๋ก๊ทธ๋จ์ ๊ธฐ๋ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ๋ ฅํ ๋ช ๋ น์ด๋ฅผ ์ดํดํ๊ณ ํ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ WebAssembly๋ก ๊ฐ๋ฅํ ๊ฒ์ ๊ฒฝ๊ณ๋ฅผ ๋ํ๋ ๋ณด๋ค ํจ์จ์ ์ด๊ณ ์ฑ๋ฅ์ด ๋ฐ์ด๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ๋ณต์กํ ๊ฒ์์ ๊ตฌ์ถํ๋ , ๋์ฉ๋ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ์ฒ๋ฆฌํ๋ , ์ต์ฒจ๋จ ์๋ฒ๋ฆฌ์ค ๊ธฐ๋ฅ์ ๊ฐ๋ฐํ๋ ๋ฒํฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ WebAssembly ๊ฐ๋ฐ์ ๋ฌด๊ธฐ๊ณ ์์ ํ์์ ์ธ ๋๊ตฌ์ ๋๋ค.