WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด, ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์ฑ, ์ ํ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ต์ ์ ์ฑ๋ฅ๊ณผ ์ํธ ์ด์ฉ์ฑ์ ์ํ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ๋ํ ์ฌ์ธต ํ๊ตฌ์ ๋๋ค.
WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด: ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์ฑ์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์ด๋
WebAssembly(Wasm)๋ ์ต์ ๋ธ๋ผ์ฐ์ ์์ ์ฝ๋๋ฅผ ์คํํ ์ ์๋ ๊ณ ์ฑ๋ฅ, ์ด์์ฑ ๋ฐ ์์ ํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ฌ ์น ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. WebAssembly์ ์ค์ํ ๊ธฐ๋ฅ์ ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด๋ฅผ ํตํด ์ฃผ๋ณ JavaScript ํ๊ฒฝ๊ณผ ์ํธ ์์ฉํ๋ ๋ฅ๋ ฅ์ ๋๋ค. ์ด ๊ฐ์ฒด๋ ๋ธ๋ฆฟ์ง ์ญํ ์ ํ์ฌ JavaScript ์ฝ๋๊ฐ WebAssembly ๋ชจ๋ ๋ด์์ ์ ์๋ ํจ์, ๋ฉ๋ชจ๋ฆฌ, ํ ์ด๋ธ ๋ฐ ์ ์ญ ๋ณ์์ ์ก์ธ์คํ๊ณ ํ์ฉํ ์ ์๋๋ก ํฉ๋๋ค. WebAssembly ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๊ตฌ์ฑํ๊ณ ๊ด๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ดํดํ๋ ๊ฒ์ ํจ์จ์ ์ด๊ณ ๊ฐ๋ ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ํ์์ ์ ๋๋ค. ์ด ๊ฐ์ด๋์์๋ ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์ฑ, ๋ค์ํ ๋ด๋ณด๋ด๊ธฐ ์ ํ, ๋ชจ๋ฒ ์ฌ๋ก ๋ฐ ์ต์ ์ ์ฑ๋ฅ๊ณผ ์ํธ ์ด์ฉ์ฑ์ ์ํ ๊ณ ๊ธ ๊ธฐ๋ฒ์ ๋ค๋ฃจ๋ WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์ ๋ํ ํฌ๊ด์ ์ธ ํ๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด๋ ๋ฌด์์ธ๊ฐ์?
WebAssembly ๋ชจ๋์ด ์ปดํ์ผ๋๊ณ ์ธ์คํด์คํ๋๋ฉด ์ธ์คํด์ค ๊ฐ์ฒด๊ฐ ์์ฑ๋ฉ๋๋ค. ์ด ์ธ์คํด์ค ๊ฐ์ฒด์๋ exports๋ผ๋ ์์ฑ์ด ์์ผ๋ฉฐ, ์ด๊ฒ์ด ๋ฐ๋ก ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์
๋๋ค. ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด๋ WebAssembly ๋ชจ๋์ด JavaScript ์ฝ๋์์ ์ฌ์ฉํ ์ ์๋๋ก ์ ๊ณตํ๋ ๋ค์ํ ์ํฐํฐ(ํจ์, ๋ฉ๋ชจ๋ฆฌ, ํ
์ด๋ธ, ์ ์ญ ๋ณ์)์ ๋ํ ์ฐธ์กฐ๋ฅผ ๋ณด์ ํ๋ JavaScript ๊ฐ์ฒด์
๋๋ค.
WebAssembly ๋ชจ๋์ ๊ณต๊ฐ API๋ผ๊ณ ์๊ฐํ์๋ฉด ๋ฉ๋๋ค. JavaScript๊ฐ Wasm ๋ชจ๋ ๋ด์ ์ฝ๋์ ๋ฐ์ดํฐ๊ฐ ์ด๋ป๊ฒ "๋ณด์ด๊ณ " ์ํธ ์์ฉํ ์ ์๋์ง ๋ณด์ฌ์ฃผ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฃผ์ ๊ฐ๋
- ๋ชจ๋: ์ปดํ์ผ๋ WebAssembly ๋ฐ์ด๋๋ฆฌ(.wasm ํ์ผ).
- ์ธ์คํด์ค: WebAssembly ๋ชจ๋์ ๋ฐํ์ ์ธ์คํด์ค. ์ด๊ณณ์์ ์ฝ๋๊ฐ ์ค์ ๋ก ์คํ๋๊ณ ๋ฉ๋ชจ๋ฆฌ๊ฐ ํ ๋น๋ฉ๋๋ค.
- ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด: WebAssembly ์ธ์คํด์ค์ ๋ด๋ณด๋ธ ๋ฉค๋ฒ๋ฅผ ํฌํจํ๋ JavaScript ๊ฐ์ฒด.
- ๋ด๋ณด๋ธ ๋ฉค๋ฒ: WebAssembly ๋ชจ๋์ด JavaScript์์ ์ฌ์ฉํ๊ธฐ ์ํด ๋ ธ์ถํ๋ ํจ์, ๋ฉ๋ชจ๋ฆฌ, ํ ์ด๋ธ ๋ฐ ์ ์ญ ๋ณ์.
WebAssembly ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์ฑ
WebAssembly ๋ชจ๋์์ ๋ด๋ณด๋ผ ํญ๋ชฉ์ ๊ตฌ์ฑํ๋ ํ๋ก์ธ์ค๋ ์ฃผ๋ก ์ปดํ์ผ ์์ ์ WebAssembly๋ก ์ปดํ์ผ๋๋ ์์ค ์ฝ๋ ๋ด์์ ์ํ๋ฉ๋๋ค. ํน์ ๊ตฌ๋ฌธ๊ณผ ๋ฉ์๋๋ ์ฌ์ฉํ๋ ์์ค ์ธ์ด(์: C, C++, Rust, AssemblyScript)์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค. ๋ช ๊ฐ์ง ์ผ๋ฐ์ ์ธ ์ธ์ด์์ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ ์ธํ๋ ๋ฐฉ๋ฒ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
Emscripten์ ์ฌ์ฉํ C/C++
Emscripten์ C ๋ฐ C++ ์ฝ๋๋ฅผ WebAssembly๋ก ์ปดํ์ผํ๋ ๋ฐ ๋๋ฆฌ ์ฌ์ฉ๋๋ ํด์ฒด์ธ์
๋๋ค. ํจ์๋ฅผ ๋ด๋ณด๋ด๋ ค๋ฉด ์ผ๋ฐ์ ์ผ๋ก EMSCRIPTEN_KEEPALIVE ๋งคํฌ๋ก๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ Emscripten ์ค์ ์์ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ง์ ํฉ๋๋ค.
์: EMSCRIPTEN_KEEPALIVE๋ฅผ ์ฌ์ฉํ์ฌ ํจ์ ๋ด๋ณด๋ด๊ธฐ
C ์ฝ๋:
#include <emscripten.h>
EMSCRIPTEN_KEEPALIVE
int add(int a, int b) {
return a + b;
}
EMSCRIPTEN_KEEPALIVE
int multiply(int a, int b) {
return a * b;
}
์ด ์์์๋ add ๋ฐ multiply ํจ์๊ฐ EMSCRIPTEN_KEEPALIVE๋ก ํ์๋์ด Emscripten์ด ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์ ํฌํจํ๋๋ก ์ง์ํฉ๋๋ค.
์: Emscripten ์ค์ ์ ์ฌ์ฉํ์ฌ ํจ์ ๋ด๋ณด๋ด๊ธฐ
์ปดํ์ผ ์ค์ -s EXPORTED_FUNCTIONS ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ง์ ํ ์๋ ์์ต๋๋ค.
emcc add.c -o add.js -s EXPORTED_FUNCTIONS='[_add,_multiply]'
์ด ๋ช
๋ น์ Emscripten์ด _add ๋ฐ `_multiply` ํจ์(Emscripten์ด ์ข
์ข
์ถ๊ฐํ๋ ์ ํ ๋ฐ์ค์ ์ ์)๋ฅผ ๋ด๋ณด๋ด๋๋ก ์ง์ํฉ๋๋ค. ๊ฒฐ๊ณผ JavaScript ํ์ผ(add.js)์๋ WebAssembly ๋ชจ๋์ ๋ก๋ํ๊ณ ์ํธ ์์ฉํ๋ ๋ฐ ํ์ํ ์ฝ๋๊ฐ ํฌํจ๋๋ฉฐ, `add` ๋ฐ `multiply` ํจ์๋ ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด๋ฅผ ํตํด ์ก์ธ์คํ ์ ์์ต๋๋ค.
wasm-pack์ ์ฌ์ฉํ Rust
Rust๋ WebAssembly ๊ฐ๋ฐ์ ํ์ํ ์ธ์ด์
๋๋ค. wasm-pack ๋๊ตฌ๋ Rust ์ฝ๋๋ฅผ WebAssembly์ฉ์ผ๋ก ๋น๋ํ๊ณ ํจํค์งํ๋ ํ๋ก์ธ์ค๋ฅผ ๊ฐ์ํํฉ๋๋ค.
์: Rust์์ ํจ์ ๋ด๋ณด๋ด๊ธฐ
Rust ์ฝ๋:
#[no_mangle]
pub extern "C" fn add(a: i32, b: i32) -> i32 {
a + b
}
#[no_mangle]
pub extern "C" fn multiply(a: i32, b: i32) -> i32 {
a * b
}
์ด ์์์๋ #[no_mangle] ์์ฑ์ด Rust ์ปดํ์ผ๋ฌ๊ฐ ํจ์ ์ด๋ฆ์ ๋งน๊ธ๋งํ์ง ์๋๋ก ํ๊ณ , pub extern "C"๋ ํจ์๊ฐ C ํธํ ํ๊ฒฝ(WebAssembly ํฌํจ)์์ ์ก์ธ์คํ ์ ์๋๋ก ํฉ๋๋ค. Cargo.toml์ `wasm-bindgen` ์ข
์์ฑ์ ์ถ๊ฐํด์ผ ํฉ๋๋ค.
์ด๋ฅผ ๋น๋ํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
wasm-pack build
๊ฒฐ๊ณผ ํจํค์ง์๋ WebAssembly ๋ชจ๋(.wasm ํ์ผ)๊ณผ ๋ชจ๋๊ณผ์ ์ํธ ์์ฉ์ ์ฉ์ดํ๊ฒ ํ๋ JavaScript ํ์ผ์ด ํฌํจ๋ฉ๋๋ค.
AssemblyScript
AssemblyScript๋ TypeScript์ ์ ์ฌํ ์ธ์ด๋ก ์ง์ WebAssembly๋ก ์ปดํ์ผ๋ฉ๋๋ค. JavaScript ๊ฐ๋ฐ์์๊ฒ ์ต์ํ ๊ตฌ๋ฌธ์ ์ ๊ณตํฉ๋๋ค.
์: AssemblyScript์์ ํจ์ ๋ด๋ณด๋ด๊ธฐ
AssemblyScript ์ฝ๋:
export function add(a: i32, b: i32): i32 {
return a + b;
}
export function multiply(a: i32, b: i32): i32 {
return a * b;
}
AssemblyScript์์๋ export ํค์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์ ํฌํจ๋ ํจ์๋ฅผ ์ง์ ํ๋ฉด ๋ฉ๋๋ค.
์ปดํ์ผ:
asc assembly/index.ts -b build/index.wasm -t build/index.wat
WebAssembly ๋ด๋ณด๋ด๊ธฐ ์ ํ
WebAssembly ๋ชจ๋์ ๋ค ๊ฐ์ง ์ฃผ์ ์ ํ์ ์ํฐํฐ๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค.
- ํจ์: ์คํ ๊ฐ๋ฅํ ์ฝ๋ ๋ธ๋ก.
- ๋ฉ๋ชจ๋ฆฌ: WebAssembly ๋ชจ๋์์ ์ฌ์ฉํ๋ ์ ํ ๋ฉ๋ชจ๋ฆฌ.
- ํ ์ด๋ธ: ํจ์ ์ฐธ์กฐ ๋ฐฐ์ด.
- ์ ์ญ ๋ณ์: ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๋๋ ๋ณ๊ฒฝ ๋ถ๊ฐ๋ฅํ ๋ฐ์ดํฐ ๊ฐ.
ํจ์
๋ด๋ณด๋ธ ํจ์๋ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ๋ด๋ณด๋ด๊ธฐ ์ ํ์ ๋๋ค. JavaScript ์ฝ๋๊ฐ WebAssembly ๋ชจ๋ ๋ด์์ ์ ์๋ ํจ์๋ฅผ ํธ์ถํ ์ ์๋๋ก ํฉ๋๋ค.
์(JavaScript): ๋ด๋ณด๋ธ ํจ์ ํธ์ถ
const wasm = await WebAssembly.instantiateStreaming(fetch('module.wasm'));
const add = wasm.instance.exports.add;
const result = add(5, 3); // result๋ 8์ด ๋ฉ๋๋ค
console.log(result);
๋ฉ๋ชจ๋ฆฌ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ด๋ณด๋ด๋ฉด JavaScript๊ฐ WebAssembly ๋ชจ๋์ ์ ํ ๋ฉ๋ชจ๋ฆฌ์ ์ง์ ์ก์ธ์คํ๊ณ ์กฐ์ํ ์ ์์ต๋๋ค. ์ด๋ JavaScript์ WebAssembly ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ๋ ๋ฐ ์ ์ฉํ์ง๋ง ๋ฉ๋ชจ๋ฆฌ ์์์ ๋ฐฉ์งํ๋ ค๋ฉด ์ ์คํ ๊ด๋ฆฌ๊ฐ ํ์ํฉ๋๋ค.
์(JavaScript): ๋ด๋ณด๋ธ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค
const wasm = await WebAssembly.instantiateStreaming(fetch('module.wasm'));
const memory = wasm.instance.exports.memory;
const buffer = new Uint8Array(memory.buffer);
// ๋ฉ๋ชจ๋ฆฌ์ ๊ฐ ์ฐ๊ธฐ
buffer[0] = 42;
// ๋ฉ๋ชจ๋ฆฌ์์ ๊ฐ ์ฝ๊ธฐ
const value = buffer[0]; // value๋ 42๊ฐ ๋ฉ๋๋ค
console.log(value);
ํ ์ด๋ธ
ํ ์ด๋ธ์ ํจ์ ์ฐธ์กฐ ๋ฐฐ์ด์ ๋๋ค. ๋์ ๋์คํจ์น ๋ฐ ํจ์ ํฌ์ธํฐ๋ฅผ WebAssembly์์ ๊ตฌํํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. ํ ์ด๋ธ์ ๋ด๋ณด๋ด๋ฉด JavaScript๊ฐ ํ ์ด๋ธ์ ํตํด ๊ฐ์ ์ ์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์์ต๋๋ค.
์(JavaScript): ๋ด๋ณด๋ธ ํ ์ด๋ธ ์ก์ธ์ค
const wasm = await WebAssembly.instantiateStreaming(fetch('module.wasm'));
const table = wasm.instance.exports.table;
// ํ
์ด๋ธ์ ํจ์ ์ฐธ์กฐ๊ฐ ํฌํจ๋์ด ์๋ค๊ณ ๊ฐ์
const functionIndex = 0; // ํ
์ด๋ธ ๋ด ํจ์์ ์ธ๋ฑ์ค
const func = table.get(functionIndex);
// ํจ์ ํธ์ถ
const result = func(5, 3);
console.log(result);
์ ์ญ ๋ณ์
์ ์ญ ๋ณ์๋ฅผ ๋ด๋ณด๋ด๋ฉด JavaScript๊ฐ WebAssembly ๋ชจ๋์ ์ ์๋ ์ ์ญ ๋ณ์์ ๊ฐ์ ์ฝ๊ณ (๋ณ์๊ฐ ๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฒฝ์ฐ) ์์ ํ ์ ์์ต๋๋ค.
์(JavaScript): ๋ด๋ณด๋ธ ์ ์ญ ๋ณ์ ์ก์ธ์ค
const wasm = await WebAssembly.instantiateStreaming(fetch('module.wasm'));
const globalVar = wasm.instance.exports.globalVar;
// ๊ฐ ์ฝ๊ธฐ
const value = globalVar.value;
console.log(value);
// ๊ฐ ์์ (๋ณ๊ฒฝ ๊ฐ๋ฅํ ๊ฒฝ์ฐ)
globalVar.value = 100;
WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์ฑ์ ๋ํ ๋ชจ๋ฒ ์ฌ๋ก
WebAssembly ๋ด๋ณด๋ด๊ธฐ๋ฅผ ๊ตฌ์ฑํ ๋๋ ์ต์ ์ ์ฑ๋ฅ, ๋ณด์ ๋ฐ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๋ณด์ฅํ๊ธฐ ์ํด ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฅด๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๋ด๋ณด๋ด๊ธฐ ์ต์ํ
JavaScript ์ํธ ์์ฉ์ ์ ๋์ ์ผ๋ก ํ์ํ ํจ์์ ๋ฐ์ดํฐ๋ง ๋ด๋ณด๋ ๋๋ค. ๊ณผ๋ํ ๋ด๋ณด๋ด๊ธฐ๋ ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์ ํฌ๊ธฐ๋ฅผ ๋๋ฆฌ๊ณ ์ฑ๋ฅ์ ์ํฅ์ ์ค ์ ์์ต๋๋ค.
ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ ์ฌ์ฉ
JavaScript์ WebAssembly ๊ฐ์ ๋ฐ์ดํฐ๋ฅผ ๊ณต์ ํ ๋๋ ๋ฐ์ดํฐ ๋ณํ ์ค๋ฒํค๋๋ฅผ ์ต์ํํ๋ ํจ์จ์ ์ธ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ์ฌ์ฉํฉ๋๋ค. ์ต์ ์ ์ฑ๋ฅ์ ์ํด ํ์
ํ๋ ๋ฐฐ์ด(Uint8Array, Float32Array ๋ฑ)์ ๊ณ ๋ คํ์ญ์์ค.
์ ๋ ฅ ๋ฐ ์ถ๋ ฅ ์ ํจ์ฑ ๊ฒ์ฌ
์์์น ๋ชปํ ๋์๊ณผ ์ ์ฌ์ ์ธ ๋ณด์ ์ทจ์ฝ์ฑ์ ๋ฐฉ์งํ๊ธฐ ์ํด WebAssembly ํจ์์์ ๋ชจ๋ ์ ์ถ๋ ฅ์ ํญ์ ์ ํจ์ฑ ๊ฒ์ฌํ์ญ์์ค. ์ด๋ ํนํ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ฅผ ๋ค๋ฃฐ ๋ ์ค์ํฉ๋๋ค.
๋ฉ๋ชจ๋ฆฌ ์ ์คํ๊ฒ ๊ด๋ฆฌ
๋ฉ๋ชจ๋ฆฌ๋ฅผ ๋ด๋ณด๋ผ ๋๋ JavaScript๊ฐ ๋ฉ๋ชจ๋ฆฌ์ ์ก์ธ์คํ๊ณ ์กฐ์ํ๋ ๋ฐฉ์์ ๋งค์ฐ ์ฃผ์ํ์ญ์์ค. ์๋ชป๋ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ ๋ฉ๋ชจ๋ฆฌ ์์ ๋ฐ ์ถฉ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค. ์ ์ด๋ ๋ฐฉ์์ผ๋ก ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ฅผ ๊ด๋ฆฌํ๊ธฐ ์ํด WebAssembly ๋ชจ๋ ๋ด์์ ๋์ฐ๋ฏธ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค.
๊ฐ๋ฅํ๋ฉด ์ง์ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค ํผํ๊ธฐ
์ง์ ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๊ฐ ํจ์จ์ ์ผ ์ ์์ง๋ง ๋ณต์ก์ฑ๊ณผ ์ ์ฌ์ ์ํ์ ์ด๋ํ๊ธฐ๋ ํฉ๋๋ค. ์ฝ๋ ์ ์ง ๊ด๋ฆฌ์ฑ์ ๊ฐ์ ํ๊ณ ์ค๋ฅ ์ํ์ ์ค์ด๊ธฐ ์ํด ๋ฉ๋ชจ๋ฆฌ ์ก์ธ์ค๋ฅผ ์บก์ํํ๋ ํจ์์ ๊ฐ์ ๋ ๋์ ์์ค์ ์ถ์ํ๋ฅผ ๊ณ ๋ คํ์ญ์์ค. ์๋ฅผ ๋ค์ด, JavaScript๊ฐ ๋ฒํผ๋ฅผ ์ง์ ๊ฑด๋๋ฆฌ๋ ๋์ ๋ฉ๋ชจ๋ฆฌ ๊ณต๊ฐ์ ํน์ ์์น์์ ๊ฐ์ ๊ฐ์ ธ์ค๊ณ ์ค์ ํ๋ WebAssembly ํจ์๋ฅผ ๊ฐ์ง ์ ์์ต๋๋ค.
์์ ์ ๋ง๋ ์ฌ๋ฐ๋ฅธ ์ธ์ด ์ ํ
์ํํ๋ ค๋ ํน์ ์์ ์ ๊ฐ์ฅ ์ ํฉํ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด๋ฅผ ์ ํํ์ญ์์ค. ๊ณ์ฐ ์ง์ฝ์ ์ธ ์์ ์ ๊ฒฝ์ฐ C, C++ ๋๋ Rust๊ฐ ์ข์ ์ ํ์ด ๋ ์ ์์ต๋๋ค. JavaScript์์ ๊ธด๋ฐํ ํตํฉ์ด ํ์ํ ์์ ์ ๊ฒฝ์ฐ AssemblyScript๊ฐ ๋ ๋์ ์ ํ์ผ ์ ์์ต๋๋ค.
๋ณด์ ์ํฅ ๊ณ ๋ ค
ํน์ ์ ํ์ ๋ฐ์ดํฐ๋ ๊ธฐ๋ฅ์ ๋ด๋ณด๋ด๋ ๊ฒ์ ๋ณด์ ์ํฅ์ ์ธ์งํ์ญ์์ค. ์๋ฅผ ๋ค์ด, ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์ง์ ๋ด๋ณด๋ด๋ ๊ฒ์ ์ ์คํ๊ฒ ์ฒ๋ฆฌํ์ง ์์ผ๋ฉด ์ ์ฌ์ ์ธ ๋ฒํผ ์ค๋ฒํ๋ก ๊ณต๊ฒฉ์ WebAssembly ๋ชจ๋์ ๋ ธ์ถ์ํฌ ์ ์์ต๋๋ค. ๊ผญ ํ์ํ ๊ฒฝ์ฐ๊ฐ ์๋๋ฉด ๋ฏผ๊ฐํ ๋ฐ์ดํฐ๋ฅผ ๋ด๋ณด๋ด์ง ๋ง์ญ์์ค.
๊ณ ๊ธ ๊ธฐ๋ฒ
`SharedArrayBuffer`๋ฅผ ์ฌ์ฉํ ๊ณต์ ๋ฉ๋ชจ๋ฆฌ
SharedArrayBuffer๋ฅผ ์ฌ์ฉํ๋ฉด JavaScript์ ์ฌ๋ฌ WebAssembly ์ธ์คํด์ค(๋๋ ์ฌ๋ฌ ์ค๋ ๋) ๊ฐ์ ๊ณต์ ํ ์ ์๋ ๋ฉ๋ชจ๋ฆฌ ๋ฒํผ๋ฅผ ๋ง๋ค ์ ์์ต๋๋ค. ์ด๋ ๋ณ๋ ฌ ๊ณ์ฐ ๋ฐ ๊ณต์ ๋ฐ์ดํฐ ๊ตฌ์กฐ๋ฅผ ๊ตฌํํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค.
์(JavaScript): SharedArrayBuffer ์ฌ์ฉ
// SharedArrayBuffer ์์ฑ
const sharedBuffer = new SharedArrayBuffer(1024);
// ๊ณต์ ๋ฒํผ๋ก WebAssembly ๋ชจ๋ ์ธ์คํด์คํ
const wasm = await WebAssembly.instantiateStreaming(fetch('module.wasm'), {
env: {
memory: new WebAssembly.Memory({ shared: true, initial: 1024, maximum: 1024 }),
},
});
// JavaScript์์ ๊ณต์ ๋ฒํผ ์ก์ธ์ค
const buffer = new Uint8Array(sharedBuffer);
// WebAssembly์์ ๊ณต์ ๋ฒํผ ์ก์ธ์ค(ํน์ ๊ตฌ์ฑ ํ์)
// (์: ๋๊ธฐํ๋ฅผ ์ํด ์์์ ์ฐ์ฐ ์ฌ์ฉ)
์ค์: SharedArrayBuffer๋ฅผ ์ฌ์ฉํ๋ ค๋ฉด ์ฌ๋ฌ ์ค๋ ๋ ๋๋ ์ธ์คํด์ค๊ฐ ๋ฒํผ์ ๋์์ ์ก์ธ์คํ ๋ ๊ฒฝ์ ์กฐ๊ฑด์ ๋ฐฉ์งํ๊ธฐ ์ํด ์ ์ ํ ๋๊ธฐํ ๋ฉ์ปค๋์ฆ(์: ์์์ ์ฐ์ฐ)์ด ํ์ํฉ๋๋ค.
๋น๋๊ธฐ ์์
WebAssembly ๋ด์์ ์ค๋ ์คํ๋๊ฑฐ๋ ์ฐจ๋จ๋๋ ์์
์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ JavaScript ์ค๋ ๋๋ฅผ ์ฐจ๋จํ์ง ์๋๋ก ๋น๋๊ธฐ ๊ธฐ๋ฒ์ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ญ์์ค. ์ด๋ Emscripten์ Asyncify ๊ธฐ๋ฅ์ ์ฌ์ฉํ๊ฑฐ๋ Promise ๋๋ ์ฝ๋ฐฑ์ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์ ์ง์ ๋น๋๊ธฐ ๋ฉ์ปค๋์ฆ์ ๊ตฌํํ์ฌ ๋ฌ์ฑํ ์ ์์ต๋๋ค.
๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ์ ๋ต
WebAssembly์๋ ๋ด์ฅ๋ ๊ฐ๋น์ง ์์ง ๊ธฐ๋ฅ์ด ์์ต๋๋ค. ํนํ ๋ณต์กํ ํ๋ก๊ทธ๋จ์ ๊ฒฝ์ฐ ๋ฉ๋ชจ๋ฆฌ๋ฅผ ์๋์ผ๋ก ๊ด๋ฆฌํด์ผ ํฉ๋๋ค. ์ฌ๊ธฐ์๋ WebAssembly ๋ชจ๋ ๋ด์์ ์ฌ์ฉ์ ์ง์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์๋ฅผ ์ฌ์ฉํ๊ฑฐ๋ ์ธ๋ถ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์์กดํ๋ ๊ฒ์ด ํฌํจ๋ ์ ์์ต๋๋ค.
์คํธ๋ฆฌ๋ฐ ์ปดํ์ผ
WebAssembly.instantiateStreaming์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํธ ์คํธ๋ฆผ์์ ์ง์ WebAssembly ๋ชจ๋์ ์ปดํ์ผํ๊ณ ์ธ์คํด์คํํฉ๋๋ค. ์ด๋ฅผ ํตํด ๋ธ๋ผ์ฐ์ ๊ฐ ์ ์ฒด ํ์ผ์ด ๋ค์ด๋ก๋๋๊ธฐ ์ ์ ๋ชจ๋ ์ปดํ์ผ์ ์์ํ ์ ์์ผ๋ฏ๋ก ์์ ์๊ฐ์ด ํฅ์๋ ์ ์์ต๋๋ค. ์ด๋ ๋ชจ๋ ๋ก๋ฉ์ ์ํ ์ ํธ๋๋ ๋ฐฉ๋ฒ์ด ๋์์ต๋๋ค.
์ฑ๋ฅ ์ต์ ํ
์ ์ ํ ๋ฐ์ดํฐ ๊ตฌ์กฐ, ์๊ณ ๋ฆฌ์ฆ ๋ฐ ์ปดํ์ผ๋ฌ ํ๋๊ทธ๋ฅผ ์ฌ์ฉํ์ฌ WebAssembly ์ฝ๋๋ฅผ ์ต์ ํํ์ญ์์ค. ํ๋กํ์ผ๋ง์ ํตํด ๋ณ๋ชฉ ํ์์ ์๋ณํ๊ณ ๊ทธ์ ๋ฐ๋ผ ์ต์ ํํ์ญ์์ค. ๋ณ๋ ฌ ์ฒ๋ฆฌ๋ฅผ ์ํด SIMD(Single Instruction Multiple Data) ๋ช ๋ น์ด๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
์ค์ ์์ ๋ฐ ์ฌ์ฉ ์ฌ๋ก
WebAssembly๋ ๋ค์๊ณผ ๊ฐ์ ๋ค์ํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๊ฒ์: ๊ธฐ์กด ๊ฒ์์ ์น์ผ๋ก ํฌํ ํ๊ณ ์๋ก์ด ๊ณ ์ฑ๋ฅ ์น ๊ฒ์์ ๋ง๋ญ๋๋ค.
- ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ: ๋ธ๋ผ์ฐ์ ์์ ๋ณต์กํ ์ด๋ฏธ์ง ๋ฐ ๋น๋์ค ์ฒ๋ฆฌ ์์ ์ ์ํํฉ๋๋ค.
- ๊ณผํ ๊ณ์ฐ: ๋ธ๋ผ์ฐ์ ์์ ๊ณ์ฐ ์ง์ฝ์ ์ธ ์๋ฎฌ๋ ์ด์ ๋ฐ ๋ฐ์ดํฐ ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์ ์คํํฉ๋๋ค.
- ์ํธํ: ์ํธํ ์๊ณ ๋ฆฌ์ฆ ๋ฐ ํ๋กํ ์ฝ์ ์์ ํ๊ณ ์ด์ ๊ฐ๋ฅํ ๋ฐฉ์์ผ๋ก ๊ตฌํํฉ๋๋ค.
- ์ฝ๋ฑ: ๋น๋์ค ๋๋ ์ค๋์ค ์ธ์ฝ๋ฉ ๋ฐ ๋์ฝ๋ฉ๊ณผ ๊ฐ์ ๋ฏธ๋์ด ์ฝ๋ฑ ๋ฐ ์์ถ/์์ถ ํด์ ๋ฅผ ๋ธ๋ผ์ฐ์ ์์ ์ฒ๋ฆฌํฉ๋๋ค.
- ๊ฐ์ ๋จธ์ : ๊ฐ์ ๋จธ์ ์ ์์ ํ๊ณ ๊ณ ์ฑ๋ฅ์ผ๋ก ๊ตฌํํฉ๋๋ค.
- ์๋ฒ ์ธก ์ ํ๋ฆฌ์ผ์ด์ : ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ ๋ธ๋ผ์ฐ์ ์ด์ง๋ง WASM์ ์๋ฒ ์ธก ํ๊ฒฝ์์๋ ์ฌ์ฉ๋ ์ ์์ต๋๋ค.
์: WebAssembly๋ฅผ ์ฌ์ฉํ ์ด๋ฏธ์ง ์ฒ๋ฆฌ
์น ๊ธฐ๋ฐ ์ด๋ฏธ์ง ํธ์ง๊ธฐ๋ฅผ ๊ตฌ์ถํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. WebAssembly๋ฅผ ์ฌ์ฉํ์ฌ ์ด๋ฏธ์ง ํํฐ๋ง, ํฌ๊ธฐ ์กฐ์ ๋ฐ ์์ ์กฐ์๊ณผ ๊ฐ์ ์ฑ๋ฅ ์ง์ฝ์ ์ธ ์ด๋ฏธ์ง ์ฒ๋ฆฌ ์์ ์ ๊ตฌํํ ์ ์์ต๋๋ค. WebAssembly ๋ชจ๋์ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ ๋ ฅ์ผ๋ก ๋ฐ๊ณ ์ฒ๋ฆฌ๋ ์ด๋ฏธ์ง ๋ฐ์ดํฐ๋ฅผ ์ถ๋ ฅ์ผ๋ก ๋ฐํํ๋ ํจ์๋ฅผ ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. ์ด๋ JavaScript์์ ๋ฌด๊ฑฐ์ด ์์ ์ ์คํ๋ก๋ํ์ฌ ๋ ๋ถ๋๋ฝ๊ณ ๋ฐ์์ฑ์ด ๋ฐ์ด๋ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํฉ๋๋ค.
์: WebAssembly๋ฅผ ์ฌ์ฉํ ๊ฒ์ ๊ฐ๋ฐ
๋ง์ ๊ฒ์ ๊ฐ๋ฐ์๋ค์ด WebAssembly๋ฅผ ์ฌ์ฉํ์ฌ ๊ธฐ์กด ๊ฒ์์ ์น์ผ๋ก ํฌํ ํ๊ฑฐ๋ ์๋ก์ด ๊ณ ์ฑ๋ฅ ์น ๊ฒ์์ ๋ง๋ญ๋๋ค. WebAssembly๋ฅผ ํตํด ๋ค์ดํฐ๋ธ์ ๊ฐ๊น์ด ์ฑ๋ฅ์ ๋ฌ์ฑํ์ฌ ๋ธ๋ผ์ฐ์ ์์ ๋ณต์กํ 3D ๊ทธ๋ํฝ ๋ฐ ๋ฌผ๋ฆฌ ์๋ฎฌ๋ ์ด์ ์ ์คํํ ์ ์์ต๋๋ค. Unity ๋ฐ Unreal Engine๊ณผ ๊ฐ์ ์ธ๊ธฐ ์๋ ๊ฒ์ ์์ง์ WebAssembly ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ง์ํฉ๋๋ค.
๊ฒฐ๋ก
WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด๋ WebAssembly ๋ชจ๋๊ณผ JavaScript ์ฝ๋ ๊ฐ์ ํต์ ๋ฐ ์ํธ ์์ฉ์ ํ์ฑํํ๋ ์ค์ํ ๋ฉ์ปค๋์ฆ์ ๋๋ค. ๋ชจ๋ ๋ด๋ณด๋ด๊ธฐ ๊ตฌ์ฑ ๋ฐฉ๋ฒ, ๋ค์ํ ๋ด๋ณด๋ด๊ธฐ ์ ํ ๊ด๋ฆฌ, ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ๋ฐ๋ฆ์ผ๋ก์จ ๊ฐ๋ฐ์๋ WebAssembly์ ์ฑ๋ฅ์ ํ์ฉํ๋ ํจ์จ์ ์ด๊ณ ์์ ํ๋ฉฐ ์ ์ง ๊ด๋ฆฌ ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. WebAssembly๊ฐ ๊ณ์ ๋ฐ์ ํจ์ ๋ฐ๋ผ ๋ด๋ณด๋ด๊ธฐ ๊ธฐ๋ฅ์ ๋ง์คํฐํ๋ ๊ฒ์ ํ์ ์ ์ด๊ณ ๊ณ ์ฑ๋ฅ์ ์น ๊ฒฝํ์ ๋ง๋๋ ๋ฐ ํ์์ ์ผ ๊ฒ์ ๋๋ค.
์ด ๊ฐ์ด๋์์๋ ๊ธฐ๋ณธ ๊ฐ๋ ๋ถํฐ ๊ณ ๊ธ ๊ธฐ๋ฒ๊น์ง WebAssembly ๋ด๋ณด๋ด๊ธฐ ๊ฐ์ฒด์ ๋ํ ํฌ๊ด์ ์ธ ๊ฐ์๋ฅผ ์ ๊ณตํ์ต๋๋ค. ์ด ๊ฐ์ด๋์ ์ค๋ช ๋ ์ง์๊ณผ ๋ชจ๋ฒ ์ฌ๋ก๋ฅผ ์ ์ฉํจ์ผ๋ก์จ ์น ๊ฐ๋ฐ ํ๋ก์ ํธ์์ WebAssembly๋ฅผ ํจ๊ณผ์ ์ผ๋ก ํ์ฉํ๊ณ ์ ์ฒด ์ ์ฌ๋ ฅ์ ๋ฐํํ ์ ์์ต๋๋ค.