Design: WebAssembly.Instance๊ฐ€ ์ด๋ฏธ ์ปดํŒŒ์ผ๋œ ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์— ๋งŒ๋“  2016๋…„ 10์›” 27์ผ  ยท  94์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: WebAssembly/design

์ด ์ฝ”๋“œ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

let descriptor = /* ... */;
let memories = Array.apply(null, {length: 1024}).map(() => new WebAssembly.Memory(descriptor));
let instance = fetch('foo.wasm')
  .then(response => response.arrayBuffer())
  .then(buffer => WebAssembly.compile(buffer))
  .then(module => new WebAssembly.Instance(module, { memory: memories[1023] }));

WebAssembly.Instance ์€(๋Š”) ์ƒ๋‹นํ•œ ์‹œ๊ฐ„ ๋™์•ˆ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด WebAssembly.Module ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ์•„๋‹ˆ์˜ค๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์ง€๋งŒ ์ด๋ฏธ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ์ˆ˜์‹ ํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํŠนํžˆ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š”๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ๊ทธ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ €์† ๋ชจ๋“œ ๋ฉ”๋ชจ๋ฆฌ์ด๊ณ  ์ฝ”๋“œ๊ฐ€ ๊ณ ์† ๋ชจ๋“œ๋ฅผ ๊ฐ€์ •ํ•˜์—ฌ ์ปดํŒŒ์ผ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๊นŒ? ์•„๋งˆ๋„ memories[0] ๋Š” ๊ณ ์† ๋ชจ๋“œ ๋ฉ”๋ชจ๋ฆฌ์˜€์ง€๋งŒ memories[1023] ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋Œ€์‹  ์ด ์ฝ”๋“œ๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

let instances = [0,1,2,3,4,5,6,7].map(v => fetch(`foo${v}.wasm`)
  .then(response => response.arrayBuffer())
  .then(buffer => WebAssembly.compile(buffer))
  .then(module => new WebAssembly.Instance(module)));

WebAssembly.Instance ํ˜ธ์ถœ์ด ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜๋„๋ก ํ—ˆ์šฉ๋ฉ๋‹ˆ๊นŒ?

์œ„์˜ ๋‚ด์šฉ์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ๋ช‡ ๊ฐ€์ง€ ๊ด€๋ จ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • ์ปดํŒŒ์ผ _and_ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ์•ฝ์† ๋ฐ˜ํ™˜ ๋น„๋™๊ธฐ ํ•จ์ˆ˜๋ฅผ ์›ํ•˜์‹ญ๋‹ˆ๊นŒ? ์ด๋ฏธ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™๊ธฐ ๋ฐ ๋น„๋™๊ธฐ API๋ฅผ ์‚ญ์ œํ•ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ƒˆ๋กœ์šด ๋น„๋™๊ธฐ API๋ฅผ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ๋ธŒ๋ผ์šฐ์ €๋Š” WebAssembly.Module ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ๋น ๋ฅด๊ณ  WebAssembly.Memory ์ธ์Šคํ„ด์Šค๊ฐ€ ์ด๋Ÿฌํ•œ ๋น ๋ฅธ ์ฝ”๋“œ์— ์ ํ•ฉํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์–ด๋–ป๊ฒŒ ๋…ธ์ถœํ•ฉ๋‹ˆ๊นŒ? ์ง€๊ธˆ ๋Œ€๋‹ต์€ "์‹œ๋„ํ•˜๊ณ  ์•Œ์•„์ฐจ๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค"์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ์ž๊ฐ€ ๋Š๋ฆฐ ์ฝ”๋“œ๋ฅผ ๋ฐ›๊ธฐ ์ „์— ํ—ˆ์šฉ๋œ WebAssembly.Memory ์ธ์Šคํ„ด์Šค์˜ ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?
JS embedding

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

@kgryte ๋‚ด ์˜๊ฒฌ์€ ์ฃผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ์„ ๋ถ„๋ช…ํžˆ ํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ API๋ฅผ ์—ฌ์ „ํžˆ ๋…ธ์ถœํ•˜๋Š” API ํ‘œ๋ฉด์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™๊ธฐ API์— ์ „๋‹ฌ๋œ ๋ชจ๋“ˆ์— ํฌ๊ธฐ ์ œํ•œ์„ ๋ถ€๊ณผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ˆ: Chrome์€ ์ด๋ฏธ ์ˆ˜ํ–‰) ํ•ด๋‹น ์ œํ•œ์€ ์ž„๋ฒ ๋”์—์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Node.js์— ์ ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

๋ชจ๋“  94 ๋Œ“๊ธ€

WebAssembly.Instance ๊ฐ€ ๋•Œ๋•Œ๋กœ ์žฌ์ปดํŒŒ์ผ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋ณ€๊ฒฝ ๋ถˆ๊ฐ€๋Šฅํ•œ ์ „์—ญ ๋ณ€์ˆ˜๊ฐ€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ์—์„œ ์ผ์ •ํ•˜๊ฒŒ ์ ‘ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Emscripten์€ ์ •์  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ๋ชจ๋“  ํฌ์ธํ„ฐ๋ฅผ ์˜คํ”„์…‹ํ•˜์—ฌ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์˜คํ”„์…‹์€ ๋ชจ๋“ˆ์ด ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ „์—ญ ๋ณ€์ˆ˜๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค. WebAssembly.Instance ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์œผ๋ฉด ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ํŠน์ˆ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์–‘์€ "์ปดํŒŒ์ผ"์ด ๋ฌด์—‡์ธ์ง€ ์ •์˜ํ•˜์ง€ ์•Š์œผ๋ฉฐ
๊ตฌํ˜„ ๋ฐฉ์‹์ด ํฌ๊ฒŒ ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.
(ํ†ต์—ญ์‚ฌ ํฌํ•จ). ๋”ฐ๋ผ์„œ ์ด์— ๋Œ€ํ•ด ์–ด๋– ํ•œ ๊ทœ๋ฒ”์  ๋ฐœ์–ธ๋„ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.
์–ด๋Š ์ชฝ์ด๋“ . ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์„ ์€
WebAssembly.Instance ์€(๋Š”) "๋น ๋ฅธ" ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋ฉ๋‹ˆ๋‹ค.

2016๋…„ 10์›” 27์ผ 03:24, Michael Bebenita [email protected]
์ผ๋‹ค:

WebAssembly.Instance๊ฐ€ ๋•Œ๋•Œ๋กœ ์žฌ์ปดํŒŒ์ผ์„ ์ผ์œผํ‚ค๋Š” ๊ฒƒ์ด ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ๋ฐฉ๋ฒ•์œผ๋กœ ๋ถˆ๋ณ€ ์ „์—ญ ๋ณ€์ˆ˜๋Š” ์ƒ์„ฑ๋œ ํŒŒ์ผ์—์„œ ์ผ์ •ํ•˜๊ฒŒ ์ ‘ํž ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
์•”ํ˜ธ. ์˜ˆ๋ฅผ ๋“ค์–ด Emscripten์€ ๋ชจ๋“  ํ•ญ๋ชฉ์„ ์˜คํ”„์…‹ํ•˜์—ฌ ์žฌ๋ฐฐ์น˜ ๊ฐ€๋Šฅํ•œ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.
์ •์  ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ. ์˜คํ”„์…‹์€ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์—†๋Š” ์ „์—ญ var๋กœ ์ „๋‹ฌ๋ฉ๋‹ˆ๋‹ค.
๋ชจ๋“ˆ์ด ์ธ์Šคํ„ด์Šคํ™”๋  ๋•Œ. WebAssembly.Instance๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ
์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ „๋ฌธํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/WebAssembly/design/issues/838#issuecomment -256522163,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AEDOO9sJPgujK3k0f6P7laYV_zaJxES5ks5q3_1LgaJpZM4Kh1gM
.

๊ธฐ๊ปํ•ด์•ผ ๋น„๊ทœ๋ฒ”์ ์ธ ๋ฉ”๋ชจ๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๋Š” ๋ฐ ๋™์˜ํ–ˆ์Šต๋‹ˆ๋‹ค.

SM์—์„œ๋Š” ํ˜„์žฌ ์žฌ์ปดํŒŒ์ผํ•˜์ง€ ์•Š๋„๋ก ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•œ ์˜ˆ์ธก ๊ฐ€๋Šฅํ•œ ์ปดํŒŒ์ผ ๋น„์šฉ ๋ชจ๋ธ์ด ์žˆ๋„๋ก ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ ๊ฐœ๋ฐœ์ž๊ฐ€ WebAssembly.compile ๋ฐ IDB๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ปดํŒŒ์ผ ํžˆํŠธ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋„๋ก). . ๋™๊ธฐ Instance ์ƒ์„ฑ์ž ๋‚ด์—์„œ ์ธ์Šคํ„ด์Šคํ™” ์‹œ๊ฐ„ ์žฌ์ปดํŒŒ์ผ์€ ํ™•์‹คํžˆ ํ•ด๋‹น ๋น„์šฉ ๋ชจ๋ธ์„ ๊นจ๊ณ  ์ฃผ์š” ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋ณ„๋„์˜ ์ปดํŒŒ์ผ์€ ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์ฃผ๋ณ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋กœ ์ „๋ฌธํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค์–‘ํ•œ ์ตœ์ ํ™”์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ์ƒ์ถฉ๋œ๋‹ค๋Š” ์ ์„ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๊ณผ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ํ•˜๋‚˜์˜ ๋น„๋™๊ธฐ ์ž‘์—…์œผ๋กœ ํ†ตํ•ฉํ•˜๋Š” ๊ฒƒ์€ ์˜๋ฏธ๊ฐ€ ์žˆ์œผ๋ฉฐ ๊ณผ๊ฑฐ์— ๊ณ ๋ คํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋‹จ์ ์€ ์ด๊ฒƒ์ด ๋ช…์‹œ์  ์บ์‹ฑ์„ ์–ต์ œํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค( Module ). ๋”ฐ๋ผ์„œ ๊ฐœ๋ฐœ์ž๋Š” ๋ถˆ์พŒํ•œ ์ ˆ์ถฉ์•ˆ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ผ๋ถ€ ์˜ต์…˜:

  • impl์€ ํ˜„์žฌ FF์— ์žˆ๋Š” asm.js์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์•”์‹œ์  ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ์ง€์ • ์บ์‹ฑ(ํ‚ค์— ์ฃผ๋ณ€ ๋งค๊ฐœ๋ณ€์ˆ˜๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Œ)์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ์ข…์˜ ๊ณ ํ†ต์ด๋ฉฐ ์•”์‹œ์  ์บ์‹œ์˜ ๋ชจ๋“  ์˜ˆ์ธก ๊ฐ€๋Šฅ์„ฑ/๊ฒฝํ—˜์  ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์ƒˆ๋กœ์šด ๋ฐฉ๋ฒ• (์˜ˆ๋ฅผ ๋“ค์–ด, ์ƒˆ๋กœ์šด ๋งŒ๋“ค ์ˆ˜ WebAssembly.Cache ๋‹น์‹ ์ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ์™€ ์ธ์Šคํ„ด์Šค ๋งค๊ฐœ ๋ณ€์ˆ˜๋ฅผ ์ „๋‹ฌ API๋ฅผํ•˜๊ณ  ๋‹ค์‹œ ์–ป์„ Promise<Instance> .

ํ›„์ž๋Š” ์ €๋ฅผ ํฅ๋ฏธ๋กญ๊ฒŒ ํ•˜๊ณ  IDB๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋‚˜์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์บ์‹ฑ์„ ๋”์šฑ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐํšŒ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ(์บ์‹œ๋Š” ๋ชฉ์ ์— ๋งž๊ฒŒ ํŠนํ™”๋˜์–ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์—) ํ™•์‹คํžˆ ํฐ ๊ธฐ๋Šฅ์ด๋ฉฐ ์‹œ๊ฐ„์ด ์ข€ ๊ฑธ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ๊ณ ๋ คํ•˜๋‹ค.

@rossberg-chromium ๋‚ด ๋ชฉ์ ์„ ์ž˜๋ชป ์„ค๋ช…ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์ด ๋งํ•˜๋Š” ๋‚ด์šฉ์— ๋Œ€ํ•ด ๋…ผ์Ÿํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. API ์•„๋ž˜์— ์ˆจ์–ด ์žˆ๋Š” ๊ฐœ๋ฐœ์ž๋“ค์—๊ฒŒ ์‹ฌ๊ฐํ•œ ๋†€๋ผ์›€์œผ๋กœ ๋ณด์ด๋Š” ๊ฒƒ์„ ์ง€์ ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” .compile ์˜ ๊ฒฐ๊ณผ๊ฐ€ ๋‹ค์‹œ ์ปดํŒŒ์ผ๋˜๋Š” ๊ฒƒ์„ ๊ธฐ๋Œ€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ๋””์ž์ธ ๊ฒฐํ•จ์ฒ˜๋Ÿผ ๋ณด์ธ๋‹ค.

@lukewagner ๋Š” ์•”์‹œ์  ๋˜๋Š” ๋ช…์‹œ์  ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋”๋ผ๋„ ๋™์ผํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„/์›์ ์—์„œ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ WebAssembly.Memory ๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š”์ง€๋Š” ๋ธŒ๋ผ์šฐ์ € ์ œํ•œ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜์ง€๋งŒ ๋ฌธ์ œ์™€ ์ง๊ตํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ๊ฒƒ์„ ๋‚ด๊ฐ€ ์ž˜๋ชป ์ดํ•ดํ–ˆ๋‹ค๋ฉด ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค.

์•„๋งˆ๋„ .compile ๋ฐ Module ์— Memory ๊ฐ€ ์ฃผ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ  Instance ์—๋Š” ๋‹ค๋ฅธ ์ปดํŒŒ์ผ/์ธ์Šคํ„ด์Šคํ™”์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ๋Š” .memory ์†์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ?

์žฌ์ปดํŒŒ์ผ ๊ฐ€๋Šฅ์„ฑ์„ ์—†์• ๋ ค๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์ฒซ ๋ฒˆ์งธ ์ปดํŒŒ์ผ ์‹œ๊ฐ„(๋˜๋Š” ์บ์‹œ ๊ฒ€์ƒ‰ ์‹œ๊ฐ„)์— ์™„๋ฒฝํ•œ ์ •๋ณด wrt Memory ๊ฐ€ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ๊ด€์šฉ์  API ์‚ฌ์šฉ์„ ์›ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ปดํŒŒ์ผ์—์„œ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

@jfbastien ํŠน์ • ์ธ์Šคํ„ด์Šคํ™” ๋งค๊ฐœ๋ณ€์ˆ˜(๊ทธ๋ž˜์„œ Memory )๊ฐ€ ์ œ๊ณต๋œ ์•”์‹œ์ /๋ช…์‹œ์  ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์ปดํŒŒ์ผ์ด ์–ด๋–ป๊ฒŒ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@jfbastien ํŠน์ • ์ธ์Šคํ„ด์Šคํ™” ๋งค๊ฐœ๋ณ€์ˆ˜(๊ทธ๋ž˜์„œ Memory )๊ฐ€ ์ œ๊ณต๋œ ์•”์‹œ์ /๋ช…์‹œ์  ์บ์‹ฑ์„ ์‚ฌ์šฉํ•˜๋ฉด ์žฌ์ปดํŒŒ์ผ์ด ์–ด๋–ป๊ฒŒ ํ•„์š”ํ•œ์ง€ ์•Œ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋งŽ์€ Memory ๋งŒ๋“ญ๋‹ˆ๋‹ค.
  2. Memory ๊ฐ€ ๋„ˆ๋ฌด ๋งŽ๊ธฐ ๋•Œ๋ฌธ์— ๋ช…์‹œ์ (๋Š๋ฆฐ) ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค.
  3. ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ์บ์‹œํ•ฉ๋‹ˆ๋‹ค.
  4. ํŽ˜์ด์ง€๋ฅผ ๋‚˜๊ฐ€์‹ญ์‹œ์˜ค.
  5. ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œํ•˜์‹ญ์‹œ์˜ค.
  6. ๋น ๋ฅธ ๋ฒ„์ „์„ ๊ฐ€์ ธ์˜ค๋Š” Memory ํ•˜๋‚˜๋งŒ ํ• ๋‹นํ•˜์‹ญ์‹œ์˜ค.
  7. ์บ์‹œ์—์„œ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  8. ๋Š๋ฆฐ ์ฝ”๋“œ ์ˆ˜์‹  Instance .

์ด ์‹œ์ ์—์„œ ์žฌ์ปดํŒŒ์ผ์ด _ํ•„์š”ํ•˜์ง€ ์•Š๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ํ•„์š”ํ•˜์ง€ ์•Š์„ ๋•Œ ๋Š๋ฆฐ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด: ๋‚˜๋Š” ๋‹น์‹ ์ด ์ œ์•ˆํ•œ ์ด Cache API๊ฐ€ ๋งˆ์Œ์— ๋“ ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด WebAssembly๋ฅผ ๋” ์œ ์šฉํ•˜๊ฒŒ ๋งŒ๋“ ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•œ๋‹ค. ๐Ÿ˜ข

์ธ์Šคํ„ด์Šคํ™” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ํ–ฅ์ƒ๋œ ์บ์‹œ์— ๋Œ€ํ•œ ์ œ ์š”์ ์ž…๋‹ˆ๋‹ค. ์บ์‹œ๋œ ํ•ญ๋ชฉ์ด ์ธ์Šคํ„ด์Šคํ™” ๋งค๊ฐœ๋ณ€์ˆ˜์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์บ์‹œ๋ฅผ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋‹จ๊ณ„๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ๋งŽ์€ Memory
  2. ์บ์‹œ์—์„œ Instance ์š”์ฒญ, ๊ทธ ์ค‘ ํ•˜๋‚˜๋ฅผ (๋Š๋ฆฐ) Memory
  3. ๋Š๋ฆฐ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜๊ณ  ์บ์‹œ๋˜์–ด Instance ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  4. ํŽ˜์ด์ง€๋ฅผ ๋– ๋‚˜๋‹ค
  5. ํŽ˜์ด์ง€๋ฅผ ๋‹ค์‹œ ๋กœ๋“œ
  6. ํ•˜๋‚˜๋งŒ ํ• ๋‹น Memory
  7. ์บ์‹œ์—์„œ Instance ์š”์ฒญ, ๋น ๋ฅธ Memory
  8. ๋น ๋ฅธ ์ฝ”๋“œ๋Š” ์ปดํŒŒ์ผ๋˜๊ณ  ์บ์‹œ๋˜์–ด Instance ๋กœ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.

8๋‹จ๊ณ„ ์ดํ›„์—๋Š” ๋ชจ๋“  ํ–ฅํ›„ ํŽ˜์ด์ง€ ๋กœ๋“œ๊ฐ€ ๋น ๋ฅด๊ฑฐ๋‚˜ ๋Š๋ฆฐ ์ฝ”๋“œ๋กœ ์บ์‹œ๋ฉ๋‹ˆ๋‹ค.

@lukewagner ์šฐ์„ , WebAssembly๊ฐ€ ๊ฒฐ์ •์  ์„ฑ๋Šฅ์„ ์ œ๊ณตํ•œ๋‹ค๋Š” ๋ช…์‹œ๋œ ๋ชฉํ‘œ์— ๋ฐ˜ํ•˜๋Š” ์™„ํ™” ๋ฐฉ์•ˆ์„ ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋Š๋ฆฐ ๊ฒƒ๊ณผ ๋น ๋ฅธ ๊ฒƒ์˜ ์ฐจ์ด๋Š” ์•ฝ 20%๋กœ ๋งˆ์ง€๋ง‰์œผ๋กœ ์ธ์šฉ๋˜์—ˆ์œผ๋ฏ€๋กœ, ๊ฒฐ์ •๋ก ์  ์„ฑ๋Šฅ์„ ๋ชฉํ‘œ๋กœ ํ•˜๋Š” ์‚ฌ์–‘์ด API ํŠน์„ฑ ๋•Œ๋ฌธ์— ๋ฐ”๋‹ฅ์— ๋–จ์–ด๋œจ๋ฆฌ๋ฉด ์ •๋ง ์•…์ทจ๊ฐ€ ๋‚  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ”„๋กœํŒŒ์ผ-์žฌ์ปดํŒŒ์ผ-์บ์‹œ ์ตœ์ ํ™”์˜ ํ•„์š”์„ฑ์„ ์—†์• ๊ธฐ ์œ„ํ•ด ์‚ฌ์–‘์ด ์ด๋ฏธ ๋‹ค๋ฅธ ๊ณณ์—์„œ ๋งŽ์€ ๋ฌธ์ œ๋ฅผ ์ผ์œผํ‚ค๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฝ˜ํ…์ธ  ์ฃผ์†Œ ์ง€์ • ์บ์‹œ๊ฐ€ ์žˆ๋Š” ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์˜ฌ๋ฐ”๋ฅธ ์†”๋ฃจ์…˜์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์šฐ๋ฆฌ๋Š” ์ฝ”๋“œ๊ฐ€ ์บ์‹œ๋˜์ง€ ์•Š๋”๋ผ๋„ ์•ฑ์ด ํ•ฉ๋ฆฌ์ ์ธ ๋™์ž‘์„ ํ•  ์ˆ˜ ์žˆ๋„๋ก ์ •ํ™•ํ•˜๊ฒŒ ์ปดํŒŒ์ผ์„ ์•ฝ์†ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ง€์ •๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ธํ•ด ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์บ์‹œ ๋˜๋Š” ๊ธฐํƒ€ ์™„ํ™”๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์ด์‹ ๊ฐ€๋Šฅํ•œ ๋น„์šฉ ๋ชจ๋ธ์„ ์ œ๊ณตํ•˜๋ ค๋Š” ๋ชฉํ‘œ์— ์‹คํŒจํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜์—๊ฒŒ ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ์ด๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฝ์Ÿ์ ์ธ ์ด์œ ๋กœ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ํšจ๊ณผ์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋Š” ์ตœ์ ํ™” ์ค‘ ํ•˜๋‚˜(4GB ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ๊ฒฝ๊ณ„ ํ™•์ธ, ๋‚˜๋Š” 4GB ํ•ดํ‚น์ด๋ผ๊ณ  ์นญํ•จ)๋Š” ํ˜„์žฌ ์‚ฌ์–‘์—์„œ ํฌ์ƒ ์—†์ด๋Š” ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜:

  • wasm ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ํ•ญ์ƒ 4GB์˜ ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ์‚ฌ๋žŒ๋“ค์ด ์ž‘์€ ๋ชจ๋“ˆ์— WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๋งŽ์€ ํ•ญ๋ชฉ์„ ํ• ๋‹นํ•˜๋ฉด ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ์ œํ•œ, ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐํ™” ๋˜๋Š” ๊ธฐํƒ€ ๋ฌธ์ œ์— ๋ถ€๋”ชํžˆ๊ฒŒ ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ๋งŽ์€ ํ• ๋‹น์„ ํ—ˆ์šฉํ•˜๋ฉด ASLR๊ณผ ๊ฐ™์€ ๋ณด์•ˆ ์™„ํ™”์˜ ํšจ์œจ์„ฑ์ด ๋–จ์–ด์งˆ๊นŒ ๋‘๋ ต์Šต๋‹ˆ๋‹ค. ๊ธฐ์กด API๋Š” ํ• ๋‹นํ•œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ปค๋ฐ‹ํ•˜๊ณ  ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์ด ํ• ๋‹นํ•˜๊ธฐ ์ „์— OOM ๋˜๋Š” ์ถฉ๋Œํ•˜๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ์œ„ํ—˜์„ ๊ณต์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
  • ์ธ์Šคํ„ด์Šคํ™” ์ค‘์— ๋ถˆ์ผ์น˜๋ฅผ ๋ฐœ๊ฒฌํ•  ๋•Œ ์žฌ์ปดํŒŒ์ผ์„ ํ—ˆ์šฉํ•˜๋ฉด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋Š” 4GB ํ•ดํ‚น์„ ์›ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ์—๋Š” ๊ฐ€์ƒ ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ์—†์Šต๋‹ˆ๋‹ค). ์ธ์Šคํ„ด์Šคํ™”๋กœ ์ธํ•ด ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ 4GB ์˜์—ญ์œผ๋กœ ์ด๋™ํ•œ ๊ฒฝ์šฐ์—๋„ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด์ „ ์š”์ ์„ ์ฐธ์กฐํ•˜์„ธ์š”. ๋”ฐ๋ผ์„œ ์•„๋งˆ๋„ ์ด๋Ÿฐ ์ผ์ด ๋ฐœ์ƒํ•  ๋•Œ๋งˆ๋‹ค ์ด๋ฅผ ๋ฐœ๊ฒฌํ•œ ๋ธŒ๋ผ์šฐ์ €์˜ P1 ๋ฒ„๊ทธ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์‚ฌ์–‘์ด ๊ณต๊ธ‰์—…์ฒด๊ฐ€ wasm ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ํ• ๋‹น๋  ๋•Œ๋งˆ๋‹ค 4GB ์˜ˆ์•ฝ์„ ํ—ˆ์šฉํ•˜๊ฑฐ๋‚˜ ์ด๋ฅผ ๊ฐ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์บ์‹œ/์ง€์—ฐ ์ปดํŒŒ์ผ/ํ”„๋กœํŒŒ์ผ ์ตœ์ ํ™”๋ฅผ ๊ฐ–๋„๋ก ์ˆ˜๋ ดํ•˜๋„๋ก ๊ถŒ์žฅํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋งˆ์ง€๋ง‰์œผ๋กœ, ๋‚˜๋Š” ์ด๊ฒƒ์„ ๋น„๊ทœ๋ฒ”์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์š”์ ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๊ทœ๋ฒ”์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” API๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋Š”์ง€ ์•Œ์ง€ ๋ชปํ•œ ์ฑ„ ๋ฌด์–ธ๊ฐ€๋ฅผ ์ปดํŒŒ์ผํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์„ ๋ฐฐ์ œํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์„ ํ•˜๋Š” ๋งŽ์€ ๋ฐฉ๋ฒ•์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•œ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ธ์Šคํ„ด์Šคํ™”๋Š” ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณ„๋„์˜ ์ปดํŒŒ์ผ ๋‹จ๊ณ„๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋‹จ๊ณ„๋ผ๋Š” ๊ฒƒ์„ ๋ถ„๋ช…ํžˆ ํ•˜๊ณ  ํด๋ผ์ด์–ธํŠธ์—๊ฒŒ ์ด๊ฒƒ์ด ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋‹จ๊ณ„์ž„์„ ๊ฐ•๋ ฅํ•˜๊ฒŒ ์•”์‹œํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ API์—์„œ ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์ปดํŒŒ์ผ ๋Œ€์ƒ ๋ฉ”๋ชจ๋ฆฌ์— 4GB ํ•ดํ‚น์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ•ญ์ƒ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๊ฐ€ ์ด๊ฒƒ์„ ์ด์ œ์„œ์•ผ ์•Œ์•„์ฐจ๋ฆฐ๋‹ค๋Š” ๊ฒƒ์ด ์Šฌํ”„์ง€๋งŒ, ์—ฌ๋Ÿฌ๋ถ„์ด ์ด๊ฒƒ์ด ๋” ํฐ ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์— ๋†€๋ž์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ„๊ณผํ•˜๊ณ  ์žˆ๋Š” ์บ์‹ฑ ์ด์™ธ์˜ ์™„ํ™” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋™๊ธฐ ๋ถ€์—ฌ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ @jfbastien ์€ ๋ชจ๋“ˆ์ด ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์„ ํ˜ธํ•˜๋„๋ก ์ž‘์„ฑ๋˜์—ˆ๋‹ค๊ณ  ์ง€์ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ์ฃผ๋กœ ํŠน์ • ๋ชจ๋“ˆ์ด ์›ํ•  ๋•Œ ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ์ตœ์ ํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ์„ ์ซ“๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ๋ชจ๋“ˆ์ด ์›ํ•˜์ง€ ์•Š์„ ๋•Œ ๊ทธ๊ฒƒ์„ ํ•˜์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. , ์šฐ์„  ์ˆœ์œ„๋ฅผ ๊ตฌ๋ถ„ํ•˜๋ ค๊ณ  ์• ์“ฐ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค).

