WebAssembly ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ดํดํ๊ณ ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ข ํฉ ๊ฐ์ด๋. ๊ฐ๋ ฅํ๊ณ ์ด์์ฑ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํ ์ํํ ๋ชจ๋ ์ข ์์ฑ ๊ด๋ฆฌ๋ฅผ ๋ฐฐ์๋ณด์ธ์.
WebAssembly ์ํฌํธ ๊ฐ์ฒด: ๋ชจ๋ ์ข ์์ฑ ์ค์ ์๋ฒฝ ๊ฐ์ด๋
WebAssembly(Wasm)๋ ์น ๋ธ๋ผ์ฐ์ , Node.js ํ๊ฒฝ ๋ฐ ๊ธฐํ ๋ค์ํ ํ๋ซํผ์์ ์คํํ ์ ์๋ ๊ณ ์ฑ๋ฅ์ ์ด์์ฑ ๋์ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ๊ธฐ์ ๋ก ๋ถ์ํ์ต๋๋ค. WebAssembly ๊ธฐ๋ฅ์ ํต์ฌ์ ์ธ ์ธก๋ฉด์ ์ํฌํธ ๊ฐ์ฒด(import objects)๋ผ๋ ๊ฐ๋ ์ ํตํด ์ฃผ๋ณ ํ๊ฒฝ๊ณผ ์ํธ ์์ฉํ ์ ์๋ ๋ฅ๋ ฅ์ ๋๋ค. ์ด ๊ธ์์๋ WebAssembly ์ํฌํธ ๊ฐ์ฒด์ ๋ณต์กํ ๋ด์ฉ์ ๊น์ด ํ๊ณ ๋ค์ด, ๊ฒฌ๊ณ ํ๊ณ ์ด์์ฑ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ํด ๋ชจ๋ ์ข ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ํ ํฌ๊ด์ ์ธ ์ดํด๋ฅผ ์ ๊ณตํฉ๋๋ค.
WebAssembly ์ํฌํธ ๊ฐ์ฒด๋ ๋ฌด์์ธ๊ฐ?
WebAssembly ๋ชจ๋์ ์ข ์ข ์ธ๋ถ ์ธ๊ณ์ ์ํธ ์์ฉํด์ผ ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ๊ฐ ์ ๊ณตํ๋ ํจ์(์: DOM ์กฐ์), ์ด์ ์ฒด์ (์: Node.js์์์ ํ์ผ ์์คํ ์ ๊ทผ) ๋๋ ๋ค๋ฅธ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ ๊ทผํด์ผ ํ ์ ์์ต๋๋ค. ์ด๋ฌํ ์ํธ ์์ฉ์ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ํตํด ์ด๋ฃจ์ด์ง๋๋ค.
๋ณธ์ง์ ์ผ๋ก ์ํฌํธ ๊ฐ์ฒด๋ WebAssembly ๋ชจ๋์ ์ฌ์ฉํ ์ ์๋ ํจ์, ๋ณ์, ๋ฉ๋ชจ๋ฆฌ ์งํฉ์ ์ ๊ณตํ๋ JavaScript ๊ฐ์ฒด(๋๋ ๋ค๋ฅธ ํ๊ฒฝ์ ์ ์ฌํ ๊ตฌ์กฐ)์ ๋๋ค. Wasm ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ๋ฐ ํ์ํ ์ธ๋ถ ์ข ์์ฑ์ ๋ชจ์์ด๋ผ๊ณ ์๊ฐํ ์ ์์ต๋๋ค.
์ํฌํธ ๊ฐ์ฒด๋ WebAssembly ๋ชจ๋๊ณผ ํธ์คํธ ํ๊ฒฝ ์ฌ์ด์ ๋ค๋ฆฌ ์ญํ ์ ํฉ๋๋ค. Wasm ๋ชจ๋์ ํ์ํ ์ํฌํธ(์ด๋ฆ๊ณผ ํ์ )๋ฅผ ์ ์ธํ๊ณ , ํธ์คํธ ํ๊ฒฝ์ ์ํฌํธ ๊ฐ์ฒด์์ ํด๋น ๊ฐ์ ์ ๊ณตํฉ๋๋ค.
์ํฌํธ ๊ฐ์ฒด์ ์ฃผ์ ๊ตฌ์ฑ ์์
- ๋ชจ๋ ์ด๋ฆ: ์ํฌํธ์ ๋ ผ๋ฆฌ์ ๊ทธ๋ฃน์ด๋ ๋ค์์คํ์ด์ค๋ฅผ ์๋ณํ๋ ๋ฌธ์์ด์ ๋๋ค. ์ด๋ฅผ ํตํด ๊ด๋ จ ์ํฌํธ๋ฅผ ํจ๊ป ๊ทธ๋ฃนํํ ์ ์์ต๋๋ค.
- ์ํฌํธ ์ด๋ฆ: ๋ชจ๋ ๋ด์ ํน์ ์ํฌํธ๋ฅผ ์๋ณํ๋ ๋ฌธ์์ด์ ๋๋ค.
- ์ํฌํธ ๊ฐ: Wasm ๋ชจ๋์ ์ ๊ณต๋๋ ์ค์ ๊ฐ์ ๋๋ค. ํจ์, ์ซ์, ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด ๋๋ ๋ค๋ฅธ WebAssembly ๋ชจ๋์ด ๋ ์ ์์ต๋๋ค.
์ํฌํธ ๊ฐ์ฒด๋ ์ ์ค์ํ๊ฐ?
์ํฌํธ ๊ฐ์ฒด๋ ์ฌ๋ฌ ๊ฐ์ง ์ด์ ๋ก ๋งค์ฐ ์ค์ํฉ๋๋ค:
- ์๋๋ฐ์ฑ ๋ฐ ๋ณด์: ํธ์คํธ ํ๊ฒฝ์ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ํตํด WebAssembly ๋ชจ๋์ ์ ๊ทผํ ์ ์๋ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์ดํจ์ผ๋ก์จ ์๊ฒฉํ ๋ณด์ ์ ์ฑ ์ ์ํํ ์ ์์ต๋๋ค. ์ด๋ ์ ์์ ์ด๊ฑฐ๋ ๋ฒ๊ทธ๊ฐ ์๋ Wasm ๋ชจ๋์ด ์ผ์ผํฌ ์ ์๋ ์ ์ฌ์ ํผํด๋ฅผ ์ ํํฉ๋๋ค. WebAssembly์ ๋ณด์ ๋ชจ๋ธ์ ์ํฌํธ๋ก ๋ช ์์ ์ผ๋ก ์ ์ธ๋ ๋ฆฌ์์ค์๋ง ์ ๊ทผ ๊ถํ์ ๋ถ์ฌํ๋ ์ต์ ๊ถํ์ ์์น์ ํฌ๊ฒ ์์กดํฉ๋๋ค.
- ์ด์์ฑ: WebAssembly ๋ชจ๋์ ์ฌ๋ฌ ๋ค๋ฅธ ํ๋ซํผ ๊ฐ์ ์ด์ ๊ฐ๋ฅํ๋๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ทธ๋ฌ๋ ํ๋ซํผ๋ง๋ค ์ ๊ณตํ๋ API ์ธํธ๊ฐ ๋ค๋ฆ ๋๋ค. ์ํฌํธ ๊ฐ์ฒด๋ ์ํฌํธ๋ ํจ์์ ๋ํด ๋ค๋ฅธ ๊ตฌํ์ ์ ๊ณตํจ์ผ๋ก์จ ๋์ผํ Wasm ๋ชจ๋์ด ๋ค๋ฅธ ํ๊ฒฝ์ ์ ์ํ ์ ์๋๋ก ํฉ๋๋ค. ์๋ฅผ ๋ค์ด, Wasm ๋ชจ๋์ ๋ธ๋ผ์ฐ์ ์์ ์คํ๋๋์ง ์๋ฒ์์ ์คํ๋๋์ง์ ๋ฐ๋ผ ๊ทธ๋ํฝ์ ๊ทธ๋ฆฌ๋ ๋ฐ ๋ค๋ฅธ ํจ์๋ฅผ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ชจ๋์ฑ ๋ฐ ์ฌ์ฌ์ฉ์ฑ: ์ํฌํธ ๊ฐ์ฒด๋ ๊ฐ๋ฐ์๊ฐ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ ์๊ณ ๋ ๋ฆฝ์ ์ธ WebAssembly ๋ชจ๋๋ก ๋ถํดํ ์ ์๋๋ก ํ์ฌ ๋ชจ๋์ฑ์ ์ด์งํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ ์ด๋ฌํ ๋ชจ๋์ ๋ค๋ฅธ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํจ์ผ๋ก์จ ๋ค๋ฅธ ์ปจํ ์คํธ์์ ์ฌ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์ํธ ์ด์ฉ์ฑ: ์ํฌํธ ๊ฐ์ฒด๋ WebAssembly ๋ชจ๋์ด JavaScript ์ฝ๋, ๋ค์ดํฐ๋ธ ์ฝ๋ ๋ฐ ๋ค๋ฅธ WebAssembly ๋ชจ๋๊ณผ ์ํํ๊ฒ ์ํธ ์์ฉํ ์ ์๋๋ก ํฉ๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ WebAssembly์ ์ฑ๋ฅ ์ด์ ์ ํ์ฉํ๋ฉด์ ๊ธฐ์กด ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ํ๋ ์์ํฌ๋ฅผ ํ์ฉํ ์ ์์ต๋๋ค.
์ํฌํธ ๊ฐ์ฒด์ ๊ตฌ์กฐ ์ดํดํ๊ธฐ
์ํฌํธ ๊ฐ์ฒด๋ ๊ณ์ธต์ ๊ตฌ์กฐ๋ฅผ ๊ฐ์ง JavaScript ๊ฐ์ฒด(๋๋ ๋ค๋ฅธ ํ๊ฒฝ์ ๋๋ฑํ ๊ฐ์ฒด)์ ๋๋ค. ๊ฐ์ฒด์ ์ต์์ ํค๋ ๋ชจ๋ ์ด๋ฆ์ ๋ํ๋ด๋ฉฐ, ์ด ํค์ ์ฐ๊ฒฐ๋ ๊ฐ์ ์ํฌํธ ์ด๋ฆ๊ณผ ํด๋น ์ํฌํธ ๊ฐ์ ํฌํจํ๋ ๊ฐ์ฒด์ ๋๋ค.
๋ค์์ JavaScript์์์ ๊ฐ๋จํ ์ํฌํธ ๊ฐ์ฒด ์์์ ๋๋ค:
const importObject = {
"env": {
"consoleLog": (arg) => {
console.log(arg);
},
"random": () => {
return Math.random();
}
}
};
์ด ์์ ์์ ์ํฌํธ ๊ฐ์ฒด๋ "env"๋ผ๋ ๋จ์ผ ๋ชจ๋์ ๊ฐ์ง๋๋ค. ์ด ๋ชจ๋์๋ "consoleLog"์ "random"์ด๋ผ๋ ๋ ๊ฐ์ ์ํฌํธ๊ฐ ํฌํจ๋์ด ์์ต๋๋ค. "consoleLog" ์ํฌํธ๋ ์ฝ์์ ๊ฐ์ ๊ธฐ๋กํ๋ JavaScript ํจ์์ด๊ณ , "random" ์ํฌํธ๋ ๋์๋ฅผ ๋ฐํํ๋ JavaScript ํจ์์ ๋๋ค.
์ํฌํธ ๊ฐ์ฒด ์์ฑ ๋ฐ ๊ตฌ์ฑํ๊ธฐ
์ํฌํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ตฌ์ฑํ๋ ๋ฐ๋ ๋ช ๊ฐ์ง ๋จ๊ณ๊ฐ ํฌํจ๋ฉ๋๋ค:
- ํ์ํ ์ํฌํธ ์๋ณํ๊ธฐ: WebAssembly ๋ชจ๋์ ๊ฒ์ฌํ์ฌ ์ด๋ค ์ํฌํธ๊ฐ ํ์ํ์ง ํ์ธํฉ๋๋ค. ์ด ์ ๋ณด๋ ์ผ๋ฐ์ ์ผ๋ก ๋ชจ๋์ ๋ฌธ์๋
wasm-objdump๋๋ ์จ๋ผ์ธ WebAssembly ํ์๊ธฐ์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ ๋ฐ์ด๋๋ฆฌ ์ฝ๋๋ฅผ ๊ฒ์ฌํ์ฌ ์ฐพ์ ์ ์์ต๋๋ค. - ์ํฌํธ ๊ฐ์ฒด ๊ตฌ์กฐ ์ ์ํ๊ธฐ: WebAssembly ๋ชจ๋์ด ๊ธฐ๋ํ๋ ๊ตฌ์กฐ์ ์ผ์นํ๋ JavaScript ๊ฐ์ฒด(๋๋ ๋๋ฑํ ๊ฐ์ฒด)๋ฅผ ์์ฑํฉ๋๋ค. ์ฌ๊ธฐ์๋ ์ฌ๋ฐ๋ฅธ ๋ชจ๋ ์ด๋ฆ, ์ํฌํธ ์ด๋ฆ ๋ฐ ์ํฌํธ๋ ๊ฐ์ ํ์ ์ ์ง์ ํ๋ ๊ฒ์ด ํฌํจ๋ฉ๋๋ค.
- ์ํฌํธ ๊ตฌํ ์ ๊ณตํ๊ธฐ: WebAssembly ๋ชจ๋์ ์ ๊ณต๋ ํจ์, ๋ณ์ ๋ฐ ๊ธฐํ ๊ฐ๋ค์ ๊ตฌํํฉ๋๋ค. ์ด๋ฌํ ๊ตฌํ์ ๋ชจ๋์ด ์ง์ ํ ์์ ํ์ ๊ณผ ๋์์ ์ค์ํด์ผ ํฉ๋๋ค.
- WebAssembly ๋ชจ๋ ์ธ์คํด์คํํ๊ธฐ:
WebAssembly.instantiateStreaming()๋๋WebAssembly.instantiate()ํจ์๋ฅผ ์ฌ์ฉํ์ฌ WebAssembly ๋ชจ๋์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ธ์๋ก ์ ๋ฌํฉ๋๋ค.
์์ : ์ํฌํธ๊ฐ ์๋ ๊ฐ๋จํ WebAssembly ๋ชจ๋
์ฝ์์ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๊ธฐ ์ํ consoleLog์ ํธ์คํธ ํ๊ฒฝ์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ธฐ ์ํ getValue๋ผ๋ ๋ ๊ฐ์ ์ํฌํธ๊ฐ ํ์ํ ๊ฐ๋จํ WebAssembly ๋ชจ๋์ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค.
WebAssembly (WAT) ์ฝ๋:
(module
(import "env" "consoleLog" (func $consoleLog (param i32)))
(import "env" "getValue" (func $getValue (result i32)))
(func (export "add") (param $x i32) (param $y i32) (result i32)
(local $value i32)
(local.set $value (call $getValue))
(i32.add (i32.add (local.get $x) (local.get $y)) (local.get $value))
)
)
์ด WAT ์ฝ๋๋ "env" ๋ชจ๋์์ ๋ ๊ฐ์ ํจ์๋ฅผ ์ํฌํธํ๋ ๋ชจ๋์ ์ ์ํฉ๋๋ค: i32 ์ธ์๋ฅผ ๋ฐ๋ consoleLog์ i32 ๊ฐ์ ๋ฐํํ๋ getValue์
๋๋ค. ์ด ๋ชจ๋์ ๋ ๊ฐ์ i32 ์ธ์๋ฅผ ๋ฐ์ ํจ๊ป ๋ํ๊ณ , getValue๊ฐ ๋ฐํํ ๊ฐ์ ๋ํ ํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐํํ๋ "add"๋ผ๋ ํจ์๋ฅผ ์ต์คํฌํธํฉ๋๋ค.
JavaScript ์ฝ๋:
const importObject = {
"env": {
"consoleLog": (arg) => {
console.log("Wasm says: " + arg);
},
"getValue": () => {
return 42;
}
}
};
fetch('module.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes, importObject))
.then(results => {
const instance = results.instance;
const add = instance.exports.add;
console.log("Result of add(10, 20): " + add(10, 20)); // ์ถ๋ ฅ: Result of add(10, 20): 72
});
์ด JavaScript ์ฝ๋์์๋ consoleLog์ getValue ์ํฌํธ์ ๋ํ ๊ตฌํ์ ์ ๊ณตํ๋ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ ์ํฉ๋๋ค. consoleLog ํจ์๋ ์ฝ์์ ๋ฉ์์ง๋ฅผ ๊ธฐ๋กํ๊ณ , getValue ํจ์๋ ๊ฐ 42๋ฅผ ๋ฐํํฉ๋๋ค. ๊ทธ๋ฐ ๋ค์ WebAssembly ๋ชจ๋์ ๊ฐ์ ธ์ ์ํฌํธ ๊ฐ์ฒด๋ก ์ธ์คํด์คํํ๊ณ , ์ต์คํฌํธ๋ "add" ํจ์๋ฅผ ์ธ์ 10๊ณผ 20์ผ๋ก ํธ์ถํฉ๋๋ค. "add" ํจ์์ ๊ฒฐ๊ณผ๋ 72(10 + 20 + 42)์
๋๋ค.
๊ณ ๊ธ ์ํฌํธ ๊ฐ์ฒด ๊ธฐ๋ฒ
๊ธฐ๋ณธ ์ฌํญ์ ๋์ด, ๋ ์ ๊ตํ๊ณ ์ ์ฐํ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ๋ง๋ค๊ธฐ ์ํด ์ฌ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ๊ณ ๊ธ ๊ธฐ๋ฒ์ด ์์ต๋๋ค:
1. ๋ฉ๋ชจ๋ฆฌ ์ํฌํธํ๊ธฐ
WebAssembly ๋ชจ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ํฌํธํ์ฌ ํธ์คํธ ํ๊ฒฝ๊ณผ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ๊ณต์ ํ ์ ์์ต๋๋ค. ์ด๋ Wasm ๋ชจ๋๊ณผ ํธ์คํธ ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ์ ๋ฌํ๊ฑฐ๋ ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ ์ฉํฉ๋๋ค.
WebAssembly (WAT) ์ฝ๋:
(module
(import "env" "memory" (memory $memory 1))
(func (export "write") (param $offset i32) (param $value i32)
(i32.store (local.get $offset) (local.get $value))
)
)
JavaScript ์ฝ๋:
const memory = new WebAssembly.Memory({ initial: 1 });
const importObject = {
"env": {
"memory": memory
}
};
fetch('module.wasm')
.then(response => response.arrayBuffer())
.then(bytes => WebAssembly.instantiate(bytes, importObject))
.then(results => {
const instance = results.instance;
const write = instance.exports.write;
write(0, 123); // ๋ฉ๋ชจ๋ฆฌ ์์น 0์ ๊ฐ 123 ์ฐ๊ธฐ
const view = new Uint8Array(memory.buffer);
console.log(view[0]); // ์ถ๋ ฅ: 123
});
์ด ์์ ์์ WebAssembly ๋ชจ๋์ "env" ๋ชจ๋์์ "memory"๋ผ๋ ์ด๋ฆ์ ๋ฉ๋ชจ๋ฆฌ ๊ฐ์ฒด๋ฅผ ์ํฌํธํฉ๋๋ค. JavaScript ์ฝ๋๋ WebAssembly.Memory ๊ฐ์ฒด๋ฅผ ์์ฑํ์ฌ ์ํฌํธ ๊ฐ์ฒด์ ์ ๋ฌํฉ๋๋ค. Wasm ๋ชจ๋์ "write" ํจ์๋ ๊ฐ 123์ ๋ฉ๋ชจ๋ฆฌ ์์น 0์ ์ฐ๊ณ , ์ด๋ JavaScript์์ Uint8Array ๋ทฐ๋ฅผ ์ฌ์ฉํ์ฌ ์ ๊ทผํ ์ ์์ต๋๋ค.
2. ํ ์ด๋ธ ์ํฌํธํ๊ธฐ
WebAssembly ๋ชจ๋์ ํจ์ ์ฐธ์กฐ์ ๋ฐฐ์ด์ธ ํ ์ด๋ธ๋ ์ํฌํธํ ์ ์์ต๋๋ค. ํ ์ด๋ธ์ ๋์ ๋์คํจ์น ๋ฐ ๊ฐ์ ํจ์ ํธ์ถ์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
3. ๋ค์์คํ์ด์ค์ ๋ชจ๋์ ์ค๊ณ
๋ค์์คํ์ด์ค(์ํฌํธ ๊ฐ์ฒด์ ๋ชจ๋ ์ด๋ฆ)๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๋ณต์กํ ์ํฌํธ ์ข ์์ฑ์ ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐ ๋งค์ฐ ์ค์ํฉ๋๋ค. ์ ์ ์๋ ๋ค์์คํ์ด์ค๋ ์ด๋ฆ ์ถฉ๋์ ๋ฐฉ์งํ๊ณ ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ํฅ์์ํต๋๋ค. ์ฌ๋ฌ WebAssembly ๋ชจ๋์ด ์๋ ๋๊ท๋ชจ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฐ๋ฐํ๋ค๊ณ ์์ํด ๋ณด์ญ์์ค. "graphics", "audio", "physics"์ ๊ฐ์ ๋ช ํํ ๋ค์์คํ์ด์ค๋ ํตํฉ์ ๊ฐ์ํํ๊ณ ์ถฉ๋ ์ํ์ ์ค์ฌ์ค๋๋ค.
4. ๋์ ์ํฌํธ ๊ฐ์ฒด
๊ฒฝ์ฐ์ ๋ฐ๋ผ ๋ฐํ์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋์ ์ผ๋ก ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์์ฑํด์ผ ํ ์๋ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ฌ์ฉ์์ ๋ธ๋ผ์ฐ์ ๋ ์ด์ ์ฒด์ ์ ๋ฐ๋ผ ํน์ ์ํฌํธ์ ๋ํด ๋ค๋ฅธ ๊ตฌํ์ ์ ๊ณตํ๊ณ ์ถ์ ์ ์์ต๋๋ค.
์์ :
function createImportObject(environment) {
const importObject = {
"env": {}
};
if (environment === "browser") {
importObject["env"]["alert"] = (message) => {
alert(message);
};
} else if (environment === "node") {
importObject["env"]["alert"] = (message) => {
console.log(message);
};
} else {
importObject["env"]["alert"] = (message) => {
// ์ฌ์ฉ ๊ฐ๋ฅํ ์๋ฆผ ๊ธฐ๋ฅ ์์
console.warn("์ด ํ๊ฒฝ์์๋ ์๋ฆผ์ด ์ง์๋์ง ์์ต๋๋ค: " + message)
}
}
return importObject;
}
const importObjectBrowser = createImportObject("browser");
const importObjectNode = createImportObject("node");
// Wasm ๋ชจ๋์ ์ธ์คํด์คํํ ๋ ์ ์ ํ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค
์ด ์์ ๋ ๋์ ํ๊ฒฝ์ ๋ฐ๋ผ ๋ค๋ฅธ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค๋๋ค. ํ๊ฒฝ์ด "browser"์ธ ๊ฒฝ์ฐ, alert ์ํฌํธ๋ ๋ธ๋ผ์ฐ์ ์ alert() ํจ์๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค. ํ๊ฒฝ์ด "node"์ธ ๊ฒฝ์ฐ, alert ์ํฌํธ๋ console.log()๋ฅผ ์ฌ์ฉํ์ฌ ๊ตฌํ๋ฉ๋๋ค.
๋ณด์ ๊ณ ๋ ค ์ฌํญ
์ํฌํธ ๊ฐ์ฒด๋ WebAssembly์ ๋ณด์ ๋ชจ๋ธ์์ ์ค์ํ ์ญํ ์ ํฉ๋๋ค. WebAssembly ๋ชจ๋์ ์ ๊ทผํ ์ ์๋ ํจ์์ ๋ฐ์ดํฐ๋ฅผ ์ ์คํ๊ฒ ์ ์ดํจ์ผ๋ก์จ ์ ์ฑ ์ฝ๋ ์คํ์ ์ํ์ ์ํํ ์ ์์ต๋๋ค.
๋ค์์ ๋ช ๊ฐ์ง ์ค์ํ ๋ณด์ ๊ณ ๋ ค ์ฌํญ์ ๋๋ค:
- ์ต์ ๊ถํ์ ์์น: WebAssembly ๋ชจ๋์ด ์ฌ๋ฐ๋ฅด๊ฒ ์๋ํ๋ ๋ฐ ํ์ํ ์ต์ํ์ ๊ถํ ์งํฉ๋ง ๋ถ์ฌํ์ญ์์ค. ๊ผญ ํ์ํ์ง ์์ ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ ํจ์์ ๋ํ ์ ๊ทผ์ ์ ๊ณตํ์ง ๋ง์ญ์์ค.
- ์ ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ: WebAssembly ๋ชจ๋์์ ๋ฐ์ ๋ชจ๋ ์ ๋ ฅ์ ๊ฒ์ฆํ์ฌ ๋ฒํผ ์ค๋ฒํ๋ก, ์ฝ๋ ์ฃผ์ ๋ฐ ๊ธฐํ ์ทจ์ฝ์ ์ ๋ฐฉ์งํ์ญ์์ค.
- ์๋๋ฐ์ฑ: WebAssembly ๋ชจ๋์ ์๋๋ฐ์ค ํ๊ฒฝ์์ ์คํํ์ฌ ์์คํ ์ ๋๋จธ์ง ๋ถ๋ถ๊ณผ ๊ฒฉ๋ฆฌํ์ญ์์ค. ์ด๋ ์ ์ฑ ๋ชจ๋์ด ์ผ์ผํฌ ์ ์๋ ํผํด๋ฅผ ์ ํํฉ๋๋ค.
- ์ฝ๋ ๊ฒํ : WebAssembly ๋ชจ๋์ ์ฝ๋๋ฅผ ์ฒ ์ ํ ๊ฒํ ํ์ฌ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ ์ ์๋ณํ์ญ์์ค.
์๋ฅผ ๋ค์ด, WebAssembly ๋ชจ๋์ ํ์ผ ์์คํ ์ ๊ทผ ๊ถํ์ ์ ๊ณตํ ๋, ๋ชจ๋์ด ์ ๊ณตํ๋ ํ์ผ ๊ฒฝ๋ก๋ฅผ ์ ์คํ๊ฒ ๊ฒ์ฆํ์ฌ ์ง์ ๋ ์๋๋ฐ์ค ์ธ๋ถ์ ํ์ผ์ ์ ๊ทผํ๋ ๊ฒ์ ๋ฐฉ์งํด์ผ ํฉ๋๋ค. ๋ธ๋ผ์ฐ์ ํ๊ฒฝ์์๋ Wasm ๋ชจ๋์ด ํ์ด์ง์ ์ ์ฑ ์คํฌ๋ฆฝํธ๋ฅผ ์ฃผ์ ํ๋ ๊ฒ์ ๋ฐฉ์งํ๊ธฐ ์ํด DOM ์กฐ์์ ๋ํ ์ ๊ทผ์ ์ ํํด์ผ ํฉ๋๋ค.
์ํฌํธ ๊ฐ์ฒด ๊ด๋ฆฌ๋ฅผ ์ํ ๋ชจ๋ฒ ์ฌ๋ก
๋ค์ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ฉด ๊ฒฌ๊ณ ํ๊ณ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ๋ฉฐ ์์ ํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋๋ ๋ฐ ๋์์ด ๋ฉ๋๋ค:
- ์ํฌํธ ๋ฌธ์ํํ๊ธฐ: WebAssembly ๋ชจ๋์ ๊ฐ ์ํฌํธ ๋ชฉ์ , ํ์ ๋ฐ ์์ ๋์์ ๋ช ํํ๊ฒ ๋ฌธ์ํํ์ญ์์ค. ์ด๋ ๊ฒ ํ๋ฉด ๋ค๋ฅธ ์ฌ๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ฏธ๋์ ์์ )์ด ๋ชจ๋์ ๋ ์ฝ๊ฒ ์ดํดํ๊ณ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ์๋ฏธ ์๋ ์ด๋ฆ ์ฌ์ฉํ๊ธฐ: ๋ชจ๋ ์ด๋ฆ๊ณผ ์ํฌํธ ์ด๋ฆ์ ์์ ์ ์ธ ์ด๋ฆ์ ์ ํํ์ฌ ์ฝ๋ ๊ฐ๋ ์ฑ์ ํฅ์์ํค์ญ์์ค.
- ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์๊ฒ ์ ์งํ๊ธฐ: ๋ถํ์ํ ์ํฌํธ๋ฅผ ์ ๊ณตํ์ง ๋ง์ญ์์ค. ์ํฌํธ ๊ฐ์ฒด๊ฐ ์์์๋ก ๊ด๋ฆฌํ๊ธฐ ์ฝ๊ณ ๋ณด์ ์ทจ์ฝ์ ์ ์ํ์ด ๋ฎ์์ง๋๋ค.
- ์ํฌํธ ํ ์คํธํ๊ธฐ: ์ํฌํธ ๊ฐ์ฒด๊ฐ WebAssembly ๋ชจ๋์ ์ฌ๋ฐ๋ฅธ ๊ฐ๊ณผ ๋์์ ์ ๊ณตํ๋์ง ์ฒ ์ ํ ํ ์คํธํ์ญ์์ค.
- WebAssembly ํ๋ ์์ํฌ ์ฌ์ฉ ๊ณ ๋ คํ๊ธฐ: AssemblyScript ๋ฐ wasm-bindgen๊ณผ ๊ฐ์ ํ๋ ์์ํฌ๋ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๊ณผ์ ์ ๋จ์ํํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ค์ ์์
์ํฌํธ ๊ฐ์ฒด๋ ๋ค์ํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉ๋ฉ๋๋ค. ๋ช ๊ฐ์ง ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฒ์ ๊ฐ๋ฐ: WebAssembly ๊ฒ์์ ์ข ์ข ๊ทธ๋ํฝ API, ์ค๋์ค API ๋ฐ ์ ๋ ฅ ์ฅ์น์ ์ ๊ทผํ๊ธฐ ์ํด ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ฒ์์ ๊ทธ๋ํฝ์ ๋ ๋๋งํ๊ธฐ ์ํด ๋ธ๋ผ์ฐ์ ์ WebGL API์์ ํจ์๋ฅผ ์ํฌํธํ๊ฑฐ๋ ์ํฅ ํจ๊ณผ๋ฅผ ์ฌ์ํ๊ธฐ ์ํด Web Audio API์์ ํจ์๋ฅผ ์ํฌํธํ ์ ์์ต๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: WebAssembly๋ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ ์์ ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค. ์ํฌํธ ๊ฐ์ฒด๋ ์ ์์ค ์ด๋ฏธ์ง ์กฐ์ ํจ์์ ์ ๊ทผํ๊ฑฐ๋ ํ๋์จ์ด ๊ฐ์ ๋น๋์ค ์ฝ๋ฑ๊ณผ ์ธํฐํ์ด์คํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ๊ณผํ ์ปดํจํ : WebAssembly๋ ๊ณผํ ์ปดํจํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ ์ ๋ ๋ง์ด ์ฌ์ฉ๋๊ณ ์์ต๋๋ค. ์ํฌํธ ๊ฐ์ฒด๋ ์์น ๋ผ์ด๋ธ๋ฌ๋ฆฌ, ์ ํ ๋์ ๋ฃจํด ๋ฐ ๊ธฐํ ๊ณผํ ์ปดํจํ ๋๊ตฌ์ ์ ๊ทผํ๋ ๋ฐ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
- ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ : WebAssembly๋ Node.js์ ๊ฐ์ ํ๋ซํผ์ ์ฌ์ฉํ์ฌ ์๋ฒ ์ธก์์ ์คํํ ์ ์์ต๋๋ค. ์ด ์ปจํ ์คํธ์์ ์ํฌํธ ๊ฐ์ฒด๋ Wasm ๋ชจ๋์ด ํ์ผ ์์คํ , ๋คํธ์ํฌ ๋ฐ ๊ธฐํ ์๋ฒ ์ธก ๋ฆฌ์์ค์ ์ํธ ์์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
- ํฌ๋ก์ค ํ๋ซํผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ: SQLite์ ๊ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ WebAssembly๋ก ์ปดํ์ผ๋์ด ์น ๋ธ๋ผ์ฐ์ ๋ฐ ๊ธฐํ ํ๊ฒฝ์์ ์ฌ์ฉํ ์ ์๊ฒ ๋์์ต๋๋ค. ์ํฌํธ ๊ฐ์ฒด๋ ์ด๋ฌํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ค๋ฅธ ํ๋ซํผ์ ์ ์ฉํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค.
์๋ฅผ ๋ค์ด, Unity ๊ฒ์ ์์ง์ ์น ๋ธ๋ผ์ฐ์ ์์ ์คํํ ์ ์๋ ๊ฒ์์ ๋ง๋ค๊ธฐ ์ํด WebAssembly๋ฅผ ์ฌ์ฉํฉ๋๋ค. Unity ์์ง์ WebAssembly ๊ฒ์์ด ๋ธ๋ผ์ฐ์ ์ ๊ทธ๋ํฝ API, ์ค๋์ค API ๋ฐ ์ ๋ ฅ ์ฅ์น์ ์ ๊ทผํ ์ ์๋๋ก ํ๋ ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์ ๊ณตํฉ๋๋ค.
์ํฌํธ ๊ฐ์ฒด ๋ฌธ์ ๋๋ฒ๊น ํ๊ธฐ
์ํฌํธ ๊ฐ์ฒด์ ๊ด๋ จ๋ ๋ฌธ์ ๋ฅผ ๋๋ฒ๊น ํ๋ ๊ฒ์ ์ด๋ ค์ธ ์ ์์ต๋๋ค. ์ผ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ํ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ์ฝ์ ํ์ธํ๊ธฐ: ๋ธ๋ผ์ฐ์ ์ ๊ฐ๋ฐ์ ์ฝ์์๋ ์ข ์ข ์ํฌํธ ๊ฐ์ฒด ๋ฌธ์ ์ ๊ด๋ จ๋ ์ค๋ฅ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค. ์ด๋ฌํ ๋ฉ์์ง๋ ๋ฌธ์ ์ ์์ธ์ ๋ํ ๊ท์คํ ๋จ์๋ฅผ ์ ๊ณตํ ์ ์์ต๋๋ค.
- WebAssembly ๊ฒ์ฌ๊ธฐ ์ฌ์ฉํ๊ธฐ: ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ์ WebAssembly ๊ฒ์ฌ๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด WebAssembly ๋ชจ๋์ ์ํฌํธ ๋ฐ ์ต์คํฌํธ๋ฅผ ๊ฒ์ฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ์์๋๋ ์ํฌํธ์ ์ ๊ณต๋ ๊ฐ ๊ฐ์ ๋ถ์ผ์น๋ฅผ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ํฌํธ ๊ฐ์ฒด ๊ตฌ์กฐ ํ์ธํ๊ธฐ: ์ํฌํธ ๊ฐ์ฒด์ ๊ตฌ์กฐ๊ฐ WebAssembly ๋ชจ๋์ด ๊ธฐ๋ํ๋ ๊ตฌ์กฐ์ ์ผ์นํ๋์ง ๋ค์ ํ์ธํ์ญ์์ค. ๋ชจ๋ ์ด๋ฆ, ์ํฌํธ ์ด๋ฆ ๋ฐ ์ํฌํธ๋ ๊ฐ์ ํ์ ์ ์ธ์ฌํ ์ฃผ์๋ฅผ ๊ธฐ์ธ์ด์ญ์์ค.
- ๋ก๊น ์ฌ์ฉํ๊ธฐ: ์ํฌํธ ๊ฐ์ฒด์ ๋ก๊น ๋ฌธ์ ์ถ๊ฐํ์ฌ WebAssembly ๋ชจ๋์ ์ ๋ฌ๋๋ ๊ฐ์ ์ถ์ ํ์ญ์์ค. ์ด๋ ์๊ธฐ์น ์์ ๊ฐ์ด๋ ๋์์ ์๋ณํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ๋ฌธ์ ๋จ์ํํ๊ธฐ: ๋ฌธ์ ๋ฅผ ์ฌํํ๋ ์ต์ํ์ ์์ ๋ฅผ ๋ง๋ค์ด ๋ฌธ์ ๋ฅผ ๋ถ๋ฆฌํด ๋ณด์ญ์์ค. ์ด๋ ๋ฌธ์ ์ ์์ธ์ ์ขํ๊ณ ๋๋ฒ๊น ์ ๋ ์ฝ๊ฒ ๋ง๋๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
WebAssembly ์ํฌํธ ๊ฐ์ฒด์ ๋ฏธ๋
WebAssembly ์ํ๊ณ๋ ๋์์์ด ๋ฐ์ ํ๊ณ ์์ผ๋ฉฐ, ์ํฌํธ ๊ฐ์ฒด๋ ๋ฏธ๋์ ๋์ฑ ์ค์ํ ์ญํ ์ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ๋ช ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฏธ๋ ๊ฐ๋ฐ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์คํ๋ ์ํฌํธ ์ธํฐํ์ด์ค: ๊ทธ๋ํฝ API ๋ฐ ์ค๋์ค API์ ๊ฐ์ ์ผ๋ฐ์ ์ธ ์น API์ ๋ํ ์ํฌํธ ์ธํฐํ์ด์ค๋ฅผ ํ์คํํ๋ ค๋ ๋ ธ๋ ฅ์ด ์งํ ์ค์ ๋๋ค. ์ด๋ฅผ ํตํด ๋ค๋ฅธ ๋ธ๋ผ์ฐ์ ์ ํ๋ซํผ์์ ์คํํ ์ ์๋ ์ด์์ฑ ์๋ WebAssembly ๋ชจ๋์ ๋ ์ฝ๊ฒ ์์ฑํ ์ ์์ต๋๋ค.
- ๊ฐ์ ๋ ๋๊ตฌ: ์ํฌํธ ๊ฐ์ฒด๋ฅผ ์์ฑ, ๊ด๋ฆฌ ๋ฐ ๋๋ฒ๊น ํ๊ธฐ ์ํ ๋ ๋์ ๋๊ตฌ๊ฐ ๋ฏธ๋์ ๋ฑ์ฅํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด๋ฅผ ํตํด ๊ฐ๋ฐ์๋ WebAssembly ๋ฐ ์ํฌํธ ๊ฐ์ฒด ์์ ์ ๋ ์ฝ๊ฒ ํ ์ ์์ต๋๋ค.
- ๊ณ ๊ธ ๋ณด์ ๊ธฐ๋ฅ: ์ธ๋ถํ๋ ๊ถํ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ๊ฒฉ๋ฆฌ์ ๊ฐ์ ์๋ก์ด ๋ณด์ ๊ธฐ๋ฅ์ด WebAssembly์ ์ถ๊ฐ๋์ด ๋ณด์ ๋ชจ๋ธ์ ๋์ฑ ๊ฐํํ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
WebAssembly ์ํฌํธ ๊ฐ์ฒด๋ ๊ฒฌ๊ณ ํ๊ณ ์ด์์ฑ ์์ผ๋ฉฐ ์์ ํ WebAssembly ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ง๋ค๊ธฐ ์ํ ๊ธฐ๋ณธ ๊ฐ๋ ์ ๋๋ค. ๋ชจ๋ ์ข ์์ฑ์ ํจ๊ณผ์ ์ผ๋ก ๊ตฌ์ฑํ๋ ๋ฐฉ๋ฒ์ ์ดํดํจ์ผ๋ก์จ WebAssembly์ ์ฑ๋ฅ ์ด์ ์ ํ์ฉํ๊ณ ๋ค์ํ ํ๊ฒฝ์์ ์คํํ ์ ์๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค.
์ด ๊ธ์์๋ WebAssembly ์ํฌํธ ๊ฐ์ฒด์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ผ๋ฉฐ, ๊ธฐ๋ณธ ์ฌํญ, ๊ณ ๊ธ ๊ธฐ๋ฒ, ๋ณด์ ๊ณ ๋ ค ์ฌํญ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ๋ฏธ๋ ๋ํฅ์ ๋ค๋ฃจ์์ต๋๋ค. ์ฌ๊ธฐ์ ์ ์๋ ์ง์นจ๊ณผ ์์ ๋ฅผ ๋ฐ๋ฅด๋ฉด WebAssembly ์ํฌํธ ๊ฐ์ฒด ๊ตฌ์ฑ ๊ธฐ์ ์ ๋ง์คํฐํ๊ณ ์ด ๊ฐ๋ ฅํ ๊ธฐ์ ์ ๋ชจ๋ ์ ์ฌ๋ ฅ์ ๋ฐํํ ์ ์์ต๋๋ค.