WebAssembly์ memory.copy, memory.fill, memory.init ๋ฑ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํ์ํ์ฌ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์กฐ์์ ๋ง์คํฐํ๊ณ ์ ์ธ๊ณ ์ ํ๋ฆฌ์ผ์ด์ ์ฑ๋ฅ์ ํฅ์์ํค์ธ์. ์ด ๊ฐ์ด๋๋ ์ฌ์ฉ ์ฌ๋ก, ์ฑ๋ฅ ์ด์ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ค๋ฃน๋๋ค.
WebAssembly ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ: ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ต๊ณ ํจ์จ์ฑ ๋ฌ์ฑ
๋์์์ด ์งํํ๋ ์น ๊ฐ๋ฐ ํ๊ฒฝ์์ ์ฑ๋ฅ์ ์ฌ์ ํ ๊ฐ์ฅ ์ค์ํ ๊ด์ฌ์ฌ์ ๋๋ค. ์ ์ธ๊ณ ์ฌ์ฉ์๋ ํ๋ถํ ๊ธฐ๋ฅ๊ณผ ๋ฐ์์ฑ์ ๊ฐ์ถ ๋ฟ๋ง ์๋๋ผ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๋น ๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ํฉ๋๋ค. ์ด๋ฌํ ์๊ตฌ๋ ๊ฐ๋ฐ์๋ค์ด C, C++, Rust์ ๊ฐ์ ์ธ์ด์์ ์ ํต์ ์ผ๋ก ์ฌ์ฉ๋๋ ๊ณ ์ฑ๋ฅ ์ฝ๋๋ฅผ ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์ ์ง์ ์คํํ ์ ์๊ฒ ํด์ฃผ๋ WebAssembly(Wasm)์ ๊ฐ์ ๊ฐ๋ ฅํ ๊ธฐ์ ์ ์ฑํ์ ์ด๋์์ต๋๋ค. WebAssembly๋ ๋ณธ์ง์ ์ผ๋ก ์๋นํ ์๋ ์ด์ ์ ์ ๊ณตํ์ง๋ง, ๊ทธ ๊ธฐ๋ฅ์ ๋ ๊น์ด ํ๊ณ ๋ค๋ฉด ํจ์จ์ฑ์ ํ๊ณ๋ฅผ ๋์ฑ ๋ฐ์ด๋ถ์ด๊ธฐ ์ํด ์ค๊ณ๋ ํนํ๋ ๊ธฐ๋ฅ, ์ฆ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ(Bulk Memory Operations)์ด ๋๋ฌ๋ฉ๋๋ค.
์ด ์ข
ํฉ ๊ฐ์ด๋์์๋ WebAssembly์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ธ memory.copy, memory.fill, memory.init์ ํ์ํ์ฌ, ๊ฐ๋ฐ์๋ค์ด ์ด๋ฌํ ๊ฐ๋ ฅํ ๊ธฐ๋ณธ ์์๋ฅผ ํตํด ์ด๋ป๊ฒ ๋น๊ตํ ์ ์๋ ํจ์จ์ฑ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ ์ ์๋์ง ๋ณด์ฌ์ค ๊ฒ์
๋๋ค. ์ฐ๋ฆฌ๋ ๊ทธ ์๋ ๋ฐฉ์์ ๋ํด ๊น์ด ์์๋ณด๊ณ , ์ค์ฉ์ ์ธ ์ ์ฉ ์ฌ๋ก๋ฅผ ์ ๋ณด์ด๋ฉฐ, ์ด๋ค์ด ์ ์ธ๊ณ์ ๋ค์ํ ์ฅ์น์ ๋คํธ์ํฌ ์กฐ๊ฑด์ ์๋ ์ฌ์ฉ์๋ค์ ์ํด ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ ๋ฐ์์ฑ์ด ์ข์ ์น ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ์ด๋ป๊ฒ ๊ธฐ์ฌํ๋์ง ๊ฐ์กฐํ ๊ฒ์
๋๋ค.
์๋์ ํ์์ฑ: ์น์์์ ๋ฉ๋ชจ๋ฆฌ ์ง์ฝ์ ์์ ํด๊ฒฐ
ํ๋์ ์น์ ๋ ์ด์ ์ ์ ์ธ ํ์ด์ง๋ ๊ฐ๋จํ ์์์๋ง ๊ตญํ๋์ง ์์ต๋๋ค. ๊ณ ๊ธ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ํธ์ง ๋๊ตฌ๋ถํฐ ๋ชฐ์ ํ 3D ๊ฒ์, ๊ณผํ ์๋ฎฌ๋ ์ด์ , ์ฌ์ง์ด ํด๋ผ์ด์ธํธ ์ธก์์ ์คํ๋๋ ์ ๊ตํ ๋จธ์ ๋ฌ๋ ๋ชจ๋ธ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ณต์กํ๊ณ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ํ๋ซํผ์ ๋๋ค. ์ด๋ฌํ ์ ํ๋ฆฌ์ผ์ด์ ์ค ๋ค์๋ ๋ณธ์ง์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ฐ์ด๋(memory-bound)์ด๋ฉฐ, ์ด๋ ์ฑ๋ฅ์ด ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ๋๊ท๋ชจ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ผ๋ง๋ ํจ์จ์ ์ผ๋ก ์ด๋, ๋ณต์ฌ, ์กฐ์ํ ์ ์๋์ง์ ํฌ๊ฒ ์์กดํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์ ํต์ ์ผ๋ก JavaScript๋ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ๋ค์ฌ๋ค๋ฅํ์ง๋ง, ์ด๋ฌํ ๊ณ ์ฑ๋ฅ ์๋๋ฆฌ์ค์์๋ ํ๊ณ์ ๋ถ๋ชํ์ต๋๋ค. ๊ฐ๋น์ง ์ปฌ๋ ์ ๋ฐฉ์์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ๊ณผ ์ฝ๋๋ฅผ ํด์ํ๊ฑฐ๋ JIT ์ปดํ์ผํ๋ ์ค๋ฒํค๋๋ ํนํ ์์ ๋ฐ์ดํธ๋ ํฐ ๋ฐฐ์ด์ ๋ค๋ฃฐ ๋ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ์ ๋ฐํ ์ ์์ต๋๋ค. WebAssembly๋ ์ ์์ค์ ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์คํ ํ๊ฒฝ์ ์ ๊ณตํจ์ผ๋ก์จ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํฉ๋๋ค. ๊ทธ๋ฌ๋ Wasm ๋ด์์๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํจ์จ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๋ฐ์์ฑ๊ณผ ์๋๋ฅผ ๊ฒฐ์ ํ๋ ์ค์ํ ์์๊ฐ ๋ ์ ์์ต๋๋ค.
๊ณ ํด์๋ ์ด๋ฏธ์ง๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋, ๊ฒ์ ์์ง์์ ๋ณต์กํ ์ฅ๋ฉด์ ๋ ๋๋งํ๊ฑฐ๋, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์คํธ๋ฆผ์ ๋์ฝ๋ฉํ๋ ๊ฒ์ ์์ํด ๋ณด์ญ์์ค. ์ด๋ฌํ ๊ฐ ์์ ์๋ ์๋ง์ ๋ฉ๋ชจ๋ฆฌ ์ ์ก ๋ฐ ์ด๊ธฐํ๊ฐ ํฌํจ๋ฉ๋๋ค. ์ต์ ํ๋ ๊ธฐ๋ณธ ์์๊ฐ ์๋ค๋ฉด ์ด๋ฌํ ์ฐ์ฐ์ ์๋ ๋ฃจํ๋ ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ํ์๋ก ํ์ฌ ๊ท์คํ CPU ์ฌ์ดํด์ ์๋ชจํ๊ณ ์ฌ์ฉ์ ๊ฒฝํ์ ์ํฅ์ ๋ฏธ์น ๊ฒ์ ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ WebAssembly์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ด ๋ฑ์ฅํ์ฌ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ํ ์ง์ ์ ์ด๊ณ ํ๋์จ์ด ๊ฐ์ํ๋ ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค.
WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ ์ดํดํ๊ธฐ
๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ํด ์์๋ณด๊ธฐ ์ ์ WebAssembly์ ๊ธฐ๋ณธ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ํ์ ํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. JavaScript์ ๋์ ์ด๊ณ ๊ฐ๋น์ง ์ปฌ๋ ์ ๋๋ ํ๊ณผ ๋ฌ๋ฆฌ, WebAssembly๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ(linear memory) ๋ชจ๋ธ์์ ์๋ํฉ๋๋ค. ์ด๊ฒ์ Wasm ๋ชจ๋์ด ์ง์ ๊ด๋ฆฌํ๋, ์ฃผ์ 0์์ ์์ํ๋ ํฌ๊ณ ์ฐ์์ ์ธ ์์ ๋ฐ์ดํธ ๋ฐฐ์ด๋ก ๊ฐ๋ ํํ ์ ์์ต๋๋ค.
- ์ฐ์์ ์ธ ๋ฐ์ดํธ ๋ฐฐ์ด: WebAssembly ๋ฉ๋ชจ๋ฆฌ๋ ๋จ์ผํ๊ณ , ํํํ๋ฉฐ, ํ์ฅ ๊ฐ๋ฅํ
ArrayBuffer์ ๋๋ค. ์ด๋ C๋ C++๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐฉ์๊ณผ ์ ์ฌํ๊ฒ ์ง์ ์ ์ธ ์ธ๋ฑ์ฑ๊ณผ ํฌ์ธํฐ ์ฐ์ฐ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. - ์๋ ๊ด๋ฆฌ: Wasm ๋ชจ๋์ ์ผ๋ฐ์ ์ผ๋ก ์ด ์ ํ ๊ณต๊ฐ ๋ด์์ ์์ฒด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํ๋ฉฐ, ์ข
์ข
C์
malloc๋ฐfree์ ์ ์ฌํ ๊ธฐ์ ์ ์ฌ์ฉํฉ๋๋ค. ์ด๋ Wasm ๋ชจ๋ ๋ด์์ ์ง์ ๊ตฌํ๋๊ฑฐ๋ ํธ์คํธ ์ธ์ด์ ๋ฐํ์(์: Rust์ ํ ๋น์)์ ์ํด ์ ๊ณต๋ฉ๋๋ค. - JavaScript์ ๊ณต์ : ์ด ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ JavaScript์ ํ์ค
ArrayBuffer๊ฐ์ฒด๋ก ๋ ธ์ถ๋ฉ๋๋ค. JavaScript๋ ์ดArrayBuffer์์TypedArray๋ทฐ(์:Uint8Array,Float32Array)๋ฅผ ์์ฑํ์ฌ Wasm ๋ชจ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์์ผ๋ฉฐ, ๋น์ฉ์ด ๋ง์ด ๋๋ ๋ฐ์ดํฐ ์ง๋ ฌํ ์์ด ํจ์จ์ ์ธ ์ํธ ์ด์ฉ์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. - ํ์ฅ ๊ฐ๋ฅ: ์ ํ๋ฆฌ์ผ์ด์
์ด ๋ ๋ง์ ๊ณต๊ฐ์ ํ์๋ก ํ ๊ฒฝ์ฐ Wasm ๋ฉ๋ชจ๋ฆฌ๋ ๋ฐํ์์ (์:
memory.grow๋ช ๋ น์ด๋ฅผ ํตํด) ์ ์๋ ์ต๋ ํฌ๊ธฐ๊น์ง ํ์ฅ๋ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณผ๋ํ๊ฒ ํฐ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ๋ฏธ๋ฆฌ ํ ๋นํ ํ์ ์์ด ๋ค์ํ ๋ฐ์ดํฐ ๋ก๋์ ์ ์ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ์ง์ ์ ์ด๊ณ ์ ์์ค์ ๋ฉ๋ชจ๋ฆฌ ์ ์ด๋ WebAssembly ์ฑ๋ฅ์ ์ด์์ ๋๋ค. ์ด๋ ๊ฐ๋ฐ์๋ค์ด ๊ณ ๋๋ก ์ต์ ํ๋ ๋ฐ์ดํฐ ๊ตฌ์กฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๊ตฌํํ ์ ์๊ฒ ํ์ฌ, ๊ณ ์์ค ์ธ์ด์ ๊ด๋ จ๋ ์ถ์ํ ๊ณ์ธต ๋ฐ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ฐํํ ์ ์๋๋ก ํฉ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด ๊ธฐ๋ฐ ์์ ์ง์ ๊ตฌ์ถ๋์ด ์ด ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ์กฐ์ํ๋ ํจ์ฌ ๋ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
์ฑ๋ฅ ๋ณ๋ชฉ ํ์: ๊ธฐ์กด์ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ
WebAssembly ์ด์ฐฝ๊ธฐ, ๋ช ์์ ์ธ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ด ๋์ ๋๊ธฐ ์ ์๋, ๋ฉ๋ชจ๋ฆฌ์ ํฐ ๋ธ๋ก์ ๋ณต์ฌํ๊ฑฐ๋ ์ฑ์ฐ๋ ๊ฒ๊ณผ ๊ฐ์ ์ผ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์กฐ์ ์์ ์ ๋ ์ต์ ํ๋ ๋ฐฉ๋ฒ์ผ๋ก ๊ตฌํ๋์ด์ผ ํ์ต๋๋ค. ๊ฐ๋ฐ์๋ค์ ์ผ๋ฐ์ ์ผ๋ก ๋ค์ ์ ๊ทผ ๋ฐฉ์ ์ค ํ๋์ ์์กดํ์ต๋๋ค.
-
WebAssembly ๋ด์์์ ๋ฃจํ:
Wasm ๋ชจ๋์ ์์ค ์ฃผ์์์ ์ฝ๊ณ ๋์ ์ฃผ์์ ํ ๋ฐ์ดํธ(๋๋ ์๋)์ฉ ์๋์ผ๋ก ๋ฐ๋ณตํ์ฌ ์ฐ๋ ๋ฐฉ์์ผ๋ก
memcpy์ ์ ์ฌํ ํจ์๋ฅผ ๊ตฌํํ ์ ์์์ต๋๋ค. ์ด๋ Wasm ์คํ ํ๊ฒฝ ๋ด์์ ์ํ๋์ง๋ง, ์ฌ์ ํ ๋ฃจํ ๋ด์์ ์ผ๋ จ์ ๋ก๋ ๋ฐ ์คํ ์ด ๋ช ๋ น์ ํฌํจํฉ๋๋ค. ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ๋ธ๋ก์ ๊ฒฝ์ฐ, ๋ฃจํ ์ ์ด, ์ธ๋ฑ์ค ๊ณ์ฐ ๋ฐ ๊ฐ๋ณ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ค๋ฒํค๋๊ฐ ์๋นํ ๋์ ๋ฉ๋๋ค.์์ (๋ณต์ฌ ํจ์์ ๋ํ ๊ฐ๋ ์ Wasm ์์ฌ ์ฝ๋):
(func $memcpy (param $dest i32) (param $src i32) (param $len i32) (local $i i32) (local.set $i (i32.const 0)) (loop $loop (br_if $loop (i32.ge_u (local.get $i) (local.get $len))) (i32.store (i32.add (local.get $dest) (local.get $i)) (i32.load (i32.add (local.get $src) (local.get $i))) ) (local.set $i (i32.add (local.get $i) (i32.const 1))) (br $loop) ) )์ด ์ ๊ทผ ๋ฐฉ์์ ๊ธฐ๋ฅ์ ์ด์ง๋ง, ์ง์ ์ ์ธ ์์คํ ํธ์ถ์ด๋ CPU ๋ช ๋ น์ด ํ ์ ์๋ ๊ฒ๋งํผ ๊ธฐ๋ณธ ํ๋์จ์ด์ ๊ณ ์ฒ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ๋ฅ๋ ฅ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ์ง ๋ชปํฉ๋๋ค.
-
JavaScript ์ํธ ์ด์ฉ:
๋ ๋ค๋ฅธ ์ผ๋ฐ์ ์ธ ํจํด์ JavaScript ์ธก์์
TypedArray๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํํ๋ ๊ฒ์ด์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ธฐ ์ํด Wasm ๋ฉ๋ชจ๋ฆฌ ์์Uint8Array๋ทฐ๋ฅผ ๋ง๋ ๋ค์subarray()์set()์ ์ฌ์ฉํ ์ ์์ต๋๋ค.// Wasm ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ฅผ ์ํ JavaScript ์์ const wasmMemory = instance.exports.memory; // WebAssembly.Memory ๊ฐ์ฒด const wasmBytes = new Uint8Array(wasmMemory.buffer); function copyInMemoryJS(dest, src, len) { wasmBytes.set(wasmBytes.subarray(src, src + len), dest); }TypedArray.prototype.set()์ ์ต์ JavaScript ์์ง์์ ๊ณ ๋๋ก ์ต์ ํ๋์ด ์์ง๋ง, ์ฌ์ ํ ๋ค์๊ณผ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ์ค๋ฒํค๋๊ฐ ์์ต๋๋ค:- JavaScript ์์ง ์ค๋ฒํค๋: Wasm๊ณผ JavaScript ๊ฐ์ ํธ์ถ ์คํ ์ ํ.
- ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ ๊ฒ์ฌ: ๋ธ๋ผ์ฐ์ ๊ฐ ์ด๋ฅผ ์ต์ ํํ๋๋ผ๋, JavaScript ์์ง์ ์ฌ์ ํ ์ฐ์ฐ์ด
ArrayBuffer๊ฒฝ๊ณ ๋ด์ ๋จธ๋ฌด๋ฅด๋๋ก ๋ณด์ฅํด์ผ ํฉ๋๋ค. - ๊ฐ๋น์ง ์ปฌ๋ ์ ์ํธ ์์ฉ: ๋ณต์ฌ ์์ ์์ฒด์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น์ง๋ ์์ง๋ง, ์ ๋ฐ์ ์ธ JS ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ์ผ์ ์ค์ง๋ฅผ ์ ๋ฐํ ์ ์์ต๋๋ค.
์ด ๋ ๊ฐ์ง ์ ํต์ ์ธ ๋ฐฉ๋ฒ ๋ชจ๋, ํนํ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ๋ธ๋ก(์: ์ ๋ฉ๊ฐ๋ฐ์ดํธ ๋๋ ๊ธฐ๊ฐ๋ฐ์ดํธ)์ด๋ ๋น๋ฒํ ์๊ท๋ชจ ์ฐ์ฐ์ ๊ฒฝ์ฐ ์๋นํ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์์ต๋๋ค. ์ด๋ค์ WebAssembly๊ฐ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์์ ์ ๋์ ์ธ ์ต๊ณ ์ฑ๋ฅ์ ์๊ตฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ๋ฐํํ๋ ๊ฒ์ ๋ง์์ต๋๋ค. ๊ธ๋ก๋ฒ ์ํฅ์ ๋ถ๋ช ํ์ต๋๋ค. ์ ์ฌ์ ์ฅ์น๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ๊ณ์ฐ ์์์ด ์ ํ๋ ์ฌ์ฉ์๋ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ๋ ๋๋ฆฐ ๋ก๋ ์๊ฐ๊ณผ ๋ ๋ฐ์์ ์ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝํํ๊ฒ ๋ ๊ฒ์ ๋๋ค.
WebAssembly์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ์๊ฐ: ์ธ ๊ฐ์ง ํต์ฌ ๊ธฐ๋ฅ
์ด๋ฌํ ์ฑ๋ฅ ์ ํ์ ํด๊ฒฐํ๊ธฐ ์ํด WebAssembly ์ปค๋ฎค๋ํฐ๋ ์ ์ฉ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ(Bulk Memory Operations) ์ธํธ๋ฅผ ๋์
ํ์ต๋๋ค. ์ด๋ Wasm ๋ชจ๋์ด ๋ค์ดํฐ๋ธ์ ๊ฐ์ ํจ์จ์ฑ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ๋ฐ ์ฑ์ฐ๊ธฐ ์ฐ์ฐ์ ์ํํ ์ ์๊ฒ ํด์ฃผ๋ ์ ์์ค์ ์ง์ ์ ์ธ ๋ช
๋ น์ด์ด๋ฉฐ, ๊ฐ๋ฅํ ๊ฒฝ์ฐ ๊ณ ๋๋ก ์ต์ ํ๋ CPU ๋ช
๋ น์ด(์: x86 ์ํคํ
์ฒ์์ ๋ณต์ฌ๋ฅผ ์ํ rep movsb ๋๋ ์ฑ์ฐ๊ธฐ๋ฅผ ์ํ rep stosb)๋ฅผ ํ์ฉํฉ๋๋ค. ์ด๋ค์ ํ์ค ์ ์์ ์ผ๋ถ๋ก Wasm ๋ช
์ธ์ ์ถ๊ฐ๋์์ผ๋ฉฐ, ๋ค์ํ ๋จ๊ณ๋ฅผ ๊ฑฐ์ณ ์ฑ์ํด์ก์ต๋๋ค.
์ด๋ฌํ ์ฐ์ฐ์ ํต์ฌ ์์ด๋์ด๋ ๋ฉ๋ชจ๋ฆฌ ์กฐ์์ ๋ฌด๊ฑฐ์ด ์์
์ WebAssembly ๋ฐํ์์ผ๋ก ์ง์ ์ด๋์์ผ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๊ณ ์ฒ๋ฆฌ๋์ ๊ทน๋ํํ๋ ๊ฒ์
๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์๋ ๋ฃจํ๋ ์ต์ ํ๋ JavaScript TypedArray ๋ฉ์๋์ ๋น๊ตํ ๋, ํนํ ์๋นํ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ค๋ฃฐ ๋ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
์ธ ๊ฐ์ง ์ฃผ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
memory.copy: Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ์์ญ์์ ๋ค๋ฅธ ์์ญ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ๊ธฐ ์ํ ๊ฒ.memory.fill: Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ํ ์์ญ์ ์ง์ ๋ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ด๊ธฐํํ๊ธฐ ์ํ ๊ฒ.memory.init&data.drop: ๋ฏธ๋ฆฌ ์ ์๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํจ์จ์ ์ผ๋ก ์ด๊ธฐํํ๊ธฐ ์ํ ๊ฒ.
์ด๋ฌํ ์ฐ์ฐ์ WebAssembly ๋ชจ๋์ด ๊ฐ๋ฅํ ๊ฒฝ์ฐ "์ ๋ก ์นดํผ(zero-copy)" ๋๋ ์ ๋ก ์นดํผ์ ๊ฐ๊น์ด ๋ฐ์ดํฐ ์ ์ก์ ๋ฌ์ฑํ ์ ์๋๋ก ํฉ๋๋ค. ์ฆ, ๋ฐ์ดํฐ๊ฐ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๊ฐ์ ๋ถํ์ํ๊ฒ ๋ณต์ฌ๋๊ฑฐ๋ ์ฌ๋ฌ ๋ฒ ํด์๋์ง ์์ต๋๋ค. ์ด๋ CPU ์ฌ์ฉ๋ ๊ฐ์, ์บ์ ํ์ฉ๋ ํฅ์, ๊ทธ๋ฆฌ๊ณ ๊ถ๊ทน์ ์ผ๋ก ํ๋์จ์ด๋ ์ธํฐ๋ท ์ฐ๊ฒฐ ์๋์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ๋ ๋น ๋ฅด๊ณ ๋ถ๋๋ฌ์ด ์ ํ๋ฆฌ์ผ์ด์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
memory.copy: ์ด๊ณ ์ ๋ฐ์ดํฐ ๋ณต์
memory.copy ๋ช
๋ น์ด๋ WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ๋ฐ์ดํฐ ๋ธ๋ก์ ์ ์ํ๊ฒ ๋ณต์ ํ๊ธฐ ์ํด ์ค๊ณ๋ ๊ฐ์ฅ ์์ฃผ ์ฌ์ฉ๋๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์
๋๋ค. ์ด๋ C์ memmove ํจ์์ ๋๋ฑํ Wasm ๊ธฐ๋ฅ์ผ๋ก, ๊ฒน์น๋ ์์ค ๋ฐ ๋์ ์์ญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํฉ๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ
์ด ๋ช ๋ น์ด๋ ์คํ์์ ์ธ ๊ฐ์ 32๋นํธ ์ ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
(memory.copy $dest_offset $src_offset $len)
$dest_offset: ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋ Wasm ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ฐ์ดํธ ์คํ์ .$src_offset: ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋ Wasm ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ฐ์ดํธ ์คํ์ .$len: ๋ณต์ฌํ ๋ฐ์ดํธ ์.
์ด ์ฐ์ฐ์ $src_offset์์ ์์ํ๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ $len ๋ฐ์ดํธ๋ฅผ $dest_offset์์ ์์ํ๋ ์์ญ์ผ๋ก ๋ณต์ฌํฉ๋๋ค. ์ด ๊ธฐ๋ฅ์ ํต์ฌ์ ๊ฒน์น๋ ์์ญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋ ๋ฅ๋ ฅ์
๋๋ค. ์ฆ, ๋ฐ์ดํฐ๊ฐ ๋จผ์ ์์ ๋ฒํผ์ ๋ณต์ฌ๋ ๋ค์ ๊ทธ ๋ฒํผ์์ ๋์์ผ๋ก ๋ณต์ฌ๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์์ค๊ฐ ๋์๊ณผ ๊ฒน์น๋ ์์ญ์์ ๊ฐ๋จํ ๋ฐ์ดํธ ๋จ์ ๋ณต์ฌ๋ฅผ ์ผ์ชฝ์์ ์ค๋ฅธ์ชฝ์ผ๋ก ์ํํ ๋ ๋ฐ์ํ ์ ์๋ ๋ฐ์ดํฐ ์์์ ๋ฐฉ์งํฉ๋๋ค.
์์ธ ์ค๋ช ๋ฐ ์ฌ์ฉ ์ฌ๋ก
memory.copy๋ ๋ค์ํ ๊ณ ์ฑ๋ฅ ์ ํ๋ฆฌ์ผ์ด์
์ ์ํ ๊ธฐ๋ณธ์ ์ธ ๊ตฌ์ฑ ์์์
๋๋ค. ๊ทธ ํจ์จ์ฑ์ ๊ธฐ๋ณธ WebAssembly ๋ฐํ์์ด ๊ณ ๋๋ก ์ต์ ํ๋ ํ๋์จ์ด ๋ช
๋ น์ด ๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ํจ์(์: memmove)์ ์ง์ ๋งคํํ ์ ์๋ ๋จ์ผํ๊ณ ์์์ ์ธ Wasm ๋ช
๋ น์ด๋ผ๋ ์ ์์ ๋น๋กฏ๋ฉ๋๋ค. ์ด๋ ๋ช
์์ ์ธ ๋ฃจํ์ ๊ฐ๋ณ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ์ ์ค๋ฒํค๋๋ฅผ ํผํ๊ฒ ํด์ค๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ค์ ์ ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํด ๋ณด์ญ์์ค:
-
์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ:
์น ๊ธฐ๋ฐ ์ด๋ฏธ์ง ํธ์ง๊ธฐ๋ ๋น๋์ค ์ฒ๋ฆฌ ๋๊ตฌ์์ ์๋ฅด๊ธฐ, ํฌ๊ธฐ ์กฐ์ ๋๋ ํํฐ ์ ์ฉ๊ณผ ๊ฐ์ ์์ ์ ์ข ์ข ํฐ ํฝ์ ๋ฒํผ๋ฅผ ์ด๋์ํค๋ ๊ฒ์ ํฌํจํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํฐ ์ด๋ฏธ์ง์์ ์์ญ์ ์๋ฅด๊ฑฐ๋ ๋์ฝ๋ฉ๋ ๋น๋์ค ํ๋ ์์ ๋์คํ๋ ์ด ๋ฒํผ๋ก ์ด๋ํ๋ ๊ฒ์ ๋จ์ผ
memory.copyํธ์ถ๋ก ์ํํ ์ ์์ด ๋ ๋๋ง ํ์ดํ๋ผ์ธ์ ํฌ๊ฒ ๊ฐ์ํํฉ๋๋ค. ๊ธ๋ก๋ฒ ์ด๋ฏธ์ง ํธ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉ์์ ์ฌ์ง์ด ์ด๋์์ ์๋ (์: ์ผ๋ณธ, ๋ธ๋ผ์ง, ๋ ์ผ) ๋์ผํ ๊ณ ์ฑ๋ฅ์ผ๋ก ์ฒ๋ฆฌํ ์ ์์ต๋๋ค.์์: ๋์ฝ๋ฉ๋ ์ด๋ฏธ์ง์ ์ผ๋ถ๋ฅผ ์์ ๋ฒํผ์์ ์ฃผ ๋์คํ๋ ์ด ๋ฒํผ๋ก ๋ณต์ฌ:
// Rust (wasm-bindgen ์ฌ์ฉ) ์์ #[wasm_bindgen] pub fn copy_image_region(dest_ptr: u32, src_ptr: u32, width: u32, height: u32, bytes_per_pixel: u32, pitch: u32) { let len = width * height * bytes_per_pixel; // Wasm์์๋ ์ด๊ฒ์ด memory.copy ๋ช ๋ น์ด๋ก ์ปดํ์ผ๋ฉ๋๋ค. unsafe { let dest_slice = core::slice::from_raw_parts_mut(dest_ptr as *mut u8, len as usize); let src_slice = core::slice::from_raw_parts(src_ptr as *const u8, len as usize); dest_slice.copy_from_slice(src_slice); } } -
์ค๋์ค ์กฐ์ ๋ฐ ํฉ์ฑ:
๋์งํธ ์ค๋์ค ์ํฌ์คํ ์ด์ (DAW)์ด๋ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋ ์ค์๊ฐ ์ ๋์ฌ์ด์ ์ ๊ฐ์ ์ค๋์ค ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค๋์ค ์ํ์ ์์ฃผ ๋ฏน์ฑ, ๋ฆฌ์ํ๋ง ๋๋ ๋ฒํผ๋งํด์ผ ํฉ๋๋ค. ์ ๋ ฅ ๋ฒํผ์์ ์ฒ๋ฆฌ ๋ฒํผ๋ก, ๋๋ ์ฒ๋ฆฌ๋ ๋ฒํผ์์ ์ถ๋ ฅ ๋ฒํผ๋ก ์ค๋์ค ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ๋ณต์ฌํ๋ ๊ฒ์
memory.copy์ ํฐ ์ด์ ์ ์ป์ด ๋ณต์กํ ํจ๊ณผ ์ฒด์ธ์์๋ ๋ถ๋๋ฝ๊ณ ๋๊น ์๋ ์ค๋์ค ์ฌ์์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ผ๊ด๋๊ณ ๋ฎ์ ์ง์ฐ ์๊ฐ์ ์ฑ๋ฅ์ ์์กดํ๋ ์ ์ธ๊ณ ์์ ๊ฐ์ ์ค๋์ค ์์ง๋์ด์๊ฒ ๋งค์ฐ ์ค์ํฉ๋๋ค. -
๊ฒ์ ๊ฐ๋ฐ ๋ฐ ์๋ฎฌ๋ ์ด์
:
๊ฒ์ ์์ง์ ํ ์ค์ฒ, ๋ฉ์, ๋ ๋ฒจ ์ง์ค๋ฉํธ๋ฆฌ ๋ฐ ์บ๋ฆญํฐ ์ ๋๋ฉ์ด์ ์ ์ํด ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํฉ๋๋ค. ํ ์ค์ฒ์ ์ผ๋ถ๋ฅผ ์ ๋ฐ์ดํธํ๊ฑฐ๋, ๋ ๋๋ง์ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๊ฑฐ๋, ๋ฉ๋ชจ๋ฆฌ ๋ด์์ ์ํฐํฐ ์ํ๋ฅผ ์ด๋์ํฌ ๋
memory.copy๋ ์ด๋ฌํ ๋ฒํผ๋ฅผ ๊ด๋ฆฌํ๋ ๋งค์ฐ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, CPU ์ธก Wasm ๋ฒํผ์์ GPU์ ๋์ ํ ์ค์ฒ๋ฅผ ์ ๋ฐ์ดํธํ๋ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ด๋ ๋ถ๋ฏธ์์ ๋๋จ์์์์ ์ด๋ฅด๊ธฐ๊น์ง ์ ์ธ๊ณ ๋ชจ๋ ์ง์ญ์ ํ๋ ์ด์ด์๊ฒ ์ ์ฐํ ๊ฒ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๋ฐ ๊ธฐ์ฌํฉ๋๋ค. -
์ง๋ ฌํ ๋ฐ ์ญ์ง๋ ฌํ:
๋คํธ์ํฌ๋ฅผ ํตํด ๋ฐ์ดํฐ๋ฅผ ์ ์กํ๊ฑฐ๋ ๋ก์ปฌ์ ์ ์ฅํ ๋, ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ํํํ ๋ฐ์ดํธ ๋ฒํผ๋ก ์ง๋ ฌํํ๊ณ ๋ค์ ์ญ์ง๋ ฌํํฉ๋๋ค.
memory.copy๋ ์ด๋ฌํ ์ง๋ ฌํ๋ ๋ฒํผ๋ฅผ Wasm ๋ฉ๋ชจ๋ฆฌ๋ก ๋๋ ๋ฐ์ผ๋ก ํจ์จ์ ์ผ๋ก ์ด๋์ํค๊ฑฐ๋ ํน์ ํ๋กํ ์ฝ์ ์ํด ๋ฐ์ดํธ ์์๋ฅผ ์ฌ์ ๋ ฌํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค. ์ด๋ ๋ถ์ฐ ์์คํ ๋ฐ ๊ตญ๊ฒฝ ๊ฐ ๋ฐ์ดํฐ ์ ์ก์์์ ๋ฐ์ดํฐ ๊ตํ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. -
๊ฐ์ ํ์ผ ์์คํ
๋ฐ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์บ์ฑ:
WebAssembly๋ ํด๋ผ์ด์ธํธ ์ธก ๊ฐ์ ํ์ผ ์์คํ (์: ๋ธ๋ผ์ฐ์ ์ SQLite)์ด๋ ์ ๊ตํ ์บ์ฑ ๋ฉ์ปค๋์ฆ์ ๊ตฌ๋ํ ์ ์์ต๋๋ค. Wasm์ด ๊ด๋ฆฌํ๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ๋ด์์ ํ์ผ ๋ธ๋ก, ๋ฐ์ดํฐ๋ฒ ์ด์ค ํ์ด์ง ๋๋ ๊ธฐํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ด๋ํ๋ ๊ฒ์
memory.copy์ ์ํด ํฌ๊ฒ ๊ฐ์ํ๋์ด ํ์ผ I/O ์ฑ๋ฅ์ ํฅ์์ํค๊ณ ๋ฐ์ดํฐ ์ ๊ทผ ์ง์ฐ ์๊ฐ์ ์ค์ผ ์ ์์ต๋๋ค.
์ฑ๋ฅ์์ ์ด์
memory.copy๋ก๋ถํฐ ์ป๋ ์ฑ๋ฅ ์ด๋์ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ์๋นํฉ๋๋ค:
- ํ๋์จ์ด ๊ฐ์: ์ต์ CPU์๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํ ์ ์ฉ ๋ช
๋ น์ด(์: x86์ `rep` ์ ๋์ฌ๊ฐ ๋ถ์
movsb/movsw/movsd, ๋๋ ํน์ ARM ๋ช ๋ น์ด)๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. Wasm ๋ฐํ์์memory.copy๋ฅผ ์ด๋ฌํ ๊ณ ๋๋ก ์ต์ ํ๋ ํ๋์จ์ด ๊ธฐ๋ณธ ์์์ ์ง์ ๋งคํํ์ฌ ์ํํธ์จ์ด ๋ฃจํ๋ณด๋ค ์ ์ ํด๋ก ์ฌ์ดํด๋ก ์ฐ์ฐ์ ์คํํ ์ ์์ต๋๋ค. - ๋ช
๋ น์ด ์ ๊ฐ์: ๋ฃจํ ๋ด์ ๋ง์ ๋ก๋/์คํ ์ด ๋ช
๋ น์ด ๋์ ,
memory.copy๋ ๋จ์ผ Wasm ๋ช ๋ น์ด๋ก, ํจ์ฌ ์ ์ ์์ ๊ธฐ๊ณ ๋ช ๋ น์ด๋ก ๋ณํ๋์ด ์คํ ์๊ฐ๊ณผ CPU ๋ถํ๋ฅผ ์ค์ ๋๋ค. - ์บ์ ์ง์ญ์ฑ: ํจ์จ์ ์ธ ๋๋ ์ฐ์ฐ์ ์บ์ ํ์ฉ๋๋ฅผ ๊ทน๋ํํ๋๋ก ์ค๊ณ๋์ด, ๋ฉ๋ชจ๋ฆฌ์ ํฐ ๋ธ๋ก์ ํ ๋ฒ์ CPU ์บ์๋ก ๊ฐ์ ธ์ ํ์ ์ ๊ทผ ์๋๋ฅผ ๊ทน์ ์ผ๋ก ๋์ ๋๋ค.
- ์์ธก ๊ฐ๋ฅํ ์ฑ๋ฅ: ๊ธฐ๋ณธ ํ๋์จ์ด๋ฅผ ํ์ฉํ๊ธฐ ๋๋ฌธ์
memory.copy์ ์ฑ๋ฅ์ ํนํ ๋๊ท๋ชจ ์ ์ก์์ JIT ์ต์ ํ ๋ฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ผ์ ์ค์ง์ ์ํฅ์ ๋ฐ์ ์ ์๋ JavaScript ๋ฉ์๋์ ๋นํด ๋ ์ผ๊ด๋๊ณ ์์ธก ๊ฐ๋ฅํฉ๋๋ค.
๊ธฐ๊ฐ๋ฐ์ดํธ์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ๊ฑฐ๋ ๋น๋ฒํ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ ์กฐ์์ ์ํํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ, ๋ฃจํ ๋ณต์ฌ์ memory.copy ์ฐ์ฐ์ ์ฐจ์ด๋ ๋๋ฆฌ๊ณ ๋ฐ์ ์๋ ์ฌ์ฉ์ ๊ฒฝํ๊ณผ ์ ์ฐํ๊ณ ๋ฐ์คํฌํฑ๊ณผ ๊ฐ์ ์ฑ๋ฅ ์ฌ์ด์ ์ฐจ์ด๋ฅผ ์๋ฏธํ ์ ์์ต๋๋ค. ์ด๋ ์ต์ ํ๋ Wasm ์ฝ๋๊ฐ ๋ก์ปฌ์์ ๋ ํจ์จ์ ์ผ๋ก ์คํ๋๋ฏ๋ก ์ฑ๋ฅ์ด ๋ฎ์ ์ฅ์น๋ ์ธํฐ๋ท ์ฐ๊ฒฐ์ด ๋๋ฆฐ ์ง์ญ์ ์ฌ์ฉ์์๊ฒ ํนํ ์ํฅ์ด ํฝ๋๋ค.
memory.fill: ์ ์ํ ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ
memory.fill ๋ช
๋ น์ด๋ Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ฐ์์ ์ธ ๋ธ๋ก์ ํน์ ๋ฐ์ดํธ ๊ฐ์ผ๋ก ์ค์ ํ๋ ์ต์ ํ๋ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ C์ memset ํจ์์ ๋๋ฑํ WebAssembly ๊ธฐ๋ฅ์
๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ
์ด ๋ช ๋ น์ด๋ ์คํ์์ ์ธ ๊ฐ์ 32๋นํธ ์ ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
(memory.fill $dest_offset $value $len)
$dest_offset: ์ฑ์ฐ๊ธฐ๊ฐ ์์๋ Wasm ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ฐ์ดํธ ์คํ์ .$value: ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์ฑ์ธ 8๋นํธ ๋ฐ์ดํธ ๊ฐ (0-255).$len: ์ฑ์ธ ๋ฐ์ดํธ ์.
์ด ์ฐ์ฐ์ $dest_offset์์ ์์ํ์ฌ $len ๋ฐ์ดํธ ๊ฐ๊ฐ์ ์ง์ ๋ $value๋ฅผ ์๋๋ค. ์ด๋ ๋ฒํผ ์ด๊ธฐํ, ๋ฏผ๊ฐํ ๋ฐ์ดํฐ ์ง์ฐ๊ธฐ ๋๋ ํ์ ์ฐ์ฐ์ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ค๋นํ๋ ๋ฐ ๋งค์ฐ ์ ์ฉํฉ๋๋ค.
์์ธ ์ค๋ช ๋ฐ ์ฌ์ฉ ์ฌ๋ก
memory.copy์ ๋ง์ฐฌ๊ฐ์ง๋ก, memory.fill์ ๊ณ ๋๋ก ์ต์ ํ๋ ํ๋์จ์ด ๋ช
๋ น์ด(์: x86์ rep stosb)๋ ์์คํ
๋ผ์ด๋ธ๋ฌ๋ฆฌ ํธ์ถ์ ๋งคํ๋ ์ ์๋ ๋จ์ผ Wasm ๋ช
๋ น์ด๋ผ๋ ์ ์์ ์ด์ ์ ์ป์ต๋๋ค. ์ด๋ ์๋์ผ๋ก ๋ฃจํ๋ฅผ ๋๊ณ ๊ฐ๋ณ ๋ฐ์ดํธ๋ฅผ ์ฐ๋ ๊ฒ๋ณด๋ค ํจ์ฌ ๋ ํจ์จ์ ์
๋๋ค.
memory.fill์ด ๋งค์ฐ ์ ์ฉํ ์ผ๋ฐ์ ์ธ ์๋๋ฆฌ์ค๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
-
๋ฒํผ ์ง์ฐ๊ธฐ ๋ฐ ๋ณด์:
๋ฏผ๊ฐํ ์ ๋ณด(์: ์ํธํ ํค, ๊ฐ์ธ ์ฌ์ฉ์ ๋ฐ์ดํฐ)์ ์ฌ์ฉ๋ ๋ฒํผ๋ ๋ฐ์ดํฐ ์ ์ถ์ ๋ฐฉ์งํ๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ๋ฅผ 0์ผ๋ก ์ฑ์ฐ๋ ๊ฒ์ด ์ข์ ๋ณด์ ๊ดํ์ ๋๋ค. ๊ฐ์ด
0(๋๋ ๋ค๋ฅธ ํจํด)์ธmemory.fill์ ์ฌ์ฉํ๋ฉด ์ด๋ฌํ ๋ฒํผ๋ฅผ ๋งค์ฐ ๋น ๋ฅด๊ณ ์์ ์ ์ผ๋ก ์ง์ธ ์ ์์ต๋๋ค. ์ด๋ ๊ธ์ต ๋ฐ์ดํฐ, ๊ฐ์ธ ์๋ณ์ ๋๋ ์๋ฃ ๊ธฐ๋ก์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ํ ์ค์ํ ๋ณด์ ์กฐ์น์ด๋ฉฐ, ๊ธ๋ก๋ฒ ๋ฐ์ดํฐ ๋ณดํธ ๊ท์ ์ ์ค์ํ๋๋ก ๋ณด์ฅํฉ๋๋ค.์์: 1MB ๋ฒํผ ์ง์ฐ๊ธฐ:
// Rust (wasm-bindgen ์ฌ์ฉ) ์์ #[wasm_bindgen] pub fn zero_memory_region(ptr: u32, len: u32) { // Wasm์์๋ ์ด๊ฒ์ด memory.fill ๋ช ๋ น์ด๋ก ์ปดํ์ผ๋ฉ๋๋ค. unsafe { let slice = core::slice::from_raw_parts_mut(ptr as *mut u8, len as usize); slice.fill(0); } } -
๊ทธ๋ํฝ ๋ฐ ๋ ๋๋ง:
WebAssembly์์ ์คํ๋๋ 2D ๋๋ 3D ๊ทธ๋ํฝ ์ ํ๋ฆฌ์ผ์ด์ (์: ๊ฒ์ ์์ง, CAD ๋๊ตฌ)์์๋ ๊ฐ ํ๋ ์์ ์์ ์ ํ๋ฉด ๋ฒํผ, ๊น์ด ๋ฒํผ ๋๋ ์คํ ์ค ๋ฒํผ๋ฅผ ์ง์ฐ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ ๋๋ค. ์ด๋ฌํ ํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ๊ธฐ๋ณธ๊ฐ(์: ๊ฒ์์์ ์ํ 0 ๋๋ ํน์ ์์ ID)์ผ๋ก ์ค์ ํ๋ ๊ฒ์
memory.fill์ ์ฌ์ฉํ์ฌ ์ฆ์ ์ํํ ์ ์์ผ๋ฉฐ, ๋ ๋๋ง ์ค๋ฒํค๋๋ฅผ ์ค์ด๊ณ ๋ถ๋๋ฌ์ด ์ ๋๋ฉ์ด์ ๊ณผ ์ ํ์ ๋ณด์ฅํฉ๋๋ค. ์ด๋ ์ ์ธ๊ณ์ ์ผ๋ก ์๊ฐ์ ์ผ๋ก ํ๋ถํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ์ค์ํฉ๋๋ค. -
์ ํ ๋น์ ์ํ ๋ฉ๋ชจ๋ฆฌ ์ด๊ธฐํ:
Wasm ๋ชจ๋์ด ์ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก(์: ์ ๋ฐ์ดํฐ ๊ตฌ์กฐ ๋๋ ํฐ ๋ฐฐ์ด)์ ํ ๋นํ ๋, ์ข ์ข ์ฌ์ฉํ๊ธฐ ์ ์ ์๋ ค์ง ์ํ(์: ๋ชจ๋ 0)๋ก ์ด๊ธฐํํด์ผ ํฉ๋๋ค.
memory.fill์ ์ด ์ด๊ธฐํ๋ฅผ ์ํํ๋ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ๋ฐ์ดํฐ ์ผ๊ด์ฑ์ ๋ณด์ฅํ๊ณ ์ ์๋์ง ์์ ๋์์ ๋ฐฉ์งํฉ๋๋ค. -
ํ
์คํ
๋ฐ ๋๋ฒ๊น
:
๊ฐ๋ฐ ์ค์ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ํน์ ํจํด(์:
0xAA,0x55)์ผ๋ก ์ฑ์ฐ๋ ๊ฒ์ ์ด๊ธฐํ๋์ง ์์ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ ๋ฌธ์ ๋ฅผ ์๋ณํ๊ฑฐ๋ ๋๋ฒ๊ฑฐ์์ ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์ ์๊ฐ์ ์ผ๋ก ๊ตฌ๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.memory.fill์ ์ด๋ฌํ ๋๋ฒ๊น ์์ ์ ๋ ๋น ๋ฅด๊ณ ๋ ๋ฐฉํด์ ์ผ๋ก ๋ง๋ญ๋๋ค.
์ฑ๋ฅ์์ ์ด์
memory.copy์ ์ ์ฌํ๊ฒ, memory.fill์ ์ฅ์ ์ ์๋นํฉ๋๋ค:
- ๋ค์ดํฐ๋ธ ์๋: ๋ฉ๋ชจ๋ฆฌ ์ฑ์ฐ๊ธฐ๋ฅผ ์ํ ์ต์ ํ๋ CPU ๋ช ๋ น์ด๋ฅผ ์ง์ ํ์ฉํ์ฌ ๋ค์ดํฐ๋ธ ์ ํ๋ฆฌ์ผ์ด์ ์ ํ์ ํ๋ ์ฑ๋ฅ์ ์ ๊ณตํฉ๋๋ค.
- ๊ท๋ชจ์ ํจ์จ์ฑ: ๋ ํฐ ๋ฉ๋ชจ๋ฆฌ ์์ญ์์ ์ด์ ์ด ๋์ฑ ๋๋๋ฌ์ง๋๋ค. ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ๊ฐ๋ฐ์ดํธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฑ์ฐ๋ ๊ฒ์ ์์ฒญ๋๊ฒ ๋๋ฆด ๊ฒ์ด์ง๋ง,
memory.fill์ ๋๋ผ์ด ์๋๋ก ์ฒ๋ฆฌํฉ๋๋ค. - ๋จ์์ฑ ๋ฐ ๊ฐ๋ ์ฑ: ๋จ์ผ ๋ช ๋ น์ด๋ก ์๋๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํ์ฌ ์๋ ๋ฃจํ ๊ตฌ์กฐ์ ๋นํด Wasm ์ฝ๋์ ๋ณต์ก์ฑ์ ์ค์ ๋๋ค.
memory.fill์ ์ฌ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ค์ ๋ฉ๋ชจ๋ฆฌ ์ค๋น ๋จ๊ณ๊ฐ ๋ณ๋ชฉ ํ์์ด ๋์ง ์๋๋ก ๋ณด์ฅํ ์ ์์ผ๋ฉฐ, ์ด๋ ๋ ๋ฐ์์ฑ ์๊ณ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
๋ผ์ดํ์ฌ์ดํด์ ๊ธฐ์ฌํ์ฌ ์ ์ธ๊ณ ์ด๋ ๊ณณ์์๋ ๋น ๋ฅธ ์ ํ๋ฆฌ์ผ์ด์
์์๊ณผ ๋ถ๋๋ฌ์ด ์ ํ์ ์์กดํ๋ ์ฌ์ฉ์์๊ฒ ์ด์ต์ ์ค๋๋ค.
memory.init & data.drop: ํจ์จ์ ์ธ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ด๊ธฐํ
memory.init ๋ช
๋ น์ด๋ data.drop๊ณผ ๊ฒฐํฉํ์ฌ, Wasm ๋ชจ๋์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์์ ๋ฏธ๋ฆฌ ์ด๊ธฐํ๋ ์ ์ ๋ฐ์ดํฐ๋ฅผ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ์ ์กํ๋ ํน์ํ๊ณ ๋งค์ฐ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค. ์ด๋ ๋ถ๋ณ ์์ฐ์ด๋ ๋ถํธ์คํธ๋ฉ ๋ฐ์ดํฐ๋ฅผ ๋ก๋ํ๋ ๋ฐ ํนํ ์ ์ฉํฉ๋๋ค.
๊ตฌ๋ฌธ ๋ฐ ์๋ฏธ
memory.init์ ๋ค ๊ฐ์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
(memory.init $data_index $dest_offset $src_offset $len)
$data_index: ์ฌ์ฉํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์๋ณํ๋ ์ธ๋ฑ์ค. ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ Wasm ๋ชจ๋ ๋ด์์ ์ปดํ์ผ ํ์์ ์ ์๋๋ฉฐ ์ ์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ํฌํจํฉ๋๋ค.$dest_offset: ๋ฐ์ดํฐ๊ฐ ๋ณต์ฌ๋ Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ฐ์ดํธ ์คํ์ .$src_offset: ๋ณต์ฌ๋ฅผ ์์ํ ์ง์ ๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ๋ด์ ์์ ๋ฐ์ดํธ ์คํ์ .$len: ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์์ ๋ณต์ฌํ ๋ฐ์ดํธ ์.
data.drop์ ํ๋์ ์ธ์๋ฅผ ๋ฐ์ต๋๋ค:
(data.drop $data_index)
$data_index: ์ญ์ (ํด์ )ํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ์ ์ธ๋ฑ์ค.
์์ธ ์ค๋ช ๋ฐ ์ฌ์ฉ ์ฌ๋ก
๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ WebAssembly ๋ชจ๋ ์์ฒด์ ์ง์ ํฌํจ๋ ๋ถ๋ณ์ ๋ฐ์ดํฐ ๋ธ๋ก์
๋๋ค. ์ด๋ค์ ์ผ๋ฐ์ ์ผ๋ก ์์, ๋ฌธ์์ด ๋ฆฌํฐ๋ด, ์กฐํ ํ
์ด๋ธ ๋๋ ์ปดํ์ผ ํ์์ ์๋ ค์ง ๊ธฐํ ์ ์ ์์ฐ์ ์ฌ์ฉ๋ฉ๋๋ค. Wasm ๋ชจ๋์ด ๋ก๋๋๋ฉด ์ด๋ฌํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋ฉ๋๋ค. memory.init์ ์ด ๋ฐ์ดํฐ๋ฅผ ํ์ฑ Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ๋ฐฐ์นํ๋ ์ ๋ก ์นดํผ์ ์ ์ฌํ ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค.
์ฌ๊ธฐ์ ํต์ฌ์ ์ธ ์ด์ ์ ๋ฐ์ดํฐ๊ฐ ์ด๋ฏธ Wasm ๋ชจ๋ ๋ฐ์ด๋๋ฆฌ์ ์ผ๋ถ๋ผ๋ ๊ฒ์
๋๋ค. memory.init์ ์ฌ์ฉํ๋ฉด JavaScript๊ฐ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ , TypedArray๋ฅผ ์์ฑํ ๋ค์, set()์ ์ฌ์ฉํ์ฌ Wasm ๋ฉ๋ชจ๋ฆฌ์ ์ฐ๋ ๊ณผ์ ์ ํผํ ์ ์์ต๋๋ค. ์ด๋ ํนํ ์ ํ๋ฆฌ์ผ์ด์
์์ ์ค์ ์ด๊ธฐํ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํฉ๋๋ค.
๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌ๋ ํ(๋๋ ๋ ์ด์ ํ์ํ์ง ์์ ๊ฒฝ์ฐ), data.drop ๋ช
๋ น์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ํ์ ์ผ๋ก ์ญ์ (drop)ํ ์ ์์ต๋๋ค. ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํ๋ฉด ๋ ์ด์ ์ ๊ทผํ ์ ์๊ฒ ํ์๋์ด Wasm ์์ง์ด ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ์ํ ์ ์๊ฒ ํ์ฌ Wasm ์ธ์คํด์ค์ ์ ์ฒด ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ค์ผ ์ ์์ต๋๋ค. ์ด๋ ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ ํ๋ ํ๊ฒฝ์ด๋ ๋ง์ ์ผ์์ ์ธ ์์ฐ์ ๋ก๋ํ๋ ์ ํ๋ฆฌ์ผ์ด์
์ ๋ํ ์ค์ํ ์ต์ ํ์
๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ณ ๋ คํด ๋ณด์ญ์์ค:
-
์ ์ ์์ฐ ๋ก๋ฉ:
3D ๋ชจ๋ธ์ ๋ด์ฅ ํ ์ค์ฒ, ๊ตฌ์ฑ ํ์ผ, ๋ค์ํ ์ธ์ด(์: ์์ด, ์คํ์ธ์ด, ์ค๊ตญ์ด, ์๋์ด)์ ๋ํ ์ง์ญํ ๋ฌธ์์ด ๋๋ ๊ธ๊ผด ๋ฐ์ดํฐ๋ ๋ชจ๋ Wasm ๋ชจ๋ ๋ด์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ก ์ ์ฅ๋ ์ ์์ต๋๋ค.
memory.init์ ํ์ํ ๋ ์ด๋ฌํ ์์ฐ์ ํ์ฑ ๋ฉ๋ชจ๋ฆฌ๋ก ํจ์จ์ ์ผ๋ก ์ ์กํฉ๋๋ค. ์ด๋ ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ถ๊ฐ์ ์ธ ๋คํธ์ํฌ ์์ฒญ์ด๋ ๋ณต์กํ JavaScript ํ์ฑ ์์ด Wasm ๋ชจ๋์์ ์ง์ ๊ตญ์ ํ๋ ๋ฆฌ์์ค๋ฅผ ๋ก๋ํ ์ ์์์ ์๋ฏธํ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ์ผ๊ด๋ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.์์: ์ง์ญํ๋ ์ธ์ฌ๋ง ๋ฉ์์ง๋ฅผ ๋ฒํผ์ ๋ก๋ํ๊ธฐ:
;; WebAssembly ํ ์คํธ ํ์ (WAT) ์์ (module (memory (export "memory") 1) ;; ์์ด ์ธ์ฌ๋ง์ ์ํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ ์ (data (i32.const 0) "Hello, World!") ;; ์คํ์ธ์ด ์ธ์ฌ๋ง์ ์ํ ๋ ๋ค๋ฅธ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ ์ ์ (data (i32.const 16) "ยกHola, Mundo!") (func (export "loadGreeting") (param $lang_id i32) (param $dest i32) (param $len i32) (if (i32.eq (local.get $lang_id) (i32.const 0)) (then (memory.init 0 (local.get $dest) (i32.const 0) (local.get $len))) (else (memory.init 1 (local.get $dest) (i32.const 0) (local.get $len))) ) (data.drop 0) ;; ์ ํ์ ์ผ๋ก ์ฌ์ฉ ํ ๋ฉ๋ชจ๋ฆฌ ํ์๋ฅผ ์ํด ์ญ์ (data.drop 1) ) ) -
์ ํ๋ฆฌ์ผ์ด์
๋ฐ์ดํฐ ๋ถํธ์คํธ๋ํ:
๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ, ์ด๊ธฐ ์ํ ๋ฐ์ดํฐ, ๊ธฐ๋ณธ ์ค์ ๋๋ ๋ฏธ๋ฆฌ ๊ณ์ฐ๋ ์กฐํ ํ ์ด๋ธ์ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ก ํฌํจํ ์ ์์ต๋๋ค.
memory.init์ ์ด ํ์ ๋ถํธ์คํธ๋ฉ ๋ฐ์ดํฐ๋ก Wasm ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ ์ํ๊ฒ ์ฑ์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ ๋นจ๋ฆฌ ์์๋๊ณ ๋ ๋น ๋ฅด๊ฒ ์ํธ์์ฉํ ์ ์๋๋ก ํฉ๋๋ค. -
๋์ ๋ชจ๋ ๋ก๋ฉ ๋ฐ ์ธ๋ก๋ฉ:
ํ๋ฌ๊ทธ์ธ ์ํคํ ์ฒ๋ฅผ ๊ตฌํํ๊ฑฐ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ผ๋ถ๋ฅผ ๋์ ์ผ๋ก ๋ก๋/์ธ๋ก๋ํ ๋, ํ๋ฌ๊ทธ์ธ๊ณผ ๊ด๋ จ๋ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ด๊ธฐํํ ๋ค์ ํ๋ฌ๊ทธ์ธ์ ๋ผ์ดํ์ฌ์ดํด์ด ์งํ๋จ์ ๋ฐ๋ผ ์ญ์ ํ์ฌ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
์ฑ๋ฅ์์ ์ด์
- ์์ ์๊ฐ ๋จ์ถ: ์ด๊ธฐ ๋ฐ์ดํฐ ๋ก๋ฉ์ JavaScript ์ค์ฌ๋ฅผ ํผํจ์ผ๋ก์จ
memory.init์ ๋ ๋น ๋ฅธ ์ ํ๋ฆฌ์ผ์ด์ ์์ ๋ฐ "์ํธ์์ฉ๊น์ง์ ์๊ฐ(time-to-interactive)"์ ๊ธฐ์ฌํฉ๋๋ค. - ์ค๋ฒํค๋ ์ต์ํ: ๋ฐ์ดํฐ๋ ์ด๋ฏธ Wasm ๋ฐ์ด๋๋ฆฌ์ ์์ผ๋ฉฐ,
memory.init์ ์ง์ ์ ์ธ ๋ช ๋ น์ด์ด๋ฏ๋ก ์ ์ก ์ค ์ค๋ฒํค๋๊ฐ ์ต์ํ๋ฉ๋๋ค. data.drop์ ํตํ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ: ์ฌ์ฉ ํ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ์ญ์ ํ๋ ๊ธฐ๋ฅ์ ํนํ ๋ง์ ์์ ๋๋ ์ผํ์ฉ ์ ์ ์์ฐ์ ์ฒ๋ฆฌํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์๋นํ ๋ฉ๋ชจ๋ฆฌ ์ ์ฝ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ์ด๋ ์์์ด ์ ํ๋ ํ๊ฒฝ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
memory.init๊ณผ data.drop์ WebAssembly ๋ด์์ ์ ์ ๋ฐ์ดํฐ๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๋๊ตฌ์ด๋ฉฐ, ๋ ๊ฐ๋ณ๊ณ , ๋น ๋ฅด๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ํจ์จ์ ์ธ ์ ํ๋ฆฌ์ผ์ด์
์ ๊ธฐ์ฌํฉ๋๋ค. ์ด๋ ๋ชจ๋ ํ๋ซํผ๊ณผ ์ฅ์น์ ์ฌ์ฉ์์๊ฒ ๋ณดํธ์ ์ธ ์ด์ ์
๋๋ค.
JavaScript์์ ์ํธ ์์ฉ: ๋ฉ๋ชจ๋ฆฌ ๊ฒฉ์ฐจ ํด์ํ๊ธฐ
๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ WebAssembly ๋ชจ๋ ๋ด์์ ์คํ๋์ง๋ง, ๋๋ถ๋ถ์ ์ค์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ Wasm๊ณผ JavaScript ๊ฐ์ ์ํํ ์ํธ ์์ฉ์ ํ์๋ก ํฉ๋๋ค. JavaScript๊ฐ Wasm์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ด๋ป๊ฒ ์ํธ ์์ฉํ๋์ง ์ดํดํ๋ ๊ฒ์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๋ ๋ฐ ์ค์ํฉ๋๋ค.
WebAssembly.Memory ๊ฐ์ฒด์ ArrayBuffer
WebAssembly ๋ชจ๋์ด ์ธ์คํด์คํ๋ ๋, ๊ทธ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ JavaScript์ WebAssembly.Memory ๊ฐ์ฒด๋ก ๋
ธ์ถ๋ฉ๋๋ค. ์ด ๊ฐ์ฒด์ ํต์ฌ์ ํ์ค JavaScript ArrayBuffer์ธ buffer ์์ฑ์
๋๋ค. ์ด ArrayBuffer๋ Wasm ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋ํ๋
๋๋ค.
๊ทธ๋ฐ ๋ค์ JavaScript๋ ์ด ArrayBuffer ์์ TypedArray ๋ทฐ(์: Uint8Array, Int32Array, Float32Array)๋ฅผ ์์ฑํ์ฌ Wasm ๋ฉ๋ชจ๋ฆฌ์ ํน์ ์์ญ์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๊ณ ์ธ ์ ์์ต๋๋ค. ์ด๊ฒ์ด ๋ ํ๊ฒฝ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ์ฃผ์ ๋ฉ์ปค๋์ฆ์
๋๋ค.
// JavaScript ์ธก
const wasmInstance = await WebAssembly.instantiateStreaming(fetch('your_module.wasm'), importObject);
const wasmMemory = wasmInstance.instance.exports.memory; // WebAssembly.Memory ๊ฐ์ฒด ๊ฐ์ ธ์ค๊ธฐ
// ์ ์ฒด Wasm ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ์ ๋ํ Uint8Array ๋ทฐ ์์ฑ
const wasmBytes = new Uint8Array(wasmMemory.buffer);
// ์์: Wasm์ด `copy_data(dest, src, len)` ํจ์๋ฅผ ๋ด๋ณด๋ด๋ ๊ฒฝ์ฐ
wasmInstance.instance.exports.copy_data(100, 0, 50); // Wasm ๋ฉ๋ชจ๋ฆฌ์์ ์คํ์
0์์ ์คํ์
100์ผ๋ก 50๋ฐ์ดํธ ๋ณต์ฌ
// JavaScript๋ ์ด ๋ณต์ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์ฝ์ ์ ์์
const copiedData = wasmBytes.subarray(100, 150);
console.log(copiedData);
wasm-bindgen ๋ฐ ๊ธฐํ ํด์ฒด์ธ: ์ํธ ์ด์ฉ ๊ฐ์ํ
์๋์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์คํ์
๊ณผ `TypedArray` ๋ทฐ๋ฅผ ๊ด๋ฆฌํ๋ ๊ฒ์ ํนํ ํ๋ถํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์
์ ๊ฒฝ์ฐ ๋ณต์กํ ์ ์์ต๋๋ค. Rust์ฉ wasm-bindgen, C/C++์ฉ Emscripten, Go์ฉ TinyGo์ ๊ฐ์ ๋๊ตฌ๋ ์ด๋ฌํ ์ํธ ์ด์ฉ์ ํฌ๊ฒ ๊ฐ์ํํฉ๋๋ค. ์ด๋ฌํ ํด์ฒด์ธ์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น, ๋ฐ์ดํฐ ์ ์ก ๋ฐ ํ์
๋ณํ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๋ ์์ฉ๊ตฌ JavaScript ์ฝ๋๋ฅผ ์์ฑํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ๋ฐฐ๊ด ์์
๋์ ์ ํ๋ฆฌ์ผ์ด์
๋ก์ง์ ์ง์คํ ์ ์๋๋ก ํฉ๋๋ค.
์๋ฅผ ๋ค์ด, wasm-bindgen์ ์ฌ์ฉํ๋ฉด ๋ฐ์ดํธ ์ฌ๋ผ์ด์ค๋ฅผ ๋ฐ๋ Rust ํจ์๋ฅผ ์ ์ํ ์ ์์ผ๋ฉฐ, wasm-bindgen์ Rust ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ ์ JavaScript Uint8Array๋ฅผ Wasm ๋ฉ๋ชจ๋ฆฌ๋ก ๋ณต์ฌํ๋ ๊ฒ์ ์๋์ผ๋ก ์ฒ๋ฆฌํ๊ณ , ๋ฐํ ๊ฐ์ ๋ํด์๋ ๋ง์ฐฌ๊ฐ์ง์
๋๋ค. ๊ทธ๋ฌ๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ ํฌ์ธํฐ์ ๊ธธ์ด๋ฅผ ์ ๋ฌํ์ฌ Wasm ๋ชจ๋์ด ์ด๋ฏธ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋ ๋ฐ์ดํฐ์ ๋ํด ๋๋ ์ฐ์ฐ์ ์ํํ๋๋ก ํ๋ ๊ฒ์ด ์ข
์ข
๋ ์ฑ๋ฅ์ด ์ข์ต๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ฒ ์ฌ๋ก
-
์ธ์ ๋ณต์ฌํ๊ณ ์ธ์ ๊ณต์ ํ ๊ฒ์ธ๊ฐ:
์๋์ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ๊ณต์ ๋ฉ๋ชจ๋ฆฌ ๋ทฐ๋ฅผ ์ค์ ํ๋ ์ค๋ฒํค๋๊ฐ ์ด์ ๋ณด๋ค ํด ์ ์์ผ๋ฉฐ, ์ง์ ๋ณต์ฌ(
wasm-bindgen์ ์๋ ๋ฉ์ปค๋์ฆ ๋๋ Wasm์์ ๋ด๋ณด๋ธ ํจ์์ ๋ํ ๋ช ์์ ํธ์ถ์ ํตํด)๊ฐ ๊ด์ฐฎ์ ์ ์์ต๋๋ค. ํฌ๊ณ ์์ฃผ ์ ๊ทผํ๋ ๋ฐ์ดํฐ์ ๊ฒฝ์ฐ, ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๋ฅผ ์ง์ ๊ณต์ ํ๊ณ Wasm ๋ด์์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ์ฌ ์์ ์ ์ํํ๋ ๊ฒ์ด ๊ฑฐ์ ํญ์ ๊ฐ์ฅ ํจ์จ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. -
๋ถํ์ํ ์ค๋ณต ํผํ๊ธฐ:
JavaScript์ Wasm ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ๋ฐ์ดํฐ๊ฐ ์ฌ๋ฌ ๋ฒ ๋ณต์ฌ๋๋ ์ํฉ์ ์ต์ํํ์ญ์์ค. ๋ฐ์ดํฐ๊ฐ JavaScript์์ ์์๋์ด Wasm์์ ์ฒ๋ฆฌํด์ผ ํ๋ ๊ฒฝ์ฐ, Wasm ๋ฉ๋ชจ๋ฆฌ์ ํ ๋ฒ๋ง ์ฐ์ญ์์ค(์:
wasmBytes.set()์ฌ์ฉ). ๊ทธ๋ฐ ๋ค์ Wasm์ด ๋๋ ๋ณต์ฌ ๋ฐ ์ฑ์ฐ๊ธฐ๋ฅผ ํฌํจํ ๋ชจ๋ ํ์ ์์ ์ ์ํํ๋๋ก ํ์ญ์์ค. -
๋ฉ๋ชจ๋ฆฌ ์์ ๊ถ ๋ฐ ์๋ช
๊ด๋ฆฌ:
ํฌ์ธํฐ์ ๊ธธ์ด๋ฅผ ๊ณต์ ํ ๋ ๋๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ "์์ "ํ๋์ง ์ ์ํ์ญ์์ค. Wasm์ด ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๊ณ JavaScript์ ํฌ์ธํฐ๋ฅผ ์ ๋ฌํ๋ ๊ฒฝ์ฐ, JavaScript๋ ํด๋น ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํด์๋ ์ ๋ฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, JavaScript๊ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ ๊ฒฝ์ฐ, Wasm์ ์ ๊ณต๋ ๊ฒฝ๊ณ ๋ด์์๋ง ์๋ํด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Rust์ ์์ ๊ถ ๋ชจ๋ธ์
wasm-bindgen๊ณผ ํจ๊ป ๋ฉ๋ชจ๋ฆฌ๊ฐ ์ฌ๋ฐ๋ฅด๊ฒ ํ ๋น, ์ฌ์ฉ ๋ฐ ํด์ ๋๋๋ก ๋ณด์ฅํจ์ผ๋ก์จ ์ด๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํ๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค. -
SharedArrayBuffer ๋ฐ ๋ฉํฐ์ค๋ ๋ฉ์ ๋ํ ๊ณ ๋ ค ์ฌํญ:
Web Worker ๋ฐ ๋ฉํฐ์ค๋ ๋ฉ์ ํฌํจํ๋ ๊ณ ๊ธ ์๋๋ฆฌ์ค์ ๊ฒฝ์ฐ, WebAssembly๋
SharedArrayBuffer๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ์ฌ๋ฌ Web Worker(๋ฐ ๊ด๋ จ Wasm ์ธ์คํด์ค)๊ฐ ๋์ผํ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ค๋ ๋๊ฐ `postMessage` ์ ์ก์ ์ํด ๋ฐ์ดํฐ๋ฅผ ์ง๋ ฌํํ๊ณ ์ญ์ง๋ ฌํํ ํ์ ์์ด ๊ณต์ ๋ฐ์ดํฐ๋ฅผ ํจ์จ์ ์ผ๋ก ์กฐ์ํ ์ ์๊ฒ ํ๋ฏ๋ก ์ฌ๊ธฐ์์ ๋์ฑ ์ค์ํด์ง๋๋ค. ์ด๋ฌํ ๋ฉํฐ์ค๋ ๋ ์๋๋ฆฌ์ค์์๋ Atomics๋ฅผ ์ฌ์ฉํ ์ ์คํ ๋๊ธฐํ๊ฐ ํ์์ ์ ๋๋ค.
JavaScript์ WebAssembly์ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ ์ํธ ์์ฉ์ ์ ์คํ๊ฒ ์ค๊ณํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํ์ ํ์ฉํ์ฌ ํด๋ผ์ด์ธํธ ์ธก ์ค์ ์ ๊ด๊ณ์์ด ์ ์ธ๊ณ ์ฌ์ฉ์์๊ฒ ์ผ๊ด๋๊ณ ๊ณ ํ์ง์ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ๋ ๊ณ ์ฑ๋ฅ ๋ฐ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์์ต๋๋ค.
๊ณ ๊ธ ์๋๋ฆฌ์ค ๋ฐ ๊ธ๋ก๋ฒ ๊ณ ๋ ค ์ฌํญ
WebAssembly ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํฅ์ ๋จ์ผ ์ค๋ ๋ ๋ธ๋ผ์ฐ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ๋ณธ ์ฑ๋ฅ ํฅ์์ ํจ์ฌ ๋ฐ์ด๋์ต๋๋ค. ํนํ ์น ๋ฐ ๊ทธ ๋๋จธ์ ๊ธ๋ก๋ฒ ๊ณ ์ฑ๋ฅ ์ปดํจํ ๋งฅ๋ฝ์์ ๊ณ ๊ธ ์๋๋ฆฌ์ค๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๋ ๋ฐ ์ค์ถ์ ์ธ ์ญํ ์ ํฉ๋๋ค.
๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ์น ์์ปค: ๋ณ๋ ฌ์ฑ ๊ทน๋ํ
SharedArrayBuffer์ ์น ์์ปค์ ๋ฑ์ฅ์ผ๋ก WebAssembly๋ ์ง์ ํ ๋ฉํฐ์ค๋ ๋ฉ ๊ธฐ๋ฅ์ ๊ฐ๊ฒ ๋์์ต๋๋ค. ์ด๋ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์
์ ์์ด ๊ฒ์ ์ฒด์ธ์ ์
๋๋ค. ์ฌ๋ฌ Wasm ์ธ์คํด์ค(๋ค๋ฅธ ์น ์์ปค์์ ์คํ)๊ฐ ๋์ผํ SharedArrayBuffer๋ฅผ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ก ๊ณต์ ํ๋ฉด ๋์ผํ ๋ฐ์ดํฐ์ ๋์์ ์ ๊ทผํ๊ณ ์์ ํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๋ณ๋ ฌํ๋ ํ๊ฒฝ์์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋์ฑ ์ค์ํด์ง๋๋ค:
- ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๋ถ๋ฐฐ: ๋ฉ์ธ ์ค๋ ๋๋
memory.fill์ ์ฌ์ฉํ์ฌ ํฐ ๊ณต์ ๋ฒํผ๋ฅผ ์ด๊ธฐํํ๊ฑฐ๋memory.copy๋ก ์ด๊ธฐ ๋ฐ์ดํฐ๋ฅผ ๋ณต์ฌํ ์ ์์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ ์์ปค๋ ์ด ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์ ๋ค๋ฅธ ์น์ ์ ์ฒ๋ฆฌํ ์ ์์ต๋๋ค. - ์ค๋ ๋ ๊ฐ ํต์ ์ค๋ฒํค๋ ๊ฐ์:
postMessage(๋ณต์ฌ๋ฅผ ํฌํจ)๋ฅผ ์ฌ์ฉํ์ฌ ์์ปค ๊ฐ์ ํฐ ๋ฐ์ดํฐ ๋ฉ์ด๋ฆฌ๋ฅผ ์ง๋ ฌํํ๊ณ ๋ณด๋ด๋ ๋์ , ์์ปค๋ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ์์ ์ง์ ์์ ํ ์ ์์ต๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ถ๊ฐ ๋ณต์ฌ ์์ด ์ด๋ฌํ ๋๊ท๋ชจ ์กฐ์์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค. - ๊ณ ์ฑ๋ฅ ๋ณ๋ ฌ ์๊ณ ๋ฆฌ์ฆ: ๋ณ๋ ฌ ์ ๋ ฌ, ํ๋ ฌ ๊ณฑ์ ๋๋ ๋๊ท๋ชจ ๋ฐ์ดํฐ ํํฐ๋ง๊ณผ ๊ฐ์ ์๊ณ ๋ฆฌ์ฆ์ ๋ค๋ฅธ Wasm ์ค๋ ๋๊ฐ ๊ณต์ ๋ฒํผ์ ๊ณ ์ ํ(๋๋ ์ ์คํ ๋๊ธฐํ๋ฅผ ํตํด ๊ฒน์น๋) ์์ญ์ ๋ํด ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํํ๊ฒ ํจ์ผ๋ก์จ ์ฌ๋ฌ ์ฝ์ด๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
์ด ๊ธฐ๋ฅ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ด ๋ฉํฐ์ฝ์ด ํ๋ก์ธ์๋ฅผ ์์ ํ ํ์ฉํ ์ ์๊ฒ ํ์ฌ, ๋ณต์กํ ์๋ฎฌ๋ ์ด์ , ์ค์๊ฐ ๋ถ์ ๋๋ ๊ณ ๊ธ AI ๋ชจ๋ธ ์ถ๋ก ๊ณผ ๊ฐ์ ์์ ์ ์ํด ๋จ์ผ ์ฌ์ฉ์์ ์ฅ์น๋ฅผ ๊ฐ๋ ฅํ ๋ถ์ฐ ์ปดํจํ ๋ ธ๋๋ก ๋ฐ๊ฟ๋๋ค. ์ด์ ์ ์ค๋ฆฌ์ฝ ๋ฐธ๋ฆฌ์ ๊ฐ๋ ฅํ ๋ฐ์คํฌํฑ ์ํฌ์คํ ์ด์ ๋ถํฐ ์ ํฅ ์์ฅ์ ์ค๊ธ ๋ชจ๋ฐ์ผ ์ฅ์น์ ์ด๋ฅด๊ธฐ๊น์ง ๋ณดํธ์ ์ด๋ฉฐ, ๋ชจ๋ ์ฌ์ฉ์๋ ๋ ๋น ๋ฅด๊ณ ๋ฐ์์ฑ์ด ์ข์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝํํ ์ ์์ต๋๋ค.
ํฌ๋ก์ค ํ๋ซํผ ์ฑ๋ฅ: 'ํ ๋ฒ ์์ฑ์ผ๋ก ์ด๋์๋ ์คํ' ์ฝ์
WebAssembly์ ์ค๊ณ๋ ๋ค์ํ ์ปดํจํ ํ๊ฒฝ์์ ์ด์์ฑ๊ณผ ์ผ๊ด๋ ์ฑ๋ฅ์ ๊ฐ์กฐํฉ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด ์ฝ์์ ์ฆ๊ฑฐ์ ๋๋ค:
- ์ํคํ
์ฒ์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ต์ ํ: ๊ธฐ๋ณธ ํ๋์จ์ด๊ฐ x86, ARM, RISC-V ๋๋ ๋ค๋ฅธ ์ํคํ
์ฒ์ด๋ , Wasm ๋ฐํ์์
memory.copy๋ฐmemory.fill๋ช ๋ น์ด๋ฅผ ํด๋น CPU์ ์ฌ์ฉ ๊ฐ๋ฅํ ๊ฐ์ฅ ํจ์จ์ ์ธ ๋ค์ดํฐ๋ธ ์ด์ ๋ธ๋ฆฌ ์ฝ๋๋ก ๋ณํํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์ด๋ ์ข ์ข ์ง์๋๋ ๊ฒฝ์ฐ ๋ฒกํฐ ๋ช ๋ น์ด(SIMD)๋ฅผ ํ์ฉํ์ฌ ์ฐ์ฐ์ ๋์ฑ ๊ฐ์ํํ๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. - ์ ์ธ๊ณ์ ์ผ๋ก ์ผ๊ด๋ ์ฑ๋ฅ: ์ด๋ฌํ ์ ์์ค ์ต์ ํ๋ WebAssembly๋ก ๊ตฌ์ถ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ฌ์ฉ์์ ์ฅ์น ์ ์กฐ์ ์ฒด, ์ด์ ์ฒด์ ๋๋ ์ง๋ฆฌ์ ์์น์ ๊ด๊ณ์์ด ์ผ๊ด๋ ๊ณ ์ฑ๋ฅ ๊ธฐ์ค์ ์ ๊ณตํ๋๋ก ๋ณด์ฅํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธ์ต ๋ชจ๋ธ๋ง ๋๊ตฌ๋ ๋ฐ๋, ๋ด์ ๋๋ ์ฑ๊ฐํฌ๋ฅด์์ ์ฌ์ฉ๋๋ ์ ์ฌํ ํจ์จ์ฑ์ผ๋ก ๊ณ์ฐ์ ์คํํ ๊ฒ์ ๋๋ค.
- ๊ฐ๋ฐ ๋ถ๋ด ๊ฐ์: ๊ฐ๋ฐ์๋ ์ํคํ ์ฒ๋ณ ๋ฉ๋ชจ๋ฆฌ ๋ฃจํด์ ์์ฑํ ํ์๊ฐ ์์ต๋๋ค. Wasm ๋ฐํ์์ด ์ต์ ํ๋ฅผ ํฌ๋ช ํ๊ฒ ์ฒ๋ฆฌํ๋ฏ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ก์ง์ ์ง์คํ ์ ์์ต๋๋ค.
ํด๋ผ์ฐ๋ ๋ฐ ์ฃ์ง ์ปดํจํ : ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ด์
WebAssembly๋ ๋ธ๋ผ์ฐ์ ๋ฅผ ๋์ด ๋น ๋ฅด๊ฒ ํ์ฅ๋์ด ์๋ฒ ์ธก ํ๊ฒฝ, ์ฃ์ง ์ปดํจํ ๋ ธ๋, ์ฌ์ง์ด ์๋ฒ ๋๋ ์์คํ ์์๋ ์๋ฆฌ๋ฅผ ์ก๊ณ ์์ต๋๋ค. ์ด๋ฌํ ๋งฅ๋ฝ์์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๊ทธ ์ด์์ผ๋ก ์ค์ํฉ๋๋ค:
- ์๋ฒ๋ฆฌ์ค ํจ์: Wasm์ ๊ฐ๋ณ๊ณ ๋น ๋ฅด๊ฒ ์์๋๋ ์๋ฒ๋ฆฌ์ค ํจ์๋ฅผ ๊ตฌ๋ํ ์ ์์ต๋๋ค. ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ ์ํ๊ฒ ์ฒ๋ฆฌํ๊ณ ๊ณ ์ฒ๋ฆฌ๋ API ํธ์ถ์ ์ํด ์ถ๋ ฅ ๋ฐ์ดํฐ๋ฅผ ์ค๋นํ๋ ๋ฐ ํต์ฌ์ ๋๋ค.
- ์ฃ์ง ๋ถ์: ์ฌ๋ฌผ ์ธํฐ๋ท(IoT) ์ฅ์น๋ ์ค์๊ฐ ๋ฐ์ดํฐ ๋ถ์์ ์ํํ๋ ์ฃ์ง ๊ฒ์ดํธ์จ์ด์ ๊ฒฝ์ฐ, Wasm ๋ชจ๋์ ์ผ์ ๋ฐ์ดํฐ๋ฅผ ์์งํ๊ณ , ๋ณํ์ ์ํํ๊ณ , ๊ฒฐ๊ณผ๋ฅผ ์ ์ฅํ ์ ์์ต๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์์ค์ ๊ฐ๊น์ด ๊ณณ์์ ์ ์ํ ๋ฐ์ดํฐ ์ฒ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ ์ค์ ํด๋ผ์ฐ๋ ์๋ฒ๋ก์ ์ง์ฐ ์๊ฐ๊ณผ ๋์ญํญ ์ฌ์ฉ์ ์ค์ ๋๋ค.
- ์ปจํ ์ด๋ ๋์: Wasm ๋ชจ๋์ ๋ง์ดํฌ๋ก์๋น์ค๋ฅผ ์ํ ๊ธฐ์กด ์ปจํ ์ด๋์ ๋ํ ๋งค์ฐ ํจ์จ์ ์ด๊ณ ์์ ํ ๋์์ ์ ๊ณตํ๋ฉฐ, ๊ฑฐ์ ์ฆ๊ฐ์ ์ธ ์์ ์๊ฐ๊ณผ ์ต์ํ์ ๋ฆฌ์์ค ์ฌ์ฉ๋์ ์๋ํฉ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ๋ ์ด๋ฌํ ๋ง์ดํฌ๋ก์๋น์ค ๋ด์์ ์ ์ํ ์ํ ์ ํ ๋ฐ ๋ฐ์ดํฐ ์กฐ์์ ์ฉ์ดํ๊ฒ ํฉ๋๋ค.
์ธ๋์ ์๊ณจ์ ์๋ ์ค๋งํธํฐ์์ ์ ๋ฝ์ ๋ฐ์ดํฐ ์ผํฐ์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ํ๊ฒฝ์์ ์ผ๊ด๋๊ฒ ๊ณ ์ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํํ ์ ์๋ ๋ฅ๋ ฅ์ WebAssembly๊ฐ ์ฐจ์ธ๋ ์ปดํจํ ์ธํ๋ผ๋ฅผ ์ํ ๊ธฐ๋ณธ ๊ธฐ์ ๋ก์์ ์ญํ ์ ๊ฐ์กฐํฉ๋๋ค.
๋ณด์ ๊ด๋ จ ์์ฌ์ : ์๋๋ฐ์ฑ๊ณผ ์์ ํ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ
WebAssembly์ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ ๋ณธ์ง์ ์ผ๋ก ์ ํ๋ฆฌ์ผ์ด์ ๋ณด์์ ๊ธฐ์ฌํฉ๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ์๋๋ฐ์ฑ: Wasm ๋ชจ๋์ ์์ฒด ๊ฒฉ๋ฆฌ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ด์์ ์๋ํฉ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ชจ๋ Wasm ๋ช ๋ น์ด์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ด ๋ฉ๋ชจ๋ฆฌ์ ์๊ฒฉํ๊ฒ ์ ํ๋์ด ๋ค๋ฅธ Wasm ์ธ์คํด์ค์ ๋ฉ๋ชจ๋ฆฌ๋ ํธ์คํธ ํ๊ฒฝ์ ๋ฉ๋ชจ๋ฆฌ์ ๋ํ ๋ฌด๋จ ์ ๊ทผ์ ๋ฐฉ์งํฉ๋๋ค.
- ๊ฒฝ๊ณ ๊ฒ์ฌ: Wasm ๋ด์ ๋ชจ๋ ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ(๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํ ์ ๊ทผ ํฌํจ)์ ๋ฐํ์์ ์ํด ๊ฒฝ๊ณ ๊ฒ์ฌ๋ฅผ ๋ฐ์ต๋๋ค. ์ด๋ ๋ค์ดํฐ๋ธ C/C++ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ดด๋กญํ๋ ๋ฒํผ ์ค๋ฒํ๋ก์ฐ ๋ฐ ๊ฒฝ๊ณ ๋ฐ ์ฐ๊ธฐ์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๋ฐ์ ์ธ ๋ณด์ ํ์ธ๋ฅผ ๊ฐํํฉ๋๋ค.
- ์ ์ด๋ ๊ณต์ :
ArrayBuffer๋๋SharedArrayBuffer๋ฅผ ํตํด JavaScript์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ ๋, ํธ์คํธ ํ๊ฒฝ์ ์ ์ด๋ฅผ ์ ์งํ์ฌ Wasm์ด ์์๋ก ํธ์คํธ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ๊ฑฐ๋ ์์์ํฌ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค.
์ด ๊ฒฌ๊ณ ํ ๋ณด์ ๋ชจ๋ธ๊ณผ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฑ๋ฅ์ด ๊ฒฐํฉ๋์ด ๊ฐ๋ฐ์๋ ์ฌ์ฉ์ ๋ณด์์ ์์์ํค์ง ์์ผ๋ฉด์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ๋ณต์กํ ๋ก์ง์ ์ฒ๋ฆฌํ๋ ์ ๋ขฐ๋ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ผ๋ฉฐ, ์ด๋ ๊ธ๋ก๋ฒ ์ฑํ์ ์ํ ํํํ ์ ์๋ ์๊ตฌ ์ฌํญ์ ๋๋ค.
์ค์ฉ์ ์ธ ์ ์ฉ: ๋ฒค์น๋งํน ๋ฐ ์ต์ ํ
WebAssembly ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํฌํ๋ก์ฐ์ ํตํฉํ๋ ๊ฒ๊ณผ ๊ทธ ์ด์ ์ ์ต๋ํ ํ์ฉํ๋ ๊ฒ์ ๋ณด์ฅํ๋ ๊ฒ์ ๋ณ๊ฐ์ ๋ฌธ์ ์ ๋๋ค. ํจ๊ณผ์ ์ธ ๋ฒค์น๋งํน๊ณผ ์ต์ ํ๋ ๊ทธ ์ ์ฌ๋ ฅ์ ์์ ํ ์คํํ๊ธฐ ์ํ ์ค์ํ ๋จ๊ณ์ ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ๋ฒค์น๋งํน ๋ฐฉ๋ฒ
์ด์ ์ ์ ๋ํํ๋ ค๋ฉด ์ธก์ ํด์ผ ํฉ๋๋ค. ๋ค์์ ์ผ๋ฐ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค:
-
์ฐ์ฐ ๊ฒฉ๋ฆฌ: ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ํํ๋ ํน์ Wasm ํจ์(์:
copy_large_buffer,fill_zeros)๋ฅผ ๋ง๋ญ๋๋ค. ์ด๋ฌํ ํจ์๊ฐ ๋ด๋ณด๋ด์ ธ JavaScript์์ ํธ์ถํ ์ ์๋์ง ํ์ธํฉ๋๋ค. -
๋์๊ณผ ๋น๊ต:
TypedArray.prototype.set()๋๋ ์๋ ๋ฃจํ๋ฅผ ์ฌ์ฉํ์ฌ ๋์ผํ ๋ฉ๋ชจ๋ฆฌ ์์ ์ ์ํํ๋ ๋๋ฑํ JavaScript ํจ์๋ฅผ ์์ฑํฉ๋๋ค. -
๊ณ ํด์๋ ํ์ด๋จธ ์ฌ์ฉ: JavaScript์์
performance.now()๋๋ Performance API(์:performance.mark()๋ฐperformance.measure())๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ฐ์ฐ์ ์คํ ์๊ฐ์ ์ ํํ๊ฒ ์ธก์ ํฉ๋๋ค. ๊ฐ ์ฐ์ฐ์ ์ฌ๋ฌ ๋ฒ(์: ์์ฒ ๋๋ ์๋ฐฑ๋ง ๋ฒ) ์คํํ๊ณ ์์คํ ๋ณ๋ ๋ฐ JIT ์๋ฐ์ ์ ๊ณ ๋ คํ์ฌ ๊ฒฐ๊ณผ๋ฅผ ํ๊ท ๋ ๋๋ค. - ๋ฐ์ดํฐ ํฌ๊ธฐ ๋ณ๊ฒฝ: ๋ค๋ฅธ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ํฌ๊ธฐ(์: 1KB, 1MB, 10MB, 100MB, 1GB)๋ก ํ ์คํธํฉ๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ผ๋ฐ์ ์ผ๋ก ๋ ํฐ ๋ฐ์ดํฐ ์ธํธ์์ ๊ฐ์ฅ ํฐ ์ด๋์ ๋ณด์ ๋๋ค.
- ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ /๋ฐํ์ ๊ณ ๋ ค: ๋ค์ํ ๋ธ๋ผ์ฐ์ ์์ง(Chrome, Firefox, Safari, Edge) ๋ฐ ๋น๋ธ๋ผ์ฐ์ Wasm ๋ฐํ์(Node.js, Wasmtime)์์ ๋ฒค์น๋งํนํ์ฌ ๋ค๋ฅธ ํ๊ฒฝ์์์ ์ฑ๋ฅ ํน์ฑ์ ์ดํดํฉ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ๋ค์ํ ์ค์ ์์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ๊ทผํ ๊ฒ์ด๋ฏ๋ก ๊ธ๋ก๋ฒ ์ ํ๋ฆฌ์ผ์ด์ ๋ฐฐํฌ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
์์ ๋ฒค์น๋งํน ์ค๋ํซ (JavaScript):
// `wasmInstance`๊ฐ `wasm_copy(dest, src, len)` ๋ฐ `js_copy(dest, src, len)`๋ฅผ ๋ด๋ณด๋ธ๋ค๊ณ ๊ฐ์
const wasmMemoryBuffer = wasmInstance.instance.exports.memory.buffer;
const testSize = 10 * 1024 * 1024; // 10 MB
const iterations = 100;
// Wasm ๋ฉ๋ชจ๋ฆฌ์ ๋ฐ์ดํฐ ์ค๋น
const wasmBytes = new Uint8Array(wasmMemoryBuffer);
for (let i = 0; i < testSize; i++) wasmBytes[i] = i % 256;
console.log(`${testSize / (1024*1024)} MB ๋ณต์ฌ, ${iterations} ํ ๋ฐ๋ณต ๋ฒค์น๋งํน`);
// Wasm memory.copy ๋ฒค์น๋งํน
let start = performance.now();
for (let i = 0; i < iterations; i++) {
wasmInstance.instance.exports.wasm_copy(testSize, 0, testSize); // ๋ค๋ฅธ ์์ญ์ผ๋ก ๋ฐ์ดํฐ ๋ณต์ฌ
}
let end = performance.now();
console.log(`Wasm memory.copy ํ๊ท : ${(end - start) / iterations} ms`);
// JS TypedArray.set() ๋ฒค์น๋งํน
start = performance.now();
for (let i = 0; i < iterations; i++) {
wasmBytes.set(wasmBytes.subarray(0, testSize), testSize); // JS๋ฅผ ์ฌ์ฉํ์ฌ ๋ณต์ฌ
}
end = performance.now();
console.log(`JS TypedArray.set() ํ๊ท : ${(end - start) / iterations} ms`);
Wasm ์ฑ๋ฅ ํ๋กํ์ผ๋ง ๋๊ตฌ
- ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ: ์ต์ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome DevTools, Firefox Developer Tools)์๋ CPU ์ฌ์ฉ๋, ํธ์ถ ์คํ ๋ฐ ์คํ ์๊ฐ์ ๋ณด์ฌ์ฃผ๋ ํ๋ฅญํ ์ฑ๋ฅ ํ๋กํ์ผ๋ฌ๊ฐ ํฌํจ๋์ด ์์ผ๋ฉฐ, ์ข ์ข JavaScript์ WebAssembly ์คํ์ ๊ตฌ๋ถํฉ๋๋ค. ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋ง์ ์๊ฐ์ด ์์๋๋ ์น์ ์ ์ฐพ์ผ์ญ์์ค.
- Wasmtime/Wasmer ํ๋กํ์ผ๋ฌ: ์๋ฒ ์ธก ๋๋ CLI Wasm ์คํ์ ๊ฒฝ์ฐ, Wasmtime ๋ฐ Wasmer์ ๊ฐ์ ๋ฐํ์์ ์ข
์ข
์์ฒด ํ๋กํ์ผ๋ง ๋๊ตฌ๋ ํ์ค ์์คํ
ํ๋กํ์ผ๋ฌ(์: Linux์
perf)์์ ํตํฉ์ ์ ๊ณตํ์ฌ Wasm ๋ชจ๋ ์ฑ๋ฅ์ ๋ํ ์์ธํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๋ณ๋ชฉ ํ์ ์๋ณ ์ ๋ต
- ํ๋ ์ ๊ทธ๋ํ: ์ ํ๋ฆฌ์ผ์ด์ ์ ํ๋กํ์ผ๋งํ๊ณ ํ๋ ์ ๊ทธ๋ํ์์ ๋ฉ๋ชจ๋ฆฌ ์กฐ์ ํจ์(๋ช ์์ Wasm ๋๋ ์ฐ์ฐ์ด๋ ์ฌ์ฉ์ ์ง์ ๋ฃจํ์ด๋ )์ ํด๋นํ๋ ๋์ ๋ง๋๋ฅผ ์ฐพ์ผ์ญ์์ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ๋ชจ๋ํฐ: ๋ธ๋ผ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ํญ์ด๋ ์์คํ ์์ค ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์๋น๋ฅผ ๊ด์ฐฐํ๊ณ ์์์น ๋ชปํ ๊ธ์ฆ์ด๋ ๋์๋ฅผ ๊ฐ์งํฉ๋๋ค.
- ํซ ์คํ ๋ถ์: ์์ฃผ ํธ์ถ๋๊ฑฐ๋ ์คํ ์๊ฐ์ ๋ถ๊ท ํํ ์์ ์๋นํ๋ ์ฝ๋ ์น์ ์ ์๋ณํฉ๋๋ค. ์ด๋ฌํ ํซ ์คํ์ด ๋ฐ์ดํฐ ์ด๋์ ํฌํจํ๋ ๊ฒฝ์ฐ, ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ฌ์ฉํ๋๋ก ๋ฆฌํฉํ ๋งํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
ํตํฉ์ ์ํ ์คํ ๊ฐ๋ฅํ ํต์ฐฐ๋ ฅ
-
๋๊ท๋ชจ ๋ฐ์ดํฐ ์ ์ก ์ฐ์ ์์ ์ง์ : ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํฐ ๋ฐ์ดํฐ ๋ธ๋ก์ ๋ํด ๊ฐ์ฅ ํฐ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ์ ํ๋ฆฌ์ผ์ด์
์์ ์ ํฌ๋ก๋ฐ์ดํธ ๋๋ ๋ฉ๊ฐ๋ฐ์ดํธ๊ฐ ์ด๋๋๊ฑฐ๋ ์ด๊ธฐํ๋๋ ์์ญ์ ์๋ณํ๊ณ
memory.copy๋ฐmemory.fill๋ก ์ต์ ํํ๋ ๊ฒ์ ์ฐ์ ์์๋ก ์ ํ์ญ์์ค. -
์ ์ ์์ฐ์
memory.initํ์ฉ: ์ ํ๋ฆฌ์ผ์ด์ ์ด ์์ ์ ์ ์ ๋ฐ์ดํฐ(์: ์ด๋ฏธ์ง, ๊ธ๊ผด, ์ง์ญํ ํ์ผ)๋ฅผ Wasm ๋ฉ๋ชจ๋ฆฌ์ ๋ก๋ํ๋ ๊ฒฝ์ฐ, ์ด๋ฅผ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ก ํฌํจํ๊ณmemory.init์ ์ฌ์ฉํ๋ ๊ฒ์ ์กฐ์ฌํ์ญ์์ค. ์ด๋ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ํฌ๊ฒ ํฅ์์ํฌ ์ ์์ต๋๋ค. -
ํด์ฒด์ธ ํจ๊ณผ์ ์ผ๋ก ์ฌ์ฉ: Rust์
wasm-bindgen์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ,wasm-bindgen์ด JSTypedArray๋ฅผ ์ฌ์ฉํ์ฌ ์์์ ์ผ๋ก ๋ฐ์ดํฐ๋ฅผ ์๋ค๋ก ๋ณต์ฌํ๋๋ก ๋๋ ๋์ , ๋๋ ๋ฐ์ดํฐ ๋ฒํผ๋ฅผ ์ฐธ์กฐ(ํฌ์ธํฐ ๋ฐ ๊ธธ์ด)๋ก Wasm ํจ์์ ์ ๋ฌํ์ฌ ๋๋ ์ฐ์ฐ์ ์ํํ๋๋ก ํ์ญ์์ค. -
memory.copy์ ๊ฒน์นจ์ ์ ์:memory.copy๋ ๊ฒน์น๋ ์์ญ์ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ์ง๋ง, ๋ก์ง์ด ๊ฒน์นจ์ด ๋ฐ์ํ ์ ์๋ ์์ ๊ณผ ๊ทธ๊ฒ์ด ์๋๋ ๊ฒ์ธ์ง ์ฌ๋ถ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ๊ฒฐ์ ํ๋๋ก ํ์ญ์์ค. ์๋ชป๋ ์คํ์ ๊ณ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์์์ด ์๋๋ผ ๋ ผ๋ฆฌ์ ์ค๋ฅ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ณต์กํ ์๋๋ฆฌ์ค์์๋ ๋ฉ๋ชจ๋ฆฌ ์์ญ์ ์๊ฐ์ ๋ค์ด์ด๊ทธ๋จ์ด ๋๋๋ก ๋์์ด ๋ ์ ์์ต๋๋ค. -
๋๋ ์ฐ์ฐ์ ์ฌ์ฉํ์ง ๋ง์์ผ ํ ๋: ๋งค์ฐ ์์ ๋ณต์ฌ(์: ๋ช ๋ฐ์ดํธ)์ ๊ฒฝ์ฐ, ๋ด๋ณด๋ธ Wasm ํจ์๋ฅผ ํธ์ถํ์ฌ
memory.copy๋ฅผ ์คํํ๋ ์ค๋ฒํค๋๊ฐ ๊ฐ๋จํ JavaScript ํ ๋น์ด๋ ๋ช ๊ฐ์ Wasm ๋ก๋/์คํ ์ด ๋ช ๋ น์ด์ ๋นํด ์ด์ ์ ์ด๊ณผํ ์ ์์ต๋๋ค. ํญ์ ๊ฐ์ ์ ํ์ธํ๊ธฐ ์ํด ๋ฒค์น๋งํนํ์ญ์์ค. ์ผ๋ฐ์ ์ผ๋ก ๋๋ ์ฐ์ฐ์ ๊ณ ๋ คํ๊ธฐ ์์ํ๋ ์ข์ ์๊ณ๊ฐ์ ์๋ฐฑ ๋ฐ์ดํธ ์ด์์ ๋ฐ์ดํฐ ํฌ๊ธฐ์ ๋๋ค.
์ด๋ฌํ ์ต์ ํ ์ ๋ต์ ์ฒด๊ณ์ ์ผ๋ก ๋ฒค์น๋งํนํ๊ณ ์ ์ฉํจ์ผ๋ก์จ ๊ฐ๋ฐ์๋ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฏธ์ธ ์กฐ์ ํ์ฌ ์ต๊ณ ์ฑ๋ฅ์ ๋ฌ์ฑํ๊ณ ๋ชจ๋ ์ฌ๋, ๋ชจ๋ ๊ณณ์์ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ ๋ณด์ฅํ ์ ์์ต๋๋ค.
WebAssembly ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ฏธ๋
WebAssembly๋ ๋น ๋ฅด๊ฒ ๋ฐ์ ํ๋ ํ์ค์ด๋ฉฐ, ๊ทธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๊ธฐ๋ฅ์ ์ง์์ ์ผ๋ก ํฅ์๋๊ณ ์์ต๋๋ค. ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ด ์๋นํ ๋ฐ์ ์ ๋ํ๋ด์ง๋ง, ์งํ ์ค์ธ ์ ์๋ค์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฒ๋ฆฌํ๋ ํจ์ฌ ๋ ์ ๊ตํ๊ณ ํจ์จ์ ์ธ ๋ฐฉ๋ฒ์ ์ฝ์ํฉ๋๋ค.
WasmGC: ๊ด๋ฆฌํ ์ธ์ด๋ฅผ ์ํ ๊ฐ๋น์ง ์ปฌ๋ ์
๊ฐ์ฅ ๊ธฐ๋๋๋ ์ถ๊ฐ ๊ธฐ๋ฅ ์ค ํ๋๋ WebAssembly ๊ฐ๋น์ง ์ปฌ๋ ์ (WasmGC) ์ ์์ ๋๋ค. ์ด๋ ์ผ๊ธ ๊ฐ๋น์ง ์ปฌ๋ ์ ์์คํ ์ WebAssembly์ ์ง์ ํตํฉํ์ฌ Java, C#, Kotlin, Dart์ ๊ฐ์ ์ธ์ด๊ฐ ๋ ์์ ๋ฐ์ด๋๋ฆฌ์ ๋ ๊ด์ฉ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ก Wasm์ผ๋ก ์ปดํ์ผ๋ ์ ์๋๋ก ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
WasmGC๊ฐ ์ ํ ๋ฉ๋ชจ๋ฆฌ ๋ชจ๋ธ์ด๋ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋์ฒดํ๋ ๊ฒ์ด ์๋๋ผ๋ ์ ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋์ , ์ด๋ ๋ณด์์ ์ธ ๊ธฐ๋ฅ์ ๋๋ค:
- ์์ ๋ฐ์ดํฐ๋ฅผ ์ํ ์ ํ ๋ฉ๋ชจ๋ฆฌ: ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ ์์ค ๋ฐ์ดํธ ์กฐ์, ์์น ๊ณ์ฐ, ๊ทธ๋ํฝ ๋ฒํผ ๋ฐ ๋ช ์์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ ์ด๊ฐ ๊ฐ์ฅ ์ค์ํ ์๋๋ฆฌ์ค์ ๊ณ์ํด์ ํ์์ ์ผ ๊ฒ์ ๋๋ค.
- ๊ตฌ์กฐํ๋ ๋ฐ์ดํฐ/๊ฐ์ฒด๋ฅผ ์ํ WasmGC: WasmGC๋ ๋ณต์กํ ๊ฐ์ฒด ๊ทธ๋ํ, ์ฐธ์กฐ ์ ํ ๋ฐ ๊ณ ์์ค ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ด๋ฆฌํ๋ ๋ฐ ํ์ํ์ฌ, ์ด์ ์์กดํ๋ ์ธ์ด์ ๋ํ ์๋ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ถ๋ด์ ์ค์ผ ๊ฒ์ ๋๋ค.
๋ ๋ชจ๋ธ์ ๊ณต์กด์ ๊ฐ๋ฐ์๊ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค๋ฅธ ๋ถ๋ถ์ ๊ฐ์ฅ ์ ํฉํ ๋ฉ๋ชจ๋ฆฌ ์ ๋ต์ ์ ํํ ์ ์๊ฒ ํ์ฌ, ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฑ๋ฅ๊ณผ ๊ด๋ฆฌํ ๋ฉ๋ชจ๋ฆฌ์ ์์ ์ฑ ๋ฐ ํธ์์ฑ์ ๊ฒฐํฉํ ์ ์๋๋ก ํฉ๋๋ค.
๋ฏธ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ธฐ๋ฅ ๋ฐ ์ ์
WebAssembly ์ปค๋ฎค๋ํฐ๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ๋์ฑ ํฅ์์ํฌ ์ ์๋ ์ฌ๋ฌ ๋ค๋ฅธ ์ ์์ ์ ๊ทน์ ์ผ๋ก ํ์ํ๊ณ ์์ต๋๋ค:
- ์ํ๋ SIMD: Wasm์ ์ด๋ฏธ SIMD(๋จ์ผ ๋ช ๋ น์ด, ๋ค์ค ๋ฐ์ดํฐ) ๋ช ๋ น์ด๋ฅผ ์ง์ํ์ง๋ง, "์ํ๋ SIMD"์ ๋ํ ์ ์์ ํจ์ฌ ๋ ๊ณต๊ฒฉ์ ์ธ ์ต์ ํ๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ์ฌ, ํนํ ๋ฐ์ดํฐ ๋ณ๋ ฌ ์๋๋ฆฌ์ค์์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ์ด์ ์ ์ค ์ ์๋ ๋ ๋น ๋ฅธ ๋ฒกํฐ ์ฐ์ฐ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
- ๋์ ๋งํน ๋ฐ ๋ชจ๋ ๋งํน: ๋์ ๋งํน์ ๋ํ ๋ ๋์ ์ง์์ ๋ชจ๋์ด ๋ฉ๋ชจ๋ฆฌ ๋ฐ ๋ฐ์ดํฐ ์ธ๊ทธ๋จผํธ๋ฅผ ๊ณต์ ํ๋ ๋ฐฉ์์ ๊ฐ์ ํ์ฌ, ์ฌ๋ฌ Wasm ๋ชจ๋์ ๊ฑธ์ณ ๋ฉ๋ชจ๋ฆฌ ๋ฆฌ์์ค๋ฅผ ๊ด๋ฆฌํ๋ ๋ ์ ์ฐํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- Memory64: 64๋นํธ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์(Memory64) ์ง์์ Wasm ์ ํ๋ฆฌ์ผ์ด์ ์ด 4GB ์ด์์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ฃผ์ ์ง์ ํ ์ ์๊ฒ ํ์ฌ, ๊ณผํ ์ปดํจํ , ๋น ๋ฐ์ดํฐ ์ฒ๋ฆฌ ๋ฐ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋งค์ฐ ํฐ ๋ฐ์ดํฐ ์ธํธ์ ๋งค์ฐ ์ค์ํฉ๋๋ค.
Wasm ํด์ฒด์ธ์ ์ง์์ ์ธ ๋ฐ์
WebAssembly๋ฅผ ๋์์ผ๋ก ํ๋ ์ปดํ์ผ๋ฌ ๋ฐ ํด์ฒด์ธ(์: C/C++์ฉ Emscripten, Rust์ฉ wasm-pack/wasm-bindgen, Go์ฉ TinyGo)์ ๋์์์ด ๋ฐ์ ํ๊ณ ์์ต๋๋ค. ์ด๋ค์ ์ ์ ํ ๊ฒฝ์ฐ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ ํ์ฉํ๊ณ JavaScript ์ํธ ์ด์ฉ ๊ณ์ธต์ ๊ฐ์ํํ๋ ๋ฑ ์ต์ ์ Wasm ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐ ์ ์ ๋ ๋ฅ์ํด์ง๊ณ ์์ต๋๋ค. ์ด๋ฌํ ์ง์์ ์ธ ๊ฐ์ ์ ๊ฐ๋ฐ์๊ฐ ๊น์ Wasm ์์ค์ ์ ๋ฌธ ์ง์ ์์ด๋ ์ด๋ฌํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ํ์ฉํ๊ธฐ ์ฝ๊ฒ ๋ง๋ญ๋๋ค.
WebAssembly ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ์ ๋ฏธ๋๋ ๋ฐ์ผ๋ฉฐ, ๊ฐ๋ฐ์๊ฐ ๋ฏฟ์ ์ ์์ ์ ๋๋ก ์ฑ๋ฅ์ด ๋ฐ์ด๋๊ณ , ์์ ํ๋ฉฐ, ์ ์ธ๊ณ์ ์ผ๋ก ์ ๊ทผ ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์๋๋ก ๋์ฑ ํ์ ์ค์ด์ค ํ๋ถํ ๋๊ตฌ์ ๊ธฐ๋ฅ์ ์ํ๊ณ๋ฅผ ์ฝ์ํฉ๋๋ค.
๊ฒฐ๋ก : ์ ์ธ๊ณ ๊ณ ์ฑ๋ฅ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ญ๋ ๊ฐํ
WebAssembly์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ โ memory.copy, memory.fill, ๊ทธ๋ฆฌ๊ณ data.drop๊ณผ ์์ ์ด๋ฃจ๋ memory.init โ ์ ์ ์ง์ ์ธ ๊ฐ์ ๊ทธ ์ด์์
๋๋ค. ์ด๋ ๊ณ ์ฑ๋ฅ ์น ๊ฐ๋ฐ์์ ๊ฐ๋ฅํ ๊ฒ์ ์ ์๋ฅผ ์ฌ์ ์ํ๋ ๊ธฐ๋ณธ ํ๋ฆฌ๋ฏธํฐ๋ธ์
๋๋ค. ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ ์ด๊ณ ํ๋์จ์ด ๊ฐ์ํ๋ ์กฐ์์ ๊ฐ๋ฅํ๊ฒ ํจ์ผ๋ก์จ, ์ด๋ฌํ ์ฐ์ฐ์ ๋ฉ๋ชจ๋ฆฌ ์ง์ฝ์ ์ธ ์์
์ ๋ํด ์๋นํ ์๋ ํฅ์์ ๊ฐ์ ธ์ต๋๋ค.
๋ณต์กํ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ๋ถํฐ ๋ชฐ์ ํ ๊ฒ์, ์ค์๊ฐ ์ค๋์ค ํฉ์ฑ, ๊ณ์ฐ ์ง์ฝ์ ์ธ ๊ณผํ ์๋ฎฌ๋ ์ด์ ์ ์ด๋ฅด๊ธฐ๊น์ง, ๋๋ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ์ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ด ์ด์ ์๋ ๋ค์ดํฐ๋ธ ๋ฐ์คํฌํฑ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ง ๋ณผ ์ ์์๋ ํจ์จ์ฑ์ผ๋ก ๋ฐฉ๋ํ ์์ ๋ฐ์ดํฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋ณด์ฅํฉ๋๋ค. ์ด๋ ๋ ๋น ๋ฅธ ๋ก๋ ์๊ฐ, ๋ ๋ถ๋๋ฌ์ด ์ํธ ์์ฉ, ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ ์ฌ๋, ๋ชจ๋ ๊ณณ์์ ๋ ๋ฐ์์ฑ์ด ์ข์ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ผ๋ ์ฐ์ํ ์ฌ์ฉ์ ๊ฒฝํ์ผ๋ก ์ง์ ์ด์ด์ง๋๋ค.
๊ธ๋ก๋ฒ ์์ฅ์์ ํ๋ํ๋ ๊ฐ๋ฐ์๋ค์๊ฒ ์ด๋ฌํ ์ต์ ํ๋ ๋จ์ง ์ฌ์น๊ฐ ์๋๋ผ ํ์์ ๋๋ค. ์ด๋ฅผ ํตํด ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ค์ํ ์ฅ์น ๋ฐ ๋คํธ์ํฌ ์กฐ๊ฑด์์ ์ผ๊ด๋๊ฒ ์ฑ๋ฅ์ ๋ฐํํ์ฌ, ๊ณ ์ฑ๋ฅ ์ํฌ์คํ ์ด์ ๊ณผ ๋ ์ ํ์ ์ธ ๋ชจ๋ฐ์ผ ํ๊ฒฝ ๊ฐ์ ์ฑ๋ฅ ๊ฒฉ์ฐจ๋ฅผ ํด์ํฉ๋๋ค. WebAssembly์ ๋๋ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ ๊ธฐ๋ฅ์ ์ดํดํ๊ณ ์ ๋ต์ ์ผ๋ก ์ ์ฉํจ์ผ๋ก์จ, ์๋, ํจ์จ์ฑ ๋ฐ ๊ธ๋ก๋ฒ ๋๋ฌ ๋ฒ์ ๋ฉด์์ ์ง์ ์ผ๋ก ๋ฐ์ด๋ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด๋ฌํ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ์ ์์ฉํ์ฌ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ํ ๋จ๊ณ ๋์ด์ฌ๋ฆฌ๊ณ , ์ฌ์ฉ์์๊ฒ ๋น๊ตํ ์ ์๋ ์ฑ๋ฅ์ ์ ๊ณตํ๋ฉฐ, ์น์ด ๋ฌ์ฑํ ์ ์๋ ๊ฒ์ ๊ฒฝ๊ณ๋ฅผ ๊ณ์ํด์ ๋ํ๊ฐ์ญ์์ค. ๊ณ ์ฑ๋ฅ ์น ์ปดํจํ ์ ๋ฏธ๋๋ ๋ฐ๋ก ์ฌ๊ธฐ์ ์์ผ๋ฉฐ, ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ์ฐ์ฐ ์์ ๊ตฌ์ถ๋์ด ์์ต๋๋ค.