๊ทธ๋ ‡๋‹ค๋ฉด ์บ์‹ฑ ๋˜๋Š” ๋น„๋™๊ธฐ ์ธ์Šคํ„ด์Šคํ™”์— ๋Œ€ํ•œ ์ด๋Ÿฌํ•œ ๋Œ€์•ˆ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. ๋ชจ๋“ˆ ์ž‘์„ฑ์ž๋Š” ์ตœ์†Œ/์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ๋กœ 4GB๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.
  2. ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ(์ ์–ด๋„ ๋น„๋™๊ธฐ, ๋™๊ธฐํ™”๋„ ๊ฐ€๋Šฅ)์˜ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.

"4GB ํ•ดํ‚น" ๋ฌธ์ œ์™€ ์ด๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์ด๋ฅผ ์˜ˆ์ƒํ•˜๋Š” ์ฝ”๋“œ ๊ฐ„์˜ ๋ถˆ์ผ์น˜์— ๋Œ€ํ•ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋‘ ๊ฐ€์ง€ ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์ปดํŒŒ์ผ์ด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? (๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์€ ๋” ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ฒŒ ๋˜์–ด ์Šฌํ”„์ง€๋งŒ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ํ›จ์”ฌ ๋” ๋‚˜๋น ์ง€์ง€ ์•Š๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ์ž‘์„ฑ์ž๊ฐ€ ๋‘ ๊ฐ€์ง€๋ฅผ ๋™์‹œ์— ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”?)

@mtrofin ์‚ฌ์šฉ ํ•˜์ง€ ์•Š์œผ

On 2.: ์—ฌ์ „ํžˆ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•ด๋‹น ๋ณ€ํ˜•์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹คํŒจํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

@kripken ์ด์ค‘ ์ปดํŒŒ์ผ์€ ์ข‹์€ ์ƒ๊ฐ์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@kripken ๋‚˜๋Š” ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ… ์—†์ด ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์บ์ฃผ์–ผ ๋ธŒ๋ผ์šฐ์ง•์˜ ๊ฒฝ์šฐ WebAssembly๊ฐ€ ํ›Œ๋ฅญํ•˜๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค. ๋ฉ‹์ง„ ์ผ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  URL์„ ๋ณด๋‚ด๋ฉด ํด๋ฆญํ•˜๊ณ  ๋ช‡ ๋ถ„ ๋™์•ˆ ์ฆ๊ฒ๊ฒŒ ์ง€๋ƒ…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์›น์„ ๋ฉ‹์ง€๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๋Š” ๋งŽ์€ ์ปดํŒŒ์ผ์ด ์บ์‹œ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋กœ ์ด๋ฃจ์–ด์ง€๋ฏ€๋กœ ์ปดํŒŒ์ผ ์‹œ๊ฐ„์ด ์‚ฌ์šฉ์ž์˜ ๋ฐฐํ„ฐ๋ฆฌ ์ˆ˜๋ช…์— ํฐ ์—ญํ• ์„ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ, ๋”๋ธ” ์ปดํŒŒ์ผ์€ ์ €๋ฅผ ์Šฌํ”„๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

@mtrofin

๋ชจ๋“ˆ ์ž‘์„ฑ์ž๋Š” ์ตœ์†Œ/์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ๋กœ 4GB๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์žฅ์น˜์— 4GB์˜ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์‚ฌ์–‘ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์ธ์Šคํ„ด์Šค๋ฅผ ์ƒ์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ(์ ์–ด๋„ ๋น„๋™๊ธฐ, ๋™๊ธฐํ™”๋„ ๊ฐ€๋Šฅ)์˜ ๋ณ€ํ˜•์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ค‘ ์ปดํŒŒ์ผ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@pizlonator ์ง€๊ธˆ๊นŒ์ง€ ๋‹ค๋ฅธ ๋ชจ๋“œ์˜ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ•„์š”ํ•œ ๋””์ž์ธ์€ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ 64๋น„ํŠธ์— 4GB ์˜์—ญ์„ ํ• ๋‹นํ–ˆ๊ณ  Linux, OSX ๋ฐ Windows์—์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์†Œ๊ทœ๋ชจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์‚ฌ์†Œํ•œ ์ „์ฒด ๊ณ ๊ฐˆ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์ˆ˜์ ์ธ ์ƒํ•œ์„ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ƒˆ๋กœ์šด ์ œ์•ฝ ์กฐ๊ฑด์€ iOS์— 4GB ํ• ๋‹น ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„ ์ œํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํ•œ ๊ฐ€์ง€ ๊ด€์ฐฐ์€ 4GB ํ•ดํ‚น์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ๊ณ„ ํ™•์ธ ์ œ๊ฑฐ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ wasm ๋ฉ”๋ชจ๋ฆฌ ๋์— ์ž‘์€ ๋ณดํ˜ธ ์˜์—ญ์„ ๊ฐ€์ง์œผ๋กœ์จ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ดˆ๊ธฐ ์‹คํ—˜์€ ๊ธฐ๋ณธ ๋ถ„์„(๋ฃจํ”„์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๋™์ผํ•œ ๊ธฐ๋ณธ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” ๋กœ๋“œ/์ €์žฅ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ ์ œ๊ฑฐ)์ด ์ด๋ฏธ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ์˜ ๋Œ€๋žต ์ ˆ๋ฐ˜์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋” ๋‚˜์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 4GB ํ•ดํ‚น์€ ๋” ๊ฒธ์†ํ•˜๊ณ  ๋œ ํ•„์š”ํ•œ ์†๋„ ํ–ฅ์ƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ์ด์ „์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ(๊ฐ€๋“œ ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ์ œ๊ฑฐ ์‚ฌ์šฉ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋น„๊ด€์ ์œผ๋กœ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ ๊ณ ์† ๋ชจ๋“œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐํ•ฉํ•˜๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์ด์ƒ์ ์ธ ๊ณ ์† ๋ชจ๋“œ ์ฝ”๋“œ์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ž‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@lukewagner

์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“œ์˜ ์ฝ”๋“œ ์ƒ์„ฑ์ด ํ•„์š”ํ•œ ๋””์ž์ธ์„ ๊ณ ๋ คํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•ญ์ƒ 64๋น„ํŠธ์— 4GB ์˜์—ญ์„ ํ• ๋‹นํ–ˆ๊ณ  Linux, OSX ๋ฐ Windows์—์„œ ์ˆ˜์ฒœ ๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์„ฑ๊ณตํ•˜๋Š” ๊ฒƒ์„ ๊ด€์ฐฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๋งŽ์€ ์†Œ๊ทœ๋ชจ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ง€์›ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์‚ฌ์†Œํ•œ ์ „์ฒด ๊ณ ๊ฐˆ์„ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ๋ณด์ˆ˜์ ์ธ ์ด ์ˆ˜๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์„œ ํ•ด๊ฒฐํ•˜๋ ค๋Š” ์ƒˆ๋กœ์šด ์ œ์•ฝ ์กฐ๊ฑด์€ iOS์— 4GB ํ• ๋‹น ์ˆ˜๋ฅผ ์ค„์ผ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„ ์ œํ•œ์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ iOS ๊ด€๋ จ ๋ฌธ์ œ๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ํ• ๋‹น์„ ๋งŽ์ด ํ—ˆ์šฉํ•˜๋ฉด ๊ฐ ํ• ๋‹น์ด ASLR์˜ ํšจ์œจ์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์œ„ํ—˜์ด ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ VM์—๋Š” ํ• ๋‹นํ•˜๋Š” 4GB ๊ณต๊ฐ„ ์ˆ˜์— ๋Œ€ํ•ด ๋งค์šฐ ๋‚ฎ์€ ์ œํ•œ์„ ์„ค์ •ํ•˜๋Š” ์˜ต์…˜์ด ์žˆ์–ด์•ผ ํ•˜์ง€๋งŒ ์ด๋Š” ๋Œ€์ฒด ๊ฒฝ๋กœ๊ฐ€ ๋„ˆ๋ฌด ๋น„์‹ธ์ง€ ์•Š์•„์•ผ ํ•จ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค(์ฆ‰, ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ํ•„์š”๊ฐ€ ์—†์–ด์•ผ ํ•จ).

ํ• ๋‹นํ•  4GB ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ์ด ํ•œ๊ณ„์— ๋„๋‹ฌํ•˜๋ฉด ๋ฌด์—‡์„ ํ•ฉ๋‹ˆ๊นŒ? ์™„์ „ํžˆ ํฌ๊ธฐํ•˜๊ฑฐ๋‚˜ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ๋‹ค์‹œ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๊นŒ?

๋”ฐ๋ผ์„œ ํ•œ ๊ฐ€์ง€ ๊ด€์ฐฐ์€ 4GB ํ•ดํ‚น์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ๊ณ„ ํ™•์ธ ์ œ๊ฑฐ์˜ ๋งŽ์€ ๋ถ€๋ถ„์„ wasm ๋ฉ”๋ชจ๋ฆฌ ๋์— ์ž‘์€ ๋ณดํ˜ธ ์˜์—ญ์„ ๊ฐ€์ง์œผ๋กœ์จ ํ”ผํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ์˜ ์ดˆ๊ธฐ ์‹คํ—˜์€ ๊ธฐ๋ณธ ๋ถ„์„(๋ฃจํ”„์™€ ๊ด€๋ จ์ด ์—†์œผ๋ฉฐ ๋™์ผํ•œ ๊ธฐ๋ณธ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” ๋กœ๋“œ/์ €์žฅ์— ๋Œ€ํ•œ ๊ฒ€์‚ฌ ์ œ๊ฑฐ)์ด ์ด๋ฏธ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ์˜ ๋Œ€๋žต ์ ˆ๋ฐ˜์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ์ด๊ฒƒ์€ ๋” ๋‚˜์•„์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ 4GB ํ•ดํ‚น์€ ๋” ๊ฒธ์†ํ•˜๊ณ  ๋œ ํ•„์š”ํ•œ ์†๋„ ํ–ฅ์ƒ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ถ„์„์„ ํ†ตํ•ด ๋” ๋งŽ์€ ๊ฒ€์‚ฌ๋ฅผ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—๋Š” ๋™์˜ํ•˜์ง€๋งŒ ์ตœ๊ณ ์˜ ์„ฑ๋Šฅ์„ ์›ํ•œ๋‹ค๋ฉด 4GB ํ•ดํ‚น์„ ์„ ํƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋ชจ๋‘๊ฐ€ ์ตœ๊ณ  ์„ฑ๋Šฅ์„ ์›ํ•˜๊ณ  ๋ณด์•ˆ ๋ฌธ์ œ, ๋ฆฌ์†Œ์Šค ๋ฌธ์ œ, ์˜ˆ๊ธฐ์น˜ ์•Š์€ ์žฌ์ปดํŒŒ์ผ๋„ ์ผ์œผํ‚ค์ง€ ์•Š๊ณ  ์ตœ๊ณ  ์„ฑ๋Šฅ์„ ์–ป์„ ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด ์ข‹์„ ๊ฒƒ ๊ฐ™์•„์š”.

๋‚ด๊ฐ€ ์ด์ „์— ๊ฐ€์ง€๊ณ  ์žˆ๋˜ ๋˜ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๋Š” ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ(๊ฐ€๋“œ ํŽ˜์ด์ง€ ๊ธฐ๋ฐ˜ ์ œ๊ฑฐ ์‚ฌ์šฉ)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๋น„๊ด€์ ์œผ๋กœ ์ปดํŒŒ์ผํ•œ ๋‹ค์Œ ๊ณ ์† ๋ชจ๋“œ ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฒฐํ•ฉํ•˜๋ฉด ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ์ด์ƒ์ ์ธ ๊ณ ์† ๋ชจ๋“œ ์ฝ”๋“œ์— ๋น„ํ•ด ์ƒ๋‹นํžˆ ์ž‘์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๊ฐ€ ์žˆ๋Š” ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์— ๋Œ€ํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ณ ์ •ํ•˜๊ณ  ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜์— ๋Œ€ํ•œ ๋ ˆ์ง€์Šคํ„ฐ๋ฅผ ๊ณ ์ •ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์Šต๋‹ˆ๋‹ค.

4GB ํ•ดํ‚น์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋Š” ๋ฉ”๋ชจ๋ฆฌ ๊ธฐ๋ฐ˜ ๋ ˆ์ง€์Šคํ„ฐ๋งŒ ๊ณ ์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ํ›Œ๋ฅญํ•œ ์†”๋ฃจ์…˜์ด ์•„๋‹™๋‹ˆ๋‹ค.

์‚ฌ์–‘๊ณผ ๊ตฌํ˜„์„ ๋žญ๊ธ€๋งํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ์™ธ์— ์ปดํŒŒ์ผ๊ณผ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์•ฝ์†๋œ ํ•˜๋‚˜์˜ ์ž‘์—…์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์˜ ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋ฌธ์ œ๋Š” ์ด๋Ÿฌํ•œ ํ• ๋‹น์„ ๋งŽ์ด ํ—ˆ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ๊ฐ๊ฐ์˜ ์ด๋Ÿฌํ•œ ํ• ๋‹น ๋•Œ๋ฌธ์— ๋ณด์•ˆ ์œ„ํ—˜์ด ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ• ๋‹น์€ ASLR์˜ ํšจ์œจ์„ฑ์„ ๊ฐ์†Œ์‹œํ‚ต๋‹ˆ๋‹ค.

์ €๋Š” ASLR์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ iiuc, ๋น„๋ก ์šฐ๋ฆฌ๊ฐ€ ๋ณด์ˆ˜์ ์ธ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋”๋ผ๋„(์ฆ‰, ์ปค๋„์ด ํ•ด๋‹น ์ˆ˜์— ๋„๋‹ฌํ•˜์—ฌ mmap ์‹คํŒจํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ํ• ๋‹นํ•˜๋„๋ก ํ—ˆ์šฉํ•œ ๊ฒฝ์šฐ) address-ranges max), ์ „์ฒด 47๋น„ํŠธ ์ฃผ์†Œ ์ง€์ • ๊ฐ€๋Šฅ ๊ณต๊ฐ„์˜ ์ž‘์€ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ฝ”๋“œ ๋ฐฐ์น˜๋Š” ์ด 47๋น„ํŠธ ๊ณต๊ฐ„์—์„œ ๊ณ„์† ๋งค์šฐ ๋ฌด์ž‘์œ„์ ์ž…๋‹ˆ๋‹ค. IIUC, ASLR ์ฝ”๋“œ ๋ฐฐ์น˜๋„ ์™„์ „ํžˆ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์žˆ์„์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

ํ• ๋‹นํ•  4GB ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์— ์ œํ•œ์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋„ˆ ๋ญํ•˜๋‹ˆ
์ด ํ•œ๊ณ„์— ๋„๋‹ฌํ–ˆ์„ ๋•Œ - ์™„์ „ํžˆ ํฌ๊ธฐํ•  ๊ฒƒ์ธ๊ฐ€, ์•„๋‹ˆ๋ฉด ์ธ์Šคํ„ด์Šคํ™”ํ•  ๋•Œ ์žฌ์ปดํŒŒ์ผํ•  ๊ฒƒ์ธ๊ฐ€?

