@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 ์ฌ์์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ ๋งค์ฐ ์ ์ต๋๋ค.
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 ์ฌ์์ ๋๋ค!
(์น๊ณผ ๊ฐ์ JS ํ๊ฒฝ์๋ง ์ํฅ์ ๋ฏธ์น๋) wasm JS ์ฌ์์ ๋ํ ๋ณ๊ฒฝ ์ฌํญ์ด ๋ ํฅ๋ฏธ๋กญ์ต๋๋ค.
waitref
๊ฐ์ JS ์ฝ์์
๋๋ค.await
๊ฐ Promise์์ ์คํ๋๋ฉด ์ ์ฒด wasm ์ธ์คํด์ค๊ฐ ์ผ์ ์ค์ง๋๊ณ ํด๋น 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๋ฅผ ์์ฑํ๋ ๊ฒ์ ์ฝ๊ณ ์ฌ๋ฏธ์์ต๋๋ค! ์์์ ์ธ๊ธํ ์ต์ ์ธ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ค์ ์ค ํ๋๋ฅผ ์ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌํ ์ ๊ทผ ๋ฐฉ์์ด๋ ๋ค๋ฅธ ์ ๊ทผ ๋ฐฉ์ ์์ ํจ์ฌ ๋ ๋ง์ ๊ฒ์ ๊ตฌ์ถํ ์ ์์ต๋๋ค. ์ ์์์ VM์ ๋ณต์ก์ฑ์ ํผํ๊ธฐ ์ํด ๋ชจ๋ ๊ฒ์ ๋๊ตฌ ์ฒด์ธ๊ณผ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งก๊ธฐ๋ ๊ฒ์ ์ ํธํฉ๋๋ค.
VM ๊ตฌํ์ ๋จ์ํ๊ฒ ์ ์งํ๋ ๋ฐ ๋์์ด ๋๋ ๋ช ๊ฐ์ง ์์:
setjmp
๋๋ ๋ณต์ /ํฌํน์ ํ์ฉํ๋ ์์คํ
์ ์ฝ๋ฃจํด๊ณผ ๋ฌ๋ฆฌ ๋ ๋ฒ ๋ฐํํ๋ ๊ฒ์ ์์ต๋๋ค.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 ์ธ์คํด์ค์ ์ฝ๋ฃจํด ๊ฒฐ๊ณผ๋ฅผ ๊ธฐ๋ค๋ฆฌ๋ ์ฌ์ด ๋ฐฉ๋ฒ ์ ๊ณต).
์ฐ์ฐ์ ์ผ์น๋ก WASI #276 ์ @tqchen ์ด ์ด ๊ธ์ ๋๋ง์น ๋ ๊ฒ์ํ์ต๋๋ค. ์ฝ๋ฃจํด๊ณผ ๋น๋๊ธฐ ์ง์์ด ๋ณ๊ฐ์ ๊ธฐ๋ฅ์ด๋ผ๋ ์ฐ๋ฆฌ์ ๋ฏฟ์์ ๊ณต์ ํ๋ค๋ ์ฌ์ค์ ์๊ฒ ๋์ด ๋งค์ฐ ๊ธฐ์ฉ๋๋ค.
์ฐ๋ฆฌ๋ await
๋ช
๋ น์ด ๊ฑฐ๊ธฐ์ ์ ์๋ ๊ฒ๊ณผ ๋งค์ฐ ์ ์ฌํ ๊ฒ์ ๊ตฌํํ๋ ๋ฐ ๋์์ด ๋ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค(์ต์
C3). ์ฐจ์ด์ ์ ํน๋ณํ ๋น๋๊ธฐ ์์คํ
ํธ์ถ์ด ํ์ํ์ง ์์ง๋ง ์คํ๋ ค ์ผ๋ถ ์์คํ
ํธ์ถ์ด waitref
๋ฅผ ๋ฐํํ ์ ์๋ค๋ ์ ์
๋๋ค. await
-ed๊ฐ ๋ ์ ์์ต๋๋ค.
JavaScript์ ๊ฒฝ์ฐ Wasm ์ธ์คํด์ค๋ฅผ ์ผ์ ์ค์งํ๋ ๊ฒ์ผ๋ก ๋๊ธฐ๋ฅผ ์ ์ํ์ต๋๋ค. ์ด๋ ํ์ด์ง์ JavaScript๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ์ธ์คํด์ค๋ฅผ ๊ฐ์ง ์ ์๊ธฐ ๋๋ฌธ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ผ๋ถ ์๋ฒ ํ๊ฒฝ์์๋ ํธ์คํธ์ ๋จ์ผ wasm ์ธ์คํด์ค๋ง ์์ ์ ์์ผ๋ฉฐ ์ด ๊ฒฝ์ฐ ๋๊ธฐ๊ฐ ํจ์ฌ ๊ฐ๋จํ ์ ์์ต๋๋ค. ๋ง ๊ทธ๋๋ก ํ์ผ ์ค๋ช ์๋ GPU์์ ๋๊ธฐํ๋ ๊ฒ์ผ ์ ์์ต๋๋ค. ๋๋ ๊ธฐ๋ค๋ฆฌ๋ฉด ์ ์ฒด wasm VM์ด ์ผ์ ์ค์ง๋์ง๋ง ์ด๋ฒคํธ ๋ฃจํ๋ ๊ณ์ ์คํ๋ ์ ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ์ฌ๊ธฐ์ ๊ตฌ์ฒด์ ์ธ ์์ด๋์ด๋ฅผ ๊ฐ์ง๊ณ ์์ง ์์ง๋ง, ๊ทธ ๋ฌธ์ ์ ๋ํ ๋ ผ์๋ฅผ ๋ฐํ์ผ๋ก ์ฌ๊ธฐ์ ํฅ๋ฏธ๋ก์ด ๊ฐ๋ฅ์ฑ์ด ์์ ์ ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ด๋ป๊ฒ ์๊ฐํ๋์ง ๊ถ๊ธํฉ๋๋ค!
JS ํ๊ฒฝ์์ wasm ์ธ์คํด์ค๊ฐ ์ผ์ ์ค์ง๋๋ฉด ํธ์ถํ ์ฌ๋์๊ฒ ์ฆ์ ๋ฐํ๋ฉ๋๋ค. ํธ์ถ์๊ฐ JS์์ ์จ ๊ฒฝ์ฐ ์ด๋ค ์ผ์ด ๋ฐ์ํ๋์ง ์ค๋ช
ํ์ผ๋ฉฐ ํธ์ถ์๊ฐ ๋ธ๋ผ์ฐ์ ์ธ ๊ฒฝ์ฐ์๋ ๋์ผํ ์ผ์ด ๋ฐ์ํฉ๋๋ค(์๋ฅผ ๋ค์ด ์ผ์ ์ค์ง๋๋ wasm ๋ด๋ณด๋ด๊ธฐ์์ setTimeout
๋ฅผ ์ํํ์ง๋ง ํฅ๋ฏธ๋ก์ด ์ผ์ ์ผ์ด๋์ง ์์ต๋๋ค. ๋ฐํ๋ Promise๋ ๋ฌด์๋ฉ๋๋ค). ๊ทธ๋ฌ๋ wasm์์ ์ค๋ ํธ์ถ์ ๋ ๋ค๋ฅธ ๊ฒฝ์ฐ๊ฐ ์์ต๋๋ค. ์ฆ, wasm ์ธ์คํด์ค A
๊ฐ B
์ธ์คํด์ค์์ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ง์ ํธ์ถํ๊ณ B
๊ฐ ์ผ์ ์ค์ง๋ฉ๋๋ค. ์ผ์ ์ค์ง๋ B
์์ ์ฆ์ ์ข
๋ฃํ๊ณ Promise
$๋ฅผ ๋ฐํํฉ๋๋ค.
ํธ์ถ์๊ฐ JavaScript์ธ ๊ฒฝ์ฐ ๋์ ์ธ์ด๋ก์ ์ด๋ ๋ฌธ์ ๊ฐ ๋์ง ์์ผ๋ฉฐ ์ค์ ๋ก ํธ์ถ์๊ฐ ์์์ ์ค๋ช
ํ ๋๋ก ์ ํ์ ํ์ธํ๋ ๊ฒ์ด ํฉ๋ฆฌ์ ์
๋๋ค. ํธ์ถ์๊ฐ ์ ์ ์ผ๋ก ์ ํ์ด ์ง์ ๋ WebAssembly์ธ ๊ฒฝ์ฐ ์ด๋ ์ด์ํฉ๋๋ค. ์ด์ ๋ํ ์ ์์์ ์๋ฌด ๊ฒ๋ ํ์ง ์์ผ๋ฉด ๊ฐ์ด ์บ์คํธ๋ฉ๋๋ค. ์ด ์์์๋ Promise์์ A
๊ฐ ์์ํ๋ ๋ชจ๋ ์ธ์คํด์ค( i32
์ด๋ฉด ๋ค์์ผ๋ก ์บ์คํธ๋ฉ๋๋ค. 0
). ๋์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ ๊ฒ์ด ์ข์ต๋๋ค.
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
์ฝ์ด์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค. ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค!
๋ฐ์ด๋ ํ๋ ฅ! ๋๋ ํธ์คํธ ์ ์ด ์์คํ์ ์ ์์ด๋์ด๋ฅผ ์ข์ํฉ๋๋ค. @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๊ฐ ์ฝ์์ ๋ ์ผ์ฐ ํด๊ฒฐํ๋๋ก ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ๋ฐฉ์์ผ๋ก ์์ฝํด ๋ณด๊ฒ ์ต๋๋ค.
๋ฐ๋ผ์ ํนํ 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 ์ธ์คํด์ค๋ฅผ ์คํํ๋ 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 ์คํ๊ณผ ๊ฐ์ด ๋ฏธ๋์ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค. ์คํ ์ ํ ๋๋ ์ฝ๋ฃจํด์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ด๊ฒ์ด ๊ทธ ์์ ์๋ํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ์ํด ๋ฌธ์ ๋ฅผ ์ด์ด๋ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋ซ์ต๋๋ค.
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
์ฌ๊ธฐ์์ ๊ณต๊ฐ์ ์ผ๋ก ๋ ๋ง์ ํ ๋ก ์ ํ๊ณ ์ถ์์ง๋ง ์๊ฐ์ ์ ์ฝํ๊ธฐ ์ํด ์ง๊ธ๊น์ง ์ฌ๊ธฐ์ ์ฐธ์ฌํ๋ ์ฌ๋์ด ๊ฑฐ์ ์๊ธฐ ๋๋ฌธ์ ์ผ๋ถ VM ๊ตฌํ์์๊ฒ ์ง์ ์ฐ๋ฝํ์ต๋๋ค. ์ฌ๊ธฐ ํ ๋ก ๊ณผ ํจ๊ป ๊ทธ๋ค์ ํผ๋๋ฐฑ์ ๊ฐ์ํ ๋ ์ฌํ๊ฒ๋ ์ฐ๋ฆฌ๋ ์ด ์ ์์ ์ผ์ ์ค์งํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค.
Await๋ ์ผ๋ฐ ์ฝ๋ฃจํด์ด๋ ์คํ ์ ํ๋ณด๋ค ๊ด์ฐฐ ๊ฐ๋ฅํ ๋์์ด ํจ์ฌ ๋ ๊ฐ๋จํ์ง๋ง, ๋ด๊ฐ ์ด์ผ๊ธฐํ VM ์ฌ๋๋ค์ @rossberg ๊ฐ ๊ฒฐ๊ตญ VM ์์ ์ด ๋ ๋ค ๋น์ทํ ๊ฒ์ด๋ผ๋ ๋ฐ ๋์ํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ ์ด๋ ์ผ๋ถ VM ์ฌ๋๋ค์ ์ฐ๋ฆฌ๊ฐ ์ด๋ป๊ฒ๋ ์ฝ๋ฃจํด์ด๋ ์คํ ์ ํ์ ์ป์ ๊ฒ์ด๋ฉฐ ์ด๋ฅผ ์ฌ์ฉํ์ฌ await์ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ง์ํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ์ด๋ wasm์ ๋ํ ๊ฐ ํธ์ถ์ ๋ํด ์๋ก์ด ์ฝ๋ฃจํด/์คํ์ ์์ฑํ๋ ๊ฒ์ ์๋ฏธํ์ง๋ง(์ด ์ ์๊ณผ ๋ฌ๋ฆฌ) ์ ์ด๋ ์ผ๋ถ VM ์ฌ์ฉ์๋ ์ถฉ๋ถํ ๋น ๋ฅด๊ฒ ๋ง๋ค ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
VM ์ฌ๋๋ค์ ๊ด์ฌ ๋ถ์กฑ ์ธ์๋ ์์์ ๋ ผ์ํ ๋ฐ์ ๊ฐ์ด @fgmccabe ๋ฐ @RossTate ์์ ์ด ์ ์์ ๋ํด ๋ช ๊ฐ์ง ๊ฐ๋ ฅํ ๋ฐ๋๋ฅผ ๋ฐ์์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ช ๊ฐ์ง ์ฌํญ์ ๋ํด ๋์ํ์ง ์์ง๋ง ์ ๋ ์ด๋ฌํ ๊ด์ ๊ณผ ๊ทธ๊ฒ๋ค์ ์ค๋ช ํ๋ ๋ฐ ๋ค์ธ ์๊ฐ์ ๊ฐ์ฌํฉ๋๋ค.
๊ฒฐ๋ก ์ ์ผ๋ก, ์ฌ๊ธฐ์์ ์์ผ๋ก ๋์๊ฐ๋ ค๊ณ ๋ ธ๋ ฅํ๋ ๊ฒ์ ๋ชจ๋ ์ฌ๋์ ์๊ฐ์ ๋ญ๋นํ๋ ๊ฒ์ฒ๋ผ ๋๊ปด์ง๋๋ค. ํ์ง๋ง ํ ๋ก ์ ์ฐธ์ฌํด์ฃผ์ ๋ชจ๋ ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค! ๊ทธ๋ฆฌ๊ณ ์ ์ด๋ ์ด๊ฒ์ด ์ฝ๋ฃจํด/์คํ ์ ํ์ ์ฐ์ ์์๋ฅผ ์ ํ๋๋ก ๋๊ธฐ๋ฅผ ๋ถ์ฌํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค.
์ด ์ ์์ JS ๋ถ๋ถ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํธ๋ฆฌํ Promise ํตํฉ์ ์ํ JS ์คํ๊ณผ ๊ฐ์ด ๋ฏธ๋์ ๊ด๋ จ์ด ์์ ์ ์์ต๋๋ค. ์คํ ์ ํ ๋๋ ์ฝ๋ฃจํด์ ๊ธฐ๋ค๋ฆฌ๊ณ ์ด๊ฒ์ด ๊ทธ ์์ ์๋ํ ์ ์๋์ง ํ์ธํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ ์ํด ๋ฌธ์ ๋ฅผ ์ด์ด๋ ๊ฐ์น๊ฐ ์๋ค๊ณ ์๊ฐํ๋ฏ๋ก ๋ซ์ต๋๋ค.