Design: ์ œ์•ˆ: ๊ธฐ๋‹ค๋ฆฌ๋‹ค

์— ๋งŒ๋“  2020๋…„ 05์›” 18์ผ  ยท  96์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: WebAssembly/design

@rreverser ์™€ ๋‚˜๋Š” WebAssembly์— ๋Œ€ํ•œ ์ƒˆ๋กœ์šด ์ œ์•ˆ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค: Await .

์ œ์•ˆ์˜ ๋™๊ธฐ๋Š” WebAssembly๋กœ ์ปดํŒŒ์ผ๋œ " ๋™๊ธฐ์‹ " ์ฝ”๋“œ๋ฅผ ๋•๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ํŒŒ์ผ์—์„œ ์ฝ๊ธฐ์™€ ๊ฐ™์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

fread(buffer, 1, num, file);
// the data is ready to be used right here, synchronously

์ด ์ฝ”๋“œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋น„๋™๊ธฐ์‹ ์ด๊ณ  "ํŒŒ์ผ์—์„œ ์ฝ๊ธฐ"๋ฅผ ๋น„๋™๊ธฐ์‹์œผ๋กœ ๊ตฌํ˜„ํ•˜๋Š” ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์‰ฝ๊ฒŒ ๊ตฌํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์›น,

const result = fetch("http://example.com/data.dat");
// result is a Promise; the data is not ready yet!

๋‹ค์‹œ ๋งํ•ด์„œ, ๋ชฉํ‘œ๋Š” ์›น์ƒ์˜ wasm์—์„œ ํ”ํžˆ ๋ณผ ์ˆ˜ ์žˆ๋Š” ๋™๊ธฐํ™”/๋น„๋™๊ธฐ ๋ฌธ์ œ๋ฅผ ๋•๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

๊ฐ„๋žตํ•œ ์•„์ด๋””์–ด

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

;; call an import which returns a promise
call $do_fetch
;; wait for the promise just pushed to the stack
await
;; do stuff with the result just pushed to the stack

JS ๋ฐ ๊ธฐํƒ€ ์–ธ์–ด์—์„œ await ์™€ ์ผ๋ฐ˜์ ์ธ ์œ ์‚ฌ์„ฑ์„ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ์ด๊ฒƒ์ด ๊ทธ๋“ค๊ณผ ๋™์ผํ•˜์ง€๋Š” ์•Š์ง€๋งŒ(์•„๋ž˜ ์„ธ๋ถ€์‚ฌํ•ญ ์ฐธ์กฐ) ์ฃผ์š” ์ด์ ์€ ๋™๊ธฐ์‹ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(๋˜๋Š” ์˜คํžˆ๋ ค ๋™๊ธฐ์‹ ์ฝ”๋“œ๋ฅผ wasm์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Œ).

์„ธ๋ถ€ ์‚ฌํ•ญ

์ฝ”์–ด wasm ์‚ฌ์–‘

ํ•ต์‹ฌ wasm ์‚ฌ์–‘์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์€ ๋งค์šฐ ์ ์Šต๋‹ˆ๋‹ค.

  • waitref ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • await ๋ช…๋ น์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ await ๋ช…๋ น์–ด(์˜ˆ: call_indirect )์— ๋Œ€ํ•ด ์œ ํ˜•์ด ์ง€์ •๋ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

;; elaborated wat from earlier, now with full types

(type $waitref_=>_i32 (func (param waitref) (result i32)))
(import "env" "do_fetch" (func $do_fetch (result waitref)))

;; call an import which returns a promise
call $do_fetch
;; wait for the promise just pushed to the stack
await (type $waitref_=>_i32)
;; do stuff with the result just pushed to the stack

์œ ํ˜•์€ waitref ๋ฅผ ๋ฐ›์•„์•ผ ํ•˜๋ฉฐ ๋ชจ๋“  ์œ ํ˜•(๋˜๋Š” ์•„๋ฌด ๊ฒƒ๋„ ๋ฐ˜ํ™˜ํ•˜์ง€ ์•Š์Œ)์„ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๊ฒƒ์ด ํ•ต์‹ฌ wasm ์‚ฌ์–‘์ž…๋‹ˆ๋‹ค!

Wasm JS ์‚ฌ์–‘

(์›น๊ณผ ๊ฐ™์€ JS ํ™˜๊ฒฝ์—๋งŒ ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”) wasm JS ์‚ฌ์–‘์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ๋” ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค.

  • ์œ ํšจํ•œ waitref ๊ฐ’์€ JS ์•ฝ์†์ž…๋‹ˆ๋‹ค.
  • await ๊ฐ€ Promise์—์„œ ์‹คํ–‰๋˜๋ฉด ์ „์ฒด wasm ์ธ์Šคํ„ด์Šค๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ํ•ด๋‹น Promise๊ฐ€ ํ•ด๊ฒฐ๋˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€๋  ๋•Œ๊นŒ์ง€ ๊ธฐ๋‹ค๋ฆฝ๋‹ˆ๋‹ค.
  • Promise๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด ์ธ์Šคํ„ด์Šค๋Š” Promise์—์„œ ๋ฐ›์€ ๊ฐ’(์žˆ๋Š” ๊ฒฝ์šฐ)์„ ์Šคํƒ์— ํ‘ธ์‹œํ•œ ํ›„ ์‹คํ–‰์„ ์žฌ๊ฐœํ•ฉ๋‹ˆ๋‹ค.
  • Promise๊ฐ€ ๊ฑฐ๋ถ€๋˜๋ฉด ์‹คํ–‰์„ ์žฌ๊ฐœํ•˜๊ณ  await ์œ„์น˜์—์„œ wasm ์˜ˆ์™ธ๋ฅผ throwํ•ฉ๋‹ˆ๋‹ค.

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

JS๊ฐ€ wasm ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœํ•œ ๋‹ค์Œ ์ผ์‹œ ์ค‘์ง€ํ•  ๋•Œ ์–ด๋–ป๊ฒŒ ๋ณด์ž…๋‹ˆ๊นŒ? ์ด๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋จผ์ € ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ด๋ฒคํŠธ ๋ฃจํ”„์ธ wasm์œผ๋กœ ์ด์‹ํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ์˜ˆ๋ฅผ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

void event_loop_iteration() {
  // ..
  while (auto task = getTask()) {
    task.run(); // this *may* be a network fetch
  }
  // ..
}

์ด ํ•จ์ˆ˜๊ฐ€ requestAnimationFrame ๋‹น ํ•œ ๋ฒˆ ํ˜ธ์ถœ๋œ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค. ๋ Œ๋”๋ง, ๋ฌผ๋ฆฌ, ์˜ค๋””์˜ค ๋ฐ ๋„คํŠธ์›Œํฌ ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ ํฌํ•จ๋  ์ˆ˜ ์žˆ๋Š” ์ฃผ์–ด์ง„ ์ž‘์—…์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋„คํŠธ์›Œํฌ ๊ฐ€์ ธ์˜ค๊ธฐ ์ด๋ฒคํŠธ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ์—๋งŒ fetch ์˜ ์•ฝ์†์— ๋Œ€ํ•ด await ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. event_loop_iteration ์˜ ํ•œ ํ˜ธ์ถœ์— ๋Œ€ํ•ด 0๋ฒˆ ๋˜๋Š” 1๋ฒˆ ๋˜๋Š” ์—ฌ๋Ÿฌ ๋ฒˆ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์ด wasm์„ ์‹คํ–‰ํ•˜๋Š” ๋™์•ˆ ๊ทธ๋ ‡๊ฒŒ ํ–ˆ๋Š”์ง€ ์—ฌ๋ถ€๋งŒ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ „์—๋Š”, ํŠนํžˆ ์ด wasm ๋‚ด๋ณด๋‚ด๊ธฐ์˜ JS ํ˜ธ์ถœ์ž๋Š” ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ํ˜ธ์ถœ์ž๋Š” ์ธ์Šคํ„ด์Šค๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋˜๊ฑฐ๋‚˜ ์ค‘์ง€๋  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ˆœ์ˆ˜ํ•œ JavaScript์—์„œ ๋‹ค์†Œ ์œ ์‚ฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

function foo(bar) {
  // ..
  let result = bar(42);
  // ..
}

foo ๋Š” JS ํ•จ์ˆ˜ bar $๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ์™€ ํ•จ๊ป˜ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. JS์—์„œ bar ๋Š” ๋น„๋™๊ธฐ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์ผ๋ฐ˜ ํ•จ์ˆ˜์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„๋™๊ธฐ์ธ ๊ฒฝ์šฐ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ณ  ๋‚˜์ค‘์— ์‹คํ–‰๋งŒ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค. ์ •์ƒ์ด๋ฉด ๋ฐ˜ํ™˜ ์ „์— ์‹คํ–‰ํ•˜๊ณ  ์‹ค์ œ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. foo ๋Š” bar ๊ฐ€ ์–ด๋–ค ์ข…๋ฅ˜์ธ์ง€ ์•Œ๊ณ  ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•˜๊ฑฐ๋‚˜(JS๋กœ ์ž‘์„ฑ๋œ ์œ ํ˜•์ด ์—†์œผ๋ฉฐ ์‹ค์ œ๋กœ bar ๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!) ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๊ธฐ๋Šฅ ๋ชจ๋‘ ์™„์ „ํžˆ ์ผ๋ฐ˜ํ™”๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์ผ๋ฐ˜์ ์œผ๋กœ bar ํ•จ์ˆ˜ ์ง‘ํ•ฉ์ด ๋ฌด์—‡์ธ์ง€ ์ •ํ™•ํžˆ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค! ์˜ˆ๋ฅผ ๋“ค์–ด, foo ๋ฐ ๊ฐ€๋Šฅํ•œ bar ๋ฅผ ์กฐ์ •ํ•˜์—ฌ ์ž‘์„ฑํ–ˆ๊ฑฐ๋‚˜ ๊ธฐ๋Œ€์น˜๊ฐ€ ์ •ํ™•ํžˆ ๋ฌด์—‡์ธ์ง€ ๋ฌธ์„œํ™”ํ–ˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์—ฌ๊ธฐ์„œ ์ด์•ผ๊ธฐํ•˜๋Š” wasm/JS ์ƒํ˜ธ ์ž‘์šฉ์€ ์‹ค์ œ๋กœ ์‚ฌ๋ฌผ ๊ฐ„์— ๊ธด๋ฐ€ํ•œ ๊ฒฐํ•ฉ ์ด ์—†๊ณ  ์‹ค์ œ๋กœ ๋‘ ๊ฒฝ์šฐ๋ฅผ ๋ชจ๋‘ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์™€ ๋” ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด event_loop_iteration ์˜ˆ์ œ์—์„œ๋Š” ์ด๋ฅผ ์š”๊ตฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ›จ์”ฌ ๋” ์ผ๋ฐ˜์ ์œผ๋กœ, ์ข…์ข… wasm์€ ์ปดํŒŒ์ผ๋œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด๊ณ  JS๋Š” ์ผ๋ฐ˜์ ์ธ "๋Ÿฐํƒ€์ž„" ์ฝ”๋“œ์ด๋ฏ€๋กœ JS๊ฐ€ ๋ชจ๋“  ๊ฒฝ์šฐ๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฌผ๋ก  JS๋Š” ๊ฒฐ๊ณผ๋ฅผ ํ™•์ธํ•˜๊ธฐ ์œ„ํ•ด result instanceof Promise ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ JS await ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์‰ฝ๊ฒŒ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async function runEventLoopIteration() {
  // await in JavaScript can handle Promises as well as regular synchronous values
  // in the same way, so the log is guaranteed to be written out consistently after
  // the operation has finished (note: this handles 0 or 1 iterations, but could be
  // generalized)
  await wasm.event_loop_iteration();
  console.log("the event loop iteration is done");
}

( console.log ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉด ์ด ์˜ˆ์ œ์—์„œ JS await ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์œผ๋ฉฐ wasm ๋‚ด๋ณด๋‚ด๊ธฐ์— ๋Œ€ํ•œ ์ผ๋ฐ˜์ ์ธ ํ˜ธ์ถœ๋งŒ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.)

์œ„์˜ ๋‚ด์šฉ์„ ์š”์•ฝํ•˜๋ฉด ์ผ์‹œ ์ค‘์ง€๋œ wasm ์ธ์Šคํ„ด์Šค์˜ ๋™์ž‘์„ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ๋งํ•  ์ˆ˜ ์žˆ๋Š” ๋น„๋™๊ธฐ์ผ ์ˆ˜๋„ ์žˆ๊ณ  ์•„๋‹ ์ˆ˜๋„ ์žˆ๋Š” ํ•จ์ˆ˜์˜ JS ์‚ฌ๋ก€์—์„œ ๋ชจ๋ธ๋งํ•  ๊ฒƒ์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค.

  • await ๊ฐ€ ์‹คํ–‰๋˜๋ฉด wasm ์ธ์Šคํ„ด์Šค๋Š” ํ˜ธ์ถœํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์ฆ‰์‹œ ๋‹ค์‹œ ์ข…๋ฃŒ๋ฉ๋‹ˆ๋‹ค(์ผ๋ฐ˜์ ์œผ๋กœ JS๊ฐ€ wasm ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ ๋‚˜์ค‘์— ์ฐธ๊ณ ํ•˜์„ธ์š”). ํ˜ธ์ถœ์ž๋Š” wasm ์‹คํ–‰์ด ์ข…๋ฃŒ๋˜๋Š” ์‹œ์ ์„ ์•Œ๊ณ  ๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ ๊ฒฐ๊ณผ๋ฅผ ์–ป๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” Promise๋ฅผ ์ˆ˜์‹ ํ•ฉ๋‹ˆ๋‹ค.

ํˆด์ฒด์ธ/๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ง€์›

Asyncify ๋ฐ ๊ด€๋ จ ๋„๊ตฌ์— ๋Œ€ํ•œ ์šฐ๋ฆฌ์˜ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๋Œ€๊ธฐ ์ค‘์ธ wasm ์ธ์Šคํ„ด์Šค๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์•ฝ๊ฐ„์˜ JS๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‰ฝ๊ณ  ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค! ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์˜ต์…˜ ์™ธ์—๋„ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‚˜ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹ ์œ„์— ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒƒ์„ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ์•ˆ์„œ์™€ VM์˜ ๋ณต์žก์„ฑ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  ๊ฒƒ์„ ๋„๊ตฌ ์ฒด์ธ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งก๊ธฐ๋Š” ๊ฒƒ์„ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค.

๊ตฌํ˜„ ๋ฐ ์„ฑ๋Šฅ

VM ๊ตฌํ˜„์„ ๋‹จ์ˆœํ•˜๊ฒŒ ์œ ์ง€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๋ช‡ ๊ฐ€์ง€ ์š”์†Œ:

  1. ์ผ์‹œ ์ค‘์ง€/์žฌ๊ฐœ๋Š” ๋Œ€๊ธฐ ์‹œ์—๋งŒ ๋ฐœ์ƒํ•˜๋ฉฐ ๊ฐ ๊ธฐ๋Šฅ ๋‚ด์—์„œ ํ•ด๋‹น ์œ„์น˜๋ฅผ ์ •์ ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.
  2. ๋‹ค์‹œ ์‹œ์ž‘ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋ฌผ๊ฑด์„ ๋†“์€ ๊ณณ์—์„œ ์ •ํ™•ํžˆ ๊ณ„์† ์ง„ํ–‰ํ•˜๋ฉฐ ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ, ์šฐ๋ฆฌ๋Š” ์‹คํ–‰์„ "ํฌํฌ"ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ C์˜ setjmp ๋˜๋Š” ๋ณต์ œ/ํฌํ‚น์„ ํ—ˆ์šฉํ•˜๋Š” ์‹œ์Šคํ…œ์˜ ์ฝ”๋ฃจํ‹ด๊ณผ ๋‹ฌ๋ฆฌ ๋‘ ๋ฒˆ ๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.
  3. await ์˜ ์†๋„๊ฐ€ JS์— ๋Œ€ํ•œ ์ผ๋ฐ˜ ํ˜ธ์ถœ๋ณด๋‹ค ๋Š๋ฆฐ ๊ฒฝ์šฐ ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์ตœ์†Œํ•œ Promise๊ฐ€ ํ• ๋‹น๋˜๊ณ  ์ด๋ฒคํŠธ ๋ฃจํ”„( ์ด๋Š” ์ตœ์†Œํ•œ์˜ ์˜ค๋ฒ„ํ—ค๋“œ์™€ ํ˜„์žฌ ์‹คํ–‰ ์ค‘์ธ ๋‹ค๋ฅธ ์ž‘์—… ์„ ์ž ์žฌ์ ์œผ๋กœ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์žˆ์Œ). ์ฆ‰, ์—ฌ๊ธฐ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” VM ๊ตฌํ˜„์ž๊ฐ€ await ๋ฅผ ์—„์ฒญ๋‚˜๊ฒŒ ๋น ๋ฅด๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๋„๋ก ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . ์—ฌ๊ธฐ์˜ ์š”๊ตฌ ์‚ฌํ•ญ๊ณผ ๋น„๊ตํ•˜์—ฌ await ํšจ์œจ์ ์ด๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ ํŠนํžˆ Asyncify์˜ ํฐ ์˜ค๋ฒ„ํ—ค๋“œ๋ณด๋‹ค ํ›จ์”ฌ ๋น ๋ฅผ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

์ด ์„น์…˜์— ๋Œ€ํ•œ VM ๊ตฌํ˜„์ž ํ”ผ๋“œ๋ฐฑ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค!

์„ค๋ช…