๊ธ€์Ž„์š”, asm.js ์‹œ์ ˆ๋ถ€ํ„ฐ 1000๊ฐœ๋ฐ–์— ์•ˆ ๋๊ฑฐ๋“ ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๊ทธ๋ƒฅ ๋˜์ง‘๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋ถ€๋”ช์ณ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋งŽ์€ ์Šˆํผ ๋ชจ๋“ˆํ™” ์•ฑ(๊ฐ๊ฐ ๋งŽ์€ ๊ฐœ๋ณ„ wasm ๋ชจ๋“ˆ ํฌํ•จ)์ด ์žˆ๋”๋ผ๋„ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. Memory ๋Š” ์•ฑ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜์ฒœ ๊ฐœ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์–ดํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ๊ธฐ์กด์˜ ArrayBuffer ์™€ ๋‹ค๋ฅด๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์–‘๊ณผ ๊ตฌํ˜„์„ ๋žญ๊ธ€๋งํ•ด์•ผ ํ•˜๋Š” ๋ฒˆ๊ฑฐ๋กœ์›€ ์™ธ์— ๋‹จ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?
์ปดํŒŒ์ผ๊ณผ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ํ•˜๋‚˜์˜ ์•ฝ์†๋œ ์ž‘์—…์œผ๋กœ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ?

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Promise<Instance> eval(bytecode, importObj) API๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ ์ด์ œ ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ถ€ ํ”Œ๋žซํผ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์‚ฌ์ด์—์„œ ์„ ํƒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ค์šด ์œ„์น˜์— ๋†“์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”Œ๋žซํผ. ์บ์‹ฑ๊ณผ ํ†ตํ•ฉ๋˜๋Š” ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ์œ„์—์„œ ๋ช…์‹œ์ ์ธ Cache API๋กœ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค.

์ƒˆ๋กœ์šด ์•„์ด๋””์–ด: new Instance ์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜๊ณ  WebAssembly.instantiate ์™€ ๊ฐ™์ด WebAssembly.compile ์™€ ๊ฐ™์ด ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋น„๋™๊ธฐ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๊ฒƒ์€ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šคํ™”์— ๋ช‡ ms๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— _์–ด์จŒ๋“ _ ๊ณ ๋ คํ–ˆ๋˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์–‘์—์„œ ์—”์ง„์ด compile ๋˜๋Š” instantiate ์—์„œ ๊ฐ’๋น„์‹ผ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค(์—”์ง„์ด ์ง€์—ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ/์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘˜ ๋‹ค!).

compile d Module ๊ฐ€ IDB์— ์ €์žฅ๋˜์–ด ์žˆ์„ ๋•Œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚จ์ง€๋งŒ, ์—ฌ๋Ÿฌ codegen ๋ชจ๋“œ๊ฐ€ _์–ด์จŒ๋“ _ ์žˆ์„ ๋•Œ ์ด๋Š” ์–ด๋ ค์šด ์งˆ๋ฌธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋Š” IDB์— ์ €์žฅ๋˜๊ฑฐ๋‚˜ IDB์—์„œ ๊ฒ€์ƒ‰๋œ Module ๊ฐ€ IDB ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํ•ธ๋“ค์„ ์žก๊ณ  ์ด ํ•ญ๋ชฉ์— ์ƒˆ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ IDB ํ•ญ๋ชฉ์€ ๋ชจ๋“ˆ์˜ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „์„ ๋Š๋ฆฌ๊ฒŒ ์ถ•์ ํ•˜๊ณ  ์ธ์Šคํ„ด์Šคํ™” ์ค‘์— ํ•„์š”ํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDB ๋ถ€๋ถ„์€ ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์ด์ƒ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

async instantiate ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ compile Memory ๋งค๊ฐœ๋ณ€์ˆ˜๋„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. instantiate ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ „๋‹ฌํ•˜๋ฉด ๋‹ค์‹œ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ปดํŒŒ์ผํ•  ๋•Œ ์ด๋ฏธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ "๋ฐ”์ธ๋”ฉ"ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ์•„์ง ์™„์ „ํ•œ ํ˜•ํƒœ์˜ ์˜๊ฒฌ์„ ๊ฐ€์งˆ ๋งŒํผ ์บ์‹ฑ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

@lukewagner

๋‚˜๋Š” ASLR์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๋Š” ์•„๋‹ˆ์ง€๋งŒ iiuc, ๋น„๋ก ์šฐ๋ฆฌ๊ฐ€ ๋ณด์ˆ˜์ ์ธ ๊ฒฝ๊ณ„๋ฅผ ๊ฐ–๊ณ  ์žˆ์ง€ ์•Š๋”๋ผ๋„(์ฆ‰, ์ปค๋„์ด ์ตœ๋Œ€ ์ฃผ์†Œ ๋ฒ”์œ„ ์ˆ˜์— ๋„๋‹ฌํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— mmap์ด ์‹คํŒจํ•  ๋•Œ๊นŒ์ง€ ๊ณ„์† ํ• ๋‹นํ•˜๋„๋ก ํ—ˆ์šฉํ•œ ๊ฒฝ์šฐ) , ์ „์ฒด 47๋น„ํŠธ ์ฃผ์†Œ ์ง€์ • ๊ฐ€๋Šฅ ๊ณต๊ฐ„์˜ ์ž‘์€ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ์ฝ”๋“œ ๋ฐฐ์น˜๋Š” ์ด 47๋น„ํŠธ ๊ณต๊ฐ„์—์„œ ๊ณ„์†ํ•ด์„œ ๋งค์šฐ ๋ฌด์ž‘์œ„์ ์ž…๋‹ˆ๋‹ค. IIUC, ASLR ์ฝ”๋“œ ๋ฐฐ์น˜๋„ ์™„์ „ํžˆ ๋ฌด์ž‘์œ„๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๋ฌด์—‡์ด ์žˆ์„์ง€ ์˜ˆ์ธกํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค๊ธฐ์— ์ถฉ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

ASLR์€ ์ฝ”๋“œ์™€ ๋ฐ์ดํ„ฐ ๋ชจ๋‘์— ์˜ํ–ฅ์„ ๋ฏธ์นฉ๋‹ˆ๋‹ค. ์š”์ ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๋ฅผ ์ถ”์ ํ•˜์ง€ ์•Š๊ณ  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ์— ์นจ์ž…ํ•˜๋Š” ๋ฐ ๋” ๋งŽ์€ ๋น„์šฉ์ด ๋“ค๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณ ๊ฐˆ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ๋” ๋งŽ์€ ์˜ํ–ฅ๋ ฅ์„ ํ–‰์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, asm.js ์‹œ์ ˆ๋ถ€ํ„ฐ 1000๊ฐœ๋ฐ–์— ์•ˆ ๋๊ฑฐ๋“ ์š”. ๊ทธ๋Ÿฌ๋ฉด ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น์ด ๊ทธ๋ƒฅ ๋˜์ง‘๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๋ถ€๋”ช์ณ์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋งŽ์€ ์Šˆํผ ๋ชจ๋“ˆํ™” ์•ฑ(๊ฐ๊ฐ ๋งŽ์€ ๊ฐœ๋ณ„ wasm ๋ชจ๋“ˆ ํฌํ•จ)์ด ์žˆ๋”๋ผ๋„ ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒƒ์ด ํ•„์š”ํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ๋Š” ์•ฑ์ด ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜์ฒœ ๊ฐœ์˜ ์ƒ์„ฑ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์—์„œ ๊ธฐ์กด์˜ ์ผ๋ฐ˜ ArrayBuffer์™€ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

1000์€ ํ•ฉ๋ฆฌ์ ์ธ ํ•œ๊ณ„์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ๋ณด์•ˆ ๋‹ด๋‹น์ž์—๊ฒŒ ๋ฌผ์–ด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์œ„์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด Promise๋ฅผ ์ถ”๊ฐ€ํ•˜๋ฉดeval(bytecode, importObj) API๋Š” ๊ดœ์ฐฎ์ง€๋งŒ ์ด์ œ ๊ฐœ๋ฐœ์ž๋Š” ์ผ๋ถ€ ํ”Œ๋žซํผ์—์„œ ์„ฑ๋Šฅ ํ–ฅ์ƒ๊ณผ ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์บ์‹œํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜๋ฅผ ์„ ํƒํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๊ฐœ๋ฐœ์ž๋ฅผ ์–ด๋ ค์šด ์œ„์น˜์— ๋‘ก๋‹ˆ๋‹ค. ์บ์‹ฑ๊ณผ ํ†ตํ•ฉ๋˜๋Š” ์†”๋ฃจ์…˜์ด ํ•„์š”ํ•œ ๊ฒƒ ๊ฐ™์œผ๋ฉฐ ์œ„์—์„œ ๋ช…์‹œ์  Cache API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ธŒ๋ ˆ์ธ์Šคํ† ๋ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

์˜ค๋ฅธ์ชฝ. ๊ทธ๋Ÿฌํ•œ API๊ฐ€ ์ž‘๋™ํ•˜๋„๋ก ๋งŒ๋“ค ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ธ๊ตฌ๋ ค์ง€๋งŒ ์‹ค์šฉ์ ์ธ API๋Š” eval์„ ์˜ค๋ฒ„๋กœ๋“œํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

  1. instancePromise = ํ‰๊ฐ€(๋ฐ”์ดํŠธ ์ฝ”๋“œ, importObj)
  2. instancePromise = ํ‰๊ฐ€(๋ชจ๋“ˆ, importObj)

Instance์—๋Š” getter๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ = instance.module

์—ฌ๊ธฐ์„œ ๋ชจ๋“ˆ์€ ๊ตฌ์กฐ๋ฅผ ๋ณต์ œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์— ๋Œ€ํ•ด์„œ ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋‹ˆ?

์ƒˆ๋กœ์šด ์•„์ด๋””์–ด: WebAssembly.instantiate์™€ ๊ฐ™์ด ์ƒˆ ์ธ์Šคํ„ด์Šค์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜๊ณ  WebAssembly.compile๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ์‚ฌ๋žŒ์ด ๋น„๋™๊ธฐ ๋ฒ„์ „์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋ ๊นŒ์š”? ์ด๊ฒƒ์€ ํŒจ์น˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ ์ธ์Šคํ„ด์Šคํ™”์— ๋ช‡ ms๊ฐ€ ๊ฑธ๋ฆด ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์–ด์จŒ๋“  ๊ณ ๋ คํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์–‘์—์„œ ์—”์ง„์ด ์ปดํŒŒ์ผ ๋˜๋Š” ์ธ์Šคํ„ด์Šคํ™”์—์„œ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋งํ•ฉ๋‹ˆ๋‹ค(์—”์ง„์ด ์ง€์—ฐ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ/์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ๋‘˜ ๋‹ค!).

์ปดํŒŒ์ผ๋œ ๋ชจ๋“ˆ์ด IDB์— ์ €์žฅ๋  ๋•Œ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์งˆ๋ฌธ์€ ์—ฌ์ „ํžˆ โ€‹โ€‹๋‚จ์•„ ์žˆ์ง€๋งŒ ์–ด์จŒ๋“  ์—ฌ๋Ÿฌ codegen ๋ชจ๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์–ด๋ ค์šด ์งˆ๋ฌธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์•„์ด๋””์–ด๋Š” IDB์— ์ €์žฅ๋˜๊ฑฐ๋‚˜ IDB์—์„œ ๊ฒ€์ƒ‰๋œ ๋ชจ๋“ˆ์ด IDB ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ํ•ธ๋“ค์„ ์žก๊ณ  ์ด ํ•ญ๋ชฉ์— ์ƒˆ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ์‹์œผ๋กœ IDB ํ•ญ๋ชฉ์€ ๋ชจ๋“ˆ์˜ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ปดํŒŒ์ผ๋œ ๋ฒ„์ „์„ ๋Š๋ฆฌ๊ฒŒ ์ถ•์ ํ•˜๊ณ  ์ธ์Šคํ„ด์Šคํ™” ์ค‘์— ํ•„์š”ํ•œ ๊ฒƒ์„ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

IDB ๋ถ€๋ถ„์€ ์•ฝ๊ฐ„ ๋” ๋งŽ์€ ์ž‘์—…์ด ํ•„์š”ํ•˜์ง€๋งŒ ์„ฑ๋Šฅ ๋ฉด์—์„œ ์ด์ƒ์— ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

ํฅ๋ฏธ๋กญ๋‹ค. ์œ„์˜ ๋‚ด ์•„์ด๋””์–ด์™€ ๊ด€๋ จํ•˜์—ฌ :

์žฅ์ : ๋‹น์‹ ์€ ์ง€๊ธˆ ์šฐ๋ฆฌ๊ฐ€ ๋งํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐœ๋…์ ์œผ๋กœ ์œ ์‚ฌํ•œ ์ดํ•ดํ•˜๊ธฐ ์‰ฌ์šด ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค.
๋‹จ์ : ๋‹น์‹ ์˜ ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ํ•˜๋Š” ์ผ๊ณผ ๋‚ด ์ œ์•ˆ์ด ํ—ˆ์šฉํ•˜๋Š” ๋งŒํผ ์—”์ง„์ด ํ•˜๋Š” ์ผ ์‚ฌ์ด์— ๋งŽ์€ ์‹œ๋„ˆ์ง€ ํšจ๊ณผ๋ฅผ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์ œ์•ˆ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์ €๋งŒํผ ๋งŽ์€ ์ œ์–ด ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜์ง€ ์•Š๋Š” ์„ธ ๊ฐ€์ง€ ์˜์—ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  1. ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ž‘์—…์€ ๋‘ ๊ณณ ์ค‘ ํ•œ ๊ณณ์—์„œ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‚ฌ์šฉ์ž๋Š” ๋‘˜ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๊ณ„ํš์„ ์„ธ์›Œ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์›น ์ฝ˜ํ…์ธ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋น„์‹ธ๋ฉด ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์›น ์ฝ˜ํ…์ธ ๋ฅผ ๊ฐ–๊ฒŒ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด ์ œ์•ˆ์—๋Š” ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ์ผ์ด ๋ฐœ์ƒํ•˜์—ฌ ๊ตฌํ˜„ ๊ฐ„์˜ ๊ท ์ผ์„ฑ์ด ํ–ฅ์ƒ๋˜๋Š” ํ•œ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋ชจ๋“  ๋ฒ„์ „์˜ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ์บ์‹œ๋˜๋„๋ก ๋ช…ํ™•ํ•˜๊ฒŒ ๋ณด์žฅ๋œ ๊ฒฝ๋กœ๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— API๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์„ ์Šค๋ ˆ๋”ฉํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์บ์‹œ๋ฅผ ๊ด€๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋ฉด์„œ VM์ด ๋งค๋ฒˆ ๋” ๋งŽ์€ ํ•ญ๋ชฉ์œผ๋กœ ๋ชจ๋“ˆ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒ˜์Œ์œผ๋กœ 4GB๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ด๊ฒƒ์ด ์บ์‹œ๋˜์ง€๋งŒ ๋‘ ๋ฒˆ์งธ๋กœ 4GB๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€ ๋ชปํ•˜๋ฉด ์ž ์žฌ์ ์œผ๋กœ ๋‘˜ ๋‹ค ์บ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์‚ฌ์šฉ์ž๊ฐ€ ๋ชจ๋“  ์ปดํŒŒ์ผ ํ›„์— instance.module์„ ์บ์‹œํ•˜๋Š” ๊ฒฝ์šฐ).
  3. ๋ธŒ๋ผ์šฐ์ €์˜ ๋น„์ •์ƒ์ ์ธ ์ฝ”๋„ˆ ์ผ€์ด์Šค ๋˜๋Š” ๊ธฐํƒ€ ๋ฌธ์ œ๋กœ ์ธํ•ด ๊ตฌ์„ฑํ‘œ์—์„œ ์ด์ค‘ ์ปดํŒŒ์ผ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ ๋‹จ๊ณ„์—์„œ ํ•œ ๊ฐ€์ง€๋ฅผ ์ปดํŒŒ์ผํ•˜์ง€๋งŒ ์ธ์Šคํ„ด์Šคํ™” ๋‹จ๊ณ„์—์„œ ๋‹ค๋ฅธ ๊ฒƒ์ด ํ•„์š”ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ๊นจ๋‹ซ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‚ด ๋ฒ„์ „์—๋Š” ์ด์ค‘ ์ปดํŒŒ์ผ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์ œ ๊ฒƒ์ด ๋” ์ข‹์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ, ๋‹น์‹ ์˜ ์ œ์•ˆ์€ ์ง„๋ณด์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ™•์‹คํžˆ ๋‚˜์—๊ฒŒ ์ข‹๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

์ด ๋ฌธ์ œ๋Š” ์กฐ๊ฐํ™”๋กœ ์ธํ•ด
๋ฉ”๋ชจ๋ฆฌ(4GB + ์ตœ๋Œ€ ์ง€์› ์˜คํ”„์…‹ ๋˜๋Š” 8GB)๊ฐ€ ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋งŒ์•ฝ
์•„๋งˆ๋„ 1% ๋ฏธ๋งŒ์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์™„์ „ํžˆ ๋น„ํ•ฉ๋ฆฌ์ ์ด์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
OOM ์ƒํ™ฉ์ž…๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž๊ฐ€ ์›น์„ ํƒ์ƒ‰ํ•˜๊ณ  ๋งŽ์€ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ
์ž‘์€ WASM ๋ชจ๋“ˆ์ด ์—ฐ์†์ ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์—ฐ๊ฒฐ๋˜๋ฉฐ ์•„๋งˆ๋„ ๋ชจ๋‘ ๋ผ์ด๋ธŒ ์ƒํƒœ๊ฐ€ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
ํ•œ ๋ฒˆ. ์ด ๊ฒฝ์šฐ ์˜ˆ์•ฝ๋œ 4GB ์ฒญํฌ์˜ ์ž‘์€ ์บ์‹œ๊ฐ€
๋ฌธ์ œ.

๋˜ ๋‹ค๋ฅธ ๊ฐ€๋Šฅํ•œ ์ „๋žต์€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•œ ๋ฒ„์ „์˜ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ฒฝ๊ณ„๋ฅผ ํ™•์ธํ•˜๊ณ  ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฝ๊ณ„๋ฅผ ๋ฎ์–ด์”๋‹ˆ๋‹ค.
nops๋กœ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค. ์ถ”์•…ํ•˜์ง€๋งŒ, ๊ทธ๊ฒƒ์€ ์ง€์˜ฅ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฆ…๋‹ˆ๋‹ค.
๋‹ค์‹œ ์ปดํŒŒ์ผํ•˜๊ณ  ๋‘ ์ปดํŒŒ์ผ๋ณด๋‹ค ์ ์€ ๊ณต๊ฐ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค.

2016๋…„ 10์›” 27์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 9:03, pizlonator [email protected]
์ผ๋‹ค:

@mtrofin https://github.com/mtrofin

๋ชจ๋“ˆ ์ž‘์„ฑ์ž๋Š” ์ตœ์†Œ/์ตœ๋Œ€ ๋ฉ”๋ชจ๋ฆฌ๋กœ 4GB๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๋งŽ์€ ์žฅ์น˜์— 4GB์˜ ๋ฌผ๋ฆฌ์  ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‹ค์ œ๋กœ๋Š” ์‹ค์šฉ์ ์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฉ”๋ชจ๋ฆฌ. ๋˜ํ•œ ์‚ฌ์–‘ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์„ ์ƒ์„ฑํ•˜๋Š” ์ปดํŒŒ์ผ์˜ ๋ณ€ํ˜•(์ ์–ด๋„ ๋น„๋™๊ธฐ, ๋™๊ธฐํ™”๋„ ๊ฐ€๋Šฅ)
๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ๋งŒ ํ—ˆ์šฉํ•˜๋Š” ์ธ์Šคํ„ด์Šค.

๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ค‘ ์ปดํŒŒ์ผ์„ ์›ํ•˜์ง€ ์•Š๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

โ€”
์ด ์Šค๋ ˆ๋“œ์— ๊ฐ€์ž…ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ฉ”์‹œ์ง€๋ฅผ ๋ฐ›๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/WebAssembly/design/issues/838#issuecomment -256738329,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1F6CYUaq0unla0H6RYivUC8jfxIAks5q4PWIgaJpZM4Kh1gM
.

ASLR ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ pagetable/allocator/etc ์˜ค์—ผ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ๋ชจ๋‘๋Š” ๋ณด์•ˆ ๋‹ด๋‹น์ž _๋ฟ๋งŒ ์•„๋‹ˆ๋ผ_ ์ปค๋„/์‹œ์Šคํ…œ ๋‹ด๋‹น์ž์™€ ์ด์•ผ๊ธฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜๋Š” ๊ฐ ์—”์ง„์ด "๋น ๋ฅธ" Memory ์— ๋ถ€๊ณผํ•˜๋Š” ์ œํ•œ์— ๋Œ€ํ•ด ๊ฐœ๋ฐœ์ž์—๊ฒŒ ๋ฏธ๋ฆฌ ์•Œ๋ฆฌ๊ณ  API์—์„œ ์ด๋ฅผ ๊ด€์šฉ์ ์œผ๋กœ ๋งŒ๋“ค์–ด์„œ ์ž˜๋ชป ์‚ฌ์šฉํ•˜๊ธฐ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

nop ๋˜๋Š” ์ด์ค‘ ์ปดํŒŒ์ผ๊ณผ ๊ฐ™์ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ชฉ๋ฐœ์ด ์žˆ์ง€๋งŒ ์™œ ๋ชฉ๋ฐœ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

@jfbastien PROT_NONE ๋ฉ”๋ชจ๋ฆฌ ๋น„์šฉ์ด ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ” ํ•ญ๋ชฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํŽ˜์ด์ง€ ํ…Œ์ด๋ธ”์ด ๋Š๋ฆฌ๊ฒŒ ์ฑ„์›Œ์ง€๋Š” ๋งคํ•‘์„ ๋ณด์œ ํ•˜๋Š” ๋ณ„๋„์˜ ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@pizlonator ์ €๋Š” ๊ทธ ์•„์ด๋””์–ด๊ฐ€ ๋งˆ์Œ์— Module ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ๋” ๊ฐ„๊ฒฐํ•˜๊ณ  ๊ฐ€๋ฅด์น˜๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋˜ํ•œ ๊ฐ€์žฅ ์ข‹์€ API๋ฅผ ๋น„๋™๊ธฐ API๋กœ ๋งŒ๋“ค์–ด ๋™๊ธฐํ™” API ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•˜๋Š” @s3ththompson ์˜ ์šฐ๋ ค๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ WebAssembly.compile ๋ฐ Module ์ƒ์„ฑ์ž๋ฅผ ์ œ๊ฑฐํ•ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. "์ฝ”๋“œ ์„œ๋ฒ„"(IDB + postMessage ๋ฅผ ํ†ตํ•ด ์›๋ณธ ๊ฐ„ ์ฝ”๋“œ ์บ์‹ฑ ์ œ๊ณต)๊ฐ€ ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ์ƒ์ƒํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. new Module ํ†ตํ•ด)์„ ์›ํ•˜๋Š” ๋™์ผํ•œ ๋ชจ์„œ๋ฆฌ ๊ฒฝ์šฐ์— ๋Œ€ํ•ด new Instance ๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด์— ๋™์˜ํ•˜๋ฉด ์–ธ๊ธ‰ํ•œ ๋‘ ๊ฐœ์˜ WebAssembly.eval ์˜ค๋ฒ„๋กœ๋“œ์— ๋Œ€ํ•œ ์ˆœ์ „ํžˆ ์ถ”๊ฐ€ ์ œ์•ˆ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ?

ํ•˜๋‚˜ ํŒ…๊ฒจ, ๋น„๋ก : ๋‚ด๊ฐ€ ์ƒ๊ฐํ•˜๋Š” ์šฐ๋ฆฌ๋Š”์ด ์•ˆ๋˜๋Š” module ๊ฒŒํ„ฐ์ด๋Š” ํ•„์š”ํ•˜๊ธฐ ๋•Œ๋ฌธ์— Instance ์˜ ์ˆ˜๋ช… ์ฃผ๋ณ€์— ์ผ๋ถ€ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์œ ์ง€ํ•˜๊ธฐ ์œ„ํ•ด (์ฆ‰, ๋ฐ”์ดํŠธ ์ฝ”๋“œ.) Instance ; ์ง€๊ธˆ Module ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ์งํ›„์— GC๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์†์„ฑ(์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์žŠ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” {instance, module} ์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” eval ์˜ ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ๋ชจ๋†€๋ฆฌ์‹ ์•ฑ์˜ ๊ถŒ์žฅ ์‚ฌ๋ก€๋กœ ๋น„๋™๊ธฐ 1๋‹จ๊ณ„ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๊ถŒ์žฅ ํŒจํ„ด์œผ๋กœ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

new Module + new Instance๊ฐ€ ๋‹ค๋ฃจ๋Š” ๋ชจ๋“  ๋™๊ธฐํ™”(์ธ๋ผ์ธ ์ปดํŒŒ์ผ) ์‚ฌ๋ก€๊ฐ€ ๋ชจ๋‘ ์œ ์šฉ ํ•˜๋‹ค๋Š”
๋˜ํ•œ ๋™๊ธฐํ™” ์ธ์Šคํ„ด์Šคํ™” ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปดํŒŒ์ผ(๋น„๋™๊ธฐ) ์„œ๋ฒ„๋„ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ œ์•ˆ๋œ ๋‘ ๊ฐ€์ง€ ํ‰๊ฐ€ ๋ณ€ํ˜•์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ด๋ฅผ ์†Œ๊ฐœํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ ์ด๋ฆ„์ด ๋งˆ์Œ์— ๋“ค์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์€ (๋ณด์•ˆ) ์‚ฌ๋žŒ๋“ค์˜ ๋งˆ์Œ๊ณผ js eval(ํ•œ ๋ฉด์—์„œ๋Š” ๋น„์Šทํ•˜์ง€๋งŒ ๋ฒ”์œ„ ์บก์ฒ˜ ์ธก๋ฉด์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Œ)๊ณผ ์œตํ•ฉ๋  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.
WebAssembly.instantiate๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ?

ํ•˜, ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. eval์—๋Š” ์•ฝ๊ฐ„์˜ ๋‹ด๋‹น์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. +1 ~ WebAssembly.instantiate .

๋น„๋™๊ธฐ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๊ฐœ๋ฐœ์ž์— ๋Œ€ํ•œ ์ง€์นจ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

@mtrofin ํŠน์ • ์šฉ๋„์™€ ๋…๋ฆฝ์ ์œผ๋กœ Module ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ํŠน๋ณ„ํ•œ ์ฝ”๋“œ ๊ณต์œ /๋กœ๋”ฉ ์ฒด๊ณ„๊ฐ€ ์—†๋Š” ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ WebAssembly.instantiate ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

@lukewagner ํ•ฉ๋ฆฌ์ ์ธ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

ํ•˜, ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. eval์—๋Š” ์•ฝ๊ฐ„์˜ ๋‹ด๋‹น์ž๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly.instantiate์— +1.

๋™์˜.

๋”ฐ๋ผ์„œ ์ด์— ๋™์˜ํ•˜๋ฉด ์–ธ๊ธ‰ํ•œ ๋‘ ๊ฐœ์˜ WebAssembly.eval ์˜ค๋ฒ„๋กœ๋“œ์— ๋Œ€ํ•œ ์ˆœ์ „ํžˆ ๋ถ€๊ฐ€์ ์ธ ์ œ์•ˆ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ์˜ˆ?

๊ทธ๊ฒŒ ๋ฌด์Šจ ์†Œ๋ฆฌ์•ผ.

๋ชจ๋“ˆ getter๊ฐ€ ์—†์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด Instance๊ฐ€ Instance์˜ ์ˆ˜๋ช… ๋™์•ˆ ์ผ๋ถ€ ๋‚ด๋ถ€ ๋ฐ์ดํ„ฐ(์ฆ‰, ๋ฐ”์ดํŠธ์ฝ”๋“œ)๋ฅผ ์œ ์ง€ํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ”๋กœ ์ง€๊ธˆ ๋ชจ๋“ˆ์€ ์ผ๋ฐ˜์ ์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™” ์งํ›„์— GC๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ฐ์ดํ„ฐ ์†์„ฑ(์‚ฌ์šฉ์ž๊ฐ€ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์žŠ์–ด๋ฒ„๋ฆด ์ˆ˜ ์žˆ์Œ) ๋˜๋Š” {instance, module} ์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ์„ธ ๋ฒˆ์งธ ๋ฒ„์ „์˜ eval์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ๋ฐ์ดํ„ฐ ์†์„ฑ์ด ๋” ๋‚˜์€ ๊ฒƒ์ฒ˜๋Ÿผ ๋Š๊ปด์ง‘๋‹ˆ๋‹ค. ๋˜๋Š” WebAssembly.instantiate๊ฐ€ ํ•ญ์ƒ ์ธ์Šคํ„ด์Šค, ๋ชจ๋“ˆ ์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด ๋งž์Šต๋‹ˆ๊นŒ? fastmemory ๋ชจ๋“ˆ ๋ณ€ํ˜•์„ ์–ป๊ธฐ ์œ„ํ•ด WebAssembly.instantiate ํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜์‹ญ์‹œ์˜ค. ์ด์ œ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์™€ ๊ตฌ์กฐ ๋ณต์ œํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์ด ๋ชจ๋“ˆ์€ fastmemory๋ฅผ ์ง€์›ํ•˜๋Š” Memory -es๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@pizlonator ์˜ˆ, ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์œผ๋กœ ์ž์ „๊ฑฐ๋ฅผ ํƒˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‹ค์ˆ˜๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š์€ Module ๋™๋ฐ˜ํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์ด ์ค„์–ด๋“ค๊ธฐ ๋•Œ๋ฌธ์— ์Œ์„ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋‚ซ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@mtrofin ์žฌ ์ปดํŒŒ์ผ์€ instantiate ํ˜ธ์ถœ์—์„œ Module ๋ฅผ ๋ฝ‘๊ณ  ์ƒˆ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ instantiate ๋ฅผ ๋ฝ‘์„ ๋•Œ ์—ฌ์ „ํžˆ ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด API ์ถ”๊ฐ€์˜ ์š”์ ์€ ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ๊ทผ๋ณธ์ ์œผ๋กœ ํ•„์š”ํ•  ๋•Œ๋งŒ ๋ฐœ์ƒํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ฆ‰, ๋‘ ์ข…๋ฅ˜์˜ ๋ฉ”๋ชจ๋ฆฌ์— ์•ก์„ธ์Šคํ•˜๋Š” 1๊ฐœ์˜ ๋ชจ๋“ˆ์ด ์žˆ๋Š” ๊ฒฝ์šฐ).

์ด ์Šค๋ ˆ๋“œ๊ฐ€ ๊ธธ์–ด์ง€๊ณ  ์ˆ˜๋ ด๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€๋งŒ 100% ํ™•์‹ ํ•˜๋ ค๋ฉด ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ์ž‘์„ฑํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒ๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋‹จ์ผ ๋ชจ๋“ˆ์˜ ๋น„๋™๊ธฐ ์ธ์Šคํ„ด์Šคํ™”.
  2. ๋‹ค๋ฅธ ๋ชจ๋“ˆ๊ณผ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋“ˆ์˜ ๋น„๋™๊ธฐ ์ธ์Šคํ„ด์Šคํ™”.
  3. ๋‹จ์ผ ๋ชจ๋“ˆ์˜ ๋™๊ธฐ์‹ ์ธ์Šคํ„ด์Šคํ™”(๋™๊ธฐ์‹ ๋‹ค์ค‘ ๋ชจ๋“ˆ์ด ์œ ์šฉํ•˜์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๊นŒ?).
  4. ์ด ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•œ ์บ์‹ฑ(๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์บ์‹œ์— ์ €์žฅํ•˜๊ณ  ๊ฒ€์ƒ‰ ๋ฐ ์ธ์Šคํ„ด์Šคํ™”).
  5. ๋‹จ์ผ .wasm ๋ชจ๋“ˆ์˜ ์—…๋ฐ์ดํŠธ ๋ฐ ๋‹ค๋ฅธ ๋ชจ๋“ˆ์˜ ์บ์‹œ๋œ ๋กœ๋“œ.

๋‹ค๋ฅธ ๊ฑด ์—†๋‚˜์š”? @lukewagner ๊ฐ€ ๋‚ด๊ฐ€ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜๋Š” ์ˆ˜์ž…ํ’ˆ์— ๋Œ€ํ•œ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ

์ฆ‰, ์ด ๋ชจ๋“ˆ์˜ ํ›„์† ์‚ฌ์šฉ์€ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•ด์•ผ ํ•˜๋ฉฐ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๋†€๋ž๊ฒŒ๋„ ๊ธด ๋™๊ธฐ์‹ ์ธ์Šคํ„ด์Šคํ™”๋กœ UI ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•  ์œ„ํ—˜์ด ์žˆ์Šต๋‹ˆ๋‹ค.

@jfbastien ์ €๋Š” ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•˜๋Š” ๊ฐ ์Šค๋‹ˆํŽซ, ํŠน์ • ๊ฒฝ๋กœ๋กœ ์ด๋™ํ•˜๋„๋ก ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•˜๋Š” ์š”์†Œ, ๊ฐœ๋ฐœ์ž๊ฐ€ ๊ฒฐ์ •์„ ๋‚ด๋ฆฌ๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ์ •๋ณด๋ฅผ ์ดํ•ดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@mtrofin ๋งž์Šต๋‹ˆ๋‹ค. Module m ์ฃผ์–ด์ง€๋ฉด ๋น„๋™๊ธฐ์‹์ธ WebAssembly.instantiate(m) ๋ฅผ ํ˜ธ์ถœํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. new Instance(m) _ํ•  ์ˆ˜ ์žˆ๊ณ  ๋น„์šฉ์ด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ new Module(m) ์™€ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@jfbastien "๋น„๋™๊ธฐ ์ธ์Šคํ„ด์Šคํ™”"๋ผ๊ณ  ๋งํ•  ๋•Œ "๋น„๋™๊ธฐ ์ปดํŒŒ์ผ ๋ฐ ์ธ์Šคํ„ด์Šคํ™”"๋ฅผ ์˜๋ฏธํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‹ค์Œ์€ ์งง์€ ๋ฒ„์ „์ž…๋‹ˆ๋‹ค.

  1. WebAssembly.instantiate(bytecode, imports)
  2. WebAssembly.instantiate(bytecode, imports) , ์—ฌ๊ธฐ์„œ imports ๋Š” ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค.
  3. new Instance(new Module(bytecode), imports)
  4. ๋ชจ๋“  ๊ฒฝ์šฐ์— ๋‹น์‹ ์ด ์–ป์„ ์ˆ˜ Module ๋‹น์‹ ์—๊ฒŒ ๋‹ค์Œ, put ์žˆ๋‹ค๋Š”์—์„œ IDBObjectStore . ๋‚˜์ค‘์— get a Module m ๋‹ค์‹œ WebAssembly.instantiate(m, imports) ์ „ํ™”๋ฅผ ๊ฒ๋‹ˆ๋‹ค.
  5. ๋‹น์‹ ์—๊ฒŒ : ์•„๋ฌด๊ฒƒ๋„ ์ •๋ง ์—ฌ๊ธฐ์— ํŠน๋ณ„ํ•œ WebAssembly.instantiate ๋ฐ”์ดํŠธ ์ฝ”๋“œ์—์„œ ํ•˜๋‚˜ ๊ฐœ์˜ ๋ชจ๋“ˆ ๋ฐ instantiate ๋กœ๋ถ€ํ„ฐ ๋‚˜๋จธ์ง€ Module IDB์—์„œ ๊ฐ€์ ธ์˜จ๋“ค.

๋™๊ธฐํ™” ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋™๊ธฐํ™” ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋น„๋™๊ธฐ ์ปดํŒŒ์ผ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐ๋˜๋ฉด ๋น„๋™๊ธฐ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๊นŒ?

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

@mtrofin ๊ฐœ๋ฐœ์ž๊ฐ€ ์ž‘์„ฑํ•˜๊ฑฐ๋‚˜ ํˆด์ฒด์ธ์—์„œ ์ƒ์„ฑํ•œ WebAssembly.instantiate ์ž…๋‹ˆ๋‹ค. ํŠน๋ณ„ํ•œ "๋‚˜๋Š” wasm์—์„œ JIT๋ฅผ ์ž‘์„ฑ ์ค‘์ž…๋‹ˆ๋‹ค"์— ๋Œ€ํ•ด์„œ๋งŒ ๋™๊ธฐํ™” API๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์ผ๋ถ€ ์ฝ”๋“œ ๊ณต์œ  ์‹œ์Šคํ…œ์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ WebAssembly.compile ๋Œ€ํ•ด์„œ๋งŒ ๋™๊ธฐํ™” API๋ฅผ ์‚ฌ์šฉํ•˜๋ฏ€๋กœ "์‹œ์ž‘ํ•˜๊ธฐ" ํŠœํ† ๋ฆฌ์–ผ์ด WebAssembly.instantiate ๋…์ ์ ์œผ๋กœ ๋‹ค๋ฃฐ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค

@lukewagner ์œ„์˜ #3 new Module()์— ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. WebAssembly.compile์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์ข‹์€ ์ƒ๊ฐ์ด๋ฉฐ ๊ฐ€๋Šฅ์„ฑ์„ ์™„์„ฑํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๋ ‡๊ฒŒํ•˜๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ํžŒํŠธ๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚˜์ค‘์— ๋‹ค๋ฅธ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ, ํŠนํžˆ ๋™๊ธฐ์ ์œผ๋กœ ๋‹ค์‹œ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๋ฉด ๋”ธ๊พน์งˆ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณ€๊ฒฝ ์‚ฌํ•ญ ์š”์•ฝ (๋‚ด๊ฐ€ ๋ช…ํ™•ํ•˜๊ธฐ ๋•Œ๋ฌธ์—) :

  • WebAssembly.instantiate(bytes, imports) ์ถ”๊ฐ€๋Š” {instance:, module:}์˜ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • WebAssembly.instantiate(module, imports) ์ถ”๊ฐ€๋Š” {instance:, module:}์˜ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒˆ Module(bytes , imports )๋กœ ๋ณ€๊ฒฝํ•˜๋ฉด ๋ชจ๋“ˆ์ด ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค.
  • WebAssembly.compile(bytes , imports ) ๋ณ€๊ฒฝ์€ ์ธ์Šคํ„ด์Šค์˜ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์ธ์Šคํ„ด์Šคํ™”๋˜๋ฉด ์ธ์Šคํ„ด์Šคํ™” ์†๋„๊ฐ€ ๋นจ๋ผ์งˆ ๊ฒƒ์ด๋ผ๋Š” ์˜ˆ์ƒ์„ ์–ด๋”˜๊ฐ€์— ๋ช…์‹œํ•˜์‹ญ์‹œ์˜ค.

์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

์ด๋Ÿฐ, ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ Instance ์ธ์ˆ˜๋กœ ๋„ฃ์œผ๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. Module ๋˜๋Š” compile ํ•„์š”ํ•˜๋‹ค๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. [ํŽธ์ง‘: ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๋ฉด instantiate ์ „ํ™”๋ฅผ ๊ฑธ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.]

์ฆ‰, ์ข…๋‹จ ๊ฐ„ ๋น„๋™๊ธฐ์˜ ๊ฒฝ์šฐ 4GB ํ•ดํ‚น ๋ฉ”๋ชจ๋ฆฌ์— ๋ฐ”์ธ๋”ฉ๋˜์ง€๋งŒ JITed ํ•„ํ„ฐ ์ปค๋„ ๋˜๋Š” ๋ฐฑ๊ทธ๋ผ์šด๋“œ ์ปดํŒŒ์ผ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด์„œ๋Š” ๋ฐ”์ธ๋”ฉ๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋–จ์–ด์ ธ ์ธ์Šคํ„ด์Šค)?

์ปดํŒŒ์ผ ๋ฐ ์ธ์Šคํ„ด์Šคํ™”์˜ ๋น„๋™๊ธฐ ์Œ์— ๋Œ€ํ•œ ์ง€์นจ์— ์ดˆ์ ์„ ๋งž์ถ”๋Š” ๋ฐ +1 - ๋ฉ”์‹œ์ง€๋ฅผ ๋‹จ์ˆœํ•˜๊ฒŒ ๋งŒ๋“ค๊ณ  ๊ฐœ๋ฐœ์ž๋กœ๋ถ€ํ„ฐ ๊ฒฐ์ • ๋ฌธ์ œ์˜ ๋ณต์žก์„ฑ์„ ์ˆจ๊น๋‹ˆ๋‹ค.

๋„ค, ์ €๋Š” ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๋‹ค์Œ์„ ์ง€์ ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์ฒ˜์Œ์œผ๋กœ:
WebAssembly.instantiate(bytes, imports) -> {module, instance}์˜ ์•ฝ์†(indexeddb์— ๋Œ€ํ•œ ์บ์‹œ ๋ชจ๋“ˆ)
๋‘๋ฒˆ์งธ:
WebAssembly.instantiate(module, imports) -> {module, instance}์˜ ์•ฝ์†

๊ทธ๊ฒƒ์ด ์ฃผ์š” ํŒจํ„ด์ด๋ผ๋Š” ๊ฒƒ์— ๋Œ€ํ•œ ์ด์˜๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ปดํŒŒ์ผ/์ƒˆ ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•ด ๊ณ ๋ฏผํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์šฉํ•œ ํžŒํŠธ๊ฐ€ ๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.
๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ๊ฐ€๋Šฅ์„ฑ์œผ๋กœ ์–ธ๊ธ‰ํ•˜๊ณ  Post-MVP์— ํ•ด๋‹น arg(์„ ํƒ ์‚ฌํ•ญ์ผ ์ˆ˜ ์žˆ์Œ)๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์„ ์—ฐ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ?

@mtrofin (๊ธฐ์ˆ ์ ์œผ๋กœ๋Š” instantiate ์ž…๋‹ˆ๋‹ค.)

@lukewagner ( @mtrofin์ด ์˜๋ฏธํ–ˆ๋˜ ๊ฒƒ ๊ฐ™์•„์š”)

@lukewagner , @flagxor OK, ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๋น„๋™๊ธฐ ์ปดํŒŒ์ผ API๋ฅผ ์œ ์ง€ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋งž์ฃ ?

์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋Š” ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์ˆ˜๋งŽ์€ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํฌํ•จ๋œ PhotoShop๊ณผ ๊ฐ™์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ์€ wasm ๋ชจ๋“ˆ์ž…๋‹ˆ๋‹ค. ๋ฉ”์ธ ์•ฑ์„ ์‹œ์ž‘ํ•˜๊ณ  fastmemory๋ฅผ ํŠธ๋ฆฌ๊ฑฐํ•˜๋Š” ๋งˆ๋ฒ•์˜ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค(์ด ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” ์•ฑ ํ•˜๋‚˜, ๋ฉ”๋ชจ๋ฆฌ ๋ถ€์กฑ).

์—ฌ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์„ ๋ณ‘๋ ฌ๋กœ ์ปดํŒŒ์ผํ•˜๊ณ  ์ผ๋ถ€ ์ž‘์—…์ž๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋‹น์‹ ์€ ๋‹น์‹ ์ด ์‚ฌ์šฉํ•  ์‹ค์ œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ทธ ์ปดํŒŒ์ผ์„ ์ „๋‹ฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค(๋งž์Šต๋‹ˆ๊นŒ?). ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ๊ฐ’์— ๋”ฐ๋ผ ํ”Œ๋Ÿฌ๊ทธ์ธ์— ๋Œ€ํ•œ ๋Š๋ฆฐ ๋ฉ”๋ชจ๋ฆฌ ์ปดํŒŒ์ผ์ด ๋ฐœ์ƒํ•˜๊ณ  ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ์•ฑ์— ์—ฐ๊ฒฐ๋  ๋•Œ fastmemory์— ๋Œ€ํ•œ ๋น„์šฉ์ด ๋งŽ์ด ๋“œ๋Š” ๋น„๋™๊ธฐ ์žฌ์ปดํŒŒ์ผ์ด ๋’ค๋”ฐ๋ฆ…๋‹ˆ๋‹ค.

์ด ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๊ตฌ์ž…ํ•˜๋ฉด ์ผ๋ถ€ ๋ฉ”๋ชจ๋ฆฌ ์„ค๋ช…์ž(์‹ค์ œ ์ง€์› ๋ฉ”๋ชจ๋ฆฌ ์—†์ด ๋ช…ํ™•ํ•˜๊ฒŒ)๋ฅผ ์ปดํŒŒ์ผ API์— ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๊ฐ€์น˜๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์˜ˆ, Memory ๋ฅผ ์ปดํŒŒ์ผ์— ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(์‹ฌ์ง€์–ด ๊ถŒ์žฅ๋จ).

@mtrofin ๋งž์Šต๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์šฉ๋„์˜ ๊ฒฝ์šฐ compile ์ž…๋‹ˆ๋‹ค. ํ”Œ๋Ÿฌ๊ทธ์ธ ์˜ˆ์ œ๋Š” Memory ๊ฐ€ ์žˆ์ง€๋งŒ _์ปดํŒŒ์ผ_ ํ•˜๊ณ  _๊ทธ๋ฆฌ๊ณ _ ํ•˜์ง€๋งŒ ์ธ์Šคํ„ด์Šคํ™”(์•„์ง)๋Š” ์›ํ•˜์ง€ ์•Š๋Š” ์œ ํšจํ•œ ๊ฒฝ์šฐ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@pizlonator Btw, "ํ”„๋กœ์„ธ์Šค๋‹น 1000๊ฐœ ์ด์ƒ์˜ 4GB ๋งต์ด ์žˆ๋Š” ๊ฒฝ์šฐ ๋˜์ง€๊ธฐ" ํ•ดํ‚น์ด ASLR/๋ณด์•ˆ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ณ  ์ด์ „์— ๋ฌป๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์ƒ ์ฃผ์†Œ ํ• ๋‹น๋Ÿ‰ ์ œํ•œ? ์—†์—ˆ๋‹ค๋ฉด ๊ณ ๊ธ‰ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์„ฑ๋Šฅ ๊ณ ๋ ค ์‚ฌํ•ญ๋„ ์•„๋‹ˆ์—ˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ์ข‹์•˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. (๋ฌผ๋ก  instantiate API๋Š” ์šฐ๋ฆฌ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋‹ค๋ฅธ ์ด์œ ๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๋ฐ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.)

๋˜ํ•œ 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์— ์Šคํ•„ ์˜์—ญ์„ ๋”ํ•œ ๋ฉ”๋ชจ๋ฆฌ ํฌ๊ธฐ์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ์ด๋ฏธ ํฌ์ธํ„ฐ๋ฅผ ๋งˆ์Šคํฌํ•˜์—ฌ ํƒœ๊น…์„ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ƒ์œ„ ๋น„ํŠธ๋ฅผ ๋งˆ์Šคํ‚นํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋งˆ์Šคํ‚น์— ์‚ฌ์šฉ๋˜๋Š” ์ „์—ญ ์ƒ์ˆ˜๋ฅผ ์ˆ˜์ •ํ•˜๊ฑฐ๋‚˜ wasm์œผ๋กœ ์••์ถ•์„ ํ‘ธ๋Š” ๋™์•ˆ ์ ์ ˆํ•œ ์ƒ์ˆ˜๋ฅผ ๋ฒ ์ดํ‚นํ•˜์—ฌ ์ปดํŒŒ์ผ ์ „์— ๋ฐ›์„ ์ˆ˜ ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ ํ• ๋‹น ํฌ๊ธฐ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ผ๋ถ€ ๋Ÿฐํƒ€์ž„์—์„œ ํ™œ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” 0์—์„œ ๋ฒ„ํผ ์ตœ์ ํ™”๊ฐ€ ์žˆ์œผ๋ฉฐ ํ”„๋กœ์„ธ์Šค๋‹น ํ•˜๋‚˜์˜ ๋ฒ„ํผ๋งŒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋˜ํ•œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ปดํŒŒ์ผํ•˜๊ธฐ ์ „์— ํ•„์š”ํ•œ ๋ฉ”๋ชจ๋ฆฌ์™€ ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํ”Œ๋žซํผ์„ ๋ณด๋‹ค ์‚ฌ์šฉ์ž ์นœํ™”์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ธŒ๋ผ์šฐ์ €๋‚˜ ์•ฑ์ด ์‚ฌ์šฉ์ž์—๊ฒŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ์„ฑ๋Šฅ ์ €ํ•˜ ์—†์ด ์‹คํ–‰ํ•˜๋ ค๋ฉด ์ผ๋ถ€ ํƒญ์„ ๋‹ซ์•„์•ผ ํ•จ์„ ์•Œ๋ฆด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์›น ๋ธŒ๋ผ์šฐ์ €๋Š” ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ์˜ต์…˜์ธ ์ „์šฉ ์•ฑ ๋ชจ๋“œ๋ฅผ ์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๋ชจ๋“œ์—์„œ๋Š” ์ œํ•œ๋œ ์žฅ์น˜์—์„œ ์‹คํ–‰๋˜๊ณ  ํ•˜๋‚˜์˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์„ ์ œ๋Œ€๋กœ ์‹คํ–‰ํ•˜๊ธฐ ์œ„ํ•ด ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋ฉ”๋ชจ๋ฆฌ์™€ ์„ฑ๋Šฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์œ„ํ•ด์„œ๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ์กฐ๊ธฐ์— ์ถ”๋ก ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฉ”๋ชจ๋ฆฌ๋Š” ์ปดํŒŒ์ผ ์ „์— ํ• ๋‹นํ•  ํ•„์š”๊ฐ€ ์—†์œผ๋ฉฐ ํ•ฉ๋ฆฌ์ ์œผ๋กœ ์˜ˆ์•ฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ œํ•œ๋œ ์žฅ์น˜์—์„œ ์ปดํŒŒ์ผ๋งŒ์œผ๋กœ๋„ ๋งŽ์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ํฐ VM ํ• ๋‹น๋„ ์‡ผ ์Šคํ† ํผ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์ƒˆ๋กœ์šด ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ฉฐ ์ˆ˜๋…„ ๋™์•ˆ ๋…ผ์˜๋˜์–ด ์™”์Šต๋‹ˆ๋‹ค. ๋ฉ”๋ชจ๋ฆฌ ์ž์› ๊ด€๋ฆฌ๊ฐ€ ํ•„์š”ํ•˜๋ฉฐ ์ฝ”๋“œ ์ƒ์„ฑ๊ณผ ํ•จ๊ป˜ ์กฐ์ •๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@lukewagner ๋‚ด ์ƒ๊ฐ์— ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๊ฐ€ 1000๊ฐœ์˜ ๋ชจ๋“ˆ๋กœ ์ œํ•œํ•œ๋‹ค๋ฉด ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ์ถฉ๋ถ„ํžˆ ํฌ์ง€ ์•Š์„๊นŒ ๊ฑฑ์ •ํ•  ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

  • ์ด ํ•œ๋„๋ฅผ ๋‚ฎ์ถ”๊ธฐ ์œ„ํ•ด ํ•„์š”ํ•œ ๊ณต๊ฒฉ์ด ๋ถ€์ƒํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.
  • ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ๊ฐ€์ƒ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์–‘์„ ์ค„์ด๋Š” ์Šคํƒ์˜ ๋‹ค๋ฅธ ๊ณณ์—์„œ ์ตœ์ ํ™”์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ์ฒœ์žฅ์ด ์ถฉ๋ถ„ํžˆ ๋‚ฎ์€์ง€ ์—ฌ๋ถ€๋ฅผ ์žฌํ‰๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ์˜๋„์ ์œผ๋กœ 1000๊ฐœ์˜ ๋ชจ๋“ˆ์„ ๋งŒ๋“œ๋Š” ํ”„๋กœ๊ทธ๋ž˜๋ฐ ์Šคํƒ€์ผ์„ ๋ฐฉ์ง€ํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋Œ€๋ถ€๋ถ„์˜ JavaScriptCore ํ”„๋ ˆ์ž„์›Œํฌ ํด๋ผ์ด์–ธํŠธ๊ฐ€ VM์„ ๋งŒ๋“ค๊ณ  ์•ฝ๊ฐ„์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•œ ๋‹ค์Œ ์ด๋ฅผ ์ œ๊ฑฐํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. WebAssembly๊ฐ€ JSC๊ฐ€ Objective-C์—์„œ ๊ฐ€์ ธ์˜จ ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ JS์—์„œ ์‚ฌ์šฉ๋˜๋Š” ๊ฒฝ์šฐ 64๋น„ํŠธ ์‹œ์Šคํ…œ์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๋ ค๋ฉด GC๊ฐ€ 1000๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ฒฝ์šฐ(๊ฐ๊ฐ์ด ์ž‘๋”๋ผ๋„) ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. 1000๊ฐœ์˜ ๋ฉ”๋ชจ๋ฆฌ์— ๋„๋‹ฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ์ด์œ ๋กœ ๋‹ค์Œ ํ• ๋‹น์ด ์„ฑ๊ณตํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์˜ GC์ž…๋‹ˆ๋‹ค. ์ด๋ฏธ 10๊ฐœ์˜ 4GB ํ•ต ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ๋ผ์ด๋ธŒ ์ƒํƒœ์ธ ํ›„ ๋น„ 4GB ํ•ต ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๋Š” ๊ธฐ๋Šฅ์€ GC๊ฐ€ ํœด๋ฆฌ์Šคํ‹ฑ์„ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. instanceiate->run->die ๋ฃจํ”„์—์„œ 1001๋ฒˆ์งธ ๋ชจ๋“ˆ์„ ํ• ๋‹นํ•  ๋•Œ GC๋ฅผ ์ˆ˜ํ–‰ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ž‘์€ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŒจํ„ด์— ์ด์ ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. 1MB ๋ฏธ๋งŒ์ด๋ฉด 1000๊ฐœ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด 64KB์—์„œ ์œ ์šฉํ•œ ์ผ์„ ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  • ๋‚˜๋Š” ์ด๊ฒƒ์ด ๋‹ค๋ฅธ JavaScript ์ปจํ…์ŠคํŠธ์— ๋œ ์œ ์šฉํ•˜์ง€ ์•Š์„๊นŒ ๊ฑฑ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. JSC C API ๋ฐ Objective-C API ํด๋ผ์ด์–ธํŠธ๊ฐ€ JS ์ฝ”๋“œ์—์„œ WebAssembly API์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฌธ์„ ์—ด์–ด๋‘๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ํด๋ผ์ด์–ธํŠธ๋Š” ์šฐ๋ฆฌ๊ฐ€ ํ• ๋‹นํ•˜๋Š” 4GB ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์— ๋Œ€ํ•œ ์ž‘์€ ์ œํ•œ์„ ์„ ํ˜ธํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ํ•ด๋‹น ํ• ๋‹น๋Ÿ‰์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ๊ฒƒ๋„ ์ข‹์Šต๋‹ˆ๋‹ค.

๊ฐœ์„ ๋œ API๋ฅผ ํ†ตํ•ด ๋ฉ”๋ชจ๋ฆฌ ์ˆ˜์— ์ธ์œ„์ ์ธ ์ƒํ•œ์„ ์ด ํ•„์š”ํ•˜๊ฑฐ๋‚˜ ์žฌ์ปดํŒŒ์ผํ•ด์•ผ ํ•˜๋Š” ํ•„์š” ๋˜๋Š” ๊ธฐํƒ€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์€ ์ผ์„ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค. ๋‚˜๋Š” ํ—ˆ์šฉ ์˜ค์ฐจ๊ฐ€ ๋งค์šฐ ํฌ์ง€ ์•Š๋Š” ํ•œ ์ธ๊ณต ์ฒœ์žฅ์„ ์ข‹์•„ํ•˜์ง€ ์•Š์œผ๋ฉฐ ์—ฌ๊ธฐ์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@pizlonator ์ถฉ๋ถ„ํžˆ ๊ณต์ •ํ•˜๊ณ  ๋” ๊นจ๋—ํ•˜๊ณ  ๊ฐ„๋‹จํ•œ API์ด๋ฏ€๋กœ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜๊ฐ€ ์–ธ๊ธ‰ํ•œ ํ•ญ๋ชฉ์— ๋Œ€ํ•ด ๊ด€์‹ฌ์ด ์—†๋Š” ์ด์œ ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค(ํ˜„์žฌ).

  • ํ•œ๋„๋ฅผ ๋†’์—ฌ์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฑด ์‰ฝ์Šต๋‹ˆ๋‹ค.
  • ํ•ฉ๋‹นํ•œ ์ œํ•œ์ด ๋ฌด์—‡์ด๋“  ๊ฐ„์— ์ด 64๋น„ํŠธ ์ฃผ์†Œ ๊ณต๊ฐ„์˜ ์ž‘์€ ๋ถ€๋ถ„๋งŒ ์‚ฌ์šฉ๋˜๋ฏ€๋กœ ๊ณต๊ฒฉ ๋ฒกํ„ฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ์•Œ์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ์ •๋œ ์ฝ˜ํ…์ธ ๋Š” ์ž์ฒด์ ์œผ๋กœ OOMํ•  ์ˆ˜ ์žˆ๋Š” ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
  • ์šฐ๋ฆฌ๋Š” ์˜ˆ์•ฝ ํฌ๊ธฐ์— ์ƒ์‘ํ•˜๋Š” GC ํœด๋ฆฌ์Šคํ‹ฑ์„ ๋ฒ”ํ•˜๊ณ  Memory s๋ฅผ ํœ˜์ “๋Š” ๊ฒƒ์€ ๋” ๊ณต๊ฒฉ์ ์ธ GC๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๋” ๋งŽ์€ GC๋Š” ์ข‹์ง€ ์•Š์ง€๋งŒ ์ด๊ฒƒ์ด ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ๊ฐ€ ๋ฏธ๋ž˜์— ๋ฌด์—‡์„ ๋ณด๊ฒŒ ๋ ์ง€ ๋ˆ„๊ฐ€ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ์ง€๊ธˆ ๋‚ด์žฅ๋œ ์œ ์—ฐ์„ฑ์„ ๊ฐ–๋Š” ๊ฒƒ์ด ์œ ์šฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

js API(ํŠนํžˆ ์•„ํ‚คํ…์ฒ˜/ํ”Œ๋žซํผ๋ณ„ ์„ธ๋ถ€์‚ฌํ•ญ)์—์„œ ๋„ˆ๋ฌด ๋งŽ์€ ๊ตฌํ˜„ ์„ธ๋ถ€์‚ฌํ•ญ์„ ํ‘œ๋ฉดํ™”ํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ๋‚˜์œ ์ƒ๊ฐ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋น ๋ฅธ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ์ž์ฒด ๋‚ด๋ถ€ ์ œํ•œ์„ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ถฉ๋ถ„ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

2016๋…„ 10์›” 28์ผ ๊ธˆ์š”์ผ ์˜ค์ „ 2์‹œ 15๋ถ„, JF Bastien [email protected]
์ผ๋‹ค:

์˜ˆ, ๋ฉ”๋ชจ๋ฆฌ๋ฅผ
ํŽธ์ง‘.

๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜คํžˆ๋ ค ๋ฐ˜๋Œ€์— ์ฐฌ์„ฑํ•˜์—ฌ ๋‚™๋‹ดํ•ด์•ผํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค
๋ฉ”๋ชจ๋ฆฌ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ. ๊ฒฐ๊ตญ ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค์ง€ ์•Š์œผ๋ฉด
๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ด๋ณด๋‚ด๊ฑฐ๋‚˜ ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์˜ˆ์•ฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ ์•Œ์•„
์ผ๋ถ€๋Š” ๋ณต์žกํ•œ ๋ชจ๋“ˆ์„ ํšจ์œจ์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.
์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€๋งŒ ๋ชจ๋†€๋ฆฌ์‹ WASM ์•ฑ์€
์šฐ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ๋” ์ผ๋ฐ˜์ ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์—ฌ๊ธฐ ์†Œ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์ง€๋งŒ
๋™์  ๋ฐ”์ธ๋”ฉ์ด ์ ์€ ๋ชจ๋“ˆ์„ ๋” ์ ๊ฒŒ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

โ€”

๋‹น์‹ ์ด ๋Œ“๊ธ€์„ ๋‹ฌ์•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/WebAssembly/design/issues/838#issuecomment -256805006,
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/ALnq1KXrUWaegRZwEhznmT1YcyI33IN9ks5q4T6TgaJpZM4Kh1gM
.

์ „์ ์œผ๋กœ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋†€๋ฆฌ์‹ ์•ฑ์ด ์ตœ์†Œํ•œ mvp ์ดํ›„ ๋ช‡ ๋…„ ๋™์•ˆ์€ ์ฃผ์š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ˆ˜๋งŒ ๊ฐœ์˜ ๋ชจ๋“ˆ์ด ๋กœ๋“œ๋˜์—ˆ์„ ๋•Œ ๋ฌด์Šจ ์ผ์ด ์ผ์–ด๋‚ ์ง€ ๊ฑฑ์ •ํ•˜๋Š” ๊ฒƒ์€ ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” wasm ์ƒํƒœ๊ณ„์— ๋Œ€ํ•ด ๋งŽ์€ ๊ฒƒ์„ ๊ฐ€์ •ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•ด ํ•ด์•ผ ํ•  ์ผ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ํ•œ ๊ฐ€์ง€๋Š” ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” http://webassembly.org/getting-started/js-api ๋ฅผ ์—…๋ฐ์ดํŠธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ๊ฒƒ์€ binaryen์ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ๋ฐฉ์ถœํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ข‹์€ @kripken?). @titzer Canary๋Š” WebAssembly.instantiate ๊ตฌํ˜„ํ•ฉ๋‹ˆ๊นŒ?

๋‹ค๋ฅธ ๊ฑด ์—†๋‚˜์š”?

@lukewagner : ๋‹น์‹ ์ด ๋ฌด์—‡์„ ๋ฌป๊ณ  ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ๋งค์šฐ ๊น๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ ์ƒˆ๋กœ์šด ์•ฝ์† ๊ธฐ๋ฐ˜ API ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ํ˜„์žฌ ๋™๊ธฐํ™” WebAssembly.Instance API์—์„œ ๋ฐ”์ด๋„ˆ๋ฆฌ๋ฅผ ๋ณ€๊ฒฝํ•˜์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ํ•„์š”ํ•ฉ๋‹ˆ๊นŒ? ์šฐ๋ฆฌ๋Š” ์ด์ „ ๋ฐฉ์‹์„ ์ œ๊ฑฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ?

@kripken ๋งž์Šต๋‹ˆ๋‹ค. WebAssembly.instantiate ์‚ฌ์šฉ์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด์ „ ๋ฐฉ๋ฒ•์„ ์ œ๊ฑฐํ•˜์ง€ ์•Š์ง€๋งŒ ์ƒˆ ๋ฐฉ๋ฒ•์ด ๋” ํšจ์œจ์ ์ด๋ฉฐ ๊ธฐ๋ณธ์ ์œผ๋กœ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

HTML์„ ์ƒ์„ฑํ•  ๋•Œ promise ๊ธฐ๋ฐ˜ API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ JS๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ž๋™์œผ๋กœ ๋น„๋™๊ธฐ ๋‹จ๊ณ„๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด ์ด๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ธŒ๋ผ์šฐ์ €์— ์ด ๊ธฐ๋Šฅ์ด ํƒ‘์žฌ๋œ ํ›„์—๋งŒ ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@kripken ๋‚ด๊ฐ€ ์ดํ•ดํ–ˆ๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ ์ ‘๊ทผ ๋ฐฉ์‹์€ ๋น„๋™๊ธฐ API๋ฅผ ์ „ํ˜€ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

์˜ˆ . ๋น„๋™๊ธฐ ํ•ญ๋ชฉ์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์ด ๋ฌธ์ œ ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

@kripken ๋…ธ๋“œ์—๋Š” ์ž‘๋™ํ•˜๋Š” ์•ฝ์†์ด ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์…ธ์—๋„ ์•ฝ์† ๋Œ€๊ธฐ์—ด์„ ๋ช…์‹œ์ ์œผ๋กœ ๋น„์šฐ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ ๋ชจ๋“  ํ•ด๊ฒฐ์„ ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰). SM์—์„œ๋Š” drainJobQueue() ์ด๊ณ  V8์—์„œ๋Š” %RunMicroTasks() ๋ผ๊ณ  ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœํžˆ test WebAssembly.instantiate ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ์กด์žฌํ•  ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก , ํ•˜์ง€๋งŒ ๋จผ์ € Promise ์ง€์›์€ ์ตœ์‹  node.js์— ์žˆ์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ์šฉ๋˜๋Š” ๋ฒ„์ „์—๋Š” ์—†์Šต๋‹ˆ๋‹ค(์˜ˆ: Linux ๋ฐฐํฌํŒ์˜ ๊ธฐ๋ณธ ๋ฒ„์ „). ๋‘ ๋ฒˆ์งธ๋กœ ๋” ํฐ ๋ฌธ์ œ๋Š” HTML์„ ๋‚ด๋ณด๋‚ผ ๋•Œ ํŽ˜์ด์ง€๊ฐ€ ๋กœ๋“œ๋˜๋Š” ๋ฐฉ์‹์„ ์ œ์–ดํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(emcc๊ฐ€ ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•ด ๋กœ๋“œ ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋ƒ„). ๋ฐ˜๋ฉด JS๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š” JS๊ฐ€ ์„ ํ˜•์œผ๋กœ ์‹คํ–‰๋˜๋Š” ๊ฒƒ์œผ๋กœ ๊ฐ€์ •ํ•˜๊ณ  ์‚ฌ์šฉ์ž๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ํ•ด๋‹น JS ๋ฐ”๋กœ ๋’ค์— ๋‹ค๋ฅธ ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๋Š” ์ž์‹ ์˜ ๋กœ๋”ฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค.

์ด ๋‘ ๊ฐ€์ง€์˜ ๊ฒฐ๊ณผ๋กœ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ HTML์„ ๋‚ด๋ณด๋‚ผ ๋•Œ Promise API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(๊ทธ๋Ÿฌ๋ฉด ๋ถ„๋ช…ํžˆ ์…ธ์— ์žˆ์ง€ ์•Š๊ณ  ๋กœ๋“œ๋ฅผ ์ œ์–ดํ•  ์ˆ˜ ์žˆ์Œ) JS๋ฅผ ๋‚ด๋ณด๋‚ผ ๋•Œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๊ณณ์—์„œ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์„ ๋ฌธ์„œํ™”ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ์ž…๋‹ˆ๋‹ค.

Node์— WebAssembly๋ฅผ ์ง€์›ํ•˜์ง€๋งŒ Promise๋Š” ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๋ฒ„์ „์ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋…ธ๋“œ ์‚ฌ๋žŒ๋“ค์€ ์ด๋Ÿฌํ•œ ๋ฒ„์ „์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ง์„  JS๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•œ๋‹ค. ํ•ญ์ƒ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋ฉด Just Work(์ฝ”๋“œ ์‚ฌ์šฉ์ž๋Š” Promise๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•จ)๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋‹ต์€ ๋ชจ๋ฅด์ง€๋งŒ polyfill์„ ์‚ฌ์šฉํ•˜๋ฉด ์•ฝ์†์ด ์—†๋Š” ๋…ธ๋“œ ๋ฒ„์ „์—์„œ wasm์„ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋…ธ๋“œ๊ฐ€ ์ž ์‹œ ๋™์•ˆ setTimeout ๋ฒ„์ „์„ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ์†์„ ํด๋ฆฌํ•„ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•  ์ˆ˜๋„ ์žˆ์ง€๋งŒ, ๊ทธ๊ฒƒ๋„ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ง์„  ๋ฌธ์ œ ์ •๋ณด: emcc๋Š” ๋Ÿฐํƒ€์ž„์„ ์„ค์ •ํ•˜๊ณ  ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์— ์—ฐ๊ฒฐํ•˜๋Š” JS๋ฅผ ๋ฐฉ์ถœํ•ฉ๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ์˜ ์ผ๋ถ€ JS๋Š” ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ccall ์‚ฌ์šฉ). ์ฆ‰, emcc์˜ JS ์ถœ๋ ฅ์€ ์•ฝ์†์ด ์•„๋‹ˆ๋ฏ€๋กœ "์•ฝ์† ๋ฐ˜ํ™˜"์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋ˆ„๊ฐ€ ๋ฐ›์„๊นŒ์š”? ๊ทธ๋Ÿฌ๋‚˜ ์–ด๋–ค ๊ฒฝ์šฐ๋“  ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋กœ๋Š” emcc๊ฐ€ HTML์„ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ๋น„๋™๊ธฐ ๋กœ๋”ฉ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€ ์‚ฌ์šฉ์ž๋Š” ๋กœ๋“œ๋ฅผ ๋ณด๋‹ค ์ง์ ‘์ ์œผ๋กœ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. ๋” ๋‚˜์€ ๊ฒฝ์šฐ ๋น„๋™๊ธฐ wasm์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WebAssembly๊ฐ€ ์žˆ์ง€๋งŒ Promise๊ฐ€ ์—†๋Š” IMO Node๋Š” ์šฐ๋ฆฌ๊ฐ€ ๊ฑฑ์ •ํ•ด์•ผ ํ•˜๋Š” ์„ค๊ณ„ ์ œ์•ฝ ์กฐ๊ฑด์ด ์•„๋‹™๋‹ˆ๋‹ค. WebAssembly์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์€ ๊ทธ๋Ÿฐ ๋งฅ๋ฝ์—์„œ ๊ฝค ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์„ ํ•˜๋Š”์ง€ ์„ค๋ช…ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์™„์ „ํžˆ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๋ฐฑ์—…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์›น ํŽ˜์ด์ง€์˜ ์ฝ”๋“œ๊ฐ€ Promise API๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. Emscripten์€ ์ด๋Ÿฌํ•œ ์ฝ”๋“œ์˜ ์ œ์ž‘์ž์ž…๋‹ˆ๋‹ค. ์•ฝ์†์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒƒ์„ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ธ์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. "์˜ค๋Š˜์€ ๊ทธ๋ ‡์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ ์žˆ๋Š” ์ž‘์—…์ด์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ํ•ด๋ณด๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค"๋ผ๊ณ  ๋งํ•ด๋„ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์šฐ๋ฆฌ ํ† ๋ก ์—์„œ ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์ด ๋งํ•˜๋Š” ๊ฒƒ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์บ์‹ฑ์„ ์œ„ํ•ด ๋น„๋™๊ธฐ API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋Œ€ํ•ด์„œ๋งŒ ์ง€์ ํ•œ ๋ฌธ์ œ ์ž…๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์ด ์‹œ์ž‘์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋„๋‹ฌํ•˜๊ณ  ์‹ถ์€ ์ตœ์ข… ์ƒํƒœ๋Š” ์ฒซ ๋ฒˆ์งธ ๋กœ๋“œ์—์„œ๋„ ๋น„๋™๊ธฐ API๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

๋…ธ๋“œ์—์„œ ํด๋ฆฌํ•„์ด ์–ด๋ฆฌ์„์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ณด๋‹ค ์ ๋”๋ผ๋„ ๊ทธ ๋งฅ๋ฝ์—์„œ ์—ฌ์ „ํžˆ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. :)

๋‹ค์‹œ: Emscripten ์€ HTML์„ ๋‚ด๋ณด๋‚ผ ๋•Œ promise API

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

๋‚ด๊ฐ€ ๋งํ•˜๊ณ ์ž ํ•˜๋Š” ๊ฒƒ์€ Emscripten์ด JS(๋œ ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋กœ)๋ฅผ ๋ฐฉ์ถœํ•  ๋•Œ ํ•ด๋‹น ์ถœ๋ ฅ์— ๋Œ€ํ•œ ๋ณด์žฅ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๋น„๋™๊ธฐ ๋งˆ์ˆ ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ์ฝ”๋“œ์™€ ์ผ์น˜ํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์›ํ•˜์ง€ ์•Š๋Š” ์‚ฌ๋žŒ๋“ค์˜ ์ฝ”๋“œ๋ฅผ ๊นจ๋œจ๋ฆด ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ๋ˆ„๊ตฐ๊ฐ€๋Š” ์ค€๋น„๊ฐ€ ๋˜์—ˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋Š” JS ์งํ›„์— ๋™๊ธฐ์ ์œผ๋กœ ์‹คํ–‰๋˜๋Š” JS๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ๊ฒฝ์šฐ์—๋Š” ์•ฝ์†์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

````

````

doSomething Module.my_func ์ด ์กด์žฌํ•˜๋ ค๋ฉด output.js ๋ฐฉ๊ธˆ ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ–ˆ๋‹ค๋ฉด ์•„์ง ์กด์žฌํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๊ฒƒ์€ ํš๊ธฐ์ ์ธ ๋ณ€๊ฒฝ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒŒ ์ง€๊ธˆ ๋ง์ด ๋ฉ๋‹ˆ๊นŒ?

๋…ธ๋“œ์—์„œ ํด๋ฆฌํ•„์ด ์–ด๋ฆฌ์„์€ ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‹ค๋ฅธ ๊ฒฝ์šฐ๋ณด๋‹ค ์ ๋”๋ผ๋„ ๊ทธ ๋งฅ๋ฝ์—์„œ ์—ฌ์ „ํžˆ ์œ ์šฉํ•ด ๋ณด์ž…๋‹ˆ๋‹ค. :)

wasm์— ๋Œ€ํ•œ ํด๋ฆฌํ•„์€ ์–ด๋ฆฌ์„์€ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. wasm์ด ์—†๊ณ  ํด๋ฆฌํ•„ํ•˜๊ณ  ์•ฝ์†์€ ์—†์ง€๋งŒ ํด๋ฆฌํ•„ํ•˜์ง€ ์•Š๋Š” ๋…ธ๋“œ ์„ค์น˜์— ์ผ€์ดํ„ฐ๋ง์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ฆฌ์„์€ ์ผ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ง์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์—‰๋ฉ์ด์˜ ๋‚˜๋จธ์ง€ ์ ˆ๋ฐ˜์„ ๊ฐ€์ ธ์™€์•ผํ•ฉ๋‹ˆ๋‹ค ๐Ÿ˜

๋‹ค์‹œ: Emscripten์€ HTML์„ ๋‚ด๋ณด๋‚ผ ๋•Œ promise API๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์ด ๊ถŒ์žฅ๋˜๋Š” ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๋Œ€๋‹ต์€ "์˜ˆ"์ž…๋‹ˆ๋‹ค. ์˜๋ฏธ ์žˆ๋Š” ์ž‘์—…์€ ์•„๋‹™๋‹ˆ๋‹ค. ์บ์‹ฑ์— ์ค‘์ ์„ ๋‘” ํ•ด๋‹น ๋ฌธ์ œ์— ์Šค์ผ€์น˜๋˜์–ด ์žˆ์ง€๋งŒ (์ด์ „) ์˜คํ”„๋ผ์ธ ํ† ๋ก ์—์„œ ๋ฉ”๋ชจ๋ฅผ ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋™์•ˆ ์šฐ๋ฆฌ๊ฐ€ ํ•  ์ˆ˜ ์žˆ๊ณ  ์‚ฌ์†Œํ•œ ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ๊ธฐ์—์„œ ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ์ตœ์ ํ™”๋„ ๋งŽ์ด ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ํ•ด๊ฒฐํ•ฉ๋‹ˆ๊นŒ?

๊ทธ๋ž˜ ๊ดœ์ฐฎ๋„ค! ๋Œ€๋ถ€๋ถ„์˜ ์›น ํŽ˜์ด์ง€๊ฐ€ promise API๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํ•œ ์ €๋Š” ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

[ํ•œ์กฐ๊ฐ]

๊ทธ๊ฒŒ ์ง€๊ธˆ ๋ง์ด ๋ฉ๋‹ˆ๊นŒ?

์˜ˆ. ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

๋‚ด ๊ด€์ ์—์„œ ๋ณผ ๋•Œ Emscripten์€ ๋” ์ด์ƒ JS๋ฅผ ๋‚ด๋ณด๋‚ด๋Š” ์‚ฌ์—…์ด ์•„๋‹™๋‹ˆ๋‹ค! ๊ท€ํ•˜์˜ ์˜ˆ๋Š” Ye Olden Codes์— ์ ํ•ฉํ•˜์ง€๋งŒ ์ƒˆ๋กœ์šด ๊ฒƒ์€ ์•ฝ์† IMO๋ฅผ ๊ฐ€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Btw, instantiate ๋ฅผ ์‚ฌ์šฉํ•˜๋„๋ก webassembly.org/demo๋ฅผ ์ „ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๋ณด์•˜๊ณ  ํ˜„์žฌ ๋™๊ธฐ new Instance ๊ฐ€ ๋™๊ธฐ ๊ฒฐ๊ณผ๋ฅผ ์›ํ•˜๋Š” ์ปจํ…์ŠคํŠธ์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ธฐ๋ณธ์ ์œผ๋กœ instantiate ๋ฅผ ๋ฐฉ์ถœํ•˜๋„๋ก Binaryen์ด ์—…๋ฐ์ดํŠธ๋˜๋ฉด AngryBots ๋ฐ๋ชจ๋ฅผ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Unity๋Š” ์ž์ฒด ๋กœ๋”ฉ ๋ฐ HTML ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์ „๋‹ฌํ•˜์—ฌ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” emcc์—์„œ html์„ ๋‚ด๋ณด๋‚ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).

์˜ˆ, ํ•˜์ง€๋งŒ ์ฒ˜์Œ๋ถ€ํ„ฐ ๋‹ค์‹œ ๋นŒ๋“œํ•˜๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Unity๋Š” ์ž์ฒด ๋กœ๋”ฉ ๋ฐ HTML ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์•ž์„œ ์–ธ๊ธ‰ํ•œ ๋Œ€๋กœ ์ด ๋ฌธ์ œ๋ฅผ ๋ฌธ์„œํ™”ํ•˜๊ณ  ์ „๋‹ฌํ•˜์—ฌ ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(๋˜๋Š” emcc์—์„œ html์„ ๋‚ด๋ณด๋‚ด๋„๋ก ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์ด ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค).

WebAssembly.instantiate API๋ฅผ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š์„ ๋•Œ์˜ ์ž ์žฌ์ ์ธ ๋‹จ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์‚ฌ์šฉ์„ ๊ณ ๋ คํ•˜๋„๋ก ์š”์ฒญํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋‹จ์ ์ด ๋ฌธ์„œํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ๋ฉ”์ธ wasm ์›น์‚ฌ์ดํŠธ๋‚˜ emscripten wasm ์œ„ํ‚ค ํŽ˜์ด์ง€ ์—์„œ ์ด์— ๋Œ€ํ•œ ๋ช…ํ™•ํ•œ ์ง€์นจ์ด

๋‚˜๋Š”์ด ๊ธด ๋ฌธ์ œ๋ฅผ ์ง์ ‘ ํ›‘์–ด ๋ณด์•˜๊ณ  ์•„์ง ๋‹จ์ ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ๊ทธ๊ฒƒ๋„ ์ฝ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. :)

@kripken ํ˜„์žฌ ์ฝ”๋“œ์˜ ๋ฌธ์ œ๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ํ•„์š”ํ•จ๊ณผ ๋™์‹œ์— binaryen/emscripten์ด ํ•„์š”ํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ( instantiate ์— ๋Œ€ํ•œ ์ธ์ˆ˜๋กœ ํ•„์š”)๋งŒ ์ œ๊ณตํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ "์•ž์„œ" ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋น„๋™๊ธฐ XHR์˜ ๊ผฌ๋ฆฌ ๋ถ€๋ถ„์— WebAssembly.instantiate ๋ฅผ ๋ถ€์ฐฉํ•˜๋Š” ๊ฒƒ์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค(ํ˜„์žฌ ๋ฐ๋ชจ์—์„œ async compile ์ˆ˜ํ–‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณธ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ํ˜„์žฌ AngryBots wasm ๋นŒ๋“œ๋Š” ์ฐจ์„ ์ฑ…์ด๋ฉฐ ์–ด์จŒ๋“  ์ƒˆ๋กœ์›Œ์ ธ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜ค, ๋‚˜๋Š” wasm XHR์ด ์‹œ์ž‘๋˜๊ธฐ๋„ ์ „์— ์ˆ˜์ž…ํ’ˆ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•˜๋Š” ๊ฒƒ์ด ์—ฌ๊ธฐ์„œ ํ•ต์‹ฌ์ด๋ผ๋Š” ๊ฒƒ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ›จ์”ฌ ๋” ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‚ด๊ฐ€ ์ „์— ๋งํ•œ ๋Œ€๋ถ€๋ถ„์€ ํ‹€๋ ธ๋‹ค.

๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ•˜๋ ค๋ฉด ๋ชจ๋“  JS ๊ธ€๋ฃจ๋ฅผ ๋‹ค์šด๋กœ๋“œ, ๊ตฌ๋ฌธ ๋ถ„์„ ๋ฐ ์‹คํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. wasm XHR์ด ์‹œ์ž‘๋˜๊ธฐ ์ „์— ์ด ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋ฉด ์ง€๊ธˆ๊ณผ๋Š” ๋งค์šฐ ๋‹ค๋ฅธ ๋กœ๋”ฉ ๋ฐฉ์‹๊ณผ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ค‘์†Œ ๊ทœ๋ชจ ํ”„๋กœ์ ํŠธ์˜ ๊ฒฝ์šฐ ์†๋„ ํ–ฅ์ƒ์ด ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„์ง ์ธก์ •ํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์ธก์ •ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ Unity๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฐ„๋‹จํ•œ ์ผ์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ๊ฐ€ ์ค€๋น„๋˜๊ธฐ ์ „์— JS ๊ธ€๋ฃจ๊ฐ€ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก emcc๊ฐ€ ๋‚ด๋ณด๋‚ด๋Š” ์ฝ”๋“œ๋ฅผ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋งˆ๋„ ์šฐ๋ฆฌ๋Š” ๋ฐฉ์ถœ๋œ JS์˜ ์ƒˆ ๋ชจ๋ธ, ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ JS ํŒŒ์ผ, ๋‚˜๋จธ์ง€๋ฅผ ์œ„ํ•œ ํ•˜๋‚˜์˜ JS ํŒŒ์ผ์„ ๊ณ ๋ คํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์€ ์˜ตํŠธ์ธ(opt-in)์ด ๋  ๊ฒƒ์ด๊ณ , ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๋Š” ์•„๋ฌด๋„ ๋ฐฉํ•ดํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ๋งŽ์€ ๊ณ ๋ ค ์‚ฌํ•ญ์ด ์žˆ์œผ๋ฉฐ ์ธก์ • ์—†์ด๋Š” ๋ฌด์—‡์ด ์ตœ์ ์ธ์ง€ ์ถ”์ธกํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

@kripken XHR ์ด์ „์ด ์•„๋‹ˆ๋ผ ์™„๋ฃŒ๋œ ํ›„, ๊ทธ๋ฆฌ๊ณ  ๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐœ์ฒด์— ๋™๊ธฐ์‹ ์•ก์„ธ์Šค๋ฅผ ์›ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ์‹คํ–‰์„ ์‹œ์ž‘ํ•˜๊ธฐ ์–ผ๋งˆ ์ „์—. ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ํ•ด๊ฒฐ๋  ๋•Œ ํ˜ธ์ถœ๋˜๋Š” ์ผ๋ถ€ ์ฝœ๋ฐฑ์— ๋‚ด๋ณด๋‚ด๊ธฐ ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ , ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค(ํŠนํžˆ ๋น„๋™๊ธฐ๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ์ด์œ ๋ฅผ ์ดํ•ดํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ๋™๊ธฐ์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ์ด์ ์ด ์žˆ์„๊นŒ์š”?). ๊ทธ๋Ÿฌ๋‚˜ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๋Š” XHR์ด ์™„๋ฃŒ๋œ ํ›„์—๋„ ์—ฌ์ „ํžˆ ๊ด€๋ จ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ฆ‰, ์ด์ œ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‚ด๋ณด๋‚ด๊ธฐ๋„ ์ˆ˜์‹ ํ•˜๋Š” ๋‹จ์ผ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ๋‚˜๋ˆ„๋ฉด ์ ˆ์ถฉ์ ์ด ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„์ด ์žˆ์„ ๋•Œ ์ธก์ •ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

์ฝœ๋ฐฑ์— ๋‚ด๋ณด๋‚ด๊ธฐ ์‚ฌ์šฉ ์ฝ”๋“œ๋ฅผ ๋„ฃ๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จํ•˜์—ฌ ์Šฌํ”„๊ฒŒ๋„ ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์ด์œ ๋กœ๋งŒ ์ž‘๋™ํ•˜์ง€๋Š” ์•Š์ง€๋งŒ ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ ๋ชจ๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ธก์ •์˜ ์ผ๋ถ€๋กœ ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

instantiate ์˜ ์„œ๋ช…์€ WebAssembly.instantiate(bytes, importObj) ์ด๋ฏ€๋กœ ๋น„๋™๊ธฐ ์ปดํŒŒ์ผ+์ธ์Šคํ„ด์Šคํ™”๋ฅผ ์‹œ์ž‘ํ•˜๋ ค๋ฉด importObj ๋ฅผ ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์˜คํ”„๋ผ์ธ์—์„œ @lukewagner ๋Š” ์—ฌ๊ธฐ์„œ ์ฃผ์š” ๋ฌธ์ œ๊ฐ€ ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋™์•ˆ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์žˆ๋‹ค๋Š” ์ ์— ๊นŠ์€ ์ธ์ƒ์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ ์ด ์ƒˆ๋กœ์šด API๋ฅผ ์‹ค์ œ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‰ฌ์šด์ง€์™€ ๊ด€๋ จ๋œ ์„ธ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  1. ์ปดํŒŒ์ผํ•  ๋•Œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ์ปดํŒŒ์ผํ•  ๋•Œ ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค(์ด์ „ ํ•ญ๋ชฉ์˜ ์ƒ์œ„ ์ง‘ํ•ฉ).
  3. ์ด ๋ชจ๋“  ์ž‘์—…์„ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

ํ˜„์žฌ ํˆด์ฒด์ธ์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•  ๋•Œ ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ 2 + 3์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์€ ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ์†์ƒ์‹œํ‚ค๊ธฐ ๋•Œ๋ฌธ์— ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ๊ธฐ๋ฅผ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ฒ˜์Œ์—๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ตฌ์„ฑ์›๊ณผ ์ƒ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์‹ค์ œ๋กœ ์ž˜ ํ•˜๋ ค๋ฉด - ์ƒˆ๋กœ์šด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค - ์‹œ๊ฐ„๊ณผ ์ž‘์—…์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(๋น ๋ฅด๊ฒŒ ํ•˜๋ฉด ์ˆ˜์ž… ๋˜๋Š” ์ˆ˜์ถœ์— ๊ฐ„์ ‘ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์ˆ˜ํ–‰).

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค.

  • 1 + 3์—๋Š” instantiate(bytes, Memory) -> Promise ์™€ ๊ฐ™์€ ์ƒˆ API๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ด์œ ๋Š” ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์–ด์จŒ๋“  ์ผ์ฐ ์ƒ์„ฑ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๊ฑฐ์˜ ๋‹ค๋ฅธ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” JS ํ•จ์ˆ˜์ด๋ฉฐ ์ดˆ๊ธฐ์—๋Š” ๊ฐ€์งˆ ์ˆ˜ ์—†์Œ).
  • 2 ์ž์ฒด๋กœ, 3 ์—†์ด, ์ฆ‰ new Instance(bytes, imports) . ์ฆ‰, ๋ฐ”์ด๋„ˆ๋ฆฌ ๋ฐ์ดํ„ฐ + ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•œ ๋™๊ธฐ ์ปดํŒŒ์ผ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ์ด์œ ๋Š” ํ˜„์žฌ ์ฝ”๋“œ๊ฐ€ instance = new WebAssembly.Instance(new WebAssembly.Module(getBinary()), imports) ํ•˜๋ฏ€๋กœ ์ด๋ฅผ 1๊ฐœ์˜ API ํ˜ธ์ถœ๋กœ ์ ‘์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋‚˜๋Š” ๋งˆ์ง€๋ง‰ ์˜ต์…˜์ด ์˜๋ฏธ๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ƒˆ API์˜ ๋™๊ธฐํ™” ๋ฒ„์ „์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๊ธฐ์กด ๋™๊ธฐ์‹ ์ปดํŒŒ์ผ ์˜ต์…˜๊ณผ ๋” ๋Œ€์นญ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์•„๋Š” ์ƒˆ๋กœ์šด ์ตœ์ ํ™”๋ฅผ ๋น„๋™๊ธฐ ์ปดํŒŒ์ผ์— ๋ฌถ์„ ์ด์œ ๊ฐ€ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๊นŒ? (๋น„๋™๊ธฐ๋Š” ํ›Œ๋ฅญํ•˜์ง€๋งŒ ๋ณ„๋„์˜ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ?)

์ปดํŒŒ์ผํ•˜๊ธฐ ์ „์— ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ํ• ๋‹น ํ•ด์•ผ ํ•œ๋‹ค๋Š” ์ œ์•ฝ์„ ๊นจ๊ธฐ ์œ„ํ•ด ๊ฐ€์ ธ์˜ค๊ธฐ(๋ฉ”๋ชจ๋ฆฌ)๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๋ฉ”ํƒ€ ๊ฐœ์ฒด๋ฅผ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด instantiate ๋ฉ”์†Œ๋“œ๋Š” ์ œ๊ณต๋œ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์˜ˆ์ƒํ•œ ๊ฒƒ๊ณผ ์ผ์น˜ํ•˜์ง€ ์•Š๊ณ  ์žฌ์ปดํŒŒ์ผ์ด ์ง€์—ฐ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ์˜ค๋ฅ˜๋ฅผ ๋˜์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ฉ”๋ชจ๋ฆฌ ์ œ์•ฝ์ด ์žˆ๋Š” ์žฅ์น˜์— ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜๊ธฐ ์ „์— ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๊ณ  ์„ ํ˜• ์ฃผ์†Œ ๊ณต๊ฐ„์—์„œ 0์— ํ• ๋‹น๋œ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์ปดํŒŒ์ผ์„ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ณดํ˜ธ ์˜์—ญ์ด ์žˆ๋Š” ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•ด ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋„ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. 2์˜ ๊ฑฐ๋“ญ์ œ๊ณฑ์— ์œ ์ถœ ์˜์—ญ์„ ๋”ํ•œ ๊ณ ์ •๋œ ์ตœ๋Œ€ ํฌ๊ธฐ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์ตœ์ ํ™”ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฉ”ํƒ€ ๊ฐ์ฒด๋Š” ๋˜ํ•œ ํ˜‘์ƒ๋œ ๋ฉ”๋ชจ๋ฆฌ ํŠน์„ฑ์— ์ตœ์ ํ™”๋œ ์ฝ”๋“œ๋ฅผ ๋ฐฉ์ถœํ•˜๊ธฐ ์œ„ํ•ด wasm ์‚ฌ์šฉ์ž ๋””์ฝ”๋”/์žฌ์ž‘์„ฑ๊ธฐ์— ์˜ํ•ด ์‚ฌ์šฉ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ช‡ ๋…„ ์ „ ์ด ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘๋  ๋ฌด๋ ต์— ํ•„์š”์— ๋”ฐ๋ผ ์ œ์•ˆ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค!

@kripken ๋™๊ธฐํ™” API๊ฐ€ ๊ธฐ์ˆ ์ ์œผ๋กœ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ํ™•์‹คํžˆ ๊ถŒ์žฅํ•˜์ง€ ์•Š๋Š” ๊ฒฝ๋กœ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™๊ธฐ ์ปดํŒŒ์ผ/์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ธˆ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ (๋˜๋Š” ๊ณผ๊ฑฐ์— ์ฃผ์žฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ)์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋ ค๋Š” ์˜๋„์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ์ด๊ฒƒ์€ ํ† ๋ก ์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž ์‹œ ์ถ•์†Œํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.


๋‹ค์Œ์€ AngryBots ๋ฐ๋ชจ๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ(asm.js๋ฅผ ํ†ตํ•ด) ๋กœ๋“œํ•˜๋Š”

comparison

๋™๊ธฐ ์ปดํŒŒ์ผ์€ ๋”์ฐํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์ด๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋กœ๋”ฉ์— ๋Œ€ํ•œ ๊ธฐํƒ€ ์‹œ๊ฐ์  ํ‘œ์‹œ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

๋…ธ๋ ฅ์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด Emscripten, Unity ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ WebAssembly๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๋„๋ก ํ•จ๊ป˜ ํ˜‘๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. cc @jechter @juj ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™๊ธฐ ๋กœ๋”ฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ•จ์ •์— ๋น ์ง€๋Š” ๊ฒƒ์„ ์—„์ฒญ๋‚˜๊ฒŒ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

WebAssembly.compile & WebAssembly.instantiate ์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ถŒ์žฅํ•˜๊ณ  new WebAssembly.Module & new WebAssembly.Instance ๊ถŒ์žฅํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


WebAssembly์˜ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์ด ์–ผ๋งˆ๋‚˜ ๋‚˜์œ์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ DevTools ์„ฑ๋Šฅ ํŒจ๋„๋กœ ์บก์ฒ˜ํ•œ ์ถ”์ ์ž…๋‹ˆ๋‹ค.

screen shot 2016-12-28 at 1 26 59 pm

MacBook Air์—์„œ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ 30์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„์ „ํžˆ ์ž ๊ฒจ ์žˆ์„ ๋•Œ wasm ๋ชจ๋“ˆ์ด ๋‹ค์šด๋กœ๋“œ๋œ ํ›„ ~20์ดˆ๋กœ ํ™•๋Œ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

screen shot 2016-12-28 at 2 18 36 pm

์ปดํŒŒ์ผ์—๋Š” ~20์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šคํ™”์—๋Š” ~2์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ Unity ๋กœ๋”๋Š” ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ ๋น„๋™๊ธฐ WebAssembly.compile ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ 20๋…„๋Œ€๋Š” V8์ด ์—ฌ์ „ํžˆ ๋‚ด๋ถ€์—์„œ ๋™๊ธฐ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. cc @titzer @flagxor ์ด๊ฒƒ์€ V8์ด ์ •๋ง๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

2์ดˆ ์ธ์Šคํ„ด์Šคํ™” ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์€ ๋™๊ธฐ new WebAssembly.Instance ํ˜ธ์ถœํ•˜๋Š” Unity ๋กœ๋” ์ฝ”๋“œ๋กœ ์ธํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Unity ์ฝ”๋“œ์™€ Emscripten์—์„œ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.


์ด๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐœ์— ์ด์„ ์˜๊ฑฐ๋‚˜ ํ•˜์ง€ ์•Š๋Š” _๋‹จ์ˆœํžˆ_ ์œ„ํ—˜์ด ์•„๋‹ˆ๋ผ๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ท ์ ์ธ ์›น ํŽ˜์ด์ง€์—๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ํƒ€์‚ฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋‘ ์ตœ์ƒ์œ„ ๋ฌธ์„œ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ WebAssembly๋ฅผ ํฌํ•จํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(์ถ”์ ์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด https://chromedevtools.github.io/timeline-viewer/?loadTimelineFromURL=https://www.dropbox.com/s/์—์„œ ์ „์ฒด ํƒ€์ž„๋ผ์ธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. noqjwql0pq6c1wy/wasm?dl=0)

async๊ฐ€ ํ›Œ๋ฅญํ•˜๋‹ค๋Š” ๋ฐ 100% ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผํ•˜๋ฉด์„œ ๋™์‹œ์— ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์–ป๋Š” ์ตœ์ ํ™”์™€ ์ง๊ตํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์šฐ๋ฆฌ๋Š” async + that ์ตœ์ ํ™”๋ฅผ ์‰ฝ๊ฒŒ ์–ป์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ - ์šฐ๋ฆฌ๋Š” ๊ทธ ์ฝค๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์ง€๋งŒ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ํฌ์ƒํ•˜๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ํ”Œ๋ž˜๊ทธ๋ฅผ ๋„์ž…ํ•˜๊ณ  ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ๋‹จ๊ณ„์ ์œผ๋กœ ์ ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ฉด ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. .

๋”ฐ๋ผ์„œ ๋ฉ”๋ชจ๋ฆฌ/์ปดํŒŒ์ผ ์ตœ์ ํ™”๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ๊ณ  ์ตœ๋Œ€ ํšจ์œจ์„ฑ์„ ์›ํ•œ๋‹ค๋ฉด ์ด๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋ฌถ๋Š” ๊ฒƒ๋„ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธด๊ธ‰ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ผœ์ ธ ์žˆ์ง€ ์•Š์•„๋„ ๊ดœ์ฐฎ๊ฑฐ๋‚˜ ์ƒˆ๋กœ์šด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์–ด๋„ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ฐœ๋ฐœ์ž๊ฐ€ wasm์„ ์„ ํƒํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์ตœ์ƒ์œ„ ๊ตฌ์กฐ๋ฅผ ์•ฝ๊ฐ„ ๋ณ€๊ฒฝํ•  ๊ธฐํšŒ๋ฅผ ์žก๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(ํ•„์š”ํ•œ ๊ฒฝ์šฐ ์ด์ „ ๋™์ž‘์„ ์„ ํƒํ•˜๋Š” ๋ฐฉ๋ฒ• ํฌํ•จ). ๋™๊ธฐํ™”๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค

@kripken ์ € , @lukewagner ๋ฐ @s3ththompson ์ด ๊ฐ€์ง„ ๊ฒฐ๋ก ๊ณผ ๋‹ค๋ฅธ ๊ฒฐ๋ก ์— ๋„๋‹ฌํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์€ ๊ธฐ์กด ๊ฐœ๋ฐœ์ž์—๊ฒŒ asm.js์—์„œ ์›ํ™œํ•œ ์ „ํ™˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์˜ฌ๋ฐ”๋ฅธ์ง€?

๋‚˜๋Š” ์ด๊ฒƒ์ด ํƒ€๋‹นํ•œ ์šฐ๋ ค๋ผ๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. WebAssembly๋ฅผ ์‚ฌ์šฉํ•œ IMO๊ฐ€ asm.js๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฐœ๋ฐœ์ž๋ฅผ ๋ถˆ๋Ÿฌ๋“ค์˜€๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋‚ฎ์€ ๋ฌด๊ฒŒ๋ฅผ ๋‘ก๋‹ˆ๋‹ค. ์–ผ๋ฆฌ ์–ด๋‹ตํ„ฐ๋ฅผ ํƒœ์šฐ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๊ณ  ์‹ถ์ง€๋งŒ IIUC ๊ธฐ์กด ๊ฐœ๋ฐœ์ž๋Š” ๋งค์šฐ ์œ ์—ฐ ํ•˜๊ณ  ๋น„๋™๊ธฐ ์ปดํŒŒ์ผ์„

๊ทธ๋“ค์ด ๋น„๋™๊ธฐ ์ปดํŒŒ์ผ์„ ์›ํ•˜๊ณ  ์ด๋ฅผ ์–ป๊ธฐ ์œ„ํ•ด ์ผ๋ถ€๋ฅผ ๋ฆฌํŒฉํ† ๋งํ•  ์˜ํ–ฅ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๋ฉด ๋‚จ์€ ๊ฒƒ์€ ์ปดํŒŒ์ผ ์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ฐ–๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ด API๊ฐ€ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•จ์ •์„ ํ”ผํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ๋ฐ”๋žŒ์งํ•ฉ๋‹ˆ๋‹ค.

์ด์ „์— ์ด๋ฅผ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด Emscripten ์ธก์— ๊ด€๋ จ๋œ ์ž‘์—…์˜ ์–‘์— ๋Œ€ํ•ด ์šฐ๋ ค๋ฅผ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„์ง๋„ ์ด๊ฒƒ์ด ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•˜์‹ญ๋‹ˆ๊นŒ?

FWIW, Unity 5.6์€ WebAssembly.instantiate๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์กฐ๋‚˜์Šค

2016๋…„ 12์›” 28์ผ ์˜คํ›„ 11์‹œ 42๋ถ„์— Seth Thompson [email protected]์ด ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ผ์Šต๋‹ˆ๋‹ค.

๋™๊ธฐ ์ปดํŒŒ์ผ/์ธ์Šคํ„ด์Šคํ™”๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ธˆ์ง€ํ•ด์•ผ ํ•˜๋Š” ์ด์œ (๋˜๋Š” ๊ณผ๊ฑฐ์— ์ฃผ์žฅํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ๋„ ์žˆ์Œ)์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋ ค๋Š” ์˜๋„์˜€์Šต๋‹ˆ๋‹ค. ๋ฐ”๋ผ๊ฑด๋Œ€ ์ด๊ฒƒ์€ ํ† ๋ก ์„ ์œ„ํ•œ ์ถ”๊ฐ€ ์ž๋ฃŒ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

์ž ์‹œ ์ถ•์†Œํ•˜๊ณ  ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ ๋น„๋™๊ธฐ ํ˜ธ์ถœ(asm.js๋ฅผ ํ†ตํ•ด), ์™ผ์ชฝ ๋ฐ ๋™๊ธฐ ํ˜ธ์ถœ(ํ˜„์žฌ WebAssembly ๊ตฌํ˜„)์„ ์‚ฌ์šฉํ•˜์—ฌ AngryBots ๋ฐ๋ชจ๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ(์˜ค๋ฅธ์ชฝ)์„ ๋น„๊ตํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™๊ธฐ ์ปดํŒŒ์ผ์€ ๋”์ฐํ•œ ์‚ฌ์šฉ์ž ๊ฒฝํ—˜์„ ์ œ๊ณตํ•˜๊ณ  ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์ด๋‚˜ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ ๋กœ๋”ฉ์— ๋Œ€ํ•œ ๊ธฐํƒ€ ์‹œ๊ฐ์  ํ‘œ์‹œ๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค.

๋…ธ๋ ฅ์ด ๋ฌด์—‡์ด๋“  ์ƒ๊ด€์—†์ด Emscripten, Unity ๋ฐ ๊ธฐํƒ€ ๋„๊ตฌ๊ฐ€ ๊ธฐ๋ณธ์ ์œผ๋กœ WebAssembly๋ฅผ ๋กœ๋“œํ•˜๋Š” ๋น„๋™๊ธฐ์‹์œผ๋กœ ๋‚ด๋ณด๋‚ด๋„๋ก ํ•จ๊ป˜ ํ˜‘๋ ฅํ•ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. cc @jechter @juj ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋™๊ธฐ ๋กœ๋”ฉ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ํ•จ์ •์— ๋น ์ง€๋Š” ๊ฒƒ์„ ์—„์ฒญ๋‚˜๊ฒŒ ์–ด๋ ต๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

WebAssembly.compile & WebAssembly.instantiate๋ฅผ ๋ช…์‹œ์ ์œผ๋กœ ๊ถŒ์žฅํ•˜๊ณ  ์ƒˆ๋กœ์šด WebAssembly.Module ๋ฐ ์ƒˆ๋กœ์šด WebAssembly.Instance๋ฅผ ๊ถŒ์žฅํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค.

WebAssembly์˜ ๊ฒฝ์šฐ ์˜ค๋ฅธ์ชฝ์— ์žˆ๋Š” ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์ด ์–ผ๋งˆ๋‚˜ ๋‚˜์œ์ง€ ์ข€ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

๋‹ค์Œ์€ DevTools ์„ฑ๋Šฅ ํŒจ๋„๋กœ ์บก์ฒ˜ํ•œ ์ถ”์ ์ž…๋‹ˆ๋‹ค.

MacBook Air์—์„œ ์ง„ํ–‰๋ฅ  ํ‘œ์‹œ์ค„์„ ํ‘œ์‹œํ•˜๋Š” ๋ฐ 30์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์‹œ๊ฐ„์ด ๊ฑธ๋ฆฌ๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ฉ”์ธ ์Šค๋ ˆ๋“œ๊ฐ€ ์™„์ „ํžˆ ์ž ๊ฒจ ์žˆ์„ ๋•Œ wasm ๋ชจ๋“ˆ์ด ๋‹ค์šด๋กœ๋“œ๋œ ํ›„ ~20์ดˆ๋กœ ํ™•๋Œ€ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ์—๋Š” ~20์ดˆ๊ฐ€ ๊ฑธ๋ฆฌ๊ณ  ์ธ์Šคํ„ด์Šคํ™”์—๋Š” ~2์ดˆ๊ฐ€ ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ Unity ๋กœ๋”๋Š” ์ง€์›๋˜๋Š” ๊ฒฝ์šฐ ์ด๋ฏธ ๋น„๋™๊ธฐ์‹ WebAssembly.compile์„ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ์œผ๋ฏ€๋กœ 20๋Œ€๋Š” V8์ด ์—ฌ์ „ํžˆ ๋‚ด๋ถ€์—์„œ ๋™๊ธฐ์‹ ์ปดํŒŒ์ผ์„ ์ˆ˜ํ–‰ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. cc @titzer @flagxor ์ด๊ฒƒ์€ V8์ด ์ •๋ง๋กœ ์ˆ˜์ •ํ•ด์•ผ ํ•  ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

2์ดˆ ์ธ์Šคํ„ด์Šคํ™” ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ์€ ๋™๊ธฐ์‹ ์ƒˆ WebAssembly.Instance๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Unity ๋กœ๋” ์ฝ”๋“œ๋กœ ์ธํ•ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด Unity ์ฝ”๋“œ์™€ Emscripten์—์„œ ๋ชจ๋‘ ์ˆ˜์ •ํ•ด์•ผ ํ•˜๋Š” ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๊ฐœ๋ฐœ์ž๊ฐ€ ๋ฐœ์— ์ด์„ ์˜๊ฑฐ๋‚˜ ๋ง๊ฑฐ๋‚˜ํ•˜๋Š” ์œ„ํ—˜์ด ์•„๋‹ˆ๋ผ๋Š” ์ ๋„ ์–ธ๊ธ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ‰๊ท ์ ์ธ ์›น ํŽ˜์ด์ง€์—๋Š” ์ˆ˜์‹ญ ๊ฐœ์˜ ํƒ€์‚ฌ ์Šคํฌ๋ฆฝํŠธ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์Šคํฌ๋ฆฝํŠธ๋Š” ๋ชจ๋‘ ์ตœ์ƒ์œ„ ๋ฌธ์„œ ๋ฒ„๋ฒ…๊ฑฐ๋ฆผ WebAssembly๋ฅผ ํฌํ•จํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

(์ถ”์ ์„ ๋” ์ž์„ธํžˆ ์‚ดํŽด๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด https://chromedevtools.github.io/timeline-viewer/?loadTimelineFromURL=https://www.dropbox.com/s/์—์„œ ์ „์ฒด ํƒ€์ž„๋ผ์ธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. noqjwql0pq6c1wy/wasm?dl=0)

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ฑฐ๋‚˜ GitHub์—์„œ ๋ณด๊ฑฐ๋‚˜ ์Šค๋ ˆ๋“œ๋ฅผ ์Œ์†Œ๊ฑฐํ•˜์„ธ์š”.

@jfbastien "๊ฒฐ๋ก "์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ดํ•ดํ•˜์ง€ ๋ชปํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ฃผ๋กœ ์—ฌ๊ธฐ์— ์˜ต์…˜์„ ์ œ์‹œํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜ ์ž์‹ ๋„ ๊ฒฐ๋ก ์ด ์—†๋‹ค.

์ง€๊ธˆ ๋ฐ”๋กœ ์ปดํŒŒ์ผ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ์˜ต์…˜์„ ์›ํ•˜๋Š” ๊ฒฝ์šฐ ํ˜„์žฌ ๋™๊ธฐํ™” ์ปดํŒŒ์ผ์„ ๊ฐ„๋‹จํ•˜๊ฒŒ ์ˆ˜์ •ํ•˜์—ฌ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์˜ต์…˜์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ์ง€๊ธˆ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ํ•ด๋‹น ์˜ต์…˜์„ ์„ ํƒํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜("1 + 3", ์ฆ‰ ์ปดํŒŒ์ผ ํƒ€์ž„์— ๋ชจ๋“  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ˆ˜์‹ ํ•˜์ง€ ์•Š๊ณ  ๋ฉ”๋ชจ๋ฆฌ๋งŒ ์ˆ˜์‹ )์„ ์ œ์•ˆํ–ˆ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ํ˜„์žฌ API("1 + 3"์ด ์•„๋‹˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น opt์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „์— ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์‹ ์ค‘ํ•œ ๊ณ„ํš์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ ค ์‚ฌํ•ญ์ด ๊ฑฐ์˜ ์—†๊ณ  ๊ทธ๋ƒฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋…ธ๋ ฅ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ—ˆ์šฉํ•  ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ „ํ˜€ ์ˆ˜์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋‚ด ๊ฐœ์ธ์ ์ธ ์ง๊ฐ์ธ ์šฐ๋ ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์˜ต์…˜์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ, ๋‚˜์—๊ฒŒ์„œ ๊ฒฐ๋ก ์ด ๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์œ„์˜ ๋ชจ๋“  ๊ฒƒ์€ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์ •๋ง๋กœ ๋‹น์‹ ์ด ๋” ์‹ ๊ฒฝ ์“ฐ๋Š” ๊ฒƒ์— ๋‹ฌ๋ ค ์žˆ์Šต๋‹ˆ๋‹ค: Memory-at-Compile-time, async, ๋˜๋Š” ๋‘˜ ๋‹ค; ๊ทธ๋ฆฌ๊ณ  ์ƒˆ๋กœ์šด ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์˜ ๋ฌธ์ œ; ๊ธด๊ธ‰ํžˆ ์›ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ธฐ๋‹ค๋ฆด ์ˆ˜ ์žˆ๋Š”์ง€ ๋“ฑ. ์‚ฌ๋žŒ๋“ค์ด ๊ฒฐ์ •ํ•˜๋Š” ๋ฐฉ์‹์— ์ƒ๊ด€์—†์ด ์œ„์˜ ์‚ฌํ•ญ์— ๋Œ€ํ•ด emscripten ์ธก์—์„œ ๊ธฐ๊บผ์ด ๋„์™€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

๋˜๋Š” ํ˜„์žฌ API("1 + 3"์ด ์•„๋‹˜)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น opt์˜ ๋น„๋™๊ธฐ ๋ฒ„์ „์— ์ง‘์ค‘ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด ๊ทธ๊ฒƒ๋„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘์š”ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด๊ธฐ ๋•Œ๋ฌธ์— ์•ฝ๊ฐ„์˜ ์‹ ์ค‘ํ•œ ๊ณ„ํš์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ธฐ์กด ์‚ฌ์šฉ์ž๋ฅผ ์ค‘๋‹จํ•˜๊ธฐ๋กœ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ์—ฌ๊ธฐ์—์„œ ์šฐ๋ฆฌ๊ฐ€ ์„ ํƒํ•  ์ˆ˜ ์žˆ๋Š” ์˜ต์…˜์ด ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ์ปค๋ฎค๋‹ˆํ‹ฐ์™€ ์ƒ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ ค ์‚ฌํ•ญ์ด ๊ฑฐ์˜ ์—†๊ณ  ๊ทธ๋ƒฅ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋…ธ๋ ฅ์ด ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ—ˆ์šฉํ•  ์˜ํ–ฅ์ด ์žˆ๋Š”์ง€์— ๋”ฐ๋ผ ๋‹ฌ๋ผ์ง‘๋‹ˆ๋‹ค. ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์ „ํ˜€ ์ˆ˜์šฉํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ๋งŽ์€ ๋…ธ๋ ฅ์ด ํ•„์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋‚ด ๊ฐœ์ธ์ ์ธ ์ง๊ฐ์ธ ์šฐ๋ ค๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ์ ์ง„์ ์œผ๋กœ ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์‹œ๊ฐ„์ด ๋” ์˜ค๋ž˜ ๊ฑธ๋ฆฌ๋ฏ€๋กœ ์ƒˆ๋กœ์šด ์˜ต์…˜์œผ๋กœ ์‹œ์ž‘ํ•˜์—ฌ ๊ฒฐ๊ตญ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์„ค์ •ํ•  ๊ณ„ํš์ž…๋‹ˆ๋‹ค.

ํ™•์‹คํžˆ ์ดํ•ดํ•˜๋ ค๋ฉด:

  1. ๊ฐ„์ ‘๋น„๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

    • ์ด๋Ÿฌํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋Š” ๋น„๋™๊ธฐ + ์ปดํŒŒ์ผ ์‹œ ๋ฉ”๋ชจ๋ฆฌ์— ๋‚ด์žฌ๋˜์–ด ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด ๋‚˜์ค‘์— ์ˆ˜์ •ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌํ˜„ ์ œ์•ฝ ์กฐ๊ฑด์ž…๋‹ˆ๊นŒ? IMO๊ฐ€ A+M ๊ณ ์œ ์˜ ๊ฒƒ์ด๋ผ๋ฉด ์ตœ๋Œ€ํ•œ ๋นจ๋ฆฌ API๋ฅผ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • IIUC ์˜ค๋ฒ„ ํ—ค๋“œ๋Š” ์ˆ˜์ž… ๋˜๋Š” ์ˆ˜์ถœ์— ๋Œ€ํ•œ ์ผ์‹œ์ ์ธ ๊ฒƒ์ด๋ฉฐ A + M์— ๊ณ ์œ ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๊นŒ? ์ข€ ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ?

  2. ์–ด๋–ค ์‚ฌ์šฉ์ž๊ฐ€ ์ค‘๋‹จ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๋™์ผํ•œ ์ฝ”๋“œ๊ฐ€ wasm๋„ ๋Œ€์ƒ์œผ๋กœ ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” asm.js ์‚ฌ์šฉ์ž?

๋‹ค์‹œ ๋งํ•ด์„œ ๋ฌดํ•œํ•œ ์‹œ๊ฐ„์ด ์žˆ๊ณ  "๋ ˆ๊ฑฐ์‹œ"๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ WebAssembly์˜ ์ด์ƒ์ ์ธ ์ตœ์ข… ์ƒํƒœ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋‚˜๋Š” ์šฐ๋ฆฌ๊ฐ€ ์ด์ƒ์ ์ธ ์ตœ์ข… ์ƒํƒœ๋ฅผ ์œ„ํ•ด ์„ค๊ณ„ํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  ๋‹น์‹ ์€ ๊ทธ ๊ณผ์ •์—์„œ ์žฅ์• ๋ฌผ์„ ์ง€์ ํ•˜๊ณ  ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์ด ์‚ฌ์‹ค์ธ์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด WebAssembly์— ์ „ํ™˜์„ ์šฉ์ดํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ๋ฐฉํŽธ์ด ํ•„์š”ํ•œ์ง€ ๋˜๋Š” Emscripten ์‚ฌ์šฉ์ž์˜ ํ•˜์œ„ ์ง‘ํ•ฉ(๋ฐ ์–ด๋–ค ์‚ฌ์šฉ์ž)์—๊ฒŒ ์ผ์‹œ์ ์ธ ๋ถ€๋‹ด์ด ํ—ˆ์šฉ๋˜๋Š”์ง€ ํŒŒ์•…ํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•œ ์ •๋ณด๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์‹ ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ผ๋ถ€ ์˜ต์…˜์˜ ์˜ค๋ฒ„ํ—ค๋“œ์— ๋Œ€ํ•ด: ์œ„์—์„œ ์„ค๋ช…ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊นŒ๋‹ค๋กœ์šด ์ ์€ ํ˜„์žฌ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ๋ณด๋‚ด๊ณ  ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋™๊ธฐ์ ์œผ๋กœ ์ˆ˜์‹ ํ•ด์•ผ ํ•˜๋ฉฐ JS๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ JS ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. !). ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€ ๋ฐฉ๋ฒ•์€ ๊ฐ€์ ธ์˜ค๊ธฐ ๋˜๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ์— ๊ฐ„์ ‘ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ์•„์ฃผ ์ดˆ๊ธฐ์—(JS ์ด์ „์˜ HTML์—์„œ) ์‹ค์ œ ๊ฐ€์ ธ์˜ค๊ธฐ ๋Œ€์‹  ์ฝํฌ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋™๊ธฐ์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ JS๊ฐ€ ์žˆ๊ธฐ ์ „์—๋„ ์ƒ์„ฑํ•˜๊ธฐ ์‰ฌ์šด ์ฝํฌ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค). . ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋‚˜์ค‘์— JS๊ฐ€ ์žˆ์œผ๋ฉด ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜๋ฅผ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ์ฝํฌ๋ฅผ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ ‡๊ฒŒ ํ•˜๋ฉด ๋‹ค๋ฅธ JS ํ˜ธ์ถœ์˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ๊ฐ ๊ฐ€์ ธ์˜ค๊ธฐ ํ˜ธ์ถœ์— ๋Œ€ํ•œ JS ๊ฐœ์ฒด ์กฐํšŒ๊ฐ€ ์ถ”๊ฐ€๋ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ์ฝ”๋“œ ํฌ๊ธฐ ๋ฐ ์‹œ์ž‘ ์‹œ ์•ฝ๊ฐ„์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ๊นจ๊ธฐ: ์šฐ๋ฆฌ๋Š” ๊ธฐ์กด emscripten ์‚ฌ์šฉ์ž๊ฐ€ ํ”Œ๋ž˜๊ทธ ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค . ๋งŽ์€ ์‚ฌ์šฉ์ž์™€ ํŒŒํŠธ๋„ˆ๊ฐ€ ์ด์— ๋Œ€ํ•ด ๋งŒ์กฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด asm.js์™€ wasm์„ ๋น„๊ตํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ƒˆ๋กœ์šด ์ด์‹ ๋…ธ๋ ฅ ์—†์ด๋„ wasm์˜ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ was๋กœ ์ด์‹ํ•˜๋Š” ๋™์•ˆ ์‹œ์ž‘ ์ฝ”๋“œ๋ฅผ ๋น„๋™๊ธฐํ™”ํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด wasm์„ ๋ถˆํ•„์š”ํ•˜๊ฒŒ ๋น„๋‚œํ•  ์ˆ˜ ์žˆ๋Š” ์œ„ํ—˜์„ ํ”ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JS๊ฐ€ ์ค€๋น„๋  ๋•Œ๊นŒ์ง€ JS ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(ํ•˜์ง€๋งŒ ๋ฉ”๋ชจ๋ฆฌ๋Š” ์žˆ์Šต๋‹ˆ๋‹ค!)

์ด๋Š” ๋ถ€์ˆ˜์ ์ธ ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ API๋กœ ์˜์›ํžˆ ์ œ ์‹œ๊ฐ„์— ๊ตฌ์›Œ์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ @s3ththompson์ด ์„ค๋ช…ํ•œ ์ด์œ  ๋•Œ๋ฌธ์— ์ปดํŒŒ์ผ ์‹œ ๋ฉ”๋ชจ๋ฆฌ ๋ฌธ์ œ๋ฅผ ๋ฌด์‹œํ•˜๋”๋ผ๋„ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋ž˜์„œ ์ €๋Š” @jfbastien ์— ์ด์ƒ์ ์ธ ์ตœ์ข… ์ƒํƒœ API๊ฐ€ ์žˆ์œผ๋ฉฐ ์—ฌ๊ธฐ์„œ ํƒ€ํ˜‘ํ•ด์„œ๋Š”

์‚ฌ์šฉ์ž ์ค‘๋‹จ ์ •๋ณด: "onload" ์ด๋ฒคํŠธ/์•ฝ์†๊ณผ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ๊ฒฝ๋กœ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ ์‚ฌ์šฉ์ž๊ฐ€ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ํ•˜๊ธฐ๊ฐ€ ๊ฐ„ํŽธํ•ด์•ผ ํ•˜๋ฉฐ ๋‹น๊ทผ์ด ๋ชจ๋“  ์ฃผ์š” ์„ฑ๋Šฅ์ด ์Šน๋ฆฌํ•ฉ๋‹ˆ๋‹ค. ์ •ํ™•ํ•œ asm.js ์†Œ์Šค backcompat์ด ๊ธฐ๋ณธ ๊ตฌ์„ฑ์— ๋Œ€ํ•œ ์–ด๋ ค์šด ์š”๊ตฌ ์‚ฌํ•ญ์ด๋ผ๋Š” ์ฆ๊ฑฐ๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ •๋ฐ˜๋Œ€์˜ ์˜ˆ๊ฐ€ ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๋Š” ์ตœ์ ์˜ ์„ฑ๋Šฅ์„ ๋‹ฌ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ๋ฌด์—‡์ด๋“  ๊ธฐ๊บผ์ด ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ๋ฌผ๋ก  ์š”์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@lukewagner์™€ ์˜คํ”„๋ผ์ธ์œผ๋กœ ๋Œ€ํ™”ํ•˜๋ฉด์„œ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ emscripten์˜ ๊ธฐ๋ณธ ๊ถŒ์žฅ ์„ค์ •์—์„œ wasm์— ๋Œ€ํ•œ ์ธ์Šคํ„ด์Šคํ™”๋ฅผ ํ™œ์„ฑํ™”ํ•˜๋Š” ๊ฒƒ๋ถ€ํ„ฐ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์œ„์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ๋‚ด๋ณด๋‚ด๊ธฐ์—์„œ) ๊ฐ„์ ‘ ๊ณ„์ธต์„ ์ถ”๊ฐ€ํ•˜์—ฌ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ๋Š” ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด๊ฒƒ์€ ์šฐ๋ฆฌ ๋ชจ๋‘๊ฐ€ ์—ฌ๊ธฐ์„œ ์›ํ•˜๋Š” ์ด์ ์„ ์–ป์Šต๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์šฐ๋ฆฌ๋Š” ๊ทธ ์ž‘์€ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์—†์•จ ์ˆ˜ ์žˆ์ง€๋งŒ ๋ถ„๋ช…ํžˆ ์ข‹์€/์˜ฌ๋ฐ”๋ฅธ ๋ฐฉ๋ฒ•์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋” ๋งŽ์€ ๊ณ„ํš๊ณผ ๋ฉ”์ผ๋ง ๋ฆฌ์ŠคํŠธ ํ† ๋ก  ๋“ฑ์ด ํ•„์š”ํ•œ ์ฃผ์š” ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋  ๊ฒƒ์ž„์„ ๊นจ๋‹ฌ์•˜์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ฐ„์ ‘ ๊ณ„์ธต์˜ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋งค์šฐ ๋‚ฎ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ๋ถ€๋ถ„์€ ์‹œ๊ธ‰ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@kripken ๋Œ€๋‹จํ•ด! ๋‹ค์–‘ํ•œ ์ธ์Šคํ„ด์Šค / JS / ๊ฐ€์ ธ์˜ค๊ธฐ / ๋‚ด๋ณด๋‚ด๊ธฐ / ๋ฉ”๋ชจ๋ฆฌ / ํ…Œ์ด๋ธ”์„ ๋ณด์—ฌ์ฃผ๋Š” ๋‹ค์ด์–ด๊ทธ๋žจ์ด ์žˆ์œผ๋ฉด ๋„์›€์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ† ๋ก ์„ ๋‹ค๋ฅธ ๊ณณ์œผ๋กœ ์˜ฎ๊ธฐ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ(Emscripten / binaryen repo)? ๋‚˜๋Š” C++ ์ฝ”๋“œ๊ฐ€ ๋ฌด์—‡์œผ๋กœ ๊ตฌ์„ฑ๋˜์–ด์•ผ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ์ •์‹ ์  ๊ทธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, ์ง€๊ธˆ์ฏค ๋‹น์‹ ์ด ๊ฐ™์€ ๊ทธ๋ฆผ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์€ ๊ฝค ๋ถ„๋ช…ํ•ฉ๋‹ˆ๋‹ค! ๋‹น์‹ ์€ ๊ทธ๊ณณ์—์„œ ๋” ๋งŽ์€ ๊ฒฝํ—˜์„ ํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ณณ์—์„œ ๋ฐฐ์šฐ๊ณ  ๋‚ด๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ํ•œ ๋„์›€์„ ๋“œ๋ฆฌ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@jfbastien : ๋ฌผ๋ก ์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹ค์ด์–ด๊ทธ๋žจ์—์„œ ๋ฌด์—‡์„ ์ฐพ๊ณ  ์žˆ๋Š”์ง€ ์•„์ง ๋ช…ํ™•ํ•˜์ง€ ์•Š์ง€๋งŒ ์˜ˆ, ์•„๋งˆ๋„ ๋‹ค๋ฅธ ๊ณณ์ด ๋” ๋‚˜์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. emscripten์—์„œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๊ธฐ ์œ„ํ•ด ์ด์ „์— ์–ธ๊ธ‰ํ•œ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. https://github.com/kripken/emscripten/issues/4711 , ์›ํ•˜๋Š” ๊ฒƒ์„ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋‹ค๋ฅธ ๋ฌธ์ œ๋„ ์ž์œ ๋กญ๊ฒŒ ์—ฌ์‹ญ์‹œ์˜ค.

IIUC Emscripten์€ ์ด์ œ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด๊ฒƒ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ์‡„.

@s3ththompson comment ์— ๋Œ€ํ•œ ํ›„์† ์กฐ์น˜๋ฅผ ์œ„ํ•ด์„œ๋Š” ๋™๊ธฐ ์ปดํŒŒ์ผ ๋ฐ ์ธ์Šคํ„ด์Šคํ™”๊ฐ€ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์ตœ๊ทผ์— Node.js( v7.7.2 )์—์„œ WebAssembly ๋ชจ๋“ˆ์„ ๋™๊ธฐ์ ์œผ๋กœ ๋กœ๋“œํ•˜๊ณ  ์ปดํŒŒ์ผํ•˜๋ ค๋Š” ์ƒํ™ฉ์— ๋ถ€๋”ช์ณค์Šต๋‹ˆ๋‹ค. ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•˜๋Š” API๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ ๋™๊ธฐ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๋น„๋™๊ธฐ, ๋™๊ธฐํ™” ๋˜๋Š” ๋‘ API๋ฅผ ๋ชจ๋‘ ์ œ๊ณตํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒฐ์ •ํ•  ๋•Œ ๋ธŒ๋ผ์šฐ์ € ์ปจํ…์ŠคํŠธ๊ฐ€ ์‚ฌ๋žŒ๋“ค์ด WebAssembly๋ฅผ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์œ ์ผํ•œ ํ™˜๊ฒฝ์ด ์•„๋‹ˆ๋ผ๋Š” ์ ์„ ๊ธฐ์–ตํ•˜์‹ญ์‹œ์˜ค. ์ €๋ฅผ ํฌํ•จํ•˜์—ฌ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด JVM๊ณผ ์œ ์‚ฌํ•œ Node.js ๋Ÿฐํƒ€์ž„๊ณผ ๊ฒฐํ•ฉ๋œ ํšจ์œจ์ ์ธ ์ปดํŒŒ์ผ ๋Œ€์ƒ์œผ๋กœ์„œ WebAssembly์˜ ์ž ์žฌ๋ ฅ์— ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ/๋‚ด๋ณด๋‚ด๊ธฐ ๊ฐ€ Node.js์—

@kgryte ๋‚ด ์˜๊ฒฌ์€ ์ฃผ๋กœ ๋ธŒ๋ผ์šฐ์ €์— ์‹คํ–‰ ์ปจํ…์ŠคํŠธ๋กœ ๊ด€๋ จ๋˜์–ด ์žˆ์Œ์„ ๋ถ„๋ช…ํžˆ ํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋™๊ธฐ API๋ฅผ ์—ฌ์ „ํžˆ ๋…ธ์ถœํ•˜๋Š” API ํ‘œ๋ฉด์— ๋„๋‹ฌํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ธŒ๋ผ์šฐ์ €๋Š” ๋™๊ธฐ API์— ์ „๋‹ฌ๋œ ๋ชจ๋“ˆ์— ํฌ๊ธฐ ์ œํ•œ์„ ๋ถ€๊ณผํ•  ์ˆ˜ ์žˆ์ง€๋งŒ(์˜ˆ: Chrome์€ ์ด๋ฏธ ์ˆ˜ํ–‰) ํ•ด๋‹น ์ œํ•œ์€ ์ž„๋ฒ ๋”์—์„œ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ Node.js์— ์ ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

@s3ththompson ์„ค๋ช… ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰

๊ด€๋ จ ๋ฌธ์ œ

Artur-A picture Artur-A  ยท  3์ฝ”๋ฉ˜ํŠธ

bobOnGitHub picture bobOnGitHub  ยท  6์ฝ”๋ฉ˜ํŠธ

chicoxyzzy picture chicoxyzzy  ยท  5์ฝ”๋ฉ˜ํŠธ

jfbastien picture jfbastien  ยท  6์ฝ”๋ฉ˜ํŠธ

frehberg picture frehberg  ยท  6์ฝ”๋ฉ˜ํŠธ