์น์ด์ ๋ธ๋ฆฌ(Wasm) ํธ์คํธ ๋ฐ์ธ๋ฉ์ ํต์ฌ ๋ฉ์ปค๋์ฆ์ ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ์ ๊ทผ๋ถํฐ Rust, C++, Go์์ ๊ณ ์์ค ์ธ์ด ํตํฉ๊น์ง ํ๊ตฌํฉ๋๋ค. ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ๋ฏธ๋์ ๋ํด ์์๋ณด์ธ์.
์ธ๊ณ๋ฅผ ์๋ ๋ค๋ฆฌ: ์น์ด์ ๋ธ๋ฆฌ ํธ์คํธ ๋ฐ์ธ๋ฉ๊ณผ ์ธ์ด ๋ฐํ์ ํตํฉ์ ๋ํ ์ฌ์ธต ๋ถ์
์น์ด์ ๋ธ๋ฆฌ(WebAssembly, Wasm)๋ ์น ๋ธ๋ผ์ฐ์ ๋ถํฐ ํด๋ผ์ฐ๋ ์๋ฒ, ์ฃ์ง ๋๋ฐ์ด์ค์ ์ด๋ฅด๊ธฐ๊น์ง ๋ค์ํ ํ๊ฒฝ์์ ์ํํ๊ฒ ์คํ๋๋ ์ด์์ฑ ๋๊ณ ๊ณ ์ฑ๋ฅ์ด๋ฉฐ ์์ ํ ์ฝ๋๋ฅผ ์ฝ์ํ๋ ํ์ ์ ์ธ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. Wasm์ ํต์ฌ์ ์คํ ๊ธฐ๋ฐ ๊ฐ์ ๋จธ์ ์ ์ํ ๋ฐ์ด๋๋ฆฌ ๋ช ๋ น์ด ํ์์ ๋๋ค. ๊ทธ๋ฌ๋ Wasm์ ์ง์ ํ ํ์ ๋จ์ํ ๊ณ์ฐ ์๋์๋ง ์๋ ๊ฒ์ด ์๋๋ผ, ์ฃผ๋ณ ์ธ๊ณ์ ์ํธ์์ฉํ๋ ๋ฅ๋ ฅ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ์ํธ์์ฉ์ ์ง์ ์ ์ด์ง ์์ต๋๋ค. ์ด๋ ํธ์คํธ ๋ฐ์ธ๋ฉ์ด๋ผ๋ ์ค์ํ ๋ฉ์ปค๋์ฆ์ ํตํด ์ ์คํ๊ฒ ์ค์ฌ๋ฉ๋๋ค.
Wasm ๋ชจ๋์ ์ค๊ณ์ ์์ ํ ์๋๋ฐ์ค ์์ ๊ฐํ ์ฃ์์ ๊ฐ์ต๋๋ค. ์์ฒด์ ์ผ๋ก ๋คํธ์ํฌ์ ์ ๊ทผํ๊ฑฐ๋, ํ์ผ์ ์ฝ๊ฑฐ๋, ์น ํ์ด์ง์ ๋ฌธ์ ๊ฐ์ฒด ๋ชจ๋ธ(DOM)์ ์กฐ์ํ ์ ์์ต๋๋ค. ์ค์ง ์์ฒด์ ์ผ๋ก ๊ฒฉ๋ฆฌ๋ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ ๋ด์ ๋ฐ์ดํฐ์ ๋ํ ๊ณ์ฐ๋ง ์ํํ ์ ์์ต๋๋ค. ํธ์คํธ ๋ฐ์ธ๋ฉ์ ์๋๋ฐ์คํ๋ Wasm ์ฝ๋("๊ฒ์คํธ")๊ฐ ์คํ๋๋ ํ๊ฒฝ("ํธ์คํธ")๊ณผ ํต์ ํ ์ ์๋๋ก ํ์ฉํ๋ ์์ ํ ๊ฒ์ดํธ์จ์ด์ด์ ์ ์ ์๋ API ๊ณ์ฝ์ ๋๋ค.
์ด ๊ธ์์๋ ์น์ด์ ๋ธ๋ฆฌ ํธ์คํธ ๋ฐ์ธ๋ฉ์ ๋ํด ํฌ๊ด์ ์ผ๋ก ํ๊ตฌํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ธ ๋ฉ์ปค๋์ฆ์ ๋ถ์ํ๊ณ , ํ๋ ์ธ์ด ํด์ฒด์ธ์ด ์ด๋ป๊ฒ ๊ทธ ๋ณต์ก์ฑ์ ์ถ์ํํ๋์ง ์กฐ์ฌํ๋ฉฐ, ํ์ ์ ์ธ ์น์ด์ ๋ธ๋ฆฌ ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ํตํด ๋ฏธ๋๋ฅผ ๋ด๋ค๋ณผ ๊ฒ์ ๋๋ค. ์์คํ ํ๋ก๊ทธ๋๋จธ, ์น ๊ฐ๋ฐ์, ํด๋ผ์ฐ๋ ์ํคํ ํธ ๋ฑ ๋๊ตฌ์๊ฒ๋ ํธ์คํธ ๋ฐ์ธ๋ฉ์ ์ดํดํ๋ ๊ฒ์ Wasm์ ์ ์ฌ๋ ฅ์ ์ต๋ํ ํ์ฉํ๋ ์ด์ ์ ๋๋ค.
์๋๋ฐ์ค ์ดํดํ๊ธฐ: ํธ์คํธ ๋ฐ์ธ๋ฉ์ด ํ์์ ์ธ ์ด์
ํธ์คํธ ๋ฐ์ธ๋ฉ์ ๊ฐ์น๋ฅผ ์ ๋๋ก ์ดํดํ๋ ค๋ฉด ๋จผ์ Wasm์ ๋ณด์ ๋ชจ๋ธ์ ์ดํดํด์ผ ํฉ๋๋ค. ์ฃผ๋ ๋ชฉํ๋ ์ ๋ขฐํ ์ ์๋ ์ฝ๋๋ฅผ ์์ ํ๊ฒ ์คํํ๋ ๊ฒ์ ๋๋ค. Wasm์ ๋ช ๊ฐ์ง ํต์ฌ ์์น์ ํตํด ์ด๋ฅผ ๋ฌ์ฑํฉ๋๋ค:
- ๋ฉ๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ: ๊ฐ Wasm ๋ชจ๋์ ์ ํ ๋ฉ๋ชจ๋ฆฌ๋ผ๊ณ ๋ถ๋ฆฌ๋ ์ ์ฉ ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก์์ ์๋ํฉ๋๋ค. ์ด๊ฒ์ ๋ณธ์ง์ ์ผ๋ก ํฌ๊ณ ์ฐ์์ ์ธ ๋ฐ์ดํธ ๋ฐฐ์ด์ ๋๋ค. Wasm ์ฝ๋๋ ์ด ๋ฐฐ์ด ๋ด์์ ์์ ๋กญ๊ฒ ์ฝ๊ณ ์ธ ์ ์์ง๋ง, ๊ตฌ์กฐ์ ์ผ๋ก ๊ทธ ์ธ๋ถ์ ๋ฉ๋ชจ๋ฆฌ์ ์ ๊ทผํ ์ ์์ต๋๋ค. ์ ๊ทผ์ ์๋ํ๋ฉด ํธ๋ฉ(๋ชจ๋์ ์ฆ๊ฐ์ ์ธ ์ข ๋ฃ)์ด ๋ฐ์ํฉ๋๋ค.
- ์ญ๋ ๊ธฐ๋ฐ ๋ณด์: Wasm ๋ชจ๋์ ๋ด์ฌ๋ ์ญ๋์ด ์์ต๋๋ค. ํธ์คํธ๊ฐ ๋ช ์์ ์ผ๋ก ํ๊ฐ๋ฅผ ๋ถ์ฌํ์ง ์๋ ํ ์ด๋ ํ ๋ถ์ ํจ๊ณผ๋ ์ํํ ์ ์์ต๋๋ค. ํธ์คํธ๋ Wasm ๋ชจ๋์ด ์ํฌํธํ์ฌ ํธ์ถํ ์ ์๋ ํจ์๋ฅผ ๋ ธ์ถํจ์ผ๋ก์จ ์ด๋ฌํ ์ญ๋์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ํธ์คํธ๋ ์ฝ์์ ์ถ๋ ฅํ๊ธฐ ์ํ `log_message` ํจ์๋ ๋คํธ์ํฌ ์์ฒญ์ ์ํ `fetch_data` ํจ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
์ด ๋์์ธ์ ๊ฐ๋ ฅํฉ๋๋ค. ์ํ์ ๊ณ์ฐ๋ง ์ํํ๋ Wasm ๋ชจ๋์ ์ํฌํธํ ํจ์๊ฐ ํ์ ์์ผ๋ฉฐ I/O ์ํ์ด ์ ํ ์์ต๋๋ค. ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ํธ์์ฉํด์ผ ํ๋ ๋ชจ๋์๋ ์ต์ ๊ถํ ์์น์ ๋ฐ๋ผ ํ์ํ ํน์ ํจ์๋ง ๋ถ์ฌํ ์ ์์ต๋๋ค.
ํธ์คํธ ๋ฐ์ธ๋ฉ์ ์ด ์ญ๋ ๊ธฐ๋ฐ ๋ชจ๋ธ์ ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ๋๋ค. ์ด๋ ์๋๋ฐ์ค ๊ฒฝ๊ณ๋ฅผ ๋์ด ํต์ ์ฑ๋์ ํ์ฑํ๋ ์ํฌํธ ๋ฐ ์ต์คํฌํธ๋ ํจ์์ ์งํฉ์ ๋๋ค.
ํธ์คํธ ๋ฐ์ธ๋ฉ์ ํต์ฌ ๋ฉ์ปค๋์ฆ
๊ฐ์ฅ ๋ฎ์ ์์ค์์ ์น์ด์ ๋ธ๋ฆฌ ๋ช ์ธ๋ ํต์ ์ ์ํ ๊ฐ๋จํ๊ณ ์ฐ์ํ ๋ฉ์ปค๋์ฆ์ ์ ์ํฉ๋๋ค: ๋ช ๊ฐ์ง ๋จ์ํ ์ซ์ ํ์ ๋ง ์ ๋ฌํ ์ ์๋ ํจ์์ ์ํฌํธ์ ์ต์คํฌํธ์ ๋๋ค.
์ํฌํธ์ ์ต์คํฌํธ: ๊ธฐ๋ฅ์ ํธ๋์ ฐ์ดํฌ
ํต์ ๊ณ์ฝ์ ๋ ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ํตํด ์๋ฆฝ๋ฉ๋๋ค:
- ์ํฌํธ: Wasm ๋ชจ๋์ ํธ์คํธ ํ๊ฒฝ์ผ๋ก๋ถํฐ ์๊ตฌํ๋ ํจ์ ์งํฉ์ ์ ์ธํฉ๋๋ค. ํธ์คํธ๊ฐ ๋ชจ๋์ ์ธ์คํด์คํํ ๋, ์ด๋ฌํ ์ํฌํธ๋ ํจ์์ ๋ํ ๊ตฌํ์ ์ ๊ณตํด์ผ ํฉ๋๋ค. ํ์ ์ํฌํธ๊ฐ ์ ๊ณต๋์ง ์์ผ๋ฉด ์ธ์คํด์คํ๋ ์คํจํฉ๋๋ค.
- ์ต์คํฌํธ: Wasm ๋ชจ๋์ ํธ์คํธ์๊ฒ ์ ๊ณตํ๋ ํจ์, ๋ฉ๋ชจ๋ฆฌ ๋ธ๋ก ๋๋ ์ ์ญ ๋ณ์ ์งํฉ์ ์ ์ธํฉ๋๋ค. ์ธ์คํด์คํ ํ, ํธ์คํธ๋ ์ด๋ฌํ ์ต์คํฌํธ์ ์ ๊ทผํ์ฌ Wasm ํจ์๋ฅผ ํธ์ถํ๊ฑฐ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์กฐ์ํ ์ ์์ต๋๋ค.
์น์ด์ ๋ธ๋ฆฌ ํ ์คํธ ํ์(WAT)์์๋ ์ด๊ฒ์ด ๊ฐ๋จํด ๋ณด์ ๋๋ค. ๋ชจ๋์ด ํธ์คํธ๋ก๋ถํฐ ๋ก๊น ํจ์๋ฅผ ์ํฌํธํ ์ ์์ต๋๋ค:
์์: WAT์์ ํธ์คํธ ํจ์ ์ํฌํธํ๊ธฐ
(module
(import "env" "log_number" (func $log (param i32)))
...
)
๊ทธ๋ฆฌ๊ณ ํธ์คํธ๊ฐ ํธ์ถํ ํจ์๋ฅผ ์ต์คํฌํธํ ์ ์์ต๋๋ค:
์์: WAT์์ ๊ฒ์คํธ ํจ์ ์ต์คํฌํธํ๊ธฐ
(module
...
(func $add (param $a i32) (param $b i32) (result i32)
local.get $a
local.get $b
i32.add
)
(export "add" (func $add))
)
์ผ๋ฐ์ ์ผ๋ก ๋ธ๋ผ์ฐ์ ์ปจํ ์คํธ์์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์์ฑ๋ ํธ์คํธ๋ `log_number` ํจ์๋ฅผ ์ ๊ณตํ๊ณ ๋ค์๊ณผ ๊ฐ์ด `add` ํจ์๋ฅผ ํธ์ถํฉ๋๋ค:
์์: Wasm ๋ชจ๋๊ณผ ์ํธ์์ฉํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํธ์คํธ
const importObject = {
env: {
log_number: (num) => {
console.log("Wasm module logged:", num);
}
}
};
const response = await fetch('module.wasm');
const { instance } = await WebAssembly.instantiateStreaming(response, importObject);
const result = instance.exports.add(40, 2);
// result is 42
๋ฐ์ดํฐ์ ๊ฐ๊ทน: ์ ํ ๋ฉ๋ชจ๋ฆฌ ๊ฒฝ๊ณ ๋๊ธฐ
์์ ์๋ ์ฐ๋ฆฌ๊ฐ ๋จ์ํ ์ซ์(i32, i64, f32, f64)๋ง ์ ๋ฌํ๊ณ ์๊ธฐ ๋๋ฌธ์ ์๋ฒฝํ๊ฒ ์๋ํฉ๋๋ค. ์ด๋ค์ Wasm ํจ์๊ฐ ์ง์ ๋ฐ๊ฑฐ๋ ๋ฐํํ ์ ์๋ ์ ์ผํ ํ์
์
๋๋ค. ํ์ง๋ง ๋ฌธ์์ด, ๋ฐฐ์ด, ๊ตฌ์กฐ์ฒด ๋๋ JSON ๊ฐ์ฒด์ ๊ฐ์ ๋ณต์กํ ๋ฐ์ดํฐ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊น์?
์ด๊ฒ์ด ๋ฐ๋ก ํธ์คํธ ๋ฐ์ธ๋ฉ์ ๊ทผ๋ณธ์ ์ธ ๊ณผ์ ์ ๋๋ค: ์ซ์๋ง ์ฌ์ฉํ์ฌ ๋ณต์กํ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ด๋ป๊ฒ ํํํ ๊ฒ์ธ๊ฐ. ํด๊ฒฐ์ฑ ์ C๋ C++ ํ๋ก๊ทธ๋๋จธ์๊ฒ ์ต์ํ ํจํด์ธ ํฌ์ธํฐ์ ๊ธธ์ด์ ๋๋ค.
์ด ๊ณผ์ ์ ๋ค์๊ณผ ๊ฐ์ด ์๋ํฉ๋๋ค:
- ๊ฒ์คํธ์์ ํธ์คํธ๋ก (์: ๋ฌธ์์ด ์ ๋ฌ):
- Wasm ๊ฒ์คํธ๋ ๋ณต์กํ ๋ฐ์ดํฐ(์: UTF-8๋ก ์ธ์ฝ๋ฉ๋ ๋ฌธ์์ด)๋ฅผ ์์ ์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ค.
- ๊ฒ์คํธ๋ ์ํฌํธ๋ ํธ์คํธ ํจ์๋ฅผ ํธ์ถํ๋ฉฐ, ๋ ๊ฐ์ ์ซ์, ์ฆ ์์ ๋ฉ๋ชจ๋ฆฌ ์ฃผ์("ํฌ์ธํฐ")์ ๋ฐ์ดํฐ์ ๋ฐ์ดํธ ๋จ์ ๊ธธ์ด๋ฅผ ์ ๋ฌํฉ๋๋ค.
- ํธ์คํธ๋ ์ด ๋ ์ซ์๋ฅผ ๋ฐ์ต๋๋ค. ๊ทธ๋ฐ ๋ค์ Wasm ๋ชจ๋์ ์ ํ ๋ฉ๋ชจ๋ฆฌ(์๋ฐ์คํฌ๋ฆฝํธ์์๋ `ArrayBuffer`๋ก ๋ ธ์ถ๋จ)์ ์ ๊ทผํ์ฌ ์ฃผ์ด์ง ์คํ์ ์์ ์ง์ ๋ ๋ฐ์ดํธ ์๋งํผ ์ฝ์ด ๋ฐ์ดํฐ๋ฅผ ์ฌ๊ตฌ์ฑํฉ๋๋ค(์: ๋ฐ์ดํธ๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด๋ก ๋์ฝ๋ฉ).
- ํธ์คํธ์์ ๊ฒ์คํธ๋ก (์: ๋ฌธ์์ด ์์ ):
- ์ด๊ฒ์ ๋ ๋ณต์กํฉ๋๋ค. ์๋ํ๋ฉด ํธ์คํธ๊ฐ Wasm ๋ชจ๋์ ๋ฉ๋ชจ๋ฆฌ์ ์์๋ก ์ง์ ์ธ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ฒ์คํธ๊ฐ ์์ ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ด๋ฆฌํด์ผ ํฉ๋๋ค.
- ๊ฒ์คํธ๋ ์ผ๋ฐ์ ์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์(์: `allocate_memory`)๋ฅผ ์ต์คํฌํธํฉ๋๋ค.
- ํธ์คํธ๋ ๋จผ์ `allocate_memory`๋ฅผ ํธ์ถํ์ฌ ๊ฒ์คํธ์๊ฒ ํน์ ํฌ๊ธฐ์ ๋ฒํผ๋ฅผ ์์ฝํ๋๋ก ์์ฒญํฉ๋๋ค. ๊ฒ์คํธ๋ ์๋ก ํ ๋น๋ ๋ธ๋ก์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
- ํธ์คํธ๋ ์์ ์ ๋ฐ์ดํฐ(์: ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด์ UTF-8 ๋ฐ์ดํธ๋ก)๋ฅผ ์ธ์ฝ๋ฉํ๊ณ , ๋ฐ์ ํฌ์ธํฐ ์ฃผ์์ ๊ฒ์คํธ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, ํธ์คํธ๋ ๋ฐฉ๊ธ ์ด ๋ฐ์ดํฐ์ ํฌ์ธํฐ์ ๊ธธ์ด๋ฅผ ์ ๋ฌํ๋ฉฐ ์ค์ Wasm ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
- ๊ฒ์คํธ๋ ๋ํ `deallocate_memory` ํจ์๋ฅผ ์ต์คํฌํธํ์ฌ ํธ์คํธ๊ฐ ๋ฉ๋ชจ๋ฆฌ๊ฐ ๋ ์ด์ ํ์ํ์ง ์์ ๋ ์ ํธ๋ฅผ ๋ณด๋ผ ์ ์๋๋ก ํด์ผ ํฉ๋๋ค.
์ด๋ฌํ ์๋์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ, ์ธ์ฝ๋ฉ, ๋์ฝ๋ฉ ๊ณผ์ ์ ์ง๋ฃจํ๊ณ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ธฐ ์ฝ์ต๋๋ค. ๊ธธ์ด๋ฅผ ๊ณ์ฐํ๊ฑฐ๋ ํฌ์ธํฐ๋ฅผ ๊ด๋ฆฌํ ๋ ์์ ์ค์ ํ๋๊ฐ ๋ฐ์ดํฐ ์์์ด๋ ๋ณด์ ์ทจ์ฝ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์ธ์ด ๋ฐํ์๊ณผ ํด์ฒด์ธ์ด ํ์ ๋ถ๊ฐ๊ฒฐํด์ง๋๋ค.
์ธ์ด ๋ฐํ์ ํตํฉ: ๊ณ ์์ค ์ฝ๋์์ ์ ์์ค ๋ฐ์ธ๋ฉ์ผ๋ก
์๋์ผ๋ก ํฌ์ธํฐ์ ๊ธธ์ด ๋ก์ง์ ์์ฑํ๋ ๊ฒ์ ํ์ฅ ๊ฐ๋ฅํ์ง๋ ์์ฐ์ ์ด์ง๋ ์์ต๋๋ค. ๋คํํ๋, ์น์ด์ ๋ธ๋ฆฌ๋ก ์ปดํ์ผ๋๋ ์ธ์ด๋ค์ ํด์ฒด์ธ์ "๊ธ๋ฃจ ์ฝ๋(glue code)"๋ฅผ ์์ฑํ์ฌ ์ด ๋ณต์กํ ๊ณผ์ ์ ๋์ ์ฒ๋ฆฌํด ์ค๋๋ค. ์ด ๊ธ๋ฃจ ์ฝ๋๋ ๋ฒ์ญ ๊ณ์ธต ์ญํ ์ ํ์ฌ ๊ฐ๋ฐ์๊ฐ ์ ํํ ์ธ์ด์ ๊ณ ์์ค, ๊ด์ฉ์ ์ธ ํ์ ์ผ๋ก ์์ ํ ์ ์๊ฒ ํ๋ ๋์ ํด์ฒด์ธ์ด ์ ์์ค ๋ฉ๋ชจ๋ฆฌ ๋ง์ฌ๋ง์ ์ฒ๋ฆฌํ๋๋ก ํฉ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ 1: Rust์ `wasm-bindgen`
Rust ์ํ๊ณ๋ `wasm-bindgen` ๋๊ตฌ๋ฅผ ์ค์ฌ์ผ๋ก ์น์ด์ ๋ธ๋ฆฌ์ ๋ํ ์ต๊ณ ์์ค์ ์ง์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ Rust์ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ ๋งค๋๋ฝ๊ณ ์ธ์ฒด๊ณตํ์ ์ธ ์ํธ์ด์ฉ์ฑ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค.
๋ฌธ์์ด์ ๋ฐ์ ์ ๋์ฌ๋ฅผ ์ถ๊ฐํ๊ณ ์ ๋ฌธ์์ด์ ๋ฐํํ๋ ๊ฐ๋จํ Rust ํจ์๋ฅผ ์๊ฐํด ๋ด ์๋ค:
์์: ๊ณ ์์ค Rust ์ฝ๋
use wasm_bindgen::prelude::*;
#[wasm_bindgen]
pub fn greet(name: &str) -> String {
format!("Hello, {}!", name)
}
`#[wasm_bindgen]` ์์ฑ์ ํด์ฒด์ธ์๊ฒ ๋ง๋ฒ์ ๋ถ๋ฆฌ๋๋ก ์ง์ํฉ๋๋ค. ๋ด๋ถ์ ์ผ๋ก ์ผ์ด๋๋ ์ผ์ ๊ฐ๋ตํ๊ฒ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
- Rust์์ Wasm์ผ๋ก ์ปดํ์ผ: Rust ์ปดํ์ผ๋ฌ๋ `greet`๋ฅผ Rust์ `&str`์ด๋ `String`์ ์ดํดํ์ง ๋ชปํ๋ ์ ์์ค Wasm ํจ์๋ก ์ปดํ์ผํฉ๋๋ค. ์ค์ ์๊ทธ๋์ฒ๋ `greet(pointer: i32, length: i32) -> i32`์ ๊ฐ์ ํํ๊ฐ ๋ ๊ฒ์ ๋๋ค. ์ด ํจ์๋ Wasm ๋ฉ๋ชจ๋ฆฌ์ ์๋ ์ ๋ฌธ์์ด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ฐํํฉ๋๋ค.
- ๊ฒ์คํธ ์ธก ๊ธ๋ฃจ ์ฝ๋: `wasm-bindgen`์ Wasm ๋ชจ๋์ ํฌํผ ์ฝ๋๋ฅผ ์ฃผ์ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ ๋ฉ๋ชจ๋ฆฌ ํ ๋น/ํด์ ํจ์์ ํฌ์ธํฐ ๋ฐ ๊ธธ์ด๋ก๋ถํฐ Rust `&str`์ ์ฌ๊ตฌ์ฑํ๋ ๋ก์ง์ด ํฌํจ๋ฉ๋๋ค.
- ํธ์คํธ ์ธก ๊ธ๋ฃจ ์ฝ๋ (์๋ฐ์คํฌ๋ฆฝํธ): ์ด ๋๊ตฌ๋ ๋ํ ์๋ฐ์คํฌ๋ฆฝํธ ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด ํ์ผ์๋ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ๋ฐ์์๊ฒ ๊ณ ์์ค ์ธํฐํ์ด์ค๋ฅผ ์ ๊ณตํ๋ ๋ํผ `greet` ํจ์๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. ์ด JS ํจ์๊ฐ ํธ์ถ๋๋ฉด:
- ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด('World')์ ๋ฐ์ต๋๋ค.
- ์ด๋ฅผ UTF-8 ๋ฐ์ดํธ๋ก ์ธ์ฝ๋ฉํฉ๋๋ค.
- ์ต์คํฌํธ๋ Wasm ๋ฉ๋ชจ๋ฆฌ ํ ๋น ํจ์๋ฅผ ํธ์ถํ์ฌ ๋ฒํผ๋ฅผ ์ป์ต๋๋ค.
- ์ธ์ฝ๋ฉ๋ ๋ฐ์ดํธ๋ฅผ Wasm ๋ชจ๋์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์๋๋ค.
- ์ ์์ค Wasm `greet` ํจ์๋ฅผ ํฌ์ธํฐ์ ๊ธธ์ด์ ํจ๊ป ํธ์ถํฉ๋๋ค.
- Wasm์ผ๋ก๋ถํฐ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ๋ํ ํฌ์ธํฐ๋ฅผ ๋ค์ ๋ฐ์ต๋๋ค.
- Wasm ๋ฉ๋ชจ๋ฆฌ์์ ๊ฒฐ๊ณผ ๋ฌธ์์ด์ ์ฝ๊ณ , ์ด๋ฅผ ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ๋ฌธ์์ด๋ก ๋์ฝ๋ฉํ์ฌ ๋ฐํํฉ๋๋ค.
- ๋ง์ง๋ง์ผ๋ก, ์ ๋ ฅ ๋ฌธ์์ด์ ์ฌ์ฉ๋ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๊ธฐ ์ํด Wasm ํด์ ํจ์๋ฅผ ํธ์ถํฉ๋๋ค.
๊ฐ๋ฐ์์ ๊ด์ ์์๋ ์๋ฐ์คํฌ๋ฆฝํธ์์ `greet('World')`๋ฅผ ํธ์ถํ๊ณ `'Hello, World!'`๋ฅผ ๋๋ ค๋ฐ๊ธฐ๋ง ํ๋ฉด ๋ฉ๋๋ค. ๋ชจ๋ ๋ณต์กํ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ๋ ์์ ํ ์๋ํ๋ฉ๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ 2: C/C++์ Emscripten
Emscripten์ C ๋๋ C++ ์ฝ๋๋ฅผ ์น์ด์ ๋ธ๋ฆฌ๋ก ์ปดํ์ผํ๋ ์ฑ์ํ๊ณ ๊ฐ๋ ฅํ ์ปดํ์ผ๋ฌ ํด์ฒด์ธ์ ๋๋ค. ๋จ์ํ ๋ฐ์ธ๋ฉ์ ๋์ด ํ์ผ ์์คํ , ๋คํธ์ํน, ๊ทธ๋ฆฌ๊ณ SDL ๋ฐ OpenGL๊ณผ ๊ฐ์ ๊ทธ๋ํฝ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์๋ฎฌ๋ ์ด์ ํ๋ ํฌ๊ด์ ์ธ POSIX ์ ์ฌ ํ๊ฒฝ์ ์ ๊ณตํฉ๋๋ค.
Emscripten์ ํธ์คํธ ๋ฐ์ธ๋ฉ ์ ๊ทผ ๋ฐฉ์๋ ์ ์ฌํ๊ฒ ๊ธ๋ฃจ ์ฝ๋์ ๊ธฐ๋ฐํฉ๋๋ค. ์ํธ์ด์ฉ์ฑ์ ์ํ ๋ช ๊ฐ์ง ๋ฉ์ปค๋์ฆ์ ์ ๊ณตํฉ๋๋ค:
- `ccall`๊ณผ `cwrap`: ์ด๊ฒ๋ค์ ์ปดํ์ผ๋ C/C++ ํจ์๋ฅผ ํธ์ถํ๊ธฐ ์ํด Emscripten์ ๊ธ๋ฃจ ์ฝ๋๊ฐ ์ ๊ณตํ๋ ์๋ฐ์คํฌ๋ฆฝํธ ํฌํผ ํจ์์ ๋๋ค. ์ด๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์ซ์์ ๋ฌธ์์ด์ ํด๋น C ํ์ ์ผ๋ก ์๋ ๋ณํํ๋ ์์ ์ ์ฒ๋ฆฌํฉ๋๋ค.
- `EM_JS`์ `EM_ASM`: ์ด๊ฒ๋ค์ C/C++ ์์ค ๋ด๋ถ์ ์๋ฐ์คํฌ๋ฆฝํธ ์ฝ๋๋ฅผ ์ง์ ํฌํจํ ์ ์๊ฒ ํด์ฃผ๋ ๋งคํฌ๋ก์ ๋๋ค. ์ด๋ C++๊ฐ ํธ์คํธ API๋ฅผ ํธ์ถํด์ผ ํ ๋ ์ ์ฉํฉ๋๋ค. ์ปดํ์ผ๋ฌ๊ฐ ํ์ํ ์ํฌํธ ๋ก์ง ์์ฑ์ ์ฒ๋ฆฌํฉ๋๋ค.
- WebIDL Binder & Embind: ํด๋์ค์ ๊ฐ์ฒด๋ฅผ ํฌํจํ๋ ๋ ๋ณต์กํ C++ ์ฝ๋์ ๊ฒฝ์ฐ, Embind๋ฅผ ์ฌ์ฉํ๋ฉด C++ ํด๋์ค, ๋ฉ์๋, ํจ์๋ฅผ ์๋ฐ์คํฌ๋ฆฝํธ์ ๋ ธ์ถ์์ผ ๋จ์ํ ํจ์ ํธ์ถ๋ณด๋ค ํจ์ฌ ๋ ๊ฐ์ฒด ์งํฅ์ ์ธ ๋ฐ์ธ๋ฉ ๊ณ์ธต์ ๋ง๋ค ์ ์์ต๋๋ค.
Emscripten์ ์ฃผ๋ ๋ชฉํ๋ ์ข ์ข ๊ธฐ์กด์ ์ ์ฒด ์ ํ๋ฆฌ์ผ์ด์ ์ ์น์ผ๋ก ์ด์ํ๋ ๊ฒ์ด๋ฉฐ, ๊ทธ ํธ์คํธ ๋ฐ์ธ๋ฉ ์ ๋ต์ ์ต์ํ ์ด์ ์ฒด์ ํ๊ฒฝ์ ์๋ฎฌ๋ ์ด์ ํจ์ผ๋ก์จ ์ด๋ฅผ ์ง์ํ๋๋ก ์ค๊ณ๋์์ต๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ 3: Go์ TinyGo
Go๋ ์น์ด์ ๋ธ๋ฆฌ๋ก์ ์ปดํ์ผ(`GOOS=js GOARCH=wasm`)์ ๊ณต์์ ์ผ๋ก ์ง์ํฉ๋๋ค. ํ์ค Go ์ปดํ์ผ๋ฌ๋ ์ ์ฒด Go ๋ฐํ์(์ค์ผ์ค๋ฌ, ๊ฐ๋น์ง ์ปฌ๋ ํฐ ๋ฑ)์ ์ต์ข `.wasm` ๋ฐ์ด๋๋ฆฌ์ ํฌํจ์ํต๋๋ค. ์ด๋ก ์ธํด ๋ฐ์ด๋๋ฆฌ๊ฐ ์๋์ ์ผ๋ก ์ปค์ง์ง๋ง, ๊ณ ๋ฃจํด์ ํฌํจํ ๊ด์ฉ์ ์ธ Go ์ฝ๋๊ฐ Wasm ์๋๋ฐ์ค ๋ด์์ ์คํ๋ ์ ์๊ฒ ํฉ๋๋ค. ํธ์คํธ์์ ํต์ ์ ์๋ฐ์คํฌ๋ฆฝํธ API์ ์ํธ์์ฉํ๋ Go ๋ค์ดํฐ๋ธ ๋ฐฉ์์ ์ ๊ณตํ๋ `syscall/js` ํจํค์ง๋ฅผ ํตํด ์ฒ๋ฆฌ๋ฉ๋๋ค.
๋ฐ์ด๋๋ฆฌ ํฌ๊ธฐ๊ฐ ์ค์ํ๊ณ ์ ์ฒด ๋ฐํ์์ด ๋ถํ์ํ ์๋๋ฆฌ์ค์์๋ TinyGo๊ฐ ๋งค๋ ฅ์ ์ธ ๋์์ ์ ๊ณตํฉ๋๋ค. ์ด๋ LLVM ๊ธฐ๋ฐ์ ๋ค๋ฅธ Go ์ปดํ์ผ๋ฌ๋ก ํจ์ฌ ์์ Wasm ๋ชจ๋์ ์์ฑํฉ๋๋ค. TinyGo๋ ํฐ Go ๋ฐํ์์ ์ค๋ฒํค๋๋ฅผ ํผํ๊ธฐ ๋๋ฌธ์ ํธ์คํธ์ ํจ์จ์ ์ผ๋ก ์ํธ ์ด์ฉํด์ผ ํ๋ ์๊ณ ์ง์ค๋ Wasm ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์์ฑํ๋ ๋ฐ ๋ ์ ํฉํ ๊ฒฝ์ฐ๊ฐ ๋ง์ต๋๋ค.
์ฌ๋ก ์ฐ๊ตฌ 4: ์ธํฐํ๋ฆฌํฐ ์ธ์ด (์: Pyodide๋ฅผ ์ฌ์ฉํ Python)
์น์ด์ ๋ธ๋ฆฌ์์ Python์ด๋ Ruby์ ๊ฐ์ ์ธํฐํ๋ฆฌํฐ ์ธ์ด๋ฅผ ์คํํ๋ ๊ฒ์ ๋ค๋ฅธ ์ข ๋ฅ์ ๊ณผ์ ๋ฅผ ์ ์ํฉ๋๋ค. ๋จผ์ ํด๋น ์ธ์ด์ ์ ์ฒด ์ธํฐํ๋ฆฌํฐ(์: Python์ CPython ์ธํฐํ๋ฆฌํฐ)๋ฅผ ์น์ด์ ๋ธ๋ฆฌ๋ก ์ปดํ์ผํด์ผ ํฉ๋๋ค. ์ด Wasm ๋ชจ๋์ ์ฌ์ฉ์์ Python ์ฝ๋๋ฅผ ์ํ ํธ์คํธ๊ฐ ๋ฉ๋๋ค.
Pyodide์ ๊ฐ์ ํ๋ก์ ํธ๊ฐ ๋ฐ๋ก ์ด ์์ ์ ์ํํฉ๋๋ค. ํธ์คํธ ๋ฐ์ธ๋ฉ์ ๋ ๊ฐ์ง ์์ค์์ ์๋ํฉ๋๋ค:
- ์๋ฐ์คํฌ๋ฆฝํธ ํธ์คํธ <=> Python ์ธํฐํ๋ฆฌํฐ (Wasm): ์๋ฐ์คํฌ๋ฆฝํธ๊ฐ Wasm ๋ชจ๋ ๋ด์์ Python ์ฝ๋๋ฅผ ์คํํ๊ณ ๊ฒฐ๊ณผ๋ฅผ ๋ค์ ๋ฐ์ ์ ์๋๋ก ํ๋ ๋ฐ์ธ๋ฉ์ด ์์ต๋๋ค.
- Python ์ฝ๋ (Wasm ๋ด๋ถ) <=> ์๋ฐ์คํฌ๋ฆฝํธ ํธ์คํธ: Pyodide๋ Wasm ๋ด๋ถ์์ ์คํ๋๋ Python ์ฝ๋๊ฐ ์๋ฐ์คํฌ๋ฆฝํธ ๊ฐ์ฒด๋ฅผ ์ํฌํธํ๊ณ ์กฐ์ํ๋ฉฐ ํธ์คํธ ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ก ํ๋ ์ธ๋ถ ํจ์ ์ธํฐํ์ด์ค(FFI)๋ฅผ ๋ ธ์ถํฉ๋๋ค. ์ด๋ ๋ ์ธ๊ณ ๊ฐ์ ๋ฐ์ดํฐ ํ์ ์ ํฌ๋ช ํ๊ฒ ๋ณํํฉ๋๋ค.
์ด ๊ฐ๋ ฅํ ๊ตฌ์ฑ์ NumPy ๋ฐ Pandas์ ๊ฐ์ ์ธ๊ธฐ ์๋ Python ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์ง์ ์คํํ ์ ์๊ฒ ํ๋ฉฐ, ํธ์คํธ ๋ฐ์ธ๋ฉ์ด ๋ณต์กํ ๋ฐ์ดํฐ ๊ตํ์ ๊ด๋ฆฌํฉ๋๋ค.
๋ฏธ๋: ์น์ด์ ๋ธ๋ฆฌ ์ปดํฌ๋ํธ ๋ชจ๋ธ
ํ์ฌ์ ํธ์คํธ ๋ฐ์ธ๋ฉ ์ํ๋ ๊ธฐ๋ฅ์ ์ด์ง๋ง ํ๊ณ๊ฐ ์์ต๋๋ค. ์ฃผ๋ก ์๋ฐ์คํฌ๋ฆฝํธ ํธ์คํธ์ ์ง์ค๋์ด ์๊ณ , ์ธ์ด๋ณ ๊ธ๋ฃจ ์ฝ๋๊ฐ ํ์ํ๋ฉฐ, ์ ์์ค ์ซ์ ABI์ ์์กดํฉ๋๋ค. ์ด๋ก ์ธํด ์๋ก ๋ค๋ฅธ ์ธ์ด๋ก ์์ฑ๋ Wasm ๋ชจ๋์ด ๋น-์๋ฐ์คํฌ๋ฆฝํธ ํ๊ฒฝ์์ ์๋ก ์ง์ ํต์ ํ๊ธฐ๊ฐ ์ด๋ ต์ต๋๋ค.
์น์ด์ ๋ธ๋ฆฌ ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ์ด๋ฌํ ๋ฌธ์ ๋ค์ ํด๊ฒฐํ๊ณ Wasm์ ์ง์ ์ผ๋ก ๋ณดํธ์ ์ด๊ณ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ํํธ์จ์ด ์ปดํฌ๋ํธ ์ํ๊ณ๋ก ํ๋ฆฝํ๊ธฐ ์ํด ๊ณ ์๋ ๋ฏธ๋ ์งํฅ์ ์ธ ์ ์์ ๋๋ค. ๊ทธ ๋ชฉํ๋ ์ผ์ฌ์ฐจ๊ณ ํ์ ์ ์ ๋๋ค:
- ์ง์ ํ ์ธ์ด ์ํธ์ด์ฉ์ฑ: ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ๋จ์ํ ์ซ์๋ฅผ ๋์ด์๋ ๊ณ ์์ค์ ํ์ค ABI(์ ํ๋ฆฌ์ผ์ด์ ๋ฐ์ด๋๋ฆฌ ์ธํฐํ์ด์ค)๋ฅผ ์ ์ํฉ๋๋ค. ์ด๋ ๋ฌธ์์ด, ๋ ์ฝ๋, ๋ฆฌ์คํธ, ๋ฒ ๋ฆฌ์ธํธ, ํธ๋ค๊ณผ ๊ฐ์ ๋ณต์กํ ํ์ ์ ๋ํ ํํ์ ํ์คํํฉ๋๋ค. ์ด๋ Rust๋ก ์์ฑ๋ ์ปดํฌ๋ํธ๊ฐ ๋ฌธ์์ด ๋ฆฌ์คํธ๋ฅผ ๋ฐ๋ ํจ์๋ฅผ ์ต์คํฌํธํ๋ฉด, Python์ผ๋ก ์์ฑ๋ ์ปดํฌ๋ํธ๊ฐ ๊ฐ ์ธ์ด์ ๋ด๋ถ ๋ฉ๋ชจ๋ฆฌ ๋ ์ด์์์ ์ ํ์ ์์ด ๋งค๋๋ฝ๊ฒ ํธ์ถํ ์ ์์์ ์๋ฏธํฉ๋๋ค.
- ์ธํฐํ์ด์ค ์ ์ ์ธ์ด(IDL): ์ปดํฌ๋ํธ ๊ฐ์ ์ธํฐํ์ด์ค๋ WIT(์น์ด์ ๋ธ๋ฆฌ ์ธํฐํ์ด์ค ํ์ )๋ผ๋ ์ธ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ ์๋ฉ๋๋ค. WIT ํ์ผ์ ์ปดํฌ๋ํธ๊ฐ ์ํฌํธํ๊ณ ์ต์คํฌํธํ๋ ํจ์์ ํ์ ์ ๊ธฐ์ ํฉ๋๋ค. ์ด๋ ํด์ฒด์ธ์ด ๋ชจ๋ ํ์ํ ๋ฐ์ธ๋ฉ ์ฝ๋๋ฅผ ์๋์ผ๋ก ์์ฑํ๋ ๋ฐ ์ฌ์ฉํ ์ ์๋ ๊ณต์์ ์ด๊ณ ๊ธฐ๊ณ๊ฐ ์ฝ์ ์ ์๋ ๊ณ์ฝ์ ๋ง๋ญ๋๋ค.
- ์ ์ ๋ฐ ๋์ ๋งํน: ์ด๋ Wasm ์ปดํฌ๋ํธ๋ค์ด ์ ํต์ ์ธ ์ํํธ์จ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ฒ๋ผ ํจ๊ป ๋งํฌ๋์ด, ์๊ณ ๋ ๋ฆฝ์ ์ด๋ฉฐ ๋ค์ํ ์ธ์ด๋ก ์์ฑ๋ ๋ถ๋ถ๋ค๋ก๋ถํฐ ๋ ํฐ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค ์ ์๊ฒ ํฉ๋๋ค.
- API์ ๊ฐ์ํ: ์ปดํฌ๋ํธ๋ ํน์ ํธ์คํธ ๊ตฌํ์ ์ฝ๋งค์ด์ง ์๊ณ `wasi:keyvalue/readwrite`๋ `wasi:http/outgoing-handler`์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์ญ๋์ด ํ์ํ๋ค๊ณ ์ ์ธํ ์ ์์ต๋๋ค. ํธ์คํธ ํ๊ฒฝ์ด ๊ตฌ์ฒด์ ์ธ ๊ตฌํ์ ์ ๊ณตํ๋ฏ๋ก, ๋์ผํ Wasm ์ปดํฌ๋ํธ๊ฐ ๋ธ๋ผ์ฐ์ ์ ๋ก์ปฌ ์คํ ๋ฆฌ์ง์ ์ ๊ทผํ๋ , ํด๋ผ์ฐ๋์ Redis ์ธ์คํด์ค์ ์ ๊ทผํ๋ , ๋๋ ์ธ๋ฉ๋ชจ๋ฆฌ ํด์ ๋งต์ ์ ๊ทผํ๋ ์์ ์์ด ์คํ๋ ์ ์์ต๋๋ค. ์ด๊ฒ์ด WASI(์น์ด์ ๋ธ๋ฆฌ ์์คํ ์ธํฐํ์ด์ค) ๋ฐ์ ์ ํต์ฌ ์์ด๋์ด์ ๋๋ค.
์ปดํฌ๋ํธ ๋ชจ๋ธ ํ์์ ๊ธ๋ฃจ ์ฝ๋์ ์ญํ ์ด ์ฌ๋ผ์ง๋ ๊ฒ์ ์๋์ง๋ง, ํ์คํ๋ฉ๋๋ค. ์ธ์ด ํด์ฒด์ธ์ ์์ฒด ๋ค์ดํฐ๋ธ ํ์ ๊ณผ ํ์ค ์ปดํฌ๋ํธ ๋ชจ๋ธ ํ์ ๊ฐ์ ๋ณํ ๋ฐฉ๋ฒ("๋ฆฌํํ "๊ณผ "๋ก์๋ง"์ด๋ผ๋ ๊ณผ์ )๋ง ์๋ฉด ๋ฉ๋๋ค. ๊ทธ๋ฌ๋ฉด ๋ฐํ์์ด ์ปดํฌ๋ํธ ์ฐ๊ฒฐ์ ์ฒ๋ฆฌํฉ๋๋ค. ์ด๋ ๋ชจ๋ ์ธ์ด ์ ๊ฐ์ ๋ฐ์ธ๋ฉ์ ์์ฑํ๋ N-๋-N ๋ฌธ์ ๋ฅผ ์ ๊ฑฐํ๊ณ , ๊ฐ ์ธ์ด๊ฐ ์ปดํฌ๋ํธ ๋ชจ๋ธ๋ง ๋์์ผ๋ก ํ๋ฉด ๋๋ ๋ ๊ด๋ฆฌํ๊ธฐ ์ฌ์ด N-๋-1 ๋ฌธ์ ๋ก ๋์ฒดํฉ๋๋ค.
์ค์ง์ ์ธ ๊ณผ์ ์ ๋ชจ๋ฒ ์ฌ๋ก
ํนํ ํ๋์ ์ธ ํด์ฒด์ธ์ ์ฌ์ฉํ์ฌ ํธ์คํธ ๋ฐ์ธ๋ฉ ์์ ์ ํ ๋ ๋ช ๊ฐ์ง ์ค์ง์ ์ธ ๊ณ ๋ ค ์ฌํญ์ด ๋จ์ ์์ต๋๋ค.
์ฑ๋ฅ ์ค๋ฒํค๋: ๋ฉ์ด๋ฆฌ(Chunky) API ๋ ์๋ค์ค๋ฌ์ด(Chatty) API
Wasm-ํธ์คํธ ๊ฒฝ๊ณ๋ฅผ ๋๋ ๋ชจ๋ ํธ์ถ์๋ ๋น์ฉ์ด ๋ฐ๋ฆ ๋๋ค. ์ด ์ค๋ฒํค๋๋ ํจ์ ํธ์ถ ๋ฉ์ปค๋์ฆ, ๋ฐ์ดํฐ ์ง๋ ฌํ, ์ญ์ง๋ ฌํ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๋ณต์ฌ์์ ๋ฐ์ํฉ๋๋ค. ์๊ณ ๋น๋ฒํ ํธ์ถ์ ์์ฒ ๋ฒ ํ๋ ๊ฒ("์๋ค์ค๋ฌ์ด" API)์ ๋น ๋ฅด๊ฒ ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก: "๋ฉ์ด๋ฆฌ" API๋ฅผ ์ค๊ณํ์ธ์. ํฐ ๋ฐ์ดํฐ ์ธํธ์ ๋ชจ๋ ๋จ์ผ ํญ๋ชฉ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด ํจ์๋ฅผ ํธ์ถํ๋ ๋์ , ์ ์ฒด ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๋จ์ผ ํธ์ถ๋ก ์ ๋ฌํ์ธ์. Wasm ๋ชจ๋์ด ํ์ดํธํ ๋ฃจํ ์์์ ๋ฐ๋ณต์ ์ํํ๊ฒ ํ๊ณ (์ด๋ ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์๋๋ก ์คํ๋ ๊ฒ์ ๋๋ค), ๊ทธ๋ฐ ๋ค์ ์ต์ข ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋๋ก ํ์ธ์. ๊ฒฝ๊ณ๋ฅผ ๋๋ ํ์๋ฅผ ์ต์ํํ์ธ์.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ
๋ฉ๋ชจ๋ฆฌ๋ ์ ์คํ๊ฒ ๊ด๋ฆฌ๋์ด์ผ ํฉ๋๋ค. ํธ์คํธ๊ฐ ์ผ๋ถ ๋ฐ์ดํฐ๋ฅผ ์ํด ๊ฒ์คํธ์ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํ ๋นํ๋ค๋ฉด, ๋์ค์ ๋ฉ๋ชจ๋ฆฌ ๋์๋ฅผ ํผํ๊ธฐ ์ํด ๊ฒ์คํธ์๊ฒ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ํด์ ํ๋ผ๊ณ ์๋ ค์ฃผ๋ ๊ฒ์ ๊ธฐ์ตํด์ผ ํฉ๋๋ค. ํ๋์ ์ธ ๋ฐ์ธ๋ฉ ์์ฑ๊ธฐ๋ ์ด๋ฅผ ์ ์ฒ๋ฆฌํ์ง๋ง, ๊ทผ๋ณธ์ ์ธ ์์ ๊ถ ๋ชจ๋ธ์ ์ดํดํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก: `wasm-bindgen`, Emscripten ๋ฑ๊ณผ ๊ฐ์ ํด์ฒด์ธ์ด ์ ๊ณตํ๋ ์ถ์ํ์ ์์กดํ์ธ์. ์ด๋ค์ ์ด๋ฌํ ์์ ๊ถ ์๋ฏธ๋ฅผ ์ฌ๋ฐ๋ฅด๊ฒ ์ฒ๋ฆฌํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ์๋์ผ๋ก ๋ฐ์ธ๋ฉ์ ์์ฑํ ๋๋ ํญ์ `allocate` ํจ์์ `deallocate` ํจ์๋ฅผ ์์ผ๋ก ๋ง๋ค๊ณ ๋ฐ๋์ ํธ์ถ๋๋๋ก ํ์ธ์.
๋๋ฒ๊น
๋ ๊ฐ์ ๋ค๋ฅธ ์ธ์ด ํ๊ฒฝ๊ณผ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ๊ฑธ์น ์ฝ๋๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ค๋ฅ๋ ๊ณ ์์ค ๋ก์ง, ๊ธ๋ฃจ ์ฝ๋ ๋๋ ๊ฒฝ๊ณ ์ํธ์์ฉ ์์ฒด์ ์์ ์ ์์ต๋๋ค.
๋ชจ๋ฒ ์ฌ๋ก: C++ ๋ฐ Rust์ ๊ฐ์ ์ธ์ด์ ์์ค ๋งต ์ง์์ ํฌํจํ์ฌ Wasm ๋๋ฒ๊น ๊ธฐ๋ฅ์ด ๊พธ์คํ ๊ฐ์ ๋ ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ๋ฅผ ํ์ฉํ์ธ์. ๊ฒฝ๊ณ๋ฅผ ๋๋ ๋ฐ์ดํฐ๋ฅผ ์ถ์ ํ๊ธฐ ์ํด ์์ชฝ์์ ๊ด๋ฒ์ํ ๋ก๊น ์ ์ฌ์ฉํ์ธ์. ํธ์คํธ์ ํตํฉํ๊ธฐ ์ ์ Wasm ๋ชจ๋์ ํต์ฌ ๋ก์ง์ ๊ฒฉ๋ฆฌํ์ฌ ํ ์คํธํ์ธ์.
๊ฒฐ๋ก : ์์คํ ๊ฐ์ ์งํํ๋ ๋ค๋ฆฌ
์น์ด์ ๋ธ๋ฆฌ ํธ์คํธ ๋ฐ์ธ๋ฉ์ ๋จ์ํ ๊ธฐ์ ์ ์ธ๋ถ ์ฌํญ ๊ทธ ์ด์์ ๋๋ค; ๊ทธ๊ฒ์ Wasm์ ์ ์ฉํ๊ฒ ๋ง๋๋ ๋ฐ๋ก ๊ทธ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๊ทธ๊ฒ๋ค์ Wasm ๊ณ์ฐ์ ์์ ํ๊ณ ๊ณ ์ฑ๋ฅ์ธ ์ธ๊ณ์ ํธ์คํธ ํ๊ฒฝ์ ํ๋ถํ๊ณ ์ํธ์์ฉ์ ์ธ ๋ฅ๋ ฅ์ ์ฐ๊ฒฐํ๋ ๋ค๋ฆฌ์ ๋๋ค. ์ซ์ ์ํฌํธ์ ๋ฉ๋ชจ๋ฆฌ ํฌ์ธํฐ๋ผ๋ ์ ์์ค ๊ธฐ๋ฐ์์๋ถํฐ, ๊ฐ๋ฐ์์๊ฒ ์ธ์ฒด๊ณตํ์ ์ด๊ณ ๊ณ ์์ค์ ์ถ์ํ๋ฅผ ์ ๊ณตํ๋ ์ ๊ตํ ์ธ์ด ํด์ฒด์ธ์ ๋ถ์์ ๋ณด์์์ต๋๋ค.
์ค๋๋ , ์ด ๋ค๋ฆฌ๋ ๊ฐ๋ ฅํ๊ณ ์ ์ง์๋์ด ์๋ก์ด ์ข ๋ฅ์ ์น ๋ฐ ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฅํ๊ฒ ํฉ๋๋ค. ๋ด์ผ, ์น์ด์ ๋ธ๋ฆฌ ์ปดํฌ๋ํธ ๋ชจ๋ธ์ ์ถํ์ผ๋ก, ์ด ๋ค๋ฆฌ๋ ๋ณดํธ์ ์ธ ๊ตํ ์๋จ์ผ๋ก ์งํํ์ฌ ์ด๋ค ์ธ์ด์ ์ปดํฌ๋ํธ๋ ์ํํ๊ณ ์์ ํ๊ฒ ํ๋ ฅํ ์ ์๋ ์ง์ ํ ํด๋ฆฌ๊ธ๋(polyglot) ์ํ๊ณ๋ฅผ ์กฐ์ฑํ ๊ฒ์ ๋๋ค.
์ด ์งํํ๋ ๋ค๋ฆฌ๋ฅผ ์ดํดํ๋ ๊ฒ์ ์ฐจ์ธ๋ ์ํํธ์จ์ด๋ฅผ ๊ตฌ์ถํ๋ ค๋ ๋ชจ๋ ๊ฐ๋ฐ์์๊ฒ ํ์์ ์ ๋๋ค. ํธ์คํธ ๋ฐ์ธ๋ฉ์ ์์น์ ๋ง์คํฐํจ์ผ๋ก์จ, ์ฐ๋ฆฌ๋ ๋ ๋น ๋ฅด๊ณ ์์ ํ ๋ฟ๋ง ์๋๋ผ ๋ ๋ชจ๋ํ๋๊ณ , ์ด์์ฑ์ด ๋ฐ์ด๋๋ฉฐ, ์ปดํจํ ์ ๋ฏธ๋์ ๋๋น๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.