์ด ์ œ์•ˆ์€ wasm ์ธ์Šคํ„ด์Šค์˜ ํ˜ธ์ถœ์ž์—๊ฒŒ๋งŒ WebAssembly ์‹คํ–‰์„ ์ผ์‹œ ์ค‘์ง€ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ(JS ๋˜๋Š” ๋ธŒ๋ผ์šฐ์ €) ์Šคํƒ ํ”„๋ ˆ์ž„์„ ์ผ์‹œ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค . await ๋Š” wasm ์ธ์Šคํ„ด์Šค์—์„œ ์ž‘๋™ํ•˜๋ฉฐ ๋‚ด๋ถ€์˜ ์Šคํƒ ํ”„๋ ˆ์ž„์—๋งŒ ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค.

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

๋‹ค๋ฅธ ์ œ์•ˆ๊ณผ์˜ ์—ฐ๊ฒฐ

์˜ˆ์™ธ

์˜ˆ์™ธ๋ฅผ ๋˜์ง€๋Š” ์•ฝ์† ๊ฑฐ๋ถ€๋Š” ์ด ์ œ์•ˆ์ด wasm ์˜ˆ์™ธ ์ œ์•ˆ์— ์˜์กดํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์ฝ”๋ฃจํ‹ด

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

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

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

๋˜ ๋‹ค๋ฅธ ์ค‘์š”ํ•œ ์ฐจ์ด์ ์€ await .wat wasm์ด ์›น๊ณผ ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๋™๊ธฐํ™”/๋น„๋™๊ธฐ ๋ถˆ์ผ์น˜๋ฅผ ์ˆ˜์ •ํ•˜๊ธฐ ์œ„ํ•ด ๋ชจ๋“  wasm ๋ชจ๋“ˆ์ด ํ•„์š”๋กœ ํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์„ ์ œ๊ณตํ•˜๋Š” ๋‹จ์ผ ๋ช…๋ น์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘). ๋˜ํ•œ Promise๋ฅผ ์ œ๊ณต โ€‹โ€‹๋ฐ/๋˜๋Š” ์ˆ˜์‹ ํ•  ์ˆ˜ ์žˆ๋Š” JS ์ธก์—์„œ ์‚ฌ์šฉํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค(์•ž์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ์•ฝ๊ฐ„์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฝ”๋“œ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋งค์šฐ ์ตœ์†Œํ™”๋  ์ˆ˜ ์žˆ์Œ).

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

์™€์‹œ#276

์šฐ์—ฐ์˜ ์ผ์น˜๋กœ WASI #276 ์€ @tqchen ์ด ์ด ๊ธ€์„ ๋๋งˆ์น  ๋•Œ ๊ฒŒ์‹œํ–ˆ์Šต๋‹ˆ๋‹ค. ์ฝ”๋ฃจํ‹ด๊ณผ ๋น„๋™๊ธฐ ์ง€์›์ด ๋ณ„๊ฐœ์˜ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ์šฐ๋ฆฌ์˜ ๋ฏฟ์Œ์„ ๊ณต์œ ํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์„ ์•Œ๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” await ๋ช…๋ น์ด ๊ฑฐ๊ธฐ์— ์ œ์•ˆ๋œ ๊ฒƒ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค(์˜ต์…˜ C3). ์ฐจ์ด์ ์€ ํŠน๋ณ„ํ•œ ๋น„๋™๊ธฐ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ ์˜คํžˆ๋ ค ์ผ๋ถ€ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์ด waitref ๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. await -ed๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

JavaScript์˜ ๊ฒฝ์šฐ Wasm ์ธ์Šคํ„ด์Šค๋ฅผ ์ผ์‹œ ์ค‘์ง€ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋Œ€๊ธฐ๋ฅผ ์ •์˜ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ํŽ˜์ด์ง€์— JavaScript๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ถ€ ์„œ๋ฒ„ ํ™˜๊ฒฝ์—์„œ๋Š” ํ˜ธ์ŠคํŠธ์™€ ๋‹จ์ผ wasm ์ธ์Šคํ„ด์Šค๋งŒ ์žˆ์„ ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ด ๊ฒฝ์šฐ ๋Œ€๊ธฐ๊ฐ€ ํ›จ์”ฌ ๊ฐ„๋‹จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ง ๊ทธ๋Œ€๋กœ ํŒŒ์ผ ์„ค๋ช…์ž๋‚˜ GPU์—์„œ ๋Œ€๊ธฐํ•˜๋Š” ๊ฒƒ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๊ธฐ๋‹ค๋ฆฌ๋ฉด ์ „์ฒด wasm VM์ด ์ผ์‹œ ์ค‘์ง€๋˜์ง€๋งŒ ์ด๋ฒคํŠธ ๋ฃจํ”„๋Š” ๊ณ„์† ์‹คํ–‰๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ๊ธฐ์— ๊ตฌ์ฒด์ ์ธ ์•„์ด๋””์–ด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์ง€ ์•Š์ง€๋งŒ, ๊ทธ ๋ฌธ์ œ์— ๋Œ€ํ•œ ๋…ผ์˜๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์—ฌ๊ธฐ์— ํฅ๋ฏธ๋กœ์šด ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค!

์ฝ”๋„ˆ ์ผ€์ด์Šค: wasm ์ธ์Šคํ„ด์Šค => wasm ์ธ์Šคํ„ด์Šค => await

JS ํ™˜๊ฒฝ์—์„œ wasm ์ธ์Šคํ„ด์Šค๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋˜๋ฉด ํ˜ธ์ถœํ•œ ์‚ฌ๋žŒ์—๊ฒŒ ์ฆ‰์‹œ ๋ฐ˜ํ™˜๋ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ JS์—์„œ ์˜จ ๊ฒฝ์šฐ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€ ์„ค๋ช…ํ–ˆ์œผ๋ฉฐ ํ˜ธ์ถœ์ž๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์ธ ๊ฒฝ์šฐ์—๋„ ๋™์ผํ•œ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ์ผ์‹œ ์ค‘์ง€๋˜๋Š” wasm ๋‚ด๋ณด๋‚ด๊ธฐ์—์„œ setTimeout ๋ฅผ ์ˆ˜ํ–‰ํ–ˆ์ง€๋งŒ ํฅ๋ฏธ๋กœ์šด ์ผ์€ ์ผ์–ด๋‚˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ฐ˜ํ™˜๋œ Promise๋Š” ๋ฌด์‹œ๋ฉ๋‹ˆ๋‹ค). ๊ทธ๋Ÿฌ๋‚˜ wasm์—์„œ ์˜ค๋Š” ํ˜ธ์ถœ์˜ ๋˜ ๋‹ค๋ฅธ ๊ฒฝ์šฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, wasm ์ธ์Šคํ„ด์Šค A ๊ฐ€ B ์ธ์Šคํ„ด์Šค์—์„œ ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๊ณ  B ๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๋Š” B ์—์„œ ์ฆ‰์‹œ ์ข…๋ฃŒํ•˜๊ณ  Promise $๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ถœ์ž๊ฐ€ JavaScript์ธ ๊ฒฝ์šฐ ๋™์  ์–ธ์–ด๋กœ์„œ ์ด๋Š” ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์œผ๋ฉฐ ์‹ค์ œ๋กœ ํ˜ธ์ถœ์ž๊ฐ€ ์•ž์—์„œ ์„ค๋ช…ํ•œ ๋Œ€๋กœ ์œ ํ˜•์„ ํ™•์ธํ•˜๋Š” ๊ฒƒ์ด ํ•ฉ๋ฆฌ์ ์ž…๋‹ˆ๋‹ค. ํ˜ธ์ถœ์ž๊ฐ€ ์ •์ ์œผ๋กœ ์œ ํ˜•์ด ์ง€์ •๋œ WebAssembly์ธ ๊ฒฝ์šฐ ์ด๋Š” ์–ด์ƒ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์ œ์•ˆ์—์„œ ์•„๋ฌด ๊ฒƒ๋„ ํ•˜์ง€ ์•Š์œผ๋ฉด ๊ฐ’์ด ์บ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. ์ด ์˜ˆ์—์„œ๋Š” Promise์—์„œ A ๊ฐ€ ์˜ˆ์ƒํ•˜๋Š” ๋ชจ๋“  ์ธ์Šคํ„ด์Šค( i32 ์ด๋ฉด ๋‹ค์Œ์œผ๋กœ ์บ์ŠคํŠธ๋ฉ๋‹ˆ๋‹ค. 0 ). ๋Œ€์‹  ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค.

  • wasm ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‹ค๋ฅธ wasm ์ธ์Šคํ„ด์Šค์—์„œ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœ(์ง์ ‘ ๋˜๋Š” call_indirect ์‚ฌ์šฉ)ํ•˜๊ณ  ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์—์„œ ์‹คํ–‰๋˜๋Š” ๋™์•ˆ await ๊ฐ€ ์‹คํ–‰๋˜๋ฉด RuntimeError ์˜ˆ์™ธ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. await ์˜ ์œ„์น˜์—์„œ ๋˜์กŒ์Šต๋‹ˆ๋‹ค.

์ค‘์š”ํ•œ ๊ฒƒ์€ ์ผ์‹œ ์ค‘์ง€ํ•˜์ง€ ์•Š๋Š” ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ ์—†์ด ์ˆ˜ํ–‰๋  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ์ผ์‹œ ์ค‘์ง€๋ฅผ ์ˆ˜ํ–‰ํ•  ๋•Œ๋งŒ ์Šคํƒ์„ ํ™•์ธํ•˜์—ฌ ์ •์ƒ์ ์ธ wasm instance -> wasm instance ํ˜ธ์ถœ์„ ์ตœ๊ณ  ์†๋„๋กœ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.

wasm ์ธ์Šคํ„ด์Šค์™€ ๊ฐ™์€ ๊ฒƒ์ด ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๋ฅผ ํ˜ธ์ถœํ•˜๊ธฐ๋ฅผ ์›ํ•˜๊ณ  ํ›„์ž์˜ ์ผ์‹œ ์ค‘์ง€๋ฅผ ์›ํ•˜๋Š” ์‚ฌ์šฉ์ž๋Š” ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ๋‘˜ ์‚ฌ์ด์— ์ผ๋ถ€ JS๋ฅผ ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์€ ์ผ๋ถ€ wasm ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ๋น„๋™๊ธฐ๋กœ ํ‘œ์‹œํ•˜๊ณ  ๋‹ค๋ฅธ ๋‚ด๋ณด๋‚ด๊ธฐ๋Š” ํ‘œ์‹œํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋ฌด์—‡์ด ๋ฌด์—‡์ธ์ง€ ์ •์ ์œผ๋กœ ์•Œ ์ˆ˜ ์žˆ๊ณ  ๋ถ€์ ์ ˆํ•œ ํ˜ธ์ถœ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด์ „์˜ event_loop_iteration ์˜ˆ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ์ด๋Š” ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ‘œ์‹œํ•ด๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š” ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์ด๋ฉฐ ๊ฐ„์ ‘ ํ˜ธ์ถœ๋„ ์žˆ์œผ๋ฏ€๋กœ ๊ทธ๋Ÿฐ ์‹์œผ๋กœ ๋ฌธ์ œ๋ฅผ ํ”ผํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

๊ณ ๋ ค๋˜๋Š” ๋Œ€์•ˆ์  ์ ‘๊ทผ

JS ๊ฐ€์ ธ์˜ค๊ธฐ๊ฐ€ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ๋งˆ๋‹ค wasm์ด ์ผ์‹œ ์ค‘์ง€๋œ๋‹ค๋ฉด ์ƒˆ๋กœ์šด await ๋ช…๋ น์ด ์ „ํ˜€ ํ•„์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋ฐ”๋กœ ์ง€๊ธˆ JS๊ฐ€ ์˜ค๋ฅ˜๊ฐ€ ์•„๋‹Œ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•  ๋•Œ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๋ณ€๊ฒฝ์€ wasm์ด ์ผ์‹œ ์ค‘์ง€ ์—†์ด ๋” ์ด์ƒ Promise๋ฅผ ๋ฐ›์„ ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ๋„ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด์ „ ๊ด€๋ จ ํ† ๋ก 

https://github.com/WebAssembly/design/issues/1171
https://github.com/WebAssembly/design/issues/1252
https://github.com/WebAssembly/design/issues/1294
https://github.com/WebAssembly/design/issues/1321

์ฝ์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค!

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

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

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

VM ์‚ฌ๋žŒ๋“ค์˜ ๊ด€์‹ฌ ๋ถ€์กฑ ์™ธ์—๋„ ์œ„์—์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด @fgmccabe ๋ฐ @RossTate ์—์„œ ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ๋ฐ˜๋Œ€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ ์ €๋Š” ์ด๋Ÿฌํ•œ ๊ด€์ ๊ณผ ๊ทธ๊ฒƒ๋“ค์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋“ค์ธ ์‹œ๊ฐ„์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์ œ์•ˆ์˜ JS ๋ถ€๋ถ„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ๋ฆฌํ•œ Promise ํ†ตํ•ฉ์„ ์œ„ํ•œ JS ์„คํƒ•๊ณผ ๊ฐ™์ด ๋ฏธ๋ž˜์— ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ์ „ํ™˜ ๋˜๋Š” ์ฝ”๋ฃจํ‹ด์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๊ทธ ์œ„์— ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋‘˜ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.

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

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

๊ด€๋ จ: "์œ„์˜ ๋‚ด์šฉ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ž์—ฐ์Šค๋Ÿฌ์šด ๊ตฌํ˜„์€ ์ผ์‹œ ์ค‘์ง€ํ•  ๋•Œ ์Šคํƒ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค." ์ด๊ฒƒ์€ ์‹คํ–‰ ์Šคํƒ์—์„œ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ• ๊นŒ์š”? ๋Œ€๋ถ€๋ถ„์˜ JIT ์—”์ง„์ด JS์™€ wasm ๊ฐ„์— ๊ธฐ๋ณธ C ์‹คํ–‰ ์Šคํƒ์„ ๊ณต์œ ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ด ์ปจํ…์ŠคํŠธ์—์„œ ์ €์žฅ ๋ฐ ๋ณต์›์ด ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์€ wasm ์‹คํ–‰ ์Šคํƒ์ด ์–ด๋–ป๊ฒŒ๋“  ๊ฐ€์ƒํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ? ํŒŒ์ด์ฌ์ด https://github.com/stackless-dev/stackless/wiki์™€ ์œ ์‚ฌํ•œ ์ž‘์—…์„ ์‹œ๋„ํ•  ๋•Œ ์ด์™€ ๊ฐ™์€ C ์Šคํƒ์˜ ์‚ฌ์šฉ์„ ํ”ผํ•˜๋Š” IIUC๋Š” ๊ฝค ๊นŒ๋‹ค๋กœ์› ์Šต๋‹ˆ๋‹ค.

@sbc100๋‹˜๊ณผ ๋น„์Šทํ•œ ๊ณ ๋ฏผ์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ VM์— ์•„์ง GC ๊ตฌํ˜„์ด ์—†๋Š” ๊ฒฝ์šฐ ์Šคํƒ์„ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์ƒ๋‹นํžˆ ์–ด๋ ค์šด ์ž‘์—…์ž…๋‹ˆ๋‹ค.

@sbc100

์ด ์ œ์•ˆ์€ wasm ์‹คํ–‰ ์Šคํƒ์ด ์–ด๋–ป๊ฒŒ๋“  ๊ฐ€์ƒํ™”๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์ „๋ฌธ๊ฐ€๊ฐ€ ์•„๋‹ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ VM ๊ตฌํ˜„์ž์—๊ฒŒ ๋งก๊ฒจ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์Šคํƒ๋ฆฌ์Šค ํŒŒ์ด์ฌ์— ๋Œ€ํ•œ ์—ฐ๊ฒฐ์„ ์ดํ•ดํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ, ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์ด ์—ฐ๊ฒฐ์„ ์ดํ•ดํ•˜๊ธฐ์— ์ถฉ๋ถ„ํžˆ ์ž˜ ๋ชจ๋ฅผ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค!

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

(์šฐ๋ฆฌ๋Š” ์ด๋Ÿฌํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ด wasm VM์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ตฌํ˜„์ž๊ฐ€ ์˜ˆ ๋˜๋Š” ์•„๋‹ˆ์š”, ๋” ๋‚˜์€ ์˜ต์…˜์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๋“ฃ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค!)

@lachlansneff

์ผ์„ ๋” ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” GC๊ฐ€ ๋ฌด์—‡์„ ์˜๋ฏธํ•˜๋Š”์ง€ ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋‚˜๋Š” ๋”ฐ๋ฅด์ง€ ์•Š๋Š”๋‹ค.

@kripken GC๋Š” ์ข…์ข…(ํ•ญ์ƒ ๊ทธ๋Ÿฐ ๊ฒƒ์€ ์•„๋‹˜) ์Šคํƒ์„ ์ด๋™ํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์Šคํƒ์˜ ํฌ์ธํ„ฐ๋ฅผ ์ƒˆ ์Šคํƒ์„ ๊ฐ€๋ฆฌํ‚ค๋„๋ก ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์•„๋งˆ๋„ JSC์— ๋Œ€ํ•ด ๋” ๋งŽ์ด ์•Œ๊ณ  ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์ด๋ฅผ ํ™•์ธํ•˜๊ฑฐ๋‚˜ ๊ฑฐ๋ถ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@lachlansneff

๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ๋ง์”€ํ•˜์‹  ๋‚ด์šฉ์„ ์•Œ์•˜์Šต๋‹ˆ๋‹ค.

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

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

ํŠน์ • ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜๊ธฐ ๋ณด๋‹ค๋Š” VM ์‚ฌ์šฉ์ž์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์„ ๋ณด๊ฒŒ ๋˜์–ด ๋งค์šฐ ๊ธฐ์ฉ๋‹ˆ๋‹ค. Lucet์€ ํ˜„์žฌ yield ๋ฐ resume ์—ฐ์‚ฐ์ž๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ Rust ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์‹คํ–‰๋˜๋Š” ๋น„๋™๊ธฐ ์ฝ”๋“œ์™€ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐ ์ •ํ™•ํžˆ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ์˜ ๋””์ž์ธ์€ ์ด๋ฏธ Wasm ์‹คํ–‰์„ ์œ„ํ•ด ๋ณ„๋„์˜ ์Šคํƒ์„ ์œ ์ง€ ๊ด€๋ฆฌํ•˜๊ธฐ๋กœ ์•ฝ์†ํ–ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์€ Lucet์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ๋งค์šฐ ๊ฐ„๋‹จํ–ˆ์ง€๋งŒ ๊ทธ๋ ‡์ง€ ์•Š์€ VM์— ๋Œ€ํ•ด ์ผ๋ถ€ ๊ตฌํ˜„ ์–ด๋ ค์›€์„ ๋‚˜ํƒ€๋‚ผ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์€ ํ›Œ๋ฅญํ•˜๊ฒŒ ๋“ค๋ฆฝ๋‹ˆ๋‹ค! ์šฐ๋ฆฌ๋Š” ์ž ์‹œ ๋™์•ˆ wasmer-js์—์„œ ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ๊ด€๋ฆฌํ•˜๋Š” ์ข‹์€ ๋ฐฉ๋ฒ•์„ ์ฐพ์œผ๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค(๋ธŒ๋ผ์šฐ์ € ์ปจํ…์ŠคํŠธ์—์„œ VM ๋‚ด๋ถ€์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์—).

ํŠน์ • ๊ตฌํ˜„ ๋ฐฉ์‹์„ ์ œ์•ˆํ•˜๊ธฐ ๋ณด๋‹ค๋Š” VM ์‚ฌ์šฉ์ž์˜ ์˜๊ฒฌ์„ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

wasm-bindgen-futures ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rust ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ JsPromise ์—์„œ .await ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๊นŒ? ์—ฌ๊ธฐ์— ์ œ์•ˆ๋œ await ๋ช…๋ น ์—†์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ฌด์ง€์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” wasm ๋‚ด๋ถ€์—์„œ fetch๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์œผ๋ฉฐ Asyncify์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์žˆ์ง€๋งŒ Rust ์†”๋ฃจ์…˜์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋‚ด๊ฐ€ ๋†“์น˜๊ณ  ์žˆ๋Š” ๊ฒƒ์ด ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ถ„๋ช…ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

๋‚˜๋Š” ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋งค์šฐ ํฅ๋ถ„๋œ๋‹ค. ์ œ์•ˆ์˜ ์ฃผ์š” ์žฅ์ ์€ ๋‹จ์ˆœํ•˜๋‹ค๋Š” ์ ์ž…๋‹ˆ๋‹ค. wasm์˜ POV์™€ ๋™๊ธฐํ™”๋˜๋Š” API๋ฅผ ๊ตฌ์ถ•ํ•  ์ˆ˜ ์žˆ๊ณ  ์ฝœ๋ฐฑ ๋ฐ ๋น„๋™๊ธฐ/๋Œ€๊ธฐ์— ๋Œ€ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์ƒ๊ฐํ•  ํ•„์š” ์—†์ด ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ํ›จ์”ฌ ์‰ฝ๊ฒŒ ์ด์‹ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋‹จ์ผ ๋„ค์ดํ‹ฐ๋ธŒ API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ WASM ๋ฐ WebGPU ๊ธฐ๋ฐ˜ ๋จธ์‹  ๋Ÿฌ๋‹ ์„ ๋„ค์ดํ‹ฐ๋ธŒ wasm vms๋กœ ๊ฐ€์ ธ์˜ค๊ณ  ์›น๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ๋ชจ๋‘์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ํ•œ ๊ฐ€์ง€๋Š” ์ž ์žฌ์ ์œผ๋กœ await๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜์˜ ์„œ๋ช…์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๊ณ  ์ƒ์ƒํ•ด๋ณด์‹ญ์‹œ์˜ค.

int test() {
   await();
   return 1;
}

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

๋Ÿฐํƒ€์ž„ ์ค‘์— ๋Œ€๊ธฐ๊ฐ€ ํ—ˆ์šฉ๋จ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜(์˜ˆ: ๋น„๋™๊ธฐ ํ˜ธ์ถœ)์— ๋ณ„๋„์˜ ํ˜ธ์ถœ ๋ชจ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

์šฉ์–ด์ ์œผ๋กœ ์ œ์•ˆํ•˜๋Š” ์ž‘์—…์€ ์šด์˜ ์ฒด์ œ์—์„œ yield ์ž‘์—… ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. finsih์— ๋Œ€ํ•œ ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด OS(์ด ๊ฒฝ์šฐ์—๋Š” wasm VM)์— ์ œ์–ด๋ฅผ ์–‘๋ณดํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์„ ์ œ๋Œ€๋กœ ์ดํ•ดํ–ˆ๋‹ค๋ฉด JS์˜ await ๋Š” async ํ•จ์ˆ˜์—์„œ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ œํ•œ์„ ์—†์• ๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, wasm ์ธก์—์„œ waitref ๋Š” externref await ๋ช…๋ น ๋Œ€์‹  $await : [externref] -> [] ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ๊ณ  JS ์ธก์—์„œ๋Š” ๊ฐ€์ ธ์˜ฌ ํ•จ์ˆ˜๋กœ foo(promise) => await promise ๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ, async ํ•จ์ˆ˜ ์™ธ๋ถ€์˜ Promise์—์„œ await ๋ฅผ ์›ํ•˜๋Š” JS ์ฝ”๋“œ๋ผ๋ฉด ๋‹จ์ˆœํžˆ await ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” wasm ๋ชจ๋“ˆ์— ํ•ด๋‹น promise๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž…๋ ฅ์—. ๊ทธ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ์ดํ•ด์ž…๋‹ˆ๊นŒ?

@RossTate ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค, AIUI. wasm ์ฝ”๋“œ๋Š” await ํ”„๋ผ๋ฏธ์Šค( promise1 ๋ผ๊ณ  ํ•จ)๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ JS๊ฐ€ ์•„๋‹Œ wasm ์‹คํ–‰๋งŒ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. wasm ์ฝ”๋“œ๋Š” JS ํ˜ธ์ถœ์ž์—๊ฒŒ ๋‹ค๋ฅธ ์•ฝ์†( promise2 ์ด๋ผ๊ณ  ํ•จ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. promise1 ๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด wasm ์‹คํ–‰์ด ๊ณ„์†๋ฉ๋‹ˆ๋‹ค. ๋งˆ์ง€๋ง‰์œผ๋กœ, ๊ทธ wasm ์ฝ”๋“œ๊ฐ€ ์ •์ƒ์ ์œผ๋กœ ์ข…๋ฃŒ๋˜๋ฉด promise2 ๋Š” wasm ํ•จ์ˆ˜์˜ ๊ฒฐ๊ณผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

@tqchen

๋Ÿฐํƒ€์ž„ ์ค‘์— ๋Œ€๊ธฐ๊ฐ€ ํ—ˆ์šฉ๋จ์„ ๋‚˜ํƒ€๋‚ด๊ธฐ ์œ„ํ•ด ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜(์˜ˆ: ๋น„๋™๊ธฐ ํ˜ธ์ถœ)์— ๋ณ„๋„์˜ ํ˜ธ์ถœ ๋ชจ๋“œ๊ฐ€ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ?

ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ์ด์ ์€ ์–ด๋””์—์„œ ๋ณด์‹ญ๋‹ˆ๊นŒ? ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด ์ผ๋ฐ˜์ ์ธ ์ด์‹ ์ƒํ™ฉ์—์„œ ๋‚ด๋ณด๋‚ด๊ธฐ๊ฐ€ ๊ฒฐ๊ตญ await ๋ฅผ ์ˆ˜ํ–‰ํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ํ™•์‹ ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†์œผ๋ฏ€๋กœ ๊ธฐ๊ปํ•ด์•ผ ๊ฐ€๋”๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด VM ๋‚ด๋ถ€์— ๋„์›€์ด ๋ ๊นŒ์š”?

๋ช…์‹œ์  ์„ ์–ธ์„ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ์˜๋„๋ฅผ ๋ช…ํ™•ํ•˜๊ฒŒ ๋ช…์‹œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ์ž์˜ ์˜๋„๊ฐ€ ๋น„๋™๊ธฐ์‹์œผ๋กœ ์‹คํ–‰๋˜๋Š” ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ VM์—์„œ ์ ์ ˆํ•œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ throwํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋ณด๋‹ค ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ŠคํŠธ๊ฐ€ await๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ Promise.resolve(test())๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

await inst.exports_async.test();

wasm-bindgen-futures ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Rust ํ•จ์ˆ˜ ๋‚ด๋ถ€์˜ JsPromise ์—์„œ .await ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ ๊ฐ™ ์Šต๋‹ˆ๊นŒ? await ๋ช…๋ น ์—†์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ๋‚ด ๋ฌด์ง€์— ๋Œ€ํ•ด ์œ ๊ฐ์Šค๋Ÿฝ๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” wasm ๋‚ด๋ถ€์—์„œ fetch๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ฐพ๊ณ  ์žˆ์œผ๋ฉฐ Asyncify์— ๋Œ€ํ•ด ๋ฐฐ์šฐ๊ณ  ์žˆ์ง€๋งŒ Rust ์†”๋ฃจ์…˜์ด ๋” ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. ๋ˆ„๊ตฐ๊ฐ€ ๋‚˜๋ฅผ ์œ„ํ•ด ๋ถ„๋ช…ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

@malbarbo ์œ ์‚ฌํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ๋‘˜ ์‚ฌ์ด์—๋Š” ๊ฑฐ์˜ ๊ฒน์น˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. Rust๊ฐ€ ํ•˜๋Š” ์ผ์€ ๋ณธ์งˆ์ ์œผ๋กœ ์™„์ „ํ•œ ์ฝ”๋ฃจํ‹ด์ด๋ฉฐ, ์ด๋Š” ๋‹ค๋ฅธ ์—ฐ๊ฒฐ๋œ ์ œ์•ˆ์˜ ๋ฒ”์œ„์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค.

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

์ด ์ œ์•ˆ์ด ๋Œ€์‹  ๋‹ฌ์„ฑํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ํ˜ธ์ŠคํŠธ ์ œ๊ณต ์‹œ์Šคํ…œ ํ˜ธ์ถœ์„ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ๋น„๋™๊ธฐ๋Š” ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ผ ๋ฟ์ด๋ฏ€๋กœ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜๋Š” ๊ธฐ์กด ์ฝ”๋“œ๋ฒ ์ด์Šค์˜ ์–ด๋””์—์„œ๋‚˜ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ํ˜ธ์ถœ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ „์ฒด ์•ฑ์ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•˜๋Š”์ง€ ๋‹ค์‹œ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ๋ฅผ ๋“ค์–ด C/C++/Rust๋ฅผ ํฌํ•จํ•œ ์†Œ์Šค ์–ธ์–ด๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ๋™๊ธฐ์‹์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•˜์ง€๋งŒ ์˜ˆ๋ฅผ ๋“ค์–ด ์›น์—์„œ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์€ ํŒŒ์ผ I/O์ž…๋‹ˆ๋‹ค.)

์‚ฌ์šฉ์ž์˜ ๊ด€์ ์—์„œ ์ฝ”๋“œ ์ž‘์„ฑ์„ ๋ณด๋‹ค ์ผ๊ด€๋˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ํ…Œ์ŠคํŠธ๊ฐ€ await๋ฅผ ํ˜ธ์ถœํ•˜์ง€ ์•Š๊ณ  ์‹œ์Šคํ…œ ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์ž๋™์œผ๋กœ Promise.resolve(test())๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋”๋ผ๋„ ์‚ฌ์šฉ์ž๋Š” ๋‹ค์Œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@tqchen ์‚ฌ์šฉ์ž๋Š” ์ œ์•ˆ ํ…Œ์ŠคํŠธ์˜ ์˜ˆ์™€ ๊ฐ™์ด ์ด๋ฏธ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, JavaScript๋Š” ์ด๋ฏธ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ await ์—ฐ์‚ฐ์ž์—์„œ ๋™๊ธฐ ๊ฐ’๊ณผ ๋น„๋™๊ธฐ ๊ฐ’์„ ๋ชจ๋‘ ์ง€์›ํ•˜๊ณ  ์ฒ˜๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๋‹จ์ผ ์ •์  ์œ ํ˜•์„ ์ ์šฉ ํ•˜๋Š” ๊ฒƒ์ด ์ œ์•ˆ์ธ ๊ฒฝ์šฐ ํ•ต์‹ฌ WebAssembly ์ธก์—์„œ ๋ณต์žก์„ฑ์„ ๋„์ž…ํ•˜๊ฑฐ๋‚˜ ์ด๋Ÿฌํ•œ ๋ž˜ํผ์˜ ๊ตฌํ˜„์ž๋ฅผ ์ œํ•œํ•˜์ง€ ์•Š๊ณ  ๋ฆฐํŠธ ๋˜๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ ์ˆ˜์ค€ ๋˜๋Š” JavaScript ๋ž˜ํผ ์ˆ˜์ค€์—์„œ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ฏฟ์Šต๋‹ˆ๋‹ค.

์•„ ์ˆ˜์ • ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค @binji๋‹˜.

๊ทธ ๊ฒฝ์šฐ, ๋‹ค์Œ์€ ๋Œ€๋žต ๋™๋“ฑํ•ฉ๋‹ˆ๊นŒ? JS API์— WebAssembly.instantiateAsync(moduleBytes, imports, "name1", "name2") ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. moduleBytes ์— ์—ฌ๋Ÿฌ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ์ถ”๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ import "name1" "name2" (func (param externref)) ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์ด ํ•จ์ˆ˜๋Š” imports ๋กœ ์ œ๊ณต๋œ ๊ฐ’์œผ๋กœ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ๊ฐœ๋…์ ์œผ๋กœ await ๋กœ ์ถ”๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๊ฐ€ ์ด ๋ชจ๋“ˆ์—์„œ ์ƒ์„ฑ๋  ๋•Œ ๋ณดํ˜ธ๋˜์–ด ์ด await ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์Šคํƒ์„ ๊ฑธ์–ด ์˜ฌ๋ผ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ณดํ˜ธ๋ฅผ ์ฐพ์€ ๋‹ค์Œ ์Šคํƒ์˜ ๋‚ด์šฉ์„ ์ƒˆ Promise๋กœ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰์‹œ ๋ฐ˜ํ™˜.

๊ทธ๊ฒŒ ํšจ๊ณผ๊ฐ€ ์žˆ์„๊นŒ์š”? ๋‚ด ์ƒ๊ฐ์— ์ด ์ œ์•ˆ์€ WebAssembly ์ž์ฒด๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด JS API๋งŒ ์ˆ˜์ •ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๊ทธ๋•Œ์—๋„ ์—ฌ์ „ํžˆ ๋งŽ์€ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

@kripken start ๊ธฐ๋Šฅ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋˜๋‚˜์š”? await ์ •์ ์œผ๋กœ ํ—ˆ์šฉํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ Wasm ์ธ์Šคํ„ด์Šคํ™”์™€ ์–ด๋–ป๊ฒŒ๋“  ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๊นŒ?

@malbarbo wasm-bindgen-futures ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Rust์—์„œ async ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์„ ๋น„๋™๊ธฐ ๋ฐฉ์‹์œผ๋กœ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•จ์ˆ˜๋ฅผ async ๋กœ ํ‘œ์‹œํ•ด์•ผ ํ•˜๊ณ  .await ๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ œ์•ˆ์„ ์‚ฌ์šฉํ•˜๋ฉด async ๋˜๋Š” .await ๋ฅผ ์‚ฌ์šฉ ํ•˜์ง€ ์•Š๊ณ  ๋น„๋™๊ธฐ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Œ€์‹  ์ผ๋ฐ˜ ๋™๊ธฐ ํ•จ์ˆ˜ ํ˜ธ์ถœ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์›น์—๋Š” ๋น„๋™๊ธฐ API๋งŒ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์žฌ ๋™๊ธฐ OS API(์˜ˆ std::fs )๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด ์ œ์•ˆ์œผ๋กœ ๋™๊ธฐ OS API๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด๋ถ€์ ์œผ๋กœ Promises๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ Rust์™€ ๋™๊ธฐ์ ์œผ๋กœ ๋ณด์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์ด ๊ตฌํ˜„๋˜๋”๋ผ๋„ wasm-bindgen-futures ๋Š” ์—ฌ์ „ํžˆ ์กด์žฌํ•˜๋ฉฐ ๋‹ค๋ฅธ ์‚ฌ์šฉ ์‚ฌ๋ก€( async ๊ธฐ๋Šฅ ์‹คํ–‰)๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ์ „ํžˆ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  async ํ•จ์ˆ˜๋Š” ์‰ฝ๊ฒŒ ๋ณ‘๋ ฌํ™”ํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

@RossTate ๊ท€ํ•˜์˜ ์ œ์•ˆ์€ "๋Œ€์ฒด ์ ‘๊ทผ ๋ฐฉ์‹ ๊ณ ๋ ค"์—์„œ ๋‹ค๋ฃจ๋Š” ์ œ์•ˆ๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

์‹œ์ž‘ ๊ธฐ๋Šฅ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๊นŒ? ๊ทธ๊ฒƒ์€ ์ •์ ์œผ๋กœ ๋Œ€๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ, ์•„๋‹ˆ๋ฉด ์–ด๋–ป๊ฒŒ๋“  Was ์ธ์Šคํ„ด์Šคํ™”์™€ ์ƒํ˜ธ ์ž‘์šฉํ•ฉ๋‹ˆ๊นŒ?

@Pauan ์šฐ๋ฆฌ๋Š” ์ด๊ฒƒ์„ ๊ตฌ์ฒด์ ์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š์•˜์ง€๋งŒ start ์—์„œ๋„ $ await ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์„ ์ˆ˜๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ instantiate{Streaming} ์—์„œ ๋ฐ˜ํ™˜๋œ Promise๋Š” ์‹œ์ž‘ ํ•จ์ˆ˜๊ฐ€ ์™„์ „ํžˆ ์‹คํ–‰์„ ์™„๋ฃŒํ–ˆ์„ ๋•Œ ์—ฌ์ „ํžˆ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ํ•ด๊ฒฐ/๊ฑฐ๋ถ€๋ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ await ed promise๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋ฟ์ž…๋‹ˆ๋‹ค.

์ฆ‰, ์˜ค๋Š˜๋‚ ๊ณผ ๋™์ผํ•œ ์ œํ•œ์ด ์ ์šฉ๋˜๋ฉฐ ํ˜„์žฌ๋กœ์„œ๋Š” ๋‚ด๋ณด๋‚ธ ๋ฉ”๋ชจ๋ฆฌ์— ์•ก์„ธ์Šคํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋‹ค์ง€ ์œ ์šฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@RReverser ๋™๊ธฐ new WebAssembly.Instance (์ž‘์—…์ž์—์„œ ์‚ฌ์šฉ๋จ)์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ?

์‹œ์ž‘์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์  @Pauan !

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

(๊ทผ๋กœ์ž์—๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”)?

ํ  ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ์›Œ์ปค์—์„œ ์‚ฌ์šฉํ•  ํ•„์š” ๋Š” ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ์ด API๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๊ธฐ ๋•Œ๋ฌธ์— ํ”„๋ผ๋ฏธ์Šค๋ฅผ ๋ฐ˜ํ™˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ํ‘œ์ค€ API์—์„œ ์ด ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ƒ๊ฐ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์ง€๋งŒ ๋‹ค์–‘ํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์˜ ์ƒ์„ฑ์ž์—์„œ thenables๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋ฐ˜ ์ธ๊ธฐ ์žˆ๋Š” ์ƒˆ๋กœ์šด ํŒจํ„ด์œผ๋กœ ๋ณด์•˜์Šต๋‹ˆ๋‹ค.

start (ํŠธ๋ž˜ํ•‘์—์„œ์™€ ๊ฐ™์ด)์—์„œ ์ด๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์ด ํ˜„์žฌ๋กœ์„œ๋Š” ๊ฐ€์žฅ ์•ˆ์ „ํ•˜๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜๋ฉฐ, ํ–ฅํ›„ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์žˆ์„ ๊ฒฝ์šฐ ์ด์ „ ๋ฒ„์ „๊ณผ ํ˜ธํ™˜๋˜๋Š” ๋ฐฉ์‹์œผ๋กœ ์ด๋ฅผ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

์ทจ์†Œ๋Š” ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? JS ์•ฝ์†์—์„œ ๊ตฌํ˜„๋˜์ง€ ์•Š์•˜์œผ๋ฉฐ ์ด๋กœ ์ธํ•ด ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

@๊ฐ•์ฆˆ

๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์ณค์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ await ๋ช…๋ น์œผ๋กœ WASM ์‹คํ–‰์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  Promise๊ฐ€ JS๋กœ ๋ฐ˜ํ™˜๋œ ๋‹ค์Œ JS๊ฐ€ Promise๋ฅผ ๊ธฐ๋‹ค๋ฆฌ์ง€ ์•Š๊ณ  WASM์œผ๋กœ ๋‹ค์‹œ ํ˜ธ์ถœํ•  ๋•Œ ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•˜๋Š”์ง€์— ๋Œ€ํ•œ ๋…ผ์˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

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

ํ˜„์žฌ ํ…์ŠคํŠธ๋Š” ์•„๋งˆ๋„ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ์ถฉ๋ถ„ํžˆ ๋ช…ํ™•ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ๋‹จ๋ฝ์˜ ๊ฒฝ์šฐ ์˜ˆ, ํ—ˆ์šฉ๋ฉ๋‹ˆ๋‹ค. "์„ค๋ช…" ์„น์…˜์„ ์ฐธ์กฐํ•˜์„ธ์š”. It is ok to call into the WebAssembly instance while a pause has occurred, and multiple pause/resume events can be in flight at once.

๋‘ ๋ฒˆ์งธ ๋‹จ๋ฝ์˜ ๊ฒฝ์šฐ ์•„๋‹ˆ์˜ค - ์ด๋ฒคํŠธ๋ฅผ ๋” ์ผ์ฐ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฉฐ JS๊ฐ€ ์•ฝ์†์„ ๋” ์ผ์ฐ ํ•ด๊ฒฐํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์š”์•ฝํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • wasm์ด Promise A์—์„œ ์ผ์‹œ ์ค‘์ง€๋˜๋ฉด ํ˜ธ์ถœํ•œ ํ•ญ๋ชฉ์œผ๋กœ ๋‹ค์‹œ ๋น ์ ธ ๋‚˜์™€ ์ƒˆ๋กœ์šด Promise B๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.
  • ์•ฝ์† A๊ฐ€ ํ•ด๊ฒฐ๋˜๋ฉด Wasm์ด ์žฌ๊ฐœ๋ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ •์ƒ ์‹œ๊ฐ„์— ๋ฐœ์ƒํ•˜๋ฉฐ , ์ด๋Š” JS ์ด๋ฒคํŠธ ๋ฃจํ”„์—์„œ ๋ชจ๋“  ๊ฒƒ์ด ์ •์ƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
  • wasm ์ด ์žฌ๊ฐœ ๋˜๊ณ  ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„์—์•ผ Promise B๊ฐ€ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ํŠนํžˆ Promise B๋Š” Promise A ์ดํ›„์— ํ•ด๊ฒฐ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JS๊ฐ€ ์–ป์„ ์ˆ˜ ์žˆ๋Š” ๊ฒƒ๋ณด๋‹ค ๋จผ์ € Promise A์˜ ๊ฒฐ๊ณผ๋ฅผ ์–ป์„ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ๋งํ•ด์„œ ์ด ์ œ์•ˆ์˜ ๋™์ž‘์€ Asyncify + ์ฃผ๋ณ€์— Promises๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์ผ๋ถ€ JS์— ์˜ํ•ด ํด๋ฆฌํ•„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

JS์—์„œ ๋™์ผํ•œ ์Šคํƒ์˜ ๋™์ผํ•œ wasm ์ธ์Šคํ„ด์Šค๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํ˜ธ์ถœ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await ๊ฐ€ ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ์‹คํ–‰๋˜๋ฉด ์–ด๋–ค ํ˜ธ์ถœ์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

๋‘ ๋ฒˆ์งธ ๋‹จ๋ฝ์˜ ๊ฒฝ์šฐ ์•„๋‹ˆ์˜ค - ์ด๋ฒคํŠธ๋ฅผ ๋” ์ผ์ฐ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์—†์œผ๋ฉฐ JS๊ฐ€ ์•ฝ์†์„ ๋” ์ผ์ฐ ํ•ด๊ฒฐํ•˜๋„๋ก ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ œ ์งˆ๋ฌธ์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ C++์˜ "main-loop" ์•ฑ์€ emscripten_set_main_loop ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋ ˆ์ž„ ๊ธฐ๋Šฅ์ด ์‹คํ–‰๋  ๋•Œ๋งˆ๋‹ค ์ œ์–ด๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์— ๋ฐ˜ํ™˜๋˜๊ณ  ์ž…๋ ฅ ๋˜๋Š” ๊ธฐํƒ€ ์ด๋ฒคํŠธ๊ฐ€ ์ฒ˜๋ฆฌ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์œผ๋กœ "๋ฉ”์ธ ๋ฃจํ”„" ์•ฑ์„ ๋ฒˆ์—ญํ•˜๋ ค๋ฉด ๋‹ค์Œ์ด ์ž‘๋™ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. (JS ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ)

int main() {
  while (true) {
    frame();
    processEvents();
  }
}

// polyfillable with ASYNCIFY!
void processEvents() {
  __builtin_await(EM_ASM(
    new Promise((resolve, reject) => {
      setTimeout(0, () => resolve());
    })
  ))
}

@Kangz ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(setTimeout ์ฝ”๋“œ์˜ ์ธ์ˆ˜ ์ˆœ์„œ์— ์ž‘์€ ๋ฌธ์ œ๊ฐ€ ์žˆ๊ณ  ๋‹จ์ˆœํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ๋งŒ ์ œ์™ธ).

int main() {
  while (true) {
    frame();
    processEvents();
  }
}

// polyfillable with ASYNCIFY!
void processEvents() {
  __builtin_await(EM_ASM_WAITREF(
    return new Promise(resolve => setTimeout(resolve));
  ));
}

JS์—์„œ ๋™์ผํ•œ ์Šคํƒ์˜ ๋™์ผํ•œ wasm ์ธ์Šคํ„ด์Šค๋กœ ๋™์‹œ์— ์—ฌ๋Ÿฌ ํ˜ธ์ถœ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await๊ฐ€ ์ธ์Šคํ„ด์Šค์— ์˜ํ•ด ์‹คํ–‰๋˜๋ฉด ์–ด๋–ค ํ˜ธ์ถœ์ด ์ผ์‹œ ์ค‘์ง€๋˜๊ณ  ์•ฝ์†์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๊นŒ?

๊ฐ€์žฅ ์•ˆ์ชฝ์— ์žˆ๋Š” ๊ฒƒ. ์›ํ•˜๋Š” ๊ฒฝ์šฐ ๋‚˜๋จธ์ง€๋ฅผ ์กฐ์ •ํ•˜๋Š” ๊ฒƒ์€ JS ๋ž˜ํผ์˜ ์ž‘์—…์ž…๋‹ˆ๋‹ค.

@Kangz ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค ๊ทธ์ „์— ์ œ๊ฐ€ ์˜คํ•ดํ–ˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ, @RReverser ๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ž‘๋™ํ•ด์•ผ ํ•˜๋ฉฐ ์—ฌ๊ธฐ์— ์˜๋„๋œ ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ์ข‹์€ ์˜ˆ์ž…๋‹ˆ๋‹ค!

๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด Asyncify๋กœ ํด๋ฆฌํ•„์ด ๊ฐ€๋Šฅํ•˜๋ฉฐ ์‹ค์ œ๋กœ __builtin_await ๋ฅผ emscripten_sleep(0) ์— ๋Œ€ํ•œ ํ˜ธ์ถœ๋กœ ๋Œ€์ฒดํ•จ์œผ๋กœ์จ ์˜ค๋Š˜๋‚  Asyncify์™€ ๋™์ผํ•œ ์ฝ”๋“œ์™€ ๋™์ผํ•ฉ๋‹ˆ๋‹ค( setTimeout(0) ์ˆ˜ํ–‰) .

@RReverser๋‹˜ , ์„ค๋ช…ํ•ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ธ์Šคํ„ด์Šค ์ž์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ (๊ฐ€์žฅ ์ตœ๊ทผ์˜) ํ˜ธ์ถœ์ด ์ผ์‹œ ์ค‘์ง€๋œ๋‹ค๊ณ  ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ์ด ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด ๊ฒฝ์šฐ promise-on-await(f) ๋ฐ await-for-promise(p) ๋‘ ๊ฐ€์ง€ ๊ธฐ๋ณธ ํ•จ์ˆ˜๋ฅผ JS์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฑฐ์˜ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ „์ž๋Š” f() ๋ฅผ ํ˜ธ์ถœํ•˜์ง€๋งŒ f() await-for-promise(p) ํ˜ธ์ถœํ•˜๋ฉด ๋Œ€์‹  p ๊ฐ€ ํ•ด๊ฒฐ๋œ ํ›„ ์‹คํ–‰์„ ์žฌ๊ฐœํ•˜๋Š” ์ƒˆ Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์‹คํ–‰์ด ์™„๋ฃŒ๋œ ํ›„ ์ž์ฒด์ ์œผ๋กœ ํ•ด๊ฒฐ๋ฉ๋‹ˆ๋‹ค(๋˜๋Š” await-for-promise ๋ฅผ ๋‹ค์‹œ ํ˜ธ์ถœ). await-for-promise ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ์—ฌ๋Ÿฌ promise-on-await ์ปจํ…์ŠคํŠธ ๋‚ด์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉด ๊ฐ€์žฅ ์ตœ๊ทผ์˜ ๊ฒƒ์ด Promise๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. await-for-promise promise-on-await ์™ธ๋ถ€์—์„œ ์ด๋ฃจ์–ด์ง€๋ฉด ๋‚˜์œ ์ผ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(์ธ์Šคํ„ด์Šค์˜ start ์ฝ”๋“œ๊ฐ€ await ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Œ).

๋ง์ด ๋ผ?

@RossTate ๊ทธ๊ฒƒ์€ ์•„์ฃผ ๊ฐ€๊น๊ณ , ์˜ˆ, ์ผ๋ฐ˜์ ์ธ ์•„์ด๋””์–ด๋ฅผ ํฌ์ฐฉํ•ฉ๋‹ˆ๋‹ค. (๊ทธ๋Ÿฌ๋‚˜ ๋‹น์‹ ์ด ๋งํ–ˆ๋“ฏ์ด, ์ด๊ฒƒ์„ ํด๋ฆฌํ•„ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  ํŠน์ • wasm/JS ๊ฒฝ๊ณ„ ์ฒ˜๋ฆฌ๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ๋™๋“ฑํ•ฉ๋‹ˆ๋‹ค.)

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

@RossTate ์žฌ๋ฏธ์žˆ๋„ค์š”... ์ข‹์•„์š”! ํ˜ธ์ถœ์˜ ๋น„๋™๊ธฐ ํŠน์„ฑ์„ ๋ช…์‹œ์ ์œผ๋กœ ๋งŒ๋“ค๊ณ (์ž ์žฌ์ ์œผ๋กœ ๋น„๋™๊ธฐ ํ˜ธ์ถœ์—๋Š” promise-on-await ๊ฐ€ ํ•„์š”ํ•จ) Wasm์„ ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘๊ฐ„์—์„œ Wasm์„ ์ œ๊ฑฐํ•˜๋ฉด ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค promise-on-await ๊ฐ€ await-for-promise ๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋ฉด Promise ๋ฅผ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

@kripken ์ด๊ฒƒ์ด ๋‹ค๋ฅธ ์ด์œ ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์™œ Wasm/JS ๊ฒฝ๊ณ„๊ฐ€ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•œ์ง€ ์ž˜ ์ดํ•ด๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@binji ๋‚œ ๊ทธ๋ƒฅ JS์˜ ๊ทธ๋Ÿฌํ•œ ๊ธฐ๋Šฅ์ด wass๊ฐ€ ๋น„์Šทํ•œ ์ผ์„ ํ•˜๋„๋ก ๋‚ด๋ฒ„๋ ค ๋‘์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค. wasm์—์„œ ๊ฐ€์ ธ์˜ค๊ธฐ๋กœ ํ˜ธ์ถœํ•˜๋ฉด ์ž‘๋™ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ์žฌ๊ฐœ ๊ฐ€๋Šฅํ•œ ๋ฐฉ์‹์œผ๋กœ ๊ฒฝ๊ณ„ ๋“ฑ์œผ๋กœ was๋ฅผ ๋น ์ ธ๋‚˜๊ฐˆ ๋ฐฉ๋ฒ•์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ?

@kripken ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ ์‹œ์ ์—์„œ await-for-promise import๋Š” Wasm ๋‚ด์žฅ์ฒ˜๋Ÿผ ์ž‘๋™ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

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

@syg ๊ฐ€ ์ด๋Ÿฌํ•œ ์ž ์žฌ์ ์ธ JS ๊ธฐ๋ณธ ์š”์†Œ์— ๋Œ€ํ•ด ์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•˜๋Š”์ง€ ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์•„, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. @RossTate๋‹˜ ์˜ ์˜๊ฒฌ์„ "์ดํ•ด๋ฅผ ํ™•์‹คํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ด๋ ‡๊ฒŒ ๋ฐ”๊ฟ”์„œ ์˜ฌ๋ฐ”๋ฅธ ํ˜•ํƒœ์ธ์ง€ ์•Œ๋ ค์ฃผ์„ธ์š”"๋กœ ๋ฐ›์•„๋“ค์˜€์œผ๋ฉฐ ๊ตฌ์ฒด์ ์ธ ์ œ์•ˆ์€ ์•„๋‹™๋‹ˆ๋‹ค.

์ƒ๊ฐํ•ด๋ณด๋ฉด ๋‹น์‹ ์˜ ์•„์ด๋””์–ด๋Š” JS ํ”„๋ ˆ์ž„๋ฟ๋งŒ ์•„๋‹ˆ๋ผ wasm๋„ ์ผ์‹œ ์ค‘์ง€ํ•˜๊ณ  ์‹ถ์–ดํ•˜์ง€๋งŒ ํ˜ธ์ŠคํŠธ/๋ธŒ๋ผ์šฐ์ € ํ”„๋ ˆ์ž„๋„ ์žˆ์Šต๋‹ˆ๋‹ค. (ํ˜„์žฌ ์ œ์•ˆ์€ wasm์ด ํ˜ธ์ถœ๋œ ๊ฒฝ๊ณ„๊นŒ์ง€๋งŒ ์ž‘์—…ํ•จ์œผ๋กœ์จ ์ด๋ฅผ ๋ฐฉ์ง€ํ•ฉ๋‹ˆ๋‹ค.) ๋‹ค์Œ์€ ์˜ˆ์ž…๋‹ˆ๋‹ค.

myList.forEach((item) => {
  .. call something which ends up pausing ..
});

forEach ๊ฐ€ ๋ธŒ๋ผ์šฐ์ € ์ฝ”๋“œ์— ๊ตฌํ˜„๋˜์–ด ์žˆ์œผ๋ฉด ๋ธŒ๋ผ์šฐ์ € ํ”„๋ ˆ์ž„์„ ์ผ์‹œ ์ค‘์ง€ํ•œ๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค. ๋˜ํ•œ ์ค‘์š”ํ•œ ๊ฒƒ์€ ์ด๋Ÿฌํ•œ ๋ฃจํ”„์˜ ์ค‘๊ฐ„์— ์ผ์‹œ ์ค‘์ง€ํ–ˆ๋‹ค๊ฐ€ ๋‚˜์ค‘์— ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด JS๊ฐ€ ํ•  ์ˆ˜ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๋Šฅ๋ ฅ์ด ๋  ๊ฒƒ์ด๋ฉฐ ๊ท€ํ•˜์˜ ์•„์ด๋””์–ด๋Š” ์ผ๋ฐ˜ ๋ฃจํ”„์—์„œ๋„ ์ด๋ฅผ ํ—ˆ์šฉํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

for (let i of something) {
  .. call something which ends up pausing ..
}

๊ทธ๋ฆฌ๊ณ  ์ด ๋ชจ๋“  ๊ฒƒ์ด async JS ํ•จ์ˆ˜์™€ ์ŠคํŽ™์ƒ ์ƒํ˜ธ์ž‘์šฉ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ๋“ค์€ ๋ชจ๋‘ ๋ธŒ๋ผ์šฐ์ €์™€ JS ์‚ฌ๋žŒ๋“ค๊ณผ ํ•จ๊ป˜ ํ•˜๊ธฐ์—๋Š” ํฐ ํ† ๋ก ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค.

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

๊ท€ํ•˜์˜ ์ œ์•ˆ์—์„œ ๋ˆ„๋ฝ๋œ ๊ฒƒ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ์‚ฌ๊ณผ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์ „๋ฐ˜์ ์œผ๋กœ, ์ฝ”์–ด wasm ์‚ฌ์–‘์— ์ถ”๊ฐ€๋ฅผ ํ”ผํ•˜๋ ค๋Š” ๋™๊ธฐ๊ฐ€ ๋ฌด์—‡์ธ์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

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

๋‚ด ์˜๊ฒฌ์€ ๋‘˜ ๋‹ค์˜ ์กฐํ•ฉ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋†’์€ ์ˆ˜์ค€์—์„œ ์ €๋Š” ์ œ์•ˆ์„ ์ˆœ์ „ํžˆ JS API์˜ ๊ฐ•ํ™”๋กœ ๋ฐ”๊ฟ€ ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์žˆ๋Š”์ง€ ์•Œ์•„ ๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋ฆฌ๊ณ  ์œ ์‚ฌํ•˜๊ฒŒ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ๊ฐ€ wasm ๋ชจ๋“ˆ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹). ์ด ์—ฐ์Šต์€ wasm์ด ์ •๋ง๋กœ ๋ณ€๊ฒฝ๋˜์–ด์•ผ ํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋ฉฐ ์‹ค์ œ๋กœ ์ œ์•ˆ์ด JS ์‚ฌ๋žŒ๋“ค์ด ์Šน์ธํ•  ์ˆ˜๋„ ์žˆ๊ณ  ์Šน์ธํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ๋Š” ์ƒˆ๋กœ์šด ๊ธฐ๋ณธ ์š”์†Œ๋ฅผ JS์— ๋น„๋ฐ€๋ฆฌ์— ์ถ”๊ฐ€ํ•˜๋Š”์ง€ ํŒ๋‹จํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๊ฐ€์ ธ์˜จ await : func (param externref) (result externref) ๋งŒ์œผ๋กœ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ด๊ฒƒ์ด JS์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

wasm์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ์˜ ๋‹จ์ˆœ์„ฑ์— ๊ด€ํ•ด์„œ๋Š” ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…, ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๊ฐ€ await ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ๊ฐ€ ํฌํ•จ๋œ GC ๊ฐ’์„ ๋ฐ˜ํ™˜ํ•  ๋•Œ ์ˆ˜ํ–‰ํ•  ์ž‘์—…๊ณผ ๊ฐ™์ด ์—ฌ์ „ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ†ตํ™”๊ฐ€ ๋๋‚œ ํ›„ ๋“ฑ๋“ฑ.

์—ฐ์Šต์œผ๋กœ ๋Œ์•„๊ฐ€์„œ ์ง€์ ํ•œ ๋Œ€๋กœ wasm ์Šคํƒ๋งŒ ์บก์ฒ˜ํ•ด์•ผ ํ•˜๋Š” ์ข‹์€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ์ƒˆ๋กœ์šด ๊ด€์ ์œผ๋กœ ์•ฝ๊ฐ„ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์ด์ „์˜ ์ œ์•ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค. JS API์— WebAssembly.instantiateAsync(moduleBytes, imports, "name1", "name2") ํ•จ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค. moduleBytes ์— ์—ฌ๋Ÿฌ ๊ฐ€์ ธ์˜ค๊ธฐ์™€ ์ถ”๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ import "name1" "name2" (func (param externref) (result externref)) ๊ฐ€ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ instantiateAsync ๋Š” imports ์— ์˜ํ•ด ์ œ๊ณต๋œ ๊ฐ’์œผ๋กœ moduleBytes $ ์˜ ๋‹ค๋ฅธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜๊ณ  ๊ฐœ๋…์ ์œผ๋กœ await-for-promise ์ธ ์ถ”๊ฐ€ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๊ฐ€ ์ด ์ธ์Šคํ„ด์Šค์—์„œ ์ƒ์„ฑ๋˜๋ฉด ๋ณดํ˜ธ๋˜์–ด(๊ฐœ๋…์ ์œผ๋กœ promise-on-await ์— ์˜ํ•ด) ์ด await-for-promise ๊ฐ€ ํ˜ธ์ถœ๋  ๋•Œ ์Šคํƒ์„ ์˜ฌ๋ผ๊ฐ€ ์ฒซ ๋ฒˆ์งธ ๋ณดํ˜ธ๋ฅผ ์ฐพ์€ ๋‹ค์Œ ๋‚ด์šฉ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์Šคํƒ์„ ์ƒˆ Promise์— ๋„ฃ์€ ๋‹ค์Œ ์ฆ‰์‹œ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ์ด์ œ ์œ„์—์„œ ์–ธ๊ธ‰ํ•œ ๊ฒƒ๊ณผ ๋™์ผํ•œ ๊ธฐ๋ณธ ์š”์†Œ๊ฐ€ ์žˆ์ง€๋งŒ ๋” ์ด์ƒ ์ผ๊ธ‰์ด ์•„๋‹ˆ๋ฉฐ ์ด ์ œํ•œ๋œ ํŒจํ„ด์œผ๋กœ ์ธํ•ด wasm ์Šคํƒ๋งŒ ์บก์ฒ˜๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋™์‹œ์— WebAssembly๋Š” ํŒจํ„ด์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ๋ณ€๊ฒฝํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

์ƒ๊ฐ?

@devsnek

์žฌ๊ฐœ ๊ฐ€๋Šฅํ•œ ์˜ˆ์™ธ(๋Œ€๋žต ํšจ๊ณผ)๊ฐ€ ์ด ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•˜๋Š” ์ด์œ ๊ฐ€ ์—ฌ์ „ํžˆ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ ํ™•์‹คํžˆ ์ด ๊ณต๊ฐ„์˜ ์˜ต์…˜์ž…๋‹ˆ๋‹ค.

@rossberg ์˜ ๋งˆ์ง€๋ง‰ ํ”„๋ ˆ์  ํ…Œ์ด์…˜ ์—์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์€ ๊ทธ๊ฐ€ ์ฒ˜์Œ์—๋Š” ๊ทธ ๊ธธ์„ ๊ฐ€๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ฝ”๋ฃจํ‹ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟจ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ฌธ์ œ"๋ผ๋Š” ์ œ๋ชฉ์˜ ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ ์Šฌ๋ผ์ด๋“œ ํ›„์— ์ด ๊ณต๊ฐ„์˜ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์ธ ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ์งˆ๋ฌธ์€ @rosberg ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

call $get_promise
await
;; use it!

wasm์˜ ๋‹จ์ˆœํ•จ์€ ๊ทธ ์ž์ฒด๋กœ ์œ ์šฉํ•˜์ง€๋งŒ VM์ด ์–ด๋–ค ์ผ์ด ์ง„ํ–‰๋˜๊ณ  ์žˆ๋Š”์ง€๋„ ๋งค์šฐ ๋ช…ํ™•ํ•˜๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

@RossTate

์ฆ‰, ๊ฐ€์ ธ์˜จ await : func (param externref) (result externref)๋งŒ์œผ๋กœ ํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์ด๊ฒƒ์ด JS์— ์ƒˆ๋กœ์šด ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ผ ๊ฐ€๋Šฅ์„ฑ์ด ํฝ๋‹ˆ๋‹ค.

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

wasm์— ๋Œ€ํ•œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์˜ ๋‹จ์ˆœ์„ฑ์— ๊ด€ํ•ด์„œ๋Š” ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…๊ณผ ๊ฐ™์ด ์—ฌ์ „ํžˆ ๊ณ ๋ คํ•ด์•ผ ํ•  ์‚ฌํ•ญ์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์ฝ”์–ด wasm ์‚ฌ์–‘ ์—์„œ ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒํ–ˆ๋Š”์ง€ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ด€๋ จ ์„น์…˜ ์„ ํ›‘์–ด๋ณด๊ณ  ์ด์ œ๋Š” ๊ทธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์นœ ๊ฒƒ์€ ์•„๋‹๊นŒ?

๋‚ด ์ƒ๊ฐ์— ํ•ต์‹ฌ wasm ์‚ฌ์–‘ ์ถ”๊ฐ€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ await ๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ "๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ" ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ œ์•ˆ์„œ์— That's it for the core wasm spec! ๋ผ๊ณ  ์ผ์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ๋” ์ถ”๊ฐ€ํ•ด์•ผ ํ•  ํ•ต์‹ฌ wasm ์‚ฌ์–‘์„ ๋ณด์—ฌ์ฃผ์„ธ์š”.

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

์ด๊ฒƒ์€ ์•ฝ๊ฐ„์˜ ์ƒˆ๋กœ์šด ๊ด€์ [์ƒˆ๋กœ์šด ์•„์ด๋””์–ด]์œผ๋กœ ์•ฝ๊ฐ„ ์ˆ˜์ •๋˜์—ˆ์ง€๋งŒ ์ด์ „์˜ ์ œ์•ˆ์œผ๋กœ ๋Œ์•„๊ฐ€๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์•„์ด๋””์–ด๋Š” ์ œ์•ˆ์„œ์˜ Alternative approaches considered ์— ์žˆ๋Š” ๋‘ ๋ฒˆ์งธ ๋‹จ๋ฝ๊ณผ ๊ธฐ๋Šฅ์ ์œผ๋กœ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๊นŒ? ๊ทธ๋Ÿฐ ๊ฒƒ๋„ ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋œ ์ข‹๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ด์œ ๋ฅผ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค.

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

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

wasm ์‚ฌ์–‘ ๋ณ€๊ฒฝ์ด ์—†๋Š” ์†”๋ฃจ์…˜์ด ๋ฐ”๋žŒ์งํ•˜๋‹ค๋Š” ๋ฐ ์šฐ๋ฆฌ ๋ชจ๋‘ ๋™์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

ํ•˜์ง€๋งŒ ๋„ค, ์ฝ”์–ด was spec ๋ถ€๋ถ„์„ ๊ฐ€๋Šฅํ•œ ํ•œ ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ์ด๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒ ํ•ฉ๋‹ˆ๊นŒ? ๋…ผ๋ฆฌ์˜ 99%๊ฐ€ JS ์ธก์— ์žˆ์Šต๋‹ˆ๋‹ค(๊ทธ๋Ÿฌ๋‚˜ @RossTate ๋Š” ๋™์˜ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ด๋ฉฐ ์šฐ๋ฆฌ๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์„ ์•Œ์•„๋‚ด๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋งˆ์ง€๋ง‰ ์‘๋‹ต์—์„œ ์ƒํ™ฉ์„ ๋ฐœ์ „์‹œํ‚ค๊ธฐ๋ฅผ ๋ฐ”๋ผ๋Š” ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค).

๋‚ด ์ƒ๊ฐ์— ํ•ต์‹ฌ wasm ์‚ฌ์–‘ ์ถ”๊ฐ€๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ await ๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ์ด๋ฉฐ "๋ฌด์–ธ๊ฐ€๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๊ธฐ" ์œ„ํ•œ ๊ฒƒ์ด๋ฉฐ ๊ทธ๊ฒŒ ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

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

์ฝ”์–ด wasm ์‚ฌ์–‘์—์„œ ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๊นŒ?

์ธ์Šคํ„ด์Šค์˜ ๊ฐ€์ ธ์˜ค๊ธฐ๋Š” ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์˜ ๋‚ด๋ณด๋‚ด๊ธฐ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JS API(๊ทธ๋ฆฌ๊ณ  wasm์˜ ๊ตฌ์„ฑ ์›์น™)์— ๋Œ€ํ•ด ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋ฐ”์— ๋”ฐ๋ฅด๋ฉด ์ด๋Ÿฌํ•œ ๊ฐ€์ ธ์˜ค๊ธฐ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๊ฐœ๋…์ ์œผ๋กœ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค๊ฐ€ ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ง์ ‘ ํ˜ธ์ถœ์ž…๋‹ˆ๋‹ค. ๋‘ ์ธ์Šคํ„ด์Šค ๊ฐ„์— ์ „๋‹ฌ๋˜๋Š” funcref ์™€ ๊ฐ™์€ ๊ธฐ๋Šฅ ๊ฐ’์— ๋Œ€ํ•œ (๊ฐ„์ ‘) ํ˜ธ์ถœ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

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

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

์ด๊ฒƒ์€ f ๊ฐ€ ์ผ๋ถ€ wasm ์ธ์Šคํ„ด์Šค์˜ ๋‚ด๋ณด๋‚ธ ๋‹จํ•ญ ํ•จ์ˆ˜์˜ ๊ฐ’์ธ ๊ฒฝ์šฐ instanceization-parameters ๊ฐœ์ฒด {"some" : {"import" : f}} ๊ฐ€ {"some" : {"import" : (x) => f(x)}} ์™€ ์˜๋ฏธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์ „์ž์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ wasm ์Šคํƒ ๋‚ด์— ์œ ์ง€๋˜๋Š” ๋ฐ˜๋ฉด ํ›„์ž์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ๊ฐ„์‹ ํžˆ๋ผ๋„ JS ์Šคํƒ์— ๋“ค์–ด๊ฐ‘๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ ์ด๋Ÿฌํ•œ ์ธ์Šคํ„ด์Šคํ™” ๋งค๊ฐœ๋ณ€์ˆ˜ ๊ฐœ์ฒด๋Š” ๋™๋“ฑํ•œ ๊ฒƒ์œผ๋กœ ๊ฐ„์ฃผ๋ฉ๋‹ˆ๋‹ค. ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜/์–ธ์–ด ์ƒํ˜ธ ์šด์šฉ์„ฑ ๊ด€์ ์—์„œ ์ด๊ฒƒ์ด ์œ ์šฉํ•œ ์ด์œ ์— ๋Œ€ํ•ด ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, ํ˜„์žฌ๋กœ์„œ๋Š” ์—ฌ๋‹ด์ž…๋‹ˆ๋‹ค.

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

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ๋Œ€์•ˆ์„ ๋‹ค๋ฅธ ์˜๋ฏธ๋กœ ์ฝ์—ˆ์ง€๋งŒ ์ œ ํ˜ผ๋ž€์„ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ ์™ธ์—๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ œ ์ œ์•ˆ๊ณผ ๊ฐ™์€ ์˜๋ฏธ๋กœ ๋ง์”€ํ•˜์‹  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฐฌ๋ฐ˜ ์–‘๋ก ์„ ๋…ผ์˜ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ œ์•ˆ์ด wasm ์ธก๋ฉด์—์„œ ๋งค์šฐ ๊ฐ€๋ณ๋‹ค๋Š” ์‚ฌ์‹ค์€ await ๋ช…๋ น์ด ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ๊ณผ ์˜๋ฏธ์ƒ ๋™์ผํ•ด ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก , ๋‹น์‹ ์ด ์ง€์ ํ•œ ๊ฒƒ์ฒ˜๋Ÿผ ๊ด€์Šต ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค! ๊ทธ๋Ÿฌ๋‚˜ await ๊ฐ€ ์ด๊ฒƒ์ด ์œ ์ง€๋˜๋Š” ์œ ์ผํ•œ ๊ธฐ๋Šฅ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜์— ๋Œ€ํ•ด์„œ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. await ์˜ ๊ฒฝ์šฐ ์ด ๊ธฐ๋Šฅ์ด ์žˆ๋Š” ๋ชจ๋“ˆ์— import "control" "await" (func (param externref) (result externref)) ์ ˆ์ด ์žˆ๊ณ  ์ด ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜๋Š” ํ™˜๊ฒฝ์—์„œ ํ•ญ์ƒ ํ•ด๋‹น ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ธ์Šคํ„ด์Šคํ™”ํ•˜์—ฌ ๊ด€๋ก€์— ๋Œ€ํ•œ ์šฐ๋ ค๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ ์ ˆํ•œ ์ฝœ๋ฐฑ์œผ๋กœ.

๊ทธ๊ฒƒ์€ ๋‹น์‹ ์ด ์ฐพ๊ณ  ์žˆ๋Š” ํฌ๋กœ์Šค ํ”Œ๋žซํผ ์ด์‹์„ฑ์„ ์—ฌ์ „ํžˆ ์ œ๊ณตํ•˜๋ฉด์„œ wasm์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š์Œ์œผ๋กœ์จ ๋งŽ์€ ์ž‘์—…์„ ์ ˆ์•ฝํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์—ฌ์ „ํžˆ ์ œ์•ˆ์˜ ๋‰˜์•™์Šค๋ฅผ ์ดํ•ดํ•˜๊ธฐ ์œ„ํ•ด ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์œผ๋ฉฐ ์ง€๊ธˆ๊นŒ์ง€ ์ด๋ฏธ ๋งŽ์€ ๊ฒƒ์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค!

์ด ์ œ์•ˆ์ด wasm ์ธก๋ฉด์—์„œ ๋งค์šฐ ๊ฐ€๋ณ๋‹ค๋Š” ์‚ฌ์‹ค์€ await ๋ช…๋ น์ด ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ๊ณผ ์˜๋ฏธ์ƒ ๋™์ผํ•˜๊ฒŒ ๋ณด์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

FWIW๋Š” ์ด ์ œ์•ˆ์ด ์›๋ž˜ ์‹œ์ž‘๋œ ๊ณณ์ด์ง€๋งŒ ์ด์™€ ๊ฐ™์€ ๋‚ด์žฅ ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์€ VM์— ๋” ๋ถˆํˆฌ๋ช…ํ•˜๊ณ  ์ผ๋ฐ˜์ ์œผ๋กœ ๊ถŒ์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค( @binji ๋Š” ์›๋ž˜ ํ† ๋ก ์—์„œ ์ด ์ œ์•ˆ์—์„œ ๋ฉ€์–ด์งˆ ๊ฒƒ์„ ์ œ์•ˆํ–ˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค).

์˜ˆ๋ฅผ ๋“ค์–ด, ๊ท€ํ•˜์˜ ์ฃผ์žฅ์— ๋”ฐ๋ผ memory.grow ๋˜๋Š” atomic.wait ์™€ ๊ฐ™์€ ๊ฒƒ์€ ์ƒ์‘ํ•˜๊ฒŒ import "control" "memory_grow" ๋˜๋Š” import "control" "atomic_wait" ๋กœ ์ˆ˜ํ–‰๋  ์ˆ˜๋„ ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์ง€์นจ๊ณผ ๋™์ผํ•œ ์ˆ˜์ค€์˜ interop ๋ฐ ์ •์  ๋ถ„์„ ๊ธฐํšŒ(VM ๋ฐ ๋„๊ตฌ ์ธก๋ฉด ๋ชจ๋‘์—์„œ)๋ฅผ ์ œ๊ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

memory.grow ๋ช…๋ น์ด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๋Š” ๊ฒฝ์šฐ์— ์—ฌ์ „ํžˆ ์œ ์šฉํ•˜๋‹ค๊ณ  ์ฃผ์žฅํ•  ์ˆ˜ ์žˆ์ง€๋งŒ atomic.wait ๋Š” ํ™•์‹คํžˆ ์ฝ”์–ด ์™ธ๋ถ€์—์„œ ๊ตฌํ˜„๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ await ์™€ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€/์žฌ๊ฐœ๊ฐ€ ๋ฐœ์ƒํ•˜๋Š” ์ˆ˜์ค€๊ณผ await ํ•จ์ˆ˜๊ฐ€ atomic.wait ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ๋งˆ๋ฒ•์„ ํ•„์š”๋กœ ํ•œ๋‹ค๋Š” ์ ์„ ์ œ์™ธํ•˜๊ณ ๋Š” VM ์Šคํƒ๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ณ  ๊ฐ’์ด ๋ณ€๊ฒฝ๋  ๋•Œ๊นŒ์ง€ ํ˜„์žฌ ์Šค๋ ˆ๋“œ๋ฅผ ์ฐจ๋‹จํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

@tlively

"wait for something"์€ ์ด๋ฏธ ์‚ฌ์–‘์—์„œ ์‚ฌ์šฉ๋˜๋Š” ์ •ํ™•ํ•œ ์šฉ์–ด๋กœ ๋ฐ”๊ฟ”์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ถ„๋ช…ํ•˜๊ฒŒ ์˜ˆ์ž…๋‹ˆ๋‹ค. ๋„์›€์ด ๋œ๋‹ค๋ฉด ์ง€๊ธˆ ๋” ๊ตฌ์ฒด์ ์ธ ํ…์ŠคํŠธ๋ฅผ ์ œ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

When an await instruction is executed on a waitref, the host environment is requested to do some work. Typically there would be a natural meaning to what that work is based on what a waitref is on a specific host (in particular, waiting for some form of host event), but from the wasm module's point of view, the semantics of an await are similar to a call to an imported host function, that is: we don't know exactly what the host will do, but at least expect to give it certain types and receive certain results; after the instruction executes, global state (the store) may change; and an exception may be thrown.

The behavior of an await from the host's perspective may be very different, however, from a call to an imported host function, and might involve something like pausing and resuming the wasm module. It is for this reason that this instruction is defined. For the instruction to be usable on a particlar host, the host would need to define the proper behavior.

Btw, ์ด๊ฒƒ์„ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ๋‚˜์—๊ฒŒ ์˜จ ๋˜ ๋‹ค๋ฅธ ๋น„๊ต๋Š” ๋กœ๋“œ ๋ฐ ์ €์žฅ์— ๋Œ€ํ•œ ์ •๋ ฌ ํžŒํŠธ์ž…๋‹ˆ๋‹ค. Wasm์€ ์ •๋ ฌ๋˜์ง€ ์•Š์€ ๋กœ๋“œ ๋ฐ ์ €์žฅ์„ ์ง€์›ํ•˜๋ฏ€๋กœ ํžŒํŠธ๋Š” wasm ๋ชจ๋“ˆ์—์„œ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๋™์ž‘์œผ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์—†์ง€๋งŒ(ํžŒํŠธ๊ฐ€ ์ž˜๋ชป๋œ ๊ฒฝ์šฐ์—๋„) ํ˜ธ์ŠคํŠธ์˜ ๊ฒฝ์šฐ ํŠน์ • ํ”Œ๋žซํผ์—์„œ ๋งค์šฐ ๋‹ค๋ฅธ ๊ตฌํ˜„์„ ์ œ์•ˆํ•ฉ๋‹ˆ๋‹ค(๋” ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์Œ). ๋”ฐ๋ผ์„œ ์‚ฌ์–‘์—์„œ The alignment in load and store instructions does not affect the semantics ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ๊ด€์ฐฐํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ๊ฐ€ ์—†๋Š” ๋‹ค๋ฅธ ๋ช…๋ น์–ด์˜ ์˜ˆ์ž…๋‹ˆ๋‹ค.

@RossTate

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

์ž˜ ๋“ค๋ ธ๊ณ  ์•Œ๊ฒŒ ๋˜์–ด์„œ ์ข‹์•˜์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ ๋ถ€๋ถ„์„ ๋†“์ณค์Šต๋‹ˆ๋‹ค.

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

์ฝ”์–ด wasm ์‚ฌ์–‘์—์„œ ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ์— ๋Œ€ํ•ด ์–ธ๊ธ‰ํ•ฉ๋‹ˆ๊นŒ? ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๊ทธ๋ ‡๊ฒŒํ–ˆ๋Š”์ง€ ๊ธฐ์–ตํ•˜์ง€ ๋ชปํ•˜๊ณ  ๊ด€๋ จ ์„น์…˜์„ ํ›‘์–ด๋ณด๊ณ  ์ด์ œ๋Š” ๊ทธ๊ฒƒ์„ ๋ณผ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‚ด๊ฐ€ ๋ญ”๊ฐ€๋ฅผ ๋†“์นœ ๊ฒƒ์€ ์•„๋‹๊นŒ?

์˜ˆ, ํ•ต์‹ฌ wasm ์‚ฌ์–‘์€ ๋‹ค๋ฅธ wasm ๋ชจ๋“ˆ์—์„œ ๊ฐ€์ ธ์˜จ ๊ธฐ๋Šฅ๊ณผ ํ˜ธ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค(ยง 4.2.6). ํ•จ์ˆ˜ ํ˜ธ์ถœ์˜ ์˜๋ฏธ(ยง 4.4.7)๋Š” ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•œ ๋ชจ๋“ˆ์— ์˜์กดํ•˜์ง€ ์•Š์œผ๋ฉฐ ํŠนํžˆ ๋ชจ๋“ˆ ๊ฐ„ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ํ˜„์žฌ ๋™์ผํ•œ ๋ชจ๋“ˆ ํ•จ์ˆ˜ ํ˜ธ์ถœ๊ณผ ๋™์ผํ•˜๊ฒŒ ๋™์ž‘ํ•˜๋„๋ก ์ง€์ •๋ฉ๋‹ˆ๋‹ค.

๊ต์ฐจ ๋ชจ๋“ˆ ํ˜ธ์ถœ ์•„๋ž˜์˜ await s๊ฐ€ ํŠธ๋žฉ์œผ๋กœ ์ •์˜๋œ ๊ฒฝ์šฐ ํ˜ธ์ŠคํŠธ์˜ ํ˜ธ์ถœ์— ์˜ํ•ด ์ƒ์„ฑ๋œ ๋งˆ์ง€๋ง‰ ๋”๋ฏธ ํ”„๋ ˆ์ž„ ์ด์ „์— ๊ต์ฐจ ๋ชจ๋“ˆ ํ˜ธ์ถœ์ด ์กด์žฌํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ๊ฒ€์‚ฌํ•˜๊ธฐ ์œ„ํ•ด ํ˜ธ์ถœ ์Šคํƒ ์œ„๋กœ ์ˆœํšŒ๋ฅผ ์ง€์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. (ยง 4.5.5). ์ด๊ฒƒ์€ ์‚ฌ์–‘์—์„œ ๋ถˆํ–‰ํ•œ ํ•ฉ๋ณ‘์ฆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” Ross์˜ ๋ง์— ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ํฌ๋กœ์Šค ๋ชจ๋“ˆ ํ˜ธ์ถœ ํŠธ๋žฉ์€ ๊ตฌ์„ฑ์„ฑ์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์ด๋ฏ€๋กœ ์ „์ฒด ์Šคํƒ์ด ํ˜ธ์ŠคํŠธ์˜ ๋งˆ์ง€๋ง‰ ํ˜ธ์ถœ๋กœ ๋‹ค์‹œ ๊ณ ์ •๋˜๋Š” ์˜๋ฏธ ์ฒด๊ณ„๋ฅผ ์„ ํ˜ธํ•ฉ๋‹ˆ๋‹ค. await ๋ฅผ ํ˜ธ์ŠคํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ(ยง 4.4.7.3)๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ ์‚ฌ์–‘ ์ง€์ • ๋ฐฉ๋ฒ•์€ @kripken์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํ˜ธ์ŠคํŠธ ํ•จ์ˆ˜ ํ˜ธ์ถœ์€ ์™„์ „ํžˆ ๋น„๊ฒฐ์ •์ ์ด๋ฏ€๋กœ ํ•ต์‹ฌ ์‚ฌ์–‘ ๊ด€์ ์—์„œ ๋ช…๋ น์–ด์— ๋Œ€ํ•œ ๋” ๋‚˜์€ ์ด๋ฆ„์€ undefined ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด ์‹œ์ ์—์„œ ์ €๋Š” ์ฝ”์–ด ์‚ฌ์–‘ ์ž์ฒด๊ฐ€ undefined ๋ช…๋ น์–ด IMO์˜ ์ด์ ์„ ์–ป์ง€ ๋ชปํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์›น ํ”Œ๋žซํผ(๋ฐ ์ด์‹์„ฑ์„ ์œ„ํ•œ WASI)์—์„œ ํ•ญ์ƒ ์ œ๊ณต๋˜๋Š” ๋ณธ์งˆ์ ์ธ ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์„ ํ˜ธํ•˜๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์˜๋ฏธ์ ์œผ๋กœ waitref ์™€ await ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์— ๋Œ€ํ•œ ํ˜ธ์ถœ์€ ์ฐจ๋‹จ ํ˜ธ์ถœ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋ธŒ๋ผ์šฐ์ €์™€ ๊ฐ™์€ ๋น„๋™๊ธฐ ํ™˜๊ฒฝ์ด ์—†๊ณ  โ€‹โ€‹๊ธฐ๋ณธ์ ์œผ๋กœ ์ฐจ๋‹จ ํ˜ธ์ถœ์„ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋Š” ์›น์ด ์•„๋‹Œ ์ž„๋ฒ ๋”ฉ์— ์–ด๋–ค ๊ฐ€์น˜๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๊นŒ?

@RReverser , ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‚ด์žฅ์— ๋Œ€ํ•ด ๋งํ•˜๊ณ  ์žˆ๋Š” ์š”์ ์„ ๋ด…๋‹ˆ๋‹ค. ํ•ด์„๋˜์ง€ ์•Š์€ ๊ธฐ๋Šฅ ๋Œ€ ๋ช…๋ น์„ ํ†ตํ•ด ์ž‘์—…์„ ์ •์˜ํ•ด์•ผ ํ•˜๋Š” ์‹œ๊ธฐ๋ฅผ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ ํŒ๋‹จ ํ˜ธ์ถœ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒ๋‹จ์˜ ํ•œ ๊ฐ€์ง€ ์š”์†Œ๋Š” ๋‹ค๋ฅธ ๋ช…๋ น๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์„ ๊ณ ๋ คํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. memory.grow ๋Š” ๋‹ค๋ฅธ ๋ฉ”๋ชจ๋ฆฌ ๋ช…๋ น์–ด์˜ ๋™์ž‘์— ์˜ํ–ฅ์„ ์ค๋‹ˆ๋‹ค. ์Šค๋ ˆ๋“œ ์ œ์•ˆ์„ ์ž์„ธํžˆ ์‚ดํŽด๋ณผ ๊ธฐํšŒ๊ฐ€ ์—†์—ˆ์ง€๋งŒ atomic.wait ๊ฐ€ ๋‹ค๋ฅธ ๋™๊ธฐํ™” ๋ช…๋ น์˜ ๋™์ž‘์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๊ฑฐ๋‚˜ ์˜ํ–ฅ์„ ๋ฐ›๋Š”๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ์‚ฌ์–‘์„ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์ƒํ˜ธ ์ž‘์šฉ์„ ๊ณต์‹ํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ await ์ž์ฒด๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋‹ค๋ฅธ ๋ช…๋ น๊ณผ์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด ์—†์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ƒํ˜ธ ์ž‘์šฉ์€ ํ˜ธ์ŠคํŠธ์™€์˜ ์ƒํ˜ธ ์ž‘์šฉ์ด๋ฏ€๋กœ ๋‚ด ์ง๊ด€์€ ์ด ์ œ์•ˆ์ด ๊ฐ€์ ธ์˜จ ํ˜ธ์ŠคํŠธ ๊ธฐ๋Šฅ์„ ํ†ตํ•ด ์ˆ˜ํ–‰๋˜์–ด์•ผ ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

atomic.wait ์™€ ์ด ์ œ์•ˆ๋œ await ์˜ ํฐ ์ฐจ์ด์ ์€ $#$2 atomic.wait #$ ๋กœ ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์ž…๋ ฅํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—์ด์ „ํŠธ๊ฐ€ ์™„์ „ํžˆ ์ผ์‹œ ์ค‘์ง€๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

@kripken :

@rossberg ์˜ ๋งˆ์ง€๋ง‰ ํ”„๋ ˆ์  ํ…Œ์ด์…˜์—์„œ ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๊ฒƒ์€ ๊ทธ๊ฐ€ ์ฒ˜์Œ์—๋Š” ๊ทธ ๊ธธ์„ ๊ฐ€๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์ฝ”๋ฃจํ‹ด ์ ‘๊ทผ ๋ฐฉ์‹์„ ํ•˜๊ธฐ ์œ„ํ•ด ๋ฐฉํ–ฅ์„ ๋ฐ”๊ฟจ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. "๋ฌธ์ œ"๋ผ๋Š” ์ œ๋ชฉ์˜ ์Šฌ๋ผ์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค. ๊ทธ ์Šฌ๋ผ์ด๋“œ ํ›„์— ์ด ๊ณต๊ฐ„์˜ ๋˜ ๋‹ค๋ฅธ ์˜ต์…˜์ธ ์ฝ”๋ฃจํ‹ด์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์•„๋งˆ๋„ ๋‹น์‹ ์˜ ์งˆ๋ฌธ์€ @rosberg ์— ๋Œ€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋ˆ„๊ฐ€ ๋ช…ํ™•ํžˆ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

ํ˜„์žฌ ์ œ์•ˆ์— ๊ด€ํ•ด์„œ๋Š”, ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋จธ๋ฆฌ๋ฅผ ์‹ธ๋งค๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. :)

ํŠนํžˆ, ์ด์ „ Wasm ํ•จ์ˆ˜์—์„œ await ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ๋งŒ await ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” JS์™€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์€ ์—”์ง„์ด ๋‹จ์ผ(๋น„๋™๊ธฐ) ํ•จ์ˆ˜์˜ _local_ ๋ณ€ํ™˜์„ ํ†ตํ•ด await ๋ฅผ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋งค์šฐ ํ•ต์‹ฌ์ ์ธ ์ œ์•ฝ์ž…๋‹ˆ๋‹ค!

์ด ์ œ์•ฝ ์กฐ๊ฑด์ด ์—†์œผ๋ฉด ์—”์ง„์€ _global_ ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(Asyncify๊ฐ€ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ). ์—ฌ๊ธฐ์„œ ๋ชจ๋“  ํ˜ธ์ถœ์€ ์ž ์žฌ์ ์œผ๋กœ ํ›จ์”ฌ ๋” ๋น„์Œ‰๋‹ˆ๋‹ค(์ผ๋ถ€ ํ˜ธ์ถœ์ด await์— ๋„๋‹ฌํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ผ๋ฐ˜์ ์œผ๋กœ ์•Œ ์ˆ˜ ์—†์Œ). ๋˜๋Š” ๋™๋“ฑํ•˜๊ฒŒ ์—”์ง„์ด ์—ฌ๋Ÿฌ ์Šคํƒ์„ ์ƒ์„ฑํ•˜๊ณ  ์Šคํƒ ๊ฐ„์— ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

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

@rossberg

ํŠนํžˆ, ์ด์ „ Wasm ํ•จ์ˆ˜์—์„œ ๋Œ€๊ธฐ๋ฅผ ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ฝ๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? ๊ทธ๋ ‡๋‹ค๋ฉด ๋น„๋™๊ธฐ ํ•จ์ˆ˜์—์„œ๋งŒ await๋ฅผ ํ—ˆ์šฉํ•˜๋Š” JS์™€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

์˜ˆ, ์—ฌ๊ธฐ ๋ชจ๋ธ์€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. JS await๋Š” ๊ธฐ๋Šฅ์— ์˜ํ•œ ๊ฒƒ์ด์ง€๋งŒ ์ด ์ œ์•ˆ์€ ์ „์ฒด wasm ์ธ์Šคํ„ด์Šค์˜ await๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค(๋ชฉํ‘œ๋Š” JS์™€ wasm ์‚ฌ์ด์— ์žˆ๋Š” JS์™€ wasm ๊ฐ„์˜ ๋™๊ธฐํ™”/๋น„๋™๊ธฐ ๋ถˆ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค). ๋˜ํ•œ JS await๋Š” ์†์œผ๋กœ ์“ด ์ฝ”๋“œ์šฉ์ด๋ฉฐ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์˜ ์ด์‹์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•ฉ๋‹ˆ๋‹ค.

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

ํ™•์‹คํžˆ ๊ธ€๋กœ๋ฒŒ ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜์€ ์—ฌ๊ธฐ์—์„œ ์˜๋„๋œ ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค! ๋ช…ํ™•ํ•˜์ง€ ์•Š์€ ๊ฒฝ์šฐ ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค.

์ œ์•ˆ์„œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ์Šคํƒ ๊ฐ„ ์ „ํ™˜์€ ๊ฐ€๋Šฅํ•œ ๊ตฌํ˜„ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์ด์ง€๋งŒ ์ฝ”๋ฃจํ‹ด ์Šคํƒ€์ผ ์Šคํƒ ์ „ํ™˜๊ณผ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ์š”์†Œ์™€ ์ด ์ œ์•ˆ์˜ ๊ด€์ฐฐ ๊ฐ€๋Šฅํ•œ ๋™์ž‘์ด ์ „์ฒด wasm ์ธ์Šคํ„ด์Šค๊ฐ€ ์ผ์‹œ ์ค‘์ง€๋œ๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ด๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋‹ค์–‘ํ•œ ๋ฐฉ๋ฒ•์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋‹จ์ผ wasm ์ธ์Šคํ„ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๋Š” VM์˜ ์›น ๋ฐ–์—์„œ๋Š” wasm์„ ์žฌ๊ฐœํ•  ๋•Œ๊นŒ์ง€ ๋ง ๊ทธ๋Œ€๋กœ ์ด๋ฒคํŠธ ๋ฃจํ”„๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์›น์—์„œ ๊ตฌํ˜„ ๋ฐฉ๋ฒ• ์ค‘ ํ•˜๋‚˜๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. await๊ฐ€ ๋ฐœ์ƒํ•˜๋ฉด ํ˜„์žฌ ์œ„์น˜์—์„œ wasm์„ ํ˜ธ์ถœํ•œ ์œ„์น˜๋กœ ์ „์ฒด wasm ์Šคํƒ์„ ๋ณต์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์˜†์— ์ €์žฅํ•˜์‹ญ์‹œ์˜ค. ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๋ ค๋ฉด ๋‹ค์‹œ ๋ณต์‚ฌํ•˜๊ณ  ๊ฑฐ๊ธฐ์—์„œ ๊ณ„์† ์ง„ํ–‰ํ•˜์‹ญ์‹œ์˜ค. ์ด์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์ ‘๊ทผ ๋ฐฉ์‹์ด๋‚˜ ๋ณ€ํ˜• ์ด ์žˆ์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(์ผ๋ถ€๋Š” ๋ณต์‚ฌํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๋ณต์‚ฌ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ํ”ผํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์—ฌ๊ธฐ์„œ ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค!).

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

๊ตฌํ˜„๊ณผ ๊ด€๋ จํ•˜์—ฌ ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ํ•  ๊ฒƒ์ด ๋งŽ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ง€๊ธˆ๊นŒ์ง€ Lucet ์— ๋Œ€ํ•œ @acfoltzer์˜ ์ฝ”๋ฉ˜ํŠธ๋Š” ๊ณ ๋ฌด์ ์ž…๋‹ˆ๋‹ค!

@kripken ์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ๋Œ“๊ธ€์—์„œ ์ผ๋ถ€ ํ‘œํ˜„์„ ๋ช…ํ™•ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด ์ผ์‹œ โ€‹โ€‹์ค‘์ง€๋˜๋Š” ๊ฒƒ์€ ์ „์ฒด wasm ์ธ์Šคํ„ด์Šค๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ์ผ์‹œ ์ค‘์ง€๋œ ์Šคํƒ์˜ wasm์— ๋Œ€ํ•œ ํ˜ธ์ŠคํŠธ ํ”„๋ ˆ์ž„์˜ ๊ฐ€์žฅ ์ตœ๊ทผ ํ˜ธ์ถœ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ํ˜ธ์ŠคํŠธ ํ”„๋ ˆ์ž„์ด ๋Œ€์‹  ํ•ด๋‹น ์•ฝ์†(๋˜๋Š” ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์ ์ ˆํ•œ ์•„๋‚ ๋กœ๊ทธ)์„ ๋ฐ˜ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์ด์ „ ์„ค๋ช…์€ ์—ฌ๊ธฐ ๋ฅผ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.

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

@rossberg

์ผ๋ถ€ VM์—์„œ๋Š” ์‚ฌ์‹ค์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. await ๋ฐ ์ฝ”๋ฃจํ‹ด์ด ๋˜‘๊ฐ™์€ VM ์ž‘์—…์„ ํ•„์š”๋กœ ํ•˜๋Š” ๊ฒฝ์šฐ ์ตœ์†Œํ•œ ์ถ”๊ฐ€ ์ž‘์—…์€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ await ์ œ์•ˆ์˜ ์ด์ ์€ ํŽธ๋ฆฌํ•œ JS ํ†ตํ•ฉ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์žฌ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜ ์—†์ด ํŽธ๋ฆฌํ•œ JS ํ†ตํ•ฉ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋“ˆ ์žฌ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜ ์—†์ด ํŽธ๋ฆฌํ•œ JS ํ†ตํ•ฉ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์™„๋ฃŒํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ๋“ค๋ฆฌ์ง€๋งŒ ํ˜ธ์ถœ ์Šคํƒ(๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ๋ชจ๋“  WebAssembly ๋ชจ๋“ˆ)์—์„œ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ์™„๋ฃŒํ•˜๋Š” ๋” ์‰ฌ์šด ๋ฐฉ๋ฒ•์œผ๋กœ ๋“ค๋ฆฌ์ง€๋งŒ ํ˜ธ์ถœ ์Šคํƒ(๋˜๋Š” ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๋กœ ๋ชจ๋“  WebAssembly ๋ชจ๋“ˆ)์—์„œ ๋ฐฉ๋ฌธํ•œ ๋ชจ๋“  ๋ชจ๋“ˆ์„ ์ฐจ๋‹จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

atomic.wait ์ฒ˜๋Ÿผ ๋งž์Šต๋‹ˆ๋‹ค.

@taralx

๋ชจ๋“ˆ ์žฌ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜ ์—†์ด ํŽธ๋ฆฌํ•œ JS ํ†ตํ•ฉ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๋”ฐ๋ผ์„œ ๋‹จ์ˆœํ™”๊ฐ€ VM์— ๋„์›€์ด ๋œ๋‹ค๋ฉด ํ™•์‹คํžˆ ๊ณ ๋ คํ•ด ๋ณผ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค!

(์•ž์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด ์—ฌ๊ธฐ์—์„œ ๋…ผ์˜ ์ค‘์ธ ์˜ต์…˜ ์ค‘ ํ•˜๋‚˜์™€ ํ•จ๊ป˜ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜์ด ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ ์— ์œ ์˜ํ•˜์‹ญ์‹œ์˜ค. Asyncify๊ฐ€ ์žˆ๋Š” ๋‚˜์œ ์ƒํ™ฉ์— ์žˆ๋Š” ๊ฒฝ์šฐ์—๋งŒ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋„๊ตฌ ์ฒด์ธ ์ˆ˜์ค€. ๊ธฐ๋‹ค๋ฆฌ๊ธฐ ์œ„ํ•ด @rossberg ์™€ ๋…ผ์˜ํ•œ ์ตœ์•…์˜ ๊ฒฝ์šฐ ์ฝ”๋ฃจํ‹ด ์ œ์•ˆ์ด ๋‚ด๋ถ€์ ์œผ๋กœ ์ˆ˜ํ–‰ํ•  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ž‘์—…์„ ๋” ๊ฐ„๋‹จํ•˜๊ฒŒ ๋งŒ๋“ค๋ฉด ์•„์ด๋””์–ด๊ฐ€ ์ž ์žฌ์ ์œผ๋กœ ๋งค์šฐ ํฅ๋ฏธ๋กœ์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!)

ํ•œํŽธ์œผ๋กœ๋Š” ์žฌ์ง„์ž…์ด ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๊ฒŒ์ž„ ์—”์ง„์ด ํŒŒ์ผ์„ ๋‹ค์šด๋กœ๋“œํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋Š” ๋™์•ˆ UI๊ฐ€ ์™„์ „ํžˆ ์ผ์‹œ ์ค‘์ง€๋˜๋Š” ๊ฒƒ์„ ์›ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(Asyncify์—์„œ๋Š” ํ˜„์žฌ ํ—ˆ์šฉ).

๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‚ฌ์šด๋“œ ๊ธฐ๋Šฅ์ธ์ง€ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์— _์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์‹œ์„ฑ_์„ ๋„์ž…ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋ Œ๋”๋งํ•˜๋Š” ๋™์•ˆ ์ž์‚ฐ์„ โ€‹โ€‹๋กœ๋“œํ•˜๋Š” ๊ธฐ๋ณธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์€ ๋‚ด๋ถ€์ ์œผ๋กœ 2๊ฐœ์˜ ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๊ฐ ์Šค๋ ˆ๋“œ๋Š” WebWorker + SharedArrayBuffer์— ๋งคํ•‘๋ฉ๋‹ˆ๋‹ค. ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด ์Šค๋ ˆ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ WebWorkers์˜ ๋™๊ธฐ ์›น ๊ธฐ๋ณธ ์š”์†Œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ ์–ด๋„ ์ผ๋ถ€ ๊ฒฝ์šฐ์—๋Š” ํ—ˆ์šฉ๋จ). ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด Atomics.wait(์˜ˆ:)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ธฐ๋ณธ ์Šค๋ ˆ๋“œ์˜ ๋น„๋™๊ธฐ ์ž‘์—…์„ ์ž‘์—…์ž์˜ ์ฐจ๋‹จ ์ž‘์—…์— ๋งคํ•‘ํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค.

์ „์ฒด ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฉ€ํ‹ฐ์Šค๋ ˆ๋”ฉ์œผ๋กœ ์ด๋ฏธ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์ž‘์—…์ž์—์„œ ์ฐจ๋‹จ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ „์ฒด ์Šคํƒ(JS/Wasm/browser ๊ธฐ๋ณธ)์ด ๋ณด์กด๋˜์–ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

์ž‘์—…์ž์—์„œ ์ฐจ๋‹จ ํ”„๋ฆฌ๋ฏธํ‹ฐ๋ธŒ๋ฅผ ์‚ฌ์šฉํ•จ์œผ๋กœ์จ ์ „์ฒด ์Šคํƒ(JS/Wasm/browser ๊ธฐ๋ณธ)์ด ๋ณด์กด๋˜์–ด ํ›จ์”ฌ ๊ฐ„๋‹จํ•˜๊ณ  ๊ฐ•๋ ฅํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

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

@alexp-sssup

์ด๊ฒƒ์€ ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๋™์‹œ์„ฑ์„ ๋„์ž…ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌผ๋ก  ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์กฐ์‹ฌ์Šค๋Ÿฝ๊ฒŒ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•˜๋ฉฐ ๋ฌธ์ œ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” Asyncify๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ข‹์€ ๊ฒƒ๊ณผ ๋‚˜์œ ๊ฒƒ์„ ํ˜ผํ•ฉํ•œ ๊ฒฝํ—˜์„ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ๋ฅผ ๋“ค์–ด ์œ ํšจํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€: ํŒŒ์ผ์ด JS๋กœ ๋‹ค์šด๋กœ๋“œ๋˜๊ณ  JS๊ฐ€ ๋‹ค์‹œ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ํŒŒ์ผ์„ ๋ณต์‚ฌํ•  ๊ณต๊ฐ„์„ mallocํ•˜๊ธฐ ์œ„ํ•ด wasm์„ ํ˜ธ์ถœํ•จ). ๊ทธ๋Ÿฌ๋‚˜ ์–ด์จŒ๋“  ์žฌ์ง„์ž…์€ ์ด ์ œ์•ˆ์˜ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ด ์•„๋‹™๋‹ˆ๋‹ค.

@RReverser ๊ฐ€ ๋งํ•œ ๊ฒƒ์— ๋ง๋ถ™์—ฌ ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•œ ์ง€์›์ด ๋ณดํŽธ์  ์ด์ง€ ์•Š์œผ๋ฉฐ ์•ž์œผ๋กœ๋„ ์—†์„ ๊ฒƒ์ด๋ผ๋Š” ์  ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๊ธฐ๋‹ค๋ฆผ์€ ์–ด๋””์—์„œ๋‚˜ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

async/await๊ฐ€ ๋„์ž…๋œ ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์žฌ์ž…๋ ฅ์ด ์ ˆ๋Œ€์ ์œผ๋กœ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํ•˜๋‚˜๊ฐ€ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๋™์•ˆ ๋‹ค๋ฅธ ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์š”์ ์˜ ์ข…๋ฅ˜์ž…๋‹ˆ๋‹ค. ์žฌ์ง„์ž…์ด ์ƒ๋‹นํžˆ ์ค‘์š”ํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋˜ํ•œ ๋ชจ๋“ˆ์ด ์™ธ๋ถ€ ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•  ๋•Œ๋งˆ๋‹ค ๋‚ด๋ณด๋‚ด๊ธฐ๋ฅผ ํ†ตํ•ด ๋ชจ๋“ˆ์ด ๋‹ค์‹œ ์ž…๋ ฅ๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ด ์•„๋‹™๋‹ˆ๊นŒ(์œ„์˜ ์˜ˆ์—์„œ๋Š” ๋Œ€๊ธฐ ์—†์ด๋„ ์™ธ๋ถ€ ํ•จ์ˆ˜์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ํ•จ์ˆ˜๋Š” malloc์„ ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ๋ฌด๋ฃŒ์ž…๋‹ˆ๋‹ค(๋ง์žฅ๋‚œ ์—†์Œ).

์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์€ ๋™์ผํ•œ ๋ชจ๋“ˆ์˜ ์—ฌ๋Ÿฌ ์ธ์Šคํ„ด์Šค๋ฅผ ๋งŒ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ(๋ชจ๋‘ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ, ๋ณ€๊ฒฝ ๊ฐ€๋Šฅํ•œ ์ „์—ญ ๋“ฑ์„ ๊ฐ€์ ธ์˜ค๋Š”๊ฐ€?), ๋”ฐ๋ผ์„œ ์žฌ์ง„์ž…์€ ๋‹ค๋ฅธ ์ธ์Šคํ„ด์Šค์— ๋Œ€ํ•œ ํ˜ธ์ถœ์ด ๋ฉ๋‹ˆ๋‹ค.

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

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

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

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

Wasm ๋ชจ๋“ˆ์„ ๋‹ค์‹œ ์ž‘์„ฑํ•˜๋Š” ํ˜„์žฌ ์†”๋ฃจ์…˜์€ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๊ฒช์ง€ ์•Š์ง€๋งŒ ๋Œ€์‹  ์ƒ๋‹นํ•œ ํŒŒ์ผ ํฌ๊ธฐ ๋น„์šฉ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ์ด๋“ค ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ๋Œ€๊ทœ๋ชจ ์‹ค์ œ ์•ฑ์— ์ ํ•ฉํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ ์—ฌ๊ธฐ์— ์„ค๋ช…๋œ ๊ฒƒ๊ณผ ๊ฐ™์ด ๋น„๋™๊ธฐ์‹ ํ†ตํ•ฉ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์„ ์‚ดํŽด๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

๋” ๋‚˜์œ ์„ฑ๋Šฅ

์ผ์ข…์˜ ๋ฒค์น˜๋งˆํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์˜ˆ, ํ™”์š”์ผ(๋˜๋Š” ์ˆ˜์š”์ผ)์— ๋‹ค์‹œ ์ผํ•  ๋•Œ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๋นˆ ๋น„๋™๊ธฐ JS ํ•จ์ˆ˜๋ฅผ ์ง์ ‘ ํ˜ธ์ถœํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ƒ๋‹นํžˆ ์‰ฝ์Šต๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”. ๋งˆ์ดํฌ๋กœ๋ฒค์น˜๋งˆํฌ๋ฅผ ๋งŒ๋“ค ์ˆ˜๋Š” ์žˆ์ง€๋งŒ ๊ทธ๋‹ค์ง€ ์œ ์ตํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์˜ค ์˜ˆ, ์šฐ๋ฆฌ๋Š” ์ˆœ์ „ํžˆ ์˜ค๋ฒ„ ํ—ค๋“œ ๋น„๊ต์— ๊ด€์‹ฌ์ด ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งˆ์ดํฌ๋กœ ๋ฒค์น˜ ๋งˆํฌ์ž…๋‹ˆ๋‹ค.

๋งˆ์ดํฌ๋กœ๋ฒค์น˜๋งˆํฌ์˜ ๋ฌธ์ œ๋Š” ์‹ค์ œ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์—์„œ ํ—ˆ์šฉ ๊ฐ€๋Šฅํ•œ ๋Œ€๊ธฐ ์‹œ๊ฐ„์„ ๋ชจ๋ฅธ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ถ”๊ฐ€๋กœ 1ms๊ฐ€ ๊ฑธ๋ฆฐ๋‹ค๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด ์‘์šฉ ํ”„๋กœ๊ทธ๋žจ์ด 1/s ์†๋„๋กœ ๋Œ€๊ธฐ ์ž‘์—…๋งŒ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๊นŒ?

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

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

@taralx ์•„, ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

@taralx :

๋ชจ๋“ˆ ์žฌ์ž…๋ ฅ์„ ํ—ˆ์šฉํ•˜์ง€ ์•Š์œผ๋ฉด ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ ๋ณ€ํ™˜ ์—†์ด ํŽธ๋ฆฌํ•œ JS ํ†ตํ•ฉ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ๋ณ‘ํ•ฉํ•˜๋ฉด ๋™์ž‘์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชจ๋“ˆํ™”์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ผ๋ฐ˜์ ์ธ ์„ค๊ณ„ ์›์น™์œผ๋กœ์„œ ์ž‘๋™ ๋™์ž‘์€ ๋ชจ๋“ˆ ๊ฒฝ๊ณ„(๋‹จ์ˆœ ๋ฒ”์œ„ ์ œ์™ธ)์— ์ข…์†๋˜์–ด์„œ๋Š” ์•ˆ ๋ฉ๋‹ˆ๋‹ค. ๋ชจ๋“ˆ์€ Wasm์˜ ๊ทธ๋ฃนํ™” ๋ฐ ๋ฒ”์œ„ ์ง€์ • ๋ฉ”์ปค๋‹ˆ์ฆ˜์ผ ๋ฟ์ด๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ ๋„ ํ•ญ๋ชฉ์„ ์žฌ๊ทธ๋ฃนํ™”ํ•˜๋Š” ๊ธฐ๋Šฅ(๋ชจ๋“ˆ ์—ฐ๊ฒฐ/๋ณ‘ํ•ฉ/๋ถ„ํ• )์„ ์œ ์ง€ํ•˜๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค.

@rossberg : ์•ž์„œ ์ œ์•ˆํ•œ ๋Œ€๋กœ ๋ชจ๋“  Wasm ๋ชจ๋“ˆ์— ๋Œ€ํ•œ ์•ก์„ธ์Šค๋ฅผ ์ฐจ๋‹จํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋„ˆ๋ฌด ์ œํ•œ์ ์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜์  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ์—ฌ๋Ÿฌ ๋ชจ๋“ˆ์„ ๋ณ‘ํ•ฉํ•˜๋ฉด ๋™์ž‘์ด ์ค‘๋‹จ๋  ์ˆ˜ ์žˆ์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ชจ๋“ˆํ™”์— ๋ฐ˜๋Œ€๋˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด polyfilling ์ธ์ˆ˜์— ๋Œ€ํ•œ ์ œ ์š”์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค atomic.wait ๋Š” ๋ชจ๋“ˆ์„ฑ์„ ๊นจ๋œจ๋ฆฌ์ง€ ์•Š์œผ๋ฏ€๋กœ ์ด๊ฒƒ๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค.

@taralx , atomic.wait ๋Š” ํŠน์ • ๋ฉ”๋ชจ๋ฆฌ์˜ ํŠน์ • ์œ„์น˜๋ฅผ ์ฐธ์กฐํ•ฉ๋‹ˆ๋‹ค. await ์‚ฌ์šฉ์„ ์ฐจ๋‹จํ•˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์™€ ์œ„์น˜๋Š” ๋ฌด์—‡์ด๋ฉฐ ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์–ด๋–ป๊ฒŒ ์ œ์–ดํ•ฉ๋‹ˆ๊นŒ?

@rossberg ์ด๊ฒƒ์ด ๊นจ์กŒ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? ๋น„ ์žฌ์ง„์ž… ๋ฒ„์ „์ด ์ž‘๋™ํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ์•„์ด๋””์–ด๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

@taralx , ๊ฐ๊ฐ A.f ๋ฐ B.g $ ์™€ ๊ฐ™์ด ์ผ๋ถ€ ๋‚ด๋ณด๋‚ด๊ธฐ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ชจ๋“ˆ A ๋ฐ B๋ฅผ ๋กœ๋“œํ•˜๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋‘˜ ๋‹ค ํ˜ธ์ถœ๋  ๋•Œ await ๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ๊ฐ๊ฐ ์ด๋Ÿฌํ•œ ํ•จ์ˆ˜ ์ค‘ ํ•˜๋‚˜์— ์ „๋‹ฌ๋˜๊ณ  ๋…๋ฆฝ์ ์œผ๋กœ ํ˜ธ์ถœ๋ฉ๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ์„œ๋กœ ๊ฐ„์„ญํ•˜๊ฑฐ๋‚˜ ์ฐจ๋‹จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ˆ„๊ตฐ๊ฐ€ ์ฝ”๋“œ๋ฅผ ๋ณ€๊ฒฝํ•˜์ง€ ์•Š๊ณ  A์™€ B๋ฅผ C๋กœ ๋ณ‘ํ•ฉํ•˜๊ฑฐ๋‚˜ ๋ฆฌํŒฉํ† ๋งํ•ฉ๋‹ˆ๋‹ค. ๊ฐ‘์ž๊ธฐ ๋‘ ํด๋ผ์ด์–ธํŠธ ์ฝ”๋“œ๊ฐ€ ์˜ˆ๊ธฐ์น˜ ์•Š๊ฒŒ ์„œ๋กœ๋ฅผ ์ฐจ๋‹จํ•˜๊ธฐ ์‹œ์ž‘ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ˆจ๊ฒจ์ง„ ๊ณต์œ  ์ƒํƒœ๋ฅผ ํ†ตํ•ด ์›๊ฑฐ๋ฆฌ์—์„œ ์œผ์Šค์Šคํ•œ ์•ก์…˜.

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

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

(ํŽธ์ง‘๋จ)

ํ , ๋„ค. ์ข‹์Šต๋‹ˆ๋‹ค. ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“ˆ์— ๋‹ค์‹œ ๋“ค์–ด๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ๋ถ„๋ช…ํžˆ ์ด๊ฒƒ์— ๋Œ€ํ•ด ๋” ์—ด์‹ฌํžˆ ์ƒ๊ฐํ•  ํ•„์š”๊ฐ€ ์žˆ๋‹ค.

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

(์œ„์˜ ๋‚ด ๋Œ“๊ธ€ ์ˆ˜์ •)

์ง€๊ธˆ๊นŒ์ง€ ํ† ๋ก ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์š”์•ฝํ•˜์ž๋ฉด, ์—ฌ๊ธฐ์— ์ผ๋ฐ˜์ ์ธ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ์ด๊ฒƒ์ด JS ์ธก์—์„œ 100%์—ฌ์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด 99%์—ฌ์•ผ ํ•˜๋Š”์ง€์™€ ๊ฐ™์€ ํฐ ๊ณต๊ฐœ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์›น์˜ ๊ฒฝ์šฐ์—๋Š” ๊ดœ์ฐฎ์œผ๋ฏ€๋กœ ์•„๋งˆ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ํฐ ๊ณต๊ฐœ ์งˆ๋ฌธ์€ ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•œ VM์—์„œ ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ๊ฐ€์ž…๋‹ˆ๋‹ค.

์ €๋Š” 2์ฃผ ํ›„์— ๋‹ค์Œ CG ํšŒ์˜์—์„œ ์˜์ œ ํ•ญ๋ชฉ์„ ์ œ์•ˆํ•˜์—ฌ ์ด ์ œ์•ˆ์„ ๋…ผ์˜ํ•˜๊ณ  1๋‹จ๊ณ„์—์„œ ๊ณ ๋ คํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, repo๋ฅผ ์—ด๊ณ  ๋ณ„๋„์˜ ๋ฌธ์ œ์—์„œ ์—ด๋ฆฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. (๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์„ธ์š”.)

์ฐธ๊ณ ๋กœ
์šฐ๋ฆฌ๋Š” ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ „์ฒด ์Šคํƒ ์ „ํ™˜ ์ œ์•ˆ์„ ๋งŒ๋“ค ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์‹œ๊ฐ„ ํ”„๋ ˆ์ž„. ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋‹น์‹ ์˜ ํŠน๋ณ„ํ•œ ๊ฒฝ์šฐ ๋ณ€ํ˜•์„ ๋ฌด์˜๋ฏธํ•˜๊ฒŒ ๋งŒ๋“ค ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.
์–ด๋–ป๊ฒŒ ์ƒ๊ฐํ•ด?
ํ”„๋ž€์‹œ์Šค

2020๋…„ 5์›” 28์ผ ๋ชฉ์š”์ผ ์˜คํ›„ 3์‹œ 51๋ถ„์— Alon Zakai [email protected] ์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์ง€๊ธˆ๊นŒ์ง€ ํ† ๋ก ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

์š”์•ฝํ•˜๋ฉด ์—ฌ๊ธฐ์— ์ผ๋ฐ˜์ ์ธ ๊ด€์‹ฌ์ด ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ ์—ฌ๊ธฐ์—๋Š”
์ด๊ฒƒ์ด JS ์ธก์—์„œ 100%์ด์–ด์•ผ ํ•˜๋Š”์ง€ ์•„๋‹ˆ๋ฉด ๊ทธ๋ƒฅ
99% - ์ „์ž๊ฐ€ ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์˜ ์ฃผ์š” ๊ฑฑ์ •๊ฑฐ๋ฆฌ๋ฅผ ์ œ๊ฑฐํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.
์›น์˜ ๊ฒฝ์šฐ์—๋Š” ๊ดœ์ฐฎ์„ ๊ฒƒ์ด๋ฏ€๋กœ ์•„๋งˆ๋„ ๊ดœ์ฐฎ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ํฐ ๋ฏธํ•ด๊ฒฐ ์งˆ๋ฌธ์€ ์ด๊ฒƒ์ด VM์—์„œ ์–ผ๋งˆ๋‚˜ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ๊ฐ€ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์— ๋Œ€ํ•ด ๋” ๋งŽ์€ ์ •๋ณด๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

2์ฃผ ํ›„์— ๋…ผ์˜ํ•  ๋‹ค์Œ CG ํšŒ์˜์˜ ์˜์ œ๋ฅผ ์ œ์•ˆํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.
๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋ฅผ ์—ฌ๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋Š” 1๋‹จ๊ณ„์—์„œ ์ด ์ œ์•ˆ์„ ๊ณ ๋ คํ•ฉ๋‹ˆ๋‹ค.
๋ณ„๋„์˜ ๋ฌธ์ œ์—์„œ ์—ด๋ฆฐ ์งˆ๋ฌธ์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ๋…ผ์˜ํ•ฉ๋‹ˆ๋‹ค.
(๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ์˜ฌ๋ฐ”๋ฅธ ๊ณผ์ •์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ, ๋‚ด๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ง€์ ํ•ด์ฃผ์„ธ์š”.)

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

>

ํ”„๋žœ์‹œ์Šค ๋งฅ์ผ€์ด๋ธŒ
SWE

@fgmccabe

์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ํ™•์‹คํžˆ ๋…ผ์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์ผ๋ฐ˜์ ์œผ๋กœ ๊ท€ํ•˜์˜ ์ œ์•ˆ์ด JS ์ธก์— ์ดˆ์ ์„ ๋งž์ถ”์ง€ ์•Š๋Š” ํ•œ, ์ด ์ œ์•ˆ์ด ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค(JS ์ธก์— 99%-100%).

๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์— ๋Œ€ํ•œ ๋…ผ์˜๊ฐ€ ๋๋‚ฌ์œผ๋ฏ€๋กœ, ์ด์ „ ์— ํ‘œ๋ช…ํ–ˆ์ง€๋งŒ ํ•œ ๋ฒˆ์— ํ•˜๋‚˜์˜ ๋…ผ์˜๋ฅผ ์œ„ํ•ด ์ƒ๋žตํ•œ ์ƒ์œ„ ์ˆ˜์ค€์˜ ์šฐ๋ ค ์‚ฌํ•ญ์„ ๋‹ค์‹œ ์ œ๊ธฐํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

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

๋ถˆํ–‰ํžˆ๋„ ์ด ์ œ์•ˆ์˜ ๋ชจ๋“  ๋ณ€ํ˜•์€ ๋ชจ๋“ˆ ๊ตฌ์„ฑ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ์ฝ”๋“œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜ ์›์น™์„ ์œ„๋ฐ˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ๋ณด์ž…๋‹ˆ๋‹ค. ์ „์ž๋Š” await ๊ฐ€ ํ˜„์žฌ wasm ๋ชจ๋“ˆ์ด ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ž…๋ ฅ๋œ ์œ„์น˜๊นŒ์ง€ ์Šคํƒ์„ ์บก์ฒ˜ํ•  ๋•Œ ์œ„๋ฐ˜๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ„๋Š” ๋ชจ๋“ˆ์ด ๋ถ„๋ฆฌ๋˜๊ฑฐ๋‚˜ ํ•จ๊ป˜ ๊ฒฐํ•ฉ๋  ๋•Œ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ›„์ž๋Š” await ๊ฐ€ wasm์ด ๊ฐ€์žฅ ์ตœ๊ทผ์— ์ž…๋ ฅ๋œ ์œ„์น˜๊นŒ์ง€ ์Šคํƒ์„ ์บก์ฒ˜ํ•  ๋•Œ ์œ„๋ฐ˜๋ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ๊ณ„๋Š” ์ฝ”๋“œ๊ฐ€ JS์—์„œ wasm์œผ๋กœ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋  ๋•Œ ๋ณ€๊ฒฝ๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค(๋”ฐ๋ผ์„œ (f, x) => f(x) ์™€ ๊ฐ™์€ ๊ฐ„๋‹จํ•œ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜์€ JS to wasm์€ ์ „์ฒด ํ”„๋กœ๊ทธ๋žจ์˜ ๋™์ž‘์„ ํฌ๊ฒŒ ๋ณ€๊ฒฝํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ์ด๋Ÿฌํ•œ ์œ„๋ฐ˜์ด ์ด ์ œ์•ˆ์˜ ์ž˜๋ชป๋œ ๋””์ž์ธ ์„ ํƒ ๋•Œ๋ฌธ์ด๋ผ๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ๋ฌธ์ œ๋Š” ์ด ์ œ์•ˆ์ด JS๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ๋” ๊ฐ•๋ ฅํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ์„ ํ”ผํ•˜๋ ค๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์ด ์ค‘์š”ํ•˜์ง€๋งŒ ์—ฌ๊ธฐ์—์„œ ๋””์ž์ธ์˜ ์ฃผ๋œ ์ด์œ ๋Š” ์•„๋‹™๋‹ˆ๋‹ค.

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

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

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

VM ์‚ฌ๋žŒ๋“ค์˜ ๊ด€์‹ฌ ๋ถ€์กฑ ์™ธ์—๋„ ์œ„์—์„œ ๋…ผ์˜ํ•œ ๋ฐ”์™€ ๊ฐ™์ด @fgmccabe ๋ฐ @RossTate ์—์„œ ์ด ์ œ์•ˆ์— ๋Œ€ํ•ด ๋ช‡ ๊ฐ€์ง€ ๊ฐ•๋ ฅํ•œ ๋ฐ˜๋Œ€๋ฅผ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์— ๋Œ€ํ•ด ๋™์˜ํ•˜์ง€ ์•Š์ง€๋งŒ ์ €๋Š” ์ด๋Ÿฌํ•œ ๊ด€์ ๊ณผ ๊ทธ๊ฒƒ๋“ค์„ ์„ค๋ช…ํ•˜๋Š” ๋ฐ ๋“ค์ธ ์‹œ๊ฐ„์— ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

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

์ด ์ œ์•ˆ์˜ JS ๋ถ€๋ถ„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ ํŽธ๋ฆฌํ•œ Promise ํ†ตํ•ฉ์„ ์œ„ํ•œ JS ์„คํƒ•๊ณผ ๊ฐ™์ด ๋ฏธ๋ž˜์— ๊ด€๋ จ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํƒ ์ „ํ™˜ ๋˜๋Š” ์ฝ”๋ฃจํ‹ด์„ ๊ธฐ๋‹ค๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ๊ทธ ์œ„์— ์ž‘๋™ํ•  ์ˆ˜ ์žˆ๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ๊ทธ๊ฒƒ์„ ์œ„ํ•ด ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋‘˜ ๊ฐ€์น˜๊ฐ€ ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฏ€๋กœ ๋‹ซ์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

ghost picture ghost  ยท  7์ฝ”๋ฉ˜ํŠธ

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

beriberikix picture beriberikix  ยท  7์ฝ”๋ฉ˜ํŠธ

dpw picture dpw  ยท  3์ฝ”๋ฉ˜ํŠธ

JimmyVV picture JimmyVV  ยท  4์ฝ”๋ฉ˜ํŠธ