WebAssembly ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํˆดํ‚ท์ธ Wasmer 2.0์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Wasmer ํ”„๋กœ์ ํŠธ๋Š” ๋‹ค๋ฅธ ์šด์˜ ์ฒด์ œ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋Š” ๋ฒ”์šฉ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ƒ์„ฑํ•˜๊ณ  ์‹ ๋ขฐํ•  ์ˆ˜ ์—†๋Š” ์ฝ”๋“œ๋ฅผ ๊ฒฉ๋ฆฌํ•˜์—ฌ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” WebAssembly ๋ชจ๋“ˆ์„ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•œ ๋Ÿฐํƒ€์ž„์„ ๊ฐœ๋ฐœํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์ฃผ์š” ๋ฆด๋ฆฌ์Šค๋ฅผ ์ถœ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ์ ํŠธ ์ฝ”๋“œ๋Š” Rust๋กœ ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฉฐ MIT ๋ผ์ด์„ ์Šค์— ๋”ฐ๋ผ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค.

์ด์‹์„ฑ์€ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฝ”๋“œ๋ฅผ ํ•˜์œ„ ์ˆ˜์ค€ WebAssembly ์ค‘๊ฐ„ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ๋‹ฌ์„ฑ๋ฉ๋‹ˆ๋‹ค. ์ด ์ค‘๊ฐ„ ์ฝ”๋“œ๋Š” ๋ชจ๋“  OS์—์„œ ์‹คํ–‰๋˜๊ฑฐ๋‚˜ ๋‹ค๋ฅธ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด์˜ ํ”„๋กœ๊ทธ๋žจ์— ํฌํ•จ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๊ทธ๋žจ์€ WebAssembly ์˜์‚ฌ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ๋Ÿ‰ ์ปจํ…Œ์ด๋„ˆ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ปจํ…Œ์ด๋„ˆ๋Š” ์šด์˜ ์ฒด์ œ์— ๋ฌถ์—ฌ ์žˆ์ง€ ์•Š์œผ๋ฉฐ ์›๋ž˜ ๋ชจ๋“  ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Emscripten ํˆดํ‚ท์„ ์‚ฌ์šฉํ•˜์—ฌ WebAssembly๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly๋ฅผ ํ˜„์žฌ ํ”Œ๋žซํผ์˜ ๊ธฐ๊ณ„ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์–‘ํ•œ ์ปดํŒŒ์ผ ๋ฐฑ์—”๋“œ(Singlepass, Cranelift, LLVM)์™€ ์—”์ง„(JIT ๋˜๋Š” ๊ธฐ๊ณ„ ์ฝ”๋“œ ์ƒ์„ฑ ์‚ฌ์šฉ)์˜ ์—ฐ๊ฒฐ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ์ œ์–ด ๋ฐ ์ƒํ˜ธ ์ž‘์šฉ์€ ์šด์˜ ์ฒด์ œ์—์„œ ์ œ๊ณตํ•˜๋Š” ํŒŒ์ผ, ์†Œ์ผ“ ๋ฐ ๊ธฐํƒ€ ๊ธฐ๋Šฅ ์ž‘์—…์„ ์œ„ํ•œ ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ œ๊ณตํ•˜๋Š” WASI(WebAssembly System Interface) API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ์ƒŒ๋“œ๋ฐ•์Šค ํ™˜๊ฒฝ์˜ ๊ธฐ๋ณธ ์‹œ์Šคํ…œ์—์„œ ๊ฒฉ๋ฆฌ๋˜๋ฉฐ ์„ ์–ธ๋œ ๊ธฐ๋Šฅ(๊ฐ ๋ฆฌ์†Œ์Šค(ํŒŒ์ผ, ๋””๋ ‰ํ„ฐ๋ฆฌ, ์†Œ์ผ“, ์‹œ์Šคํ…œ ํ˜ธ์ถœ ๋“ฑ)์— ๋Œ€ํ•œ ์ž‘์—…์— ๋Œ€ํ•œ ๊ธฐ๋Šฅ ๊ด€๋ฆฌ ๊ธฐ๋ฐ˜ ๋ณด์•ˆ ๋ฉ”์ปค๋‹ˆ์ฆ˜), ์‹ ์ฒญ์—๋Š” ์ ์ ˆํ•œ ๊ถŒํ•œ์ด ๋ถ€์—ฌ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.)

WebAssembly ์ปจํ…Œ์ด๋„ˆ๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ์™ธ๋ถ€ ์ข…์†์„ฑ ์—†์ด ์ œ๊ณต๋˜๋Š” Wasmer ๋Ÿฐํƒ€์ž„์„ ์‹œ์Šคํ…œ์— ์„ค์น˜ํ•˜๊ณ ("curl https://get.wasmer.io -sSfL | sh") ํ•„์š”ํ•œ ํŒŒ์ผ("wasmer test")์„ ์‹คํ–‰ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. .wasmโ€). ํ”„๋กœ๊ทธ๋žจ์€ WAPM ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜ WebAssembly ๋ชจ๋“ˆ ํ˜•ํƒœ๋กœ ๋ฐฐํฌ๋ฉ๋‹ˆ๋‹ค. Wasmer๋Š” Rust, C/C++, C#, D, Python, JavaScript, Go, PHP, Ruby, Elixir ๋ฐ Java ํ”„๋กœ๊ทธ๋žจ์— WebAssembly ์ฝ”๋“œ๋ฅผ ์‚ฝ์ž…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋กœ๋„ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

ํ”Œ๋žซํผ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ์— ๊ฐ€๊นŒ์šด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์‹คํ–‰ ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly ๋ชจ๋“ˆ์— ๋„ค์ดํ‹ฐ๋ธŒ ๊ฐœ์ฒด ์—”์ง„์„ ์‚ฌ์šฉํ•˜๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ(๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ .so, .dylib ๋ฐ .dll ๊ฐœ์ฒด ํŒŒ์ผ์„ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•œ "wasmer compile -native")๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ์ฝ”๋“œ๋Š” ์‹คํ–‰ํ•˜๋Š” ๋ฐ ์ตœ์†Œํ•œ์˜ ๋Ÿฐํƒ€์ž„์ด ํ•„์š”ํ•˜์ง€๋งŒ ๋‹ค์Œ์˜ ๋ชจ๋“  ๊ธฐ๋Šฅ์„ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ƒŒ๋“œ๋ฐ•์Šค ๊ฒฉ๋ฆฌ. ๋‚ด์žฅ๋œ Wasmer๋กœ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผ๋œ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ถ”๊ฐ€ ๊ธฐ๋Šฅ ๋ฐ ์ถ”๊ฐ€ ๊ธฐ๋Šฅ์„ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด Rust API ๋ฐ Wasm-C-API๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค.

Wasmer ๋ฒ„์ „ ๋ฒˆํ˜ธ์˜ ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ์€ ๋‚ด๋ถ€ API์— ๋Œ€ํ•œ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ๋„์ž…๊ณผ ๊ด€๋ จ์ด ์žˆ์œผ๋ฉฐ ๊ฐœ๋ฐœ์ž์— ๋”ฐ๋ฅด๋ฉด ์ด๋Š” ํ”Œ๋žซํผ ์‚ฌ์šฉ์ž์˜ 99%์— ์˜ํ–ฅ์„ ๋ฏธ์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ˜ธํ™˜์„ฑ์„ ๊นจ๋Š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ ์ค‘์—๋Š” ์ง๋ ฌํ™”๋œ Wasm ๋ชจ๋“ˆ ํ˜•์‹์˜ ๋ณ€๊ฒฝ๋„ ์žˆ์Šต๋‹ˆ๋‹ค(Wasmer 1.0์—์„œ ์ง๋ ฌํ™”๋œ ๋ชจ๋“ˆ์€ Wasmer 2.0์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค). ๊ธฐํƒ€ ๋ณ€๊ฒฝ์‚ฌํ•ญ:

  • SIMD(Single Instruction, Multiple Data) ๋ช…๋ น์–ด๋ฅผ ์ง€์›ํ•˜์—ฌ ๋ฐ์ดํ„ฐ ์ž‘์—…์˜ ๋ณ‘๋ ฌํ™”๋ฅผ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค. SIMD๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ํ–ฅ์ƒ๋  ์ˆ˜ ์žˆ๋Š” ์˜์—ญ์—๋Š” ๊ธฐ๊ณ„ ํ•™์Šต, ๋น„๋””์˜ค ์ธ์ฝ”๋”ฉ ๋ฐ ๋””์ฝ”๋”ฉ, ์ด๋ฏธ์ง€ ์ฒ˜๋ฆฌ, ๋ฌผ๋ฆฌ์  ํ”„๋กœ์„ธ์Šค ์‹œ๋ฎฌ๋ ˆ์ด์…˜, ๊ทธ๋ž˜ํ”ฝ ์กฐ์ž‘ ๋“ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์ฐธ์กฐ ์œ ํ˜•์„ ์ง€์›ํ•˜์—ฌ Wasm ๋ชจ๋“ˆ์ด ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด๋‚˜ ๊ธฐ๋ณธ ํ™˜๊ฒฝ์˜ ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒ๋‹นํ•œ ์„ฑ๋Šฅ ์ตœ์ ํ™”๊ฐ€ ์ด๋ฃจ์–ด์กŒ์Šต๋‹ˆ๋‹ค. ๋ถ€๋™ ์†Œ์ˆ˜์  ์ˆซ์ž๋ฅผ ์‚ฌ์šฉํ•˜๋Š” LLVM ๋Ÿฐํƒ€์ž„ ์†๋„๊ฐ€ ์•ฝ 50% ์ฆ๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ปค๋„์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ์ƒํ™ฉ์„ ์ค„์ž„์œผ๋กœ์จ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ด ํฌ๊ฒŒ ๊ฐ€์†ํ™”๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Cranelift ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ ์„ฑ๋Šฅ์ด 40% ํ–ฅ์ƒ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ์ดํ„ฐ ์—ญ์ง๋ ฌํ™” ์‹œ๊ฐ„์ด ๋‹จ์ถ•๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
    WebAssembly ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํˆดํ‚ท์ธ Wasmer 2.0์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
    WebAssembly ๊ธฐ๋ฐ˜ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ตฌ์ถ•ํ•˜๊ธฐ ์œ„ํ•œ ํˆดํ‚ท์ธ Wasmer 2.0์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋ณธ์งˆ์„ ๋ณด๋‹ค ์ •ํ™•ํ•˜๊ฒŒ ๋ฐ˜์˜ํ•˜๊ธฐ ์œ„ํ•ด ์—”์ง„ ์ด๋ฆ„์„ JIT โ†’ Universal, Native โ†’ Dylib(Dynamic Library), Object File โ†’ StaticLib(Static Library)๋กœ ๋ณ€๊ฒฝํ–ˆ์Šต๋‹ˆ๋‹ค.

์ถœ์ฒ˜ : opennet.ru

์ฝ”๋ฉ˜ํŠธ๋ฅผ ์ถ”๊ฐ€