call_indirect
๋ WebAssembly์์ ๋งค์ฐ ์ ์ฉํ ๊ธฐ๋ฅ์ด์์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ช
๋ น์ ํจ์จ์ฑ๊ณผ ์ข์ ๋์์ ์์์ ์ผ๋ก wasm ์ ํ ์์คํ
์ ๋จ์์ฑ์ ์์กดํด ์์ต๋๋ค. ํนํ ๋ชจ๋ wasm ๊ฐ์ ์ ํํ ํ๋์ (์ ์ ) ์ ํ์ด ์ํฉ๋๋ค. ์ด ์์ฑ์ ์ ํ์ด ์ง์ ๋ ์ธ์ด์์ ์ ํ์ด ์ง์ ๋์ง ์์ ํจ์ ํธ์ถ๊ณผ ๊ด๋ จ๋ ์ฌ๋ฌ ์๋ ค์ง ๋ฌธ์ ๋ฅผ ํธ๋ฆฌํ๊ฒ ๋ฐฉ์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด์ wasm์ ์ซ์ ์ ํ์ ๋์ด ํ์ฅ๋๊ณ ์์ผ๋ฉฐ ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ์ดํดํ๊ณ ์ผ๋์ ๋์ด์ผ ํ๋ ์ง๊ฒฝ์ ์ด๋ฅด๋ ์ต๋๋ค.
call_indirect
๊ธฐ๋ณธ์ ์ผ๋ก ํธ์ถ์์ ์์ ์๋ช
๊ณผ ์์ ์์ ์ ์๋ ์๋ช
์ ๋น๊ตํ์ฌ ์๋ํฉ๋๋ค. ์ซ์ ์ ํ๋ง ์์ผ๋ฉด WebAssembly๋ ํด๋น funcref
์ฐธ์กฐํ๋ ํจ์์ ๋ํ ์ง์ ํธ์ถ์ด ์ ํ ๊ฒ์ฌ๋ฅผ ๋ฐ์ ๊ฒฝ์ฐ์๋ง ์ด๋ฌํ ์๋ช
์ด ๋์ผํ๋ค๋ ์์ฑ์ ๊ฐ์ก์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ณง ์ฌ์ค์ด ์๋ ๋ ๊ฐ์ง ์ด์ ๊ฐ ์์ต๋๋ค.
call_indirect
๋ฅผ ์ฌ์ฉํ์ฌ ํจ์์ ์ฝํ ๊ณต๊ฐ ์๋ช
( ๋ฐฉ๊ธ ๋ฐ๊ฒฌ๋์ด ์์ง ๋
ผ์๋์ง ์์ ๋ฌธ์ ).call_indirect
๊ฐ ์ ๋๋ก ์๋ํ๋๋ก ํ๋ ๋ฐ ์ค์ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์
์์ ์ธ ๋ชจ๋์ด ๋ด๋ณด๋ธ ์ ํ์ ์ ์๊ฐ ๋ฌด์์ธ์ง ์๊ณ ์์ผ๋ฉด call_indirect
๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ธ ์ ํ๊ณผ ์๋๋ ๋น๋ฐ ์ ์ ์ฌ์ด๋ฅผ ์๋ค๋ก ๋ณํํ ์ ์์ต๋๋ค. call_indirect
๋ ๋ ์ ํ์ด ์ค์ ๋ก ๋์ผํ ๋ฐํ์ ์์๋ง ์๋ช
์ ๋น๊ตํฉ๋๋ค . ๋ฐ๋ผ์ ์
์ฑ ๋ชจ๋์ call_indirect
๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ธ ์ ํ์ ์ํด ์ถ์ํ๋๋ ๋น๋ฐ์ ์ก์ธ์คํ ์ ์์ผ๋ฉฐ call_indirect
๋ฅผ ์ฌ์ฉํ์ฌ ๋ด๋ณด๋ธ ์ ํ์ ๊ฐ์ ์์กฐํ ์ ์์ต๋๋ค. ์ ํ ์์ฒด์ ์ ์.์์ ๋ ์ํฉ ๋ชจ๋์์ call_indirect
๋ ๋ชจ๋์ ๋ด๋ณด๋ธ ์๋ช
์ ์ถ์ํ๋ฅผ ์ฐํํ๋ ๋ฐ ์ฌ์ฉํ ์ ์์ต๋๋ค. ๋ด๊ฐ ์ธ๊ธํ๋ฏ์ด, was๋ ์ซ์ ์ ํ๋ง ๊ฐ์ง๊ณ ์์๊ธฐ ๋๋ฌธ์ ์ง๊ธ๊น์ง ์ด๊ฒ์ ๋ฌธ์ ๊ฐ ๋์ง ์์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ์๋ ๋๋ subtyping์ ์ฐ๊ธฐํจ์ผ๋ก์จ call_indirect
์ ๋ํ ๋ชจ๋ ์ฐ๋ ค๋ ํจ๊ณผ์ ์ผ๋ก ์ฐ๊ธฐํ๋ค๊ณ ์๊ฐํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ต๊ทผ์ ๊นจ๋ฌ์ ๊ฒ์ ํ์ ์ ํ์ ์ ๊ฑฐํ๋ฉด "์" ์ ํ(https://github.com/WebAssembly/reference-types/pull/87์์ externref
๋ก ๋ช
๋ช
๋จ)์ด ์ฌ์ค์ ๋
๋ฆฝํ์ด๋ผ๋ ๊ฒ์
๋๋ค. ์ถ์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฒฝ์ฐ. ๊ทธ๊ฒ์ด ์ฌ๋๋ค์ด ์ค์ ๋ก ์ํ๋ ๊ฒ์ด๋ผ๋ฉด ๋ถํํ๋ ์์ call_indirect
์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ ๊ฐ์ ์ํธ ์์ฉ์ ๊ณ ๋ คํด์ผ ํฉ๋๋ค.
์ด์ call_indirect
์ฌ์ฉํ์ฌ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ์ฌ๋ฌ ๊ฐ์ง ์ ์ฌ์ ์ธ ๋ฐฉ๋ฒ์ด ์์ง๋ง ๊ฐ๊ฐ์๋ ์ฅ๋จ์ ์ด ์์ผ๋ฉฐ ๋น ๋ฅด๊ฒ ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ์๋ ์ค๊ณ ๊ณต๊ฐ์ด ๋๋ฌด ํฝ๋๋ค. ๊ทธ๋์ ์ ๋ ์ฐ๋ฆฌ๊ฐ ์ง๊ธ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ์๊ณ ์ ์ํ๋ ๊ฒ์ด ์๋๋๋ค . ์คํ๋ ค ์ง๊ธ ๊ฒฐ์ ํด์ผ ํ ๊ฒ์ externref
๋ํด ๋ฌธ์ ๋ฅผ ์ ๋๋ก ํ๊ธฐ ์ํด ์๊ฐ์ ๋ฒ ๊ฒ์ธ๊ฐ ํ๋ ๊ฒ์
๋๋ค. ํนํ ํ์ฌ๋ก์๋ call_indirect
๋ฐ func.ref
๋ฅผ ์ฐ๊ฒฐ๋ ์๋ช
์ด ์์ ํ ์ซ์์ธ ๊ฒฝ์ฐ์๋ง ์ ํ ํ์ธํ๋๋ก ์ ํํ๋ฉด ๊ฐ์ ํธ์ถ์ ๋ชจ๋ ํต์ฌ-wasm ์ฌ์ฉ ์ฌ๋ก๋ฅผ ์ ๊ณตํ๊ณ ๋์์ ์์ ๋ฌธ์ ์ ๋ํ ๋ชจ๋ ์ ์ฌ์ ์ธ ์๋ฃจ์
์ ์ํ ์ฌ์ง๋ฅผ ๋จ๊ฒจ ๋ก๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ฌํ ์ ํ์ด ๊ตฌํ ๋
ธ๋ ฅ์ ์ธก๋ฉด๊ณผ ์ฌ๋๋ค์ด ๊ธฐ๋ค๋ฆฌ๊ณ ์๋ externref
์ ์์ฉ ํ๋ก๊ทธ๋จ์ ๋ฐฉํดํ๋์ง ์ฌ๋ถ ๋ชจ๋์์ ์ค์ฉ์ ์ธ์ง ์ฌ๋ถ๋ ์ ์ ์์ต๋๋ค. ๋์์ call_indirect
๋ฐ func.ref
๋ฅผ ๊ทธ๋๋ก ๋๋ ๊ฒ์
๋๋ค. ์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋๋ฌํ ์๋ฃจ์
์ ๋ฐ๋ผ ์ค์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ด externref
์ธ์คํด์คํํ ์ ์๊ฑฐ๋ externref
๊ฐ (์์ด๋ฌ๋ํ๊ฒ๋) ๊ทธ๋ ์ง ์์ ์ ์์์ ์๋ฏธํ ์ ์์ต๋๋ค. ๋ชจ๋ ์์ ์ ํ์ ๊ฐ์ง ์ ์์ต๋๋ค(์: anyref
๋ฅผ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ ๊ฒฝ์ฐ anyref
์ ํ์ ์ ํ์ด ๋ ์ ์์).
๋๋ ๋ ์์ ์ ์ํด ๋ ๊ฐ์ง ์ต์
์ ๋ชจ๋ ๊ด๋ฆฌํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๋๋ ์ ํธํ๋ ๊ฒ์ด ์์ง๋ง ์ด๋ ์ชฝ์ด๋ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋๋ก ๊ฐ๋ ฅํ๊ฒ ๋ฐ์ด๋ถ์ด์ง๋ ์์ผ๋ฉฐ, ์ฌ๋ฌ๋ถ ๋ชจ๋๊ฐ ์ ๋ณด์ ์
๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ํ์ํ ์ ๋ณด์ ๋ ์ ์ ๊ทผํ ์ ์๋ค๊ณ ๋ฏฟ์ต๋๋ค. ๋๋ ๋จ์ง ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํ๋ค๋ ๊ฒ์ ์ฌ๋ฌ๋ถ ๋ชจ๋์๊ฒ ์๋ฆฌ๊ณ ์ถ์๊ณ ๋์์ call_indirect
์ ํจ๊ป ๊ฐ์ฅ ์ค์ํ ๋ฌธ์ ์ ๋ํ ์ธ์์ ํ๋ฆฝํ๊ณ ์ถ์์ต๋๋ค. ์์ ์์ฝ์์ ์ ๊ณตํ๋ ๊ฒ๋ณด๋ค ๋ฌธ์ ์ ๋ํ ๋ ์์ธํ ์ค๋ช
์ ์ํ์๋ฉด ๋ค์์ ์ฝ์ด๋ณด์ญ์์ค.
call_indirect
๋ ์ถ์ํ, ์์ธํcall_indirect[ti*->to*](func, args)
ํ๊ธฐ๋ฒ์ ์ฌ์ฉํ๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ [ti*] -> [to*]
๋ ํจ์์ ์์ ์๋ช
์ด๊ณ func
๋ ๋จ์ํ funcref์
๋๋ค(funcref ํ
์ด๋ธ ๋ฐ ์ธ๋ฑ์ค๊ฐ ์๋). args
๋ ํจ์์ ์ ๋ฌํ to*
๊ฐ์
๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก, ๋ด๊ฐ ์ฌ์ฉํฉ๋๋ค call($foo, args)
์ง์ ํจ์์ ์ง์ ํธ์ถ $foo
์ธ์๋ฅผ ์ ๋ฌ args
.
์ด์ $foo
๊ฐ ์ ์ธ๋ ์
๋ ฅ ์ ํ ti*
๋ฐ ์ถ๋ ฅ ์ ํ to*
๊ฐ ์๋ ํจ์์ ์ธ๋ฑ์ค๋ผ๊ณ ๊ฐ์ ํฉ๋๋ค. call_indirect[ti*->to*](ref.func($foo), args)
๊ฐ call($foo, args)
์ ๊ฐ๋ค๊ณ ์์ํ ์ ์์ต๋๋ค. ์ฌ์ค ์ง๊ธ์ด ๊ทธ๋ ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฐ๋ฆฌ๊ฐ ๊ทธ ํ๋์ ์ ์งํ ์ ์๋์ง๋ ๋ถ๋ช
ํ์ง ์์ต๋๋ค.
call_indirect
๋ฐ ํ์ ์
๋ ฅ์ ์ฌ์ ์ธ ๋ฌธ์ ์ ํ ์๊ฐ ํ์ ์ ํ ์ง์ ์ ๋ํ ๋ ผ์์์ ๋ํ๋ฌ์ต๋๋ค. ๋ค์์ ๊ฐ์ ํฉ๋๋ค.
tsub
๋ tsuper
์ ํ์ ์ ํ์
๋๋ค.[] -> [tsub]
์ ํ์ผ๋ก ์ ์๋ $fsub
ํจ์๋ฅผ ๋ด๋ณด๋
๋๋ค.[] -> [tsuper]
์ ํ์ $fsuper
ํจ์๋ฅผ ๊ฐ์ ธ์ต๋๋ค.$fsub
๋ฅผ $fsuper
$fsub
๋ก ์ธ์คํด์คํํ ๋ชจ๋ MB์
๋๋ค(์ง๊ธ์ ๋ถ๊ฐ๋ฅํ๋๋ผ๋ ์ด ๋ฌธ์ ๋ ์ ์ฌ์ ์ธ ํฅํ ๋ฌธ์ ์ ๊ดํ ๊ฒ์
๋๋ค).์ด์ IB๊ฐ call_indirect[ -> tsuper](ref.func($fsuper))
์คํํ๋ฉด ์ด๋ค ์ผ์ด ๋ฐ์ํด์ผ ํ๋์ง ๊ณ ๋ คํ์ญ์์ค. ๋ค์์ ๊ฐ์ฅ ๊ทธ๋ด๋ฏํด ๋ณด์ด๋ ๋ ๊ฐ์ง ๊ฒฐ๊ณผ์
๋๋ค.
๊ฒฐ๊ณผ 1์ ์ ํํ๋ค๋ฉด ์ด๋ฅผ ๊ฐ๋ฅํ๊ฒ ํ๊ธฐ ์ํด ๋ ๊ฐ์ง ๊ธฐ์ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ ๊ฐ๋ฅ์ฑ์ด ์์์ ์ธ์ํ์ญ์์ค.
call_indirect
์ ์ ์๋ช
์ด ์๋ ๊ฐ์ ธ์ค๊ธฐ ์๋ช
๊ณผ ๋น๊ตํฉ๋๋ค.๊ธฐ์ 1์ ์ ํธํ๋ ๊ฒฝ์ฐ Typed Function References(๋ณํ ํ์ ์ ํ ํฌํจ)๋ฅผ ์ถ๊ฐํ๋ฉด ์๋ํ์ง ์๋๋ค๋ ์ ์ ์์๋์ญ์์ค. ์ฆ, func.ref($fsub)
๋ ref ([] -> [tsub])
๋ฐ ref ([] -> [tsuper])
์ด์ง๋ง ๊ธฐ์ 1์ call_indirect[ -> super](ref.func($fsub))
๊ฐ ํธ๋ํ๋์ง ์๋๋ก ํ๋ ๋ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ด๋ ๊ฒฐ๊ณผ 1์ด ๊ธฐ์ 2๋ฅผ ํ์๋ก ํ ๊ฐ๋ฅ์ฑ์ด ์์์ ์๋ฏธํ๋ฉฐ, ์ด๋ ์ฑ๋ฅ์ ์ํฅ์ ๋ฏธ์นฉ๋๋ค.
๊ฒฐ๊ณผ 2๋ฅผ ์กฐ๊ธ ๋ ์๊ฐํด ๋ณด๊ฒ ์ต๋๋ค. ์ฌ๊ธฐ์ ๊ตฌํ ๊ธฐ์ ์ IB์์ ์์๋๋ call_indirect
์ ์๋ช
์ด IA์์ ์ ์๋ $fsub
์ ์๋ช
๊ณผ ๋์ผํ์ง ํ์ธ ํ๋ ๊ฒ์
๋๋ค. ์ฒ์์ ์ด ๊ธฐ์ ์ ์ฃผ์ ๋จ์ ์ ์คํํ๊ธฐ์ ์์ ํ ์ฌ๋ฌ ํธ์ถ์ ํธ๋ฉํ๋ค๋ ๊ฒ์
๋๋ค. ๊ทธ๋ฌ๋ ๋ ๋ค๋ฅธ ๋จ์ ์ ์ ์ฌ์ ์ผ๋ก IA์ ๋ํ ๋ณด์ ๋์ถ์ด ๋ฐ์ํ ์ ์๋ค๋ ๊ฒ์
๋๋ค.
์๋ฅผ IA๋ ๋ด๋ถ์ ์ผ๋ก ์ ์ํ์ง๋ง, ์ด์ ์ฐ๋ฆฌ์ ์๋ฅผ ์กฐ๊ธ์ ์ ํํ๊ณ ์๋ค๊ณ ๊ฐ์ ํ์, ๋ฐฉ๋ฒ์ ๋ณด๋ ค๋ฉด $fsub
์
๋ ฅํ๋๋ก [] -> [tsub]
, ์๋ฅผ IA๋ ์ ํ์ ์์ถ [] -> [tsuper]
. ๊ฒฐ๊ณผ 2์ ๋ํ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ธ์คํด์ค IB๋ (์
์์ ์ผ๋ก) call_indirect[ -> tsub]($fsuper)
์คํํ ์ ์์ผ๋ฉฐ ํธ์ถ์ ์ฑ๊ณตํฉ๋๋ค. ์ฆ, IB๋ call_indirect
๋ฅผ ์ฌ์ฉํ์ฌ IA๊ฐ ํจ์ ์๋ช
์ ๋ํด ์ํํ ์ถ์๋ฅผ ์ฐํํ ์ ์์ต๋๋ค. ์ด๋ ๊ธฐ๊ปํด์ผ IB๊ฐ IA์ ์๋ช
์ผ๋ก ๋ณด์ฅ๋์ง ์๋ IA์ ์ธก๋ฉด์ ์์กดํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ต์
์ ๊ฒฝ์ฐ IB๋ ์ด๋ฅผ ์ฌ์ฉํ์ฌ IA๊ฐ ์๋์ ์ผ๋ก ์ํํ์ ์ ์๋ ๋ด๋ถ ์ํ์ ์ก์ธ์คํ ์ ์์ต๋๋ค.
call_indirect
๋ฐ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ด์ ํ์ ์ ํ ์ง์ ์ ์ ์ณ๋๊ณ
capability
์ ํ์ ์ ์ ํ๊ณ $handle
๋ก ์ ์ํ์ง ์๊ณ ์ ํ์ ๋ด๋ณด๋
๋๋ค.[capability] -> []
์ ํ์ผ๋ก ์ ์๋์์ง๋ง [$handle] -> []
์ ํ์ผ๋ก ๋ด๋ณด๋ธ $do_stuff
ํจ์๋ฅผ ๋ด๋ณด๋
๋๋ค.$extern
์ ํ๊ณผ [$extern] -> []
์ ํ์ ํจ์ $run
๋ฅผ ๊ฐ์ ธ์ต๋๋ค.$handle
๋ก ๋ด๋ณด๋ธ $extern
๋ก IA๊ฐ ๋ด๋ณด๋ธ $do_stuff
๋ก ์ธ์คํด์คํ๋ ๋ชจ๋ MD์
๋๋ค $run
์ด ์์ ๊ฐ ์ค์ ํ๋ ๊ฒ์ ํ ๋ชจ๋์ด ๋ค๋ฅธ ๋ชจ๋์ ๊ฐ์ด ๋ฌด์์ธ์ง ์์ง ๋ชปํ๊ฑฐ๋ ์ ์ ์๋๋ก ํ๋ ๋ ๊ฐ์ ๋ชจ๋์ ๋๋ค. ์๋ฅผ ๋ค์ด ์ด ํจํด์ WASI์ ์ํธ ์์ฉํ๊ธฐ ์ํ ๊ณํ๋ ๊ธฐ๋ฐ์ ๋๋ค.
์ด์ ํ์ ๊ฐ์ ํด ์ธ์คํด์ค ID๋ ๊ฐ์ ์ป์ ์์๊ฒ๋์๋ค e
์ ํ์ $extern
ํ๊ณ ์คํํ๋์๊ฒ call_indirect[$extern -> ](ref.func($run), e)
. ๋ค์์ ๊ฐ์ฅ ๊ทธ๋ด๋ฏํด ๋ณด์ด๋ ๋ ๊ฐ์ง ๊ฒฐ๊ณผ์
๋๋ค.
๊ฒฐ๊ณผ 2๋ ๊ฐ์ ธ์จ ์ ํ์์ call_indirect
๊ฑฐ์ ์ธ๋ชจ ์๊ฒ ๋ง๋ญ๋๋ค. ๋ฐ๋ผ์ ๊ฒฐ๊ณผ 1์ ๊ฒฝ์ฐ ์
๋ ฅ ์ ํ $extern
์ด ์ ์๋ $do_stuff
(๋์ capability
) ์
๋ ฅ ์ ํ์ด ์๋๋ฏ๋ก ๋ค์ ์ค ํ๋๋ฅผ ์ฌ์ฉํด์ผ ํ ์ ์์ต๋๋ค. ์ด ๊ฒฉ์ฐจ๋ฅผ ํด์ํ๊ธฐ ์ํ ๋ ๊ฐ์ง ๊ธฐ์ :
call_indirect
์ ์ ์๋ช
์ด ์๋ ๊ฐ์ ธ์ค๊ธฐ ์๋ช
๊ณผ ๋น๊ตํฉ๋๋ค.$extern
์ ํ์ capability
๋ํ๋
๋๋ค.๊ธฐ์ 1์ ์ ํธํ๋ ๊ฒฝ์ฐ Typed Function References๋ฅผ ์ถ๊ฐํ๋ฉด ๋ค์ ํ ๋ฒ ์๋ํ์ง ์๋๋ค๋ ์ ์ ์์๋์ญ์์ค. (๊ทผ๋ณธ์ ์ธ ์ด์ ๋ ํ์ ์ ๋ ฅ๊ณผ ๋์ผํ์ง๋ง ์ฌ๊ธฐ์์ ์๋ ๋ก๊ทธ๋ฅผ ์ค๋ช ํ๋ ค๋ฉด ๋ ๋ง์ ํ ์คํธ๊ฐ ํ์ํฉ๋๋ค.)
์ด๊ฒ์ ์ฐ๋ฆฌ์๊ฒ ๊ธฐ์ 2๋ฅผ ๋จ๊น๋๋ค. ๋ถํํ๋ ์ด๊ฒ์ ๋ค์ ํ ๋ฒ ์ ์ฌ์ ์ธ ๋ณด์ ๋ฌธ์ ๋ฅผ ๋ํ๋
๋๋ค. ๊ทธ ์ด์ ๋ฅผ ์์๋ณด๊ธฐ ์ํด ID๊ฐ ์
์์ ์ด๋ฉฐ IC๊ฐ ๋น๋ฐ๋ก ์ ์งํ $handle
์ ๋ด์ฉ์ ์ป์ผ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ ๋์๊ฐ ID๊ฐ $handle
์ค์ ๋ก ๋ํ๋ด๋ ๊ฒ, ์ฆ capability
๋ํด ์ ์ถ์ธกํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ID๋ [capability] -> [capability]
์ ํ์ ID ํจ์ $id_capability
๋ฅผ ์ ์ํ ์ ์์ต๋๋ค. $extern
์ ํ์ e
๊ฐ์ด ์ฃผ์ด์ง๋ฉด ID๋ call_indirect[$extern -> capability](ref.func($id_capability), e)
์คํํ ์ ์์ต๋๋ค. ๊ธฐ์ 2๋ฅผ ์ฌ์ฉํ๋ฉด $extern
๊ฐ ๋ฐํ์์ capability
๋ฅผ ๋ํ๋ด๊ณ ID๊ฐ e
๋ํ๋ด๋ ์์ capability
๋ฅผ ๊ฐ์ ธ์ค๊ธฐ ๋๋ฌธ์ ์ด ๊ฐ์ ํธ์ถ์ด ์ฑ๊ณตํฉ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก capability
์ ํ์ ๊ฐ c
๊ฐ ์ฃผ์ด์ง๋ฉด ID๋ call_indirect[capability -> $extern](ref.func($id_capability), c)
๋ฅผ ์คํํ์ฌ c
๋ฅผ $extern
์์ต๋๋ค.
call_indirect
์์ผ๋ก ์์ ์ค์ํ ์ฑ๋ฅ, ์๋ฏธ ๋ฐ/๋๋ ๋ณด์/์ถ์ํ ๋ฌธ์ ๊ฐ ๋ง์ด ์์์ ๋ถ๋ช
ํ ๋ฐํ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ถํํ๋ call_indirect
๊ฐ ํต์ฌ WebAssembly์ ์ผ๋ถ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฌธ์ ๋ ์งํ ์ค์ธ ์ฌ๋ฌ ์ ์์ ๊ฐ๋ก์ง๋ฆ
๋๋ค. ์ง๊ธ์ด ์๊ฐ, ๋๋ ์ฐ๋ฆฌ๊ฐ ์ ํ ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํด์ผ ํ ๊ฐ์ฅ ์๊ธํ ๊ฐ์ ์ ์, ์ฐธ์กฐ ์ ํ์ ์ง์คํ๋ ๊ฒ์ด ์ต์ ์ด๋ผ๊ณ ์๊ฐ call_indirect
๋ฐ func.ref
๋ง ์ซ์ ์ ํ call_indirect
๊ฐ์ฅ ์ค์ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐฉ๋ฒ์ ๋ฐ๋ผ ์ ํ์ ์ํํ ์ ์์ต๋๋ค.
(๊ธด ๊ธ์ ์ฌ๋ ค์ ์ฃ์กํฉ๋๋ค. ๋ชจ๋ ๊ฐ ์ปดํ์ผ ํ์ ํ์ดํ๊ณผ ๋ฐํ์ ํ์ดํ ๊ธฐ๋ฅ์ ๋ณต์กํ ์ํธ ์์ฉ์ ์ค๋ช ํ๊ณ ์ด๋ฌํ ์ํธ ์์ฉ์ ์ค์์ฑ์ ๊ฐ๋ฅํ ํ ๊ฐ๊ฒฐํ๊ฒ ๋ณด์ฌ์ฃผ๊ธฐ ์ํด ์ต์ ์ ๋คํ์ต๋๋ค.)
์์ธํ ๊ธ์ ์จ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค, Ross! ์์ ์ง๋ฌธ์ด ์์ต๋๋ค. " call_indirect
๋ฐ ์ ํ ๊ฐ์ ธ์ค๊ธฐ" ์น์
์ ๋ค์๊ณผ ๊ฐ์ด ์์ฑํฉ๋๋ค.
๊ธฐ์ 1์ ์ ํธํ๋ ๊ฒฝ์ฐ Typed Function References๋ฅผ ์ถ๊ฐํ๋ฉด ๋ค์ ํ ๋ฒ ์๋ํ์ง ์๋๋ค๋ ์ ์ ์์๋์ญ์์ค.
์ด๊ฒ์ ๋ํ ์ ํ์ด ์ง์ ๋ ํจ์ ์ฐธ์กฐ์ ๋ณํ ํ์ ์ ํ์ ์ถ๊ฐํ ํ์๋ง ๋ฌธ์ ๊ฐ ์กด์ฌํ๋ค๋ ์ด์ ์น์ ์ ๊ฒฝ๊ณ ์ ๋์์ ๋๊น?
๊ทธ๋ ์ง ์๋ค. ํ์ ์ ํ ์น์
์ ๋ชจ๋ ๋ฌธ์ ๋ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๋ฌด๊ดํ๊ณ ์ ํ ๊ฐ์ ธ์ค๊ธฐ ์น์
์ ๋ชจ๋ ๋ฌธ์ ๋ ํ์ ์ ํ๊ณผ ๋ฌด๊ดํฉ๋๋ค. ๊ทํ๊ฐ ๋ฌป๋ ํน์ ๋ฌธ์ ์ ๊ด๋ จํ์ฌ ref ([] -> [capability])
์ ํ์ ๊ฐ์ด ๋ด๋ณด๋ธ ํจ์์ ์ํด ref ([] -> [$handle])
์ ํ์ ๊ฐ์ผ๋ก ๋ฐํ๋ ์ ์์์ ๊ณ ๋ คํ์ญ์์ค. funcref
๋ฐ ๊ฐ์ ์ ์ผ๋ก ํธ์ถ๋ฉ๋๋ค. ๋ด๋ณด๋ธ ํจ์์ ๋ฌ๋ฆฌ ์ด๋ฌํ ๊ด์ ์์์ ๊ฐ ๋ณ๊ฒฝ์ ๋งํฌ ์๊ฐ์ด ์๋ ๋ฐํ์์ ๋ฐ์ํ๋ฏ๋ก ํจ์ ์ฐธ์กฐ ์์ฒด๋ฅผ ๊ฐ์ ธ์จ ์ ์ด ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ธ์ค๊ธฐ ์๋ช
๊ณผ ๋น๊ตํ์ฌ ์ด๋ฅผ ํด๊ฒฐํ ์ ์์ต๋๋ค.
module instance IC defines a type capability and exports the type but not its definition as $handle
์ด๋ป๊ฒ ์๋ํฉ๋๊น? capability
์ $handle
๋ฅผ ์ฐ๊ฒฐํ๋ ๋ฌด์ธ๊ฐ๊ฐ ์์ด์ผ IC๊ฐ ์ด๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ๋ฒ์ ์ ์ ์์ต๋๋ค.
๋ํ https://github.com/WebAssembly/proposal-type-imports/blob/master/proposals/type-imports/Overview.md#exports ๊ธฐ๋ฐ์ผ๋ก ๊ฐ์ ธ์จ ์ ํ์ ์์ ํ ์ถ์์ ์
๋๋ค. ๋ฐ๋ผ์ $capability
๋ฅผ ๋ด๋ณด๋ด๋๋ผ๋ ์ถ์์ ์
๋๋ค. ์๋ง๋ ๋ด๊ฐ ๋ญ๊ฐ๋ฅผ ์คํดํ๊ณ ์๋ ๊ฒ ๊ฐ์ต๋๋ค.
module instance IC exports a function $do_stuff that was defined with type [capability] -> [] but exported with type [$handle] -> []
์์ถ์ ๋ํ ์ ์ฌํ ์ง๋ฌธ์
๋๋ค.
์ฌ๊ธฐ์ ์ฌ์ฉ๋๋ ์ผ์ข
์ ํ์ ์ ํ ๊ด๊ณ๋ฅผ ์์ํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด $capability <: $handle
์ด๋ฉด export $capability as $handle
ํ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด ์น์
์ ์์ ๋ถ๋ถ์์ ์๋ธํ์ดํ์ ์ ์ณ๋๋ผ๊ณ ์ธ๊ธํ๊ธฐ ๋๋ฌธ์ ๊ทธ๊ฑด ์ ์ณ๋๊ณ ... ํ์ง๋ง ๋๋ ๋ํ ๊ทธ๊ฒ์ ๋ํด ์กฐ๊ธ ๋ ์๊ฐํ์ต๋๋ค.
$capability <: $handle
์ด๋ฉด export $capability as $handle
ํ ์ ์์ง๋ง export ([$capability] -> []) as ([$handle] -> [])
๋ ์ธ์์์ ๋ฐ๊ณต๋ณ(contravariant) ํจ์์ด๊ธฐ ๋๋ฌธ์ "์คํจ"ํด์ผ ํฉ๋๋ค.
์ ํ ๋ด๋ณด๋ด๊ธฐ๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋์ type $handle; func $do_stuff_export : [$handle] -> []
์ ๊ฐ์ ์๋ช
์ ์ง์ ํ ๋ค์ type $handle := capability; func $do_stuff_export := $do_stuff
์ ๊ฐ์ ์๋ช
์ ์ธ์คํด์คํํฉ๋๋ค. (ํน์ ๊ตฌ๋ฌธ์ ์์ ํ ๋ฌด์ํ์ญ์์ค.) ๊ทธ๋ฐ ๋ค์ ์ ํ ๊ฒ์ฌ๊ธฐ๋ " $handle
capability
๊ฐ ์ด ๋ชจ๋์์ func $do_stuff_export := $do_stuff
๋ด๋ณด๋ด๊ธฐ๊ฐ ์ ํจํ๊ฐ์?"๋ฅผ ํ์ธํฉ๋๋ค. $do_stuff
์ ์ ํ์ด [capability] -> []
์ด๋ฏ๋ก $handle
๋ฅผ capability
์ธ์คํด์คํํ ํ ์๋ช
์ $do_stuff_export
์ ์ ํ๊ณผ ์ ํํ ์ผ์นํฉ๋๋ค. ํ์ธ ์ฑ๊ณต. (์ฌ๊ธฐ์๋ ํ์ ์ ํ์ด ํฌํจ๋์ง ์๊ณ ๋ณ์ ๋์ฒด๋ง ์์ต๋๋ค.)
๊ทธ๋ฌ๋ ์๋ช
์์ฒด๋ $handle
๋ํด ์๋ฌด ๊ฒ๋ ๋งํ์ง ์์ต๋๋ค. ์ด๊ฒ์ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋๋ค์ด $handle
๋ฅผ ์ถ์ ์ ํ์ผ๋ก ์ทจ๊ธํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ฆ, ์๋ช
์ ์๋์ ์ผ๋ก ๋ชจ๋ ๊ตฌํ์ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๊ณ ๋ค๋ฅธ ๋ชจ๋ ์ฌ๋์ ํด๋น ์ถ์ํ๋ฅผ ์กด์คํด์ผ ํฉ๋๋ค. ์ด ๋ฌธ์ ์ ๋ชฉ์ ์ call_indirect
๋ฅผ ์ฌ์ฉํ์ฌ ํด๋น ์ถ์ํ๋ฅผ ์ฐํํ ์ ์์์ ์ค๋ช
ํ๋ ๊ฒ์
๋๋ค.
๋ฌธ์ ๊ฐ ์กฐ๊ธ ํด๊ฒฐ๋๊ธฐ๋ฅผ ๋ฐ๋๋๋ค!
๋๋ถ์ ์ํฉ์ด ๋ช ํํด์ก์ต๋๋ค. ํ์ ์ ๋ ฅ ์น์ ์ ๋ํด ์ง๋ฌธ์ด ์์ต๋๋ค(์ด๋ํ์ฌ ์ฃ์กํฉ๋๋ค).
์ ๋ call_indirect
"์ ์ ์๋ช
์ด ์๋ ๊ฐ์ ธ์ค๊ธฐ ์๋ช
๊ณผ ๋น๊ต"ํ๋๋ก ํ์ฌ call_indirect[ -> tsuper](ref.func($fsuper))
๋ฅผ ์คํํ๋ IB๊ฐ ์ฑ๊ณตํ๊ธฐ๋ฅผ ์ํ๋ ์๋๋ฆฌ์ค๋ฅผ ๋ฐ๋ฅด๊ณ ์์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋น์ ์ (์ ํํ๋ ํจ์ ์ฐธ์กฐ๋ก ์ธํด) ์ฐ๋ฆฌ๋ ํ์ํ๋ค๊ณ ์ถ๊ฐํ์ต๋๋ค.
- ์์ ์๋ช ๊ณผ ์ ์ ์๋ช ์ ํ์ ์ ํ ํธํ์ฑ์ ๋ํด ์ต์ ์ ํ ์๊ฐ ๋ฐํ์ ๊ฒ์ฌ๋ฅผ ์ํํฉ๋๋ค.
์ด๊ฒ์ด "์์ ์๋ช ๊ณผ ๊ฐ์ ธ์ค๊ธฐ ์๋ช " ๊ฐ์ ํธํ์ฑ์ด์ด์ผ ํฉ๋๊น? call_indirect๊ฐ ๊ฐ์ ธ์ค๊ธฐ ์๋ช ์ ์์ ์๋ช ๊ณผ ๋น๊ตํ๋๋ก ๋ง๋ค์๋ค๊ณ ๊ฐ์ ํ๊ธฐ ๋๋ฌธ์.
์์๋ ๊ฒ๊ณผ ๊ฐ์ ธ์ค๊ธฐ ๊ฐ์ ํธํ์ฑ์ด ํ์ธ๋๋ฉด ๋์ค์ call_indirect[ -> tsub]($fsuper)
๊ฐ ์คํจํฉ๋๋ค.
๊ธฐ์ 1๊ณผ 2๋ ๊ฐ์ ํธ์ถ์ ์๋์ํค๋ ๋ ๊ฐ์ง ์ง๊ต ๋ฐฉ๋ฒ์ผ๋ก ์ ๊ณต๋ฉ๋๋ค. ๋ถํํ๋ ๊ธฐ์ 1์ ํ์ํ๋ ํจ์ ์ฐธ์กฐ์ ํธํ๋์ง ์์ผ๋ฉฐ ๊ธฐ์ 2๋ ๋๋ฌด ๋น์ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ํด๊ฒฐ๋์ง ์์ ๊ฒ ๊ฐ์ต๋๋ค. ๋ฐ๋ผ์ ์น์ ์ ๋๋จธ์ง ๋ถ๋ถ์์๋ ์ด๋ค ์ค ์ด๋ ๊ฒ๋ ์ฌ์ฉํ์ง ์๊ณ ์์ ์๋ช ๊ณผ ์ ์๋ ์๋ช ๊ฐ์ ๋จ์ํ ๋๋ฑ ๋น๊ต๋ง ๊ณ ์ํ๋ฉด ์ด๋ป๊ฒ ๋๋์ง ๊ณ ๋ คํฉ๋๋ค. ํผ๋์ ๋๋ ค ์ฃ์กํฉ๋๋ค; ๊ณํ๋ ์๋ฏธ๊ฐ ์๋ค๋ ๊ฒ์ ๋ด๊ฐ ์ธ ๊ฐ์ง ์ ์ฌ์ ์๋ฏธ๋ฅผ ๋ ผ์ํด์ผ ํ๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
๋๋ฌด ๋ง์ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ์๋๋ก ์ฃผ์ํ์ญ์์ค. ;)
๋ด ๊ฐ์ ์ call_indirect
๊ฐ ์ค๋๋ ์ฒ๋ผ ๋น ๋ฅด๊ฒ ์ ์ง๋์ด์ผ ํ๋ฏ๋ก ์ธ์ด์ ์ผ๋ง๋ ๋ง์ ํ์ ์ ํ์ ์ถ๊ฐํ๋๋ผ๋ ์ ํ ๋๋ฑ์ฑ ํ
์คํธ๋ง ํ์ํ๋ค๋ ๊ฒ์
๋๋ค. ๋์์ ๋ฐํ์ ๊ฒ์ฌ๋ ์ ์ ์ ํ ์์คํ
๊ณผ ์ผ๊ด์ฑ์ด ์์ด์ผ ํฉ๋๋ค. ์ฆ, ํ์ ์ ํ ์ง์ ๊ด๊ณ๋ฅผ ์กด์คํด์ผ ํฉ๋๋ค.
์ด์ call_indirect
์ ํจ๊ป ์ฌ์ฉํ ์ ์๋ ์ ํ์ด ํญ์ ํ์ ์ ํ ๊ณ์ธต ๊ตฌ์กฐ์ ๋ฆฌํ์ ์๋์ง ํ์ธํ๋ ํ ์ด๋ฌํ ๊ฒ๋ณด๊ธฐ์ ์์ถฉ๋๋ ์๊ตฌ ์ฌํญ์ ์ค์ ๋ก ์๋นํ ์ฝ๊ฒ ์กฐ์ ๋ ์ ์์ต๋๋ค.
์ด๋ฅผ ์ํํ๋ ํ ๊ฐ์ง ํ๋ฆฝ๋ ๋ฐฉ๋ฒ์ _exact_ ์ ํ์ ๊ฐ๋
์ ์ ํ ์์คํ
์ ๋์
ํ๋ ๊ฒ์
๋๋ค. ์ ํํ ์ ํ์๋ ํ์ ์ ํ์ด ์๊ณ ์์ ์ ํ๋ง ์์ผ๋ฉฐ (exact T) <: T
์์ต๋๋ค.
์ด๋ฅผ ํตํด call_indirect
์ ๋์ ์ ํ์ด ์ ํํ ์ ํ์ด ๋๋๋ก ์๊ตฌํ ์ ์์ต๋๋ค. ๋ํ, ํจ์ ์์ฒด์ ์ ํ์ ์ด๋ฏธ ํด๋น ํจ์์ ์ ํํ ์ ํ์
๋๋ค.
๋ชจ๋์ ์๋ํ ๋ฐํ์ ๊ฒ์ฌ์ ์ฑ๊ณตํ ํจ์๋ก๋ง ์ธ์คํด์คํํ ์ ์๋๋ก ํ๋ ค๋ ๊ฒฝ์ฐ ํจ์ ๊ฐ์ ธ์ค๊ธฐ์ ์ ํํ ์ ํ์ ์๊ตฌํ ์๋ ์์ต๋๋ค.
์ด๊ฒ์ด ์ ๊ทํ๋ ํจ์ ์ ํ์ ๋ํ ๊ฐ๋จํ ํฌ์ธํฐ ๋น๊ต์ ํ์ฌ ๊ตฌํ ๊ธฐ์ ์ด ์ ํจํ์ง ํ์ธํ๋ ๋ฐ ํ์ํ ์ ๋ถ์ ๋๋ค. ๋ค๋ฅธ ํ์ ์ ํ์ด ๋ฌด์์ธ์ง ๋๋ ํจ์ ํ์ ์ ํ์ ์ผ๋ง๋ ๋ฉ์ง๊ฒ ๋ง๋๋์ง์๋ ๋ฌด๊ดํฉ๋๋ค. (FWIW, ๋๋ ์ผ๋ง ์ ์ ์ด๊ฒ์ Luke์ ๋ ผ์ํ๊ณ PR์ ๋ง๋ค ๊ณํ์ด์์ง๋ง, subtyping ์คํ ๋ฆฌ์ ๋ํ ๋ณด๋ฅ ์ค์ธ ๋ณ๊ฒฝ ์ฌํญ๊ณผ ํ์ฌ ์ด๋ํ๋ ์ ์์ผ๋ก ์ธํด ์ฐจ๋จ๋์์ต๋๋ค.)
(ํ ๊ฐ์ง ๋จ์ ์ ํจ์ ์ ์๋ฅผ ํ์ ์ ํ์ผ๋ก ๊ตฌ์ฒดํํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์ด์ ์ด์ ๋ฒ์ ๊ณผ ํธํ๋๋ ๋ณ๊ฒฝ์ด ์๋๋ผ๋ ๊ฒ์ ๋๋ค. ์ ์ด๋ ์ ํํ ์ ํ์ด ์ด๋์์๋ ์ฌ์ฉ๋ ๊ฒฝ์ฐ์๋ ๊ทธ๋ ์ง ์์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ ๋จ์ ์ ์ฐ๋ฆฌ๊ฐ ์ผ๋ง๋ ์ ํํ๊ฒ ์ ์ฉํ๋์ง์ ๊ด๊ณ์์ด ์ฐ๋ฆฌ์ ์ ์ฝ ์กฐ๊ฑด์์ ํผํ ์ ์์ต๋๋ค. ๊ทธ๋ค์.)
๋ช ๊ฐ์ง ์ธก๋ฉด:
๋์์ call_indirect ๋ฐ func.ref๋ฅผ ๊ทธ๋๋ก ๋๋ ๊ฒ์ ๋๋ค.
AFAICS, ์ฐธ์กฐ ์ ํ์ ํฌํจํ๋ ํจ์์์ ref.func๋ฅผ ํ์ฉํ์ง ์๋ ๊ฒ์ ์คํ ๊ฐ๋ฅํ์ง ์์ต๋๋ค. ์ด๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก, ์ฆ externref
(์ฝ๋ฐฑ, ํํฌ ๋ฑ)์์ ์๋ํ๋ ์ผ๋ฅ ํจ์์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ์ฌ๊ฐํ๊ฒ ์์์ํต๋๋ค.
์ด๊ฒ์ ์ฐ๋ฆฌ๊ฐ ๋๋ฌํ ์๋ฃจ์ ์ ๋ฐ๋ผ ์ค์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ด externref๊ฐ ์ธ์คํด์คํํ ์ ์๊ฑฐ๋ externref๊ฐ (์์ด๋ฌ๋ํ๊ฒ๋) ์ด๋ค ์์ ์ ํ๋ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ ์๋ฏธํ ์ ์์ต๋๋ค(์: ๊ฒฐ๊ตญ anyref๋ฅผ ์ถ๊ฐํ๊ธฐ๋ก ๊ฒฐ์ ํ๋ฉด anyref์ ํ์ ์ ํ์ด ๋ ์ ์์).
์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ฐ๊ฒฐ์ด ์ ๋ณด์ด๋ค์.
๋๋ฌด ๋ง์ ๊ฒฐ๋ก ์ ๋ด๋ฆฌ์ง ์๋๋ก ์ฃผ์ํ์ญ์์ค. ;)
์ด๋ค ๊ฒฐ๋ก ์ ๋ง์ํ์๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ๋ด๊ฐ ์ธ๊ธํ ๊ฒฐ๋ก ์ call_indirect
๋ํด ์ฐ๋ฆฌ๊ฐ ์ธ์งํด์ผ ํ๊ณ ๊ณํ์ ์์ํด์ผ ํ๋ ๋ง์ ๋ฌธ์ ๊ฐ ์๋ค๋ ๊ฒ์
๋๋ค. ๋น์ ์ ํด๊ฒฐ์ฑ
์ ์ผ๋์ ๋๊ณ ์๊ธฐ ๋๋ฌธ์ ์ด๋ฌํ ๋ฌธ์ ๊ฐ ์ค์ํ์ง ์๋ค๊ณ ์ ์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ํด๋น ์๋ฃจ์
์ CG์์ ๊ฒํ ํ๊ฑฐ๋ ์น์ธํ์ง ์์์ผ๋ฏ๋ก ๊ฒํ ๊ฐ ์๋ฃ๋ ๋๊น์ง ๊ณํ์ ์ธ์์๋ ์ ๋ฉ๋๋ค. ์๋ฃจ์
์ ํ๊ฐํ๊ณ ๋น๊ตํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆฌ๊ณ ์ด๋ฌํ ํ๊ฐ์ ๋น๊ต๋ฅผ ์ ์ ํ๊ฒ ์ํํ ์๊ฐ์ด ์๊ธฐ ์ ์ ๊ฒฐ์ ์ ๋ด๋ ค์ผ ํ๊ธฐ ๋๋ฌธ์ ์๋ฃจ์
์ ๋ํด ๋
ผ์ํ์ง ์๊ธฐ๋ฅผ ํน๋ณํ ์์ฒญํ์ต๋๋ค. ๊ทธ๋ฌ๋ ์ฌ๋๋ค์ด ์ด ๋ฌธ์ ๊ฐ ํด๊ฒฐ๋์๋ค๋ ์ธ์์ ํ์ฑํ๊ณ ๊ฒฐ๊ณผ์ ์ผ๋ก ๊ธด๊ธํ ๊ฒฐ์ ์ ํผํ๊ธฐ ์ํด ์ ์ ์๊ฐ์ ๋ด์ด ๊ทํ์ ์๋ฃจ์
์ ๋ํด ์ ์ํ๊ฒ ๋
ผ์ํ๊ฒ ์ต๋๋ค.
์ด๋ฅผ ์ํํ๋ ํ๋ฆฝ๋ ๋ฐฉ๋ฒ ์ค ํ๋๋ ์ ํํ ์ ํ์ ๊ฐ๋ ์ ์ ํ ์์คํ ์ ๋์ ํ๋ ๊ฒ์ ๋๋ค.
์ ํํ ์ ํ์ ๊ฑฐ์ ํ๋ฆฝ๋ ์๋ฃจ์ ์ด ์๋๋๋ค. ์ด๋ค ๊ฒ์ด๋ ์ ํํ ์ ํ์ ๊ทธ ์ง์ง์๋ค์ด ์ฌ์ ํ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์๋ ๋ฌธ์ ๋ฅผ ์ค์ ํ์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ์ฌ๊ธฐ ์ TypeScript ํ์ด ์๋ ์ ์ํ๋ ์์์ ์ ํํ ์ ํ์ด ๋ช ๊ฐ์ง ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์์ง๋ง ๊ฒฐ๊ตญ [์คํ](https://github.com/microsoft/TypeScript/issues/12936)ํ ์ค๋ ๋๊ฐ ์์ต๋๋ค. #issuecomment-284590083) ์ ํํ ์ ํ์ ํด๊ฒฐํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ์ต๋๋ค. (์ํฉ์ ๋ํ ์ฐธ๊ณ ์ฌํญ: Flow์ ์ ํํ ๊ฐ์ฒด ์ ํ์ ์ํด ๋ ผ์๊ฐ ์ด๋ฐ๋์์ต๋๋ค. ์ด
์ด๋ฌํ ์ข
๋ฅ์ ๋ฌธ์ ๊ฐ WebAssembly์์ ์ด๋ป๊ฒ ๋ฐ์ํ ์ ์๋์ง์ ๋ํ ์๋ก, ํ์ ์ ํ ์ง์ ์ ์ฐ๊ธฐํ์ง ์์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ref.null
์ ์ ํ์ ์ ํํ ์ ํ์ ์ฌ์ฉํ๋ exact nullref
์
๋๋ค. ๊ทธ๋ฌ๋ exact nullref
๋ exact anyref
์ ํ์ ์ ํ์ด ์๋๋๋ค. ์ฌ์ค, ์ ํํ ์ ํ์ ์ผ๋ฐ์ ์ธ ์๋ฏธ๋ก ์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ ๋ฐํ์ ์ ํ์ด ์ ํํ anyref
๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ exact anyref
์ ์ํ๋ ๊ฐ์ ์์ ๊ฒ์
๋๋ค. ์ด๊ฒ์ anyref
s์ ๋ํด call_indirect
์์ ํ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
์ด์ ์ ํํ ์ ํ์ ๋ค๋ฅธ ๋ฒ์ ์ ์ผ๋์ ๋๊ณ ์์ ์ ์์ง๋ง ์ด ๋ค๋ฅธ ๋ฒ์ ์ด ์ ํํ ์ ํ๊ณผ ๊ด๋ จ๋ ๋ง์ ๋ฏธํด๊ฒฐ ๋ฌธ์ ๋ฅผ ์ด๋ป๊ฒ๋ ํด๊ฒฐํ๋์ง ํ์ธํ๋ ๋ฐ ์๊ฐ์ด ๊ฑธ๋ฆด ๊ฒ์ ๋๋ค. ์ฌ๊ธฐ ๋ด ์์ ์์ด ์๋ฃจ์ ์ ๋์ ธํ์ง๋ง์ด ์๋ฃจ์ ์ด๋ฉฐ, ๊ทธ ๊ธฐ๋์ ์์ฌ ๊ฒฐ์ ์ํ์ง ๋ถ๋ช ์๋๋ผ๊ณ ์ธ์๋์ง ์๋๋ก.
์์ธํ ์ค๋ช ํด ์ฃผ์๊ฒ ์ต๋๊น? ์ฐ๊ฒฐ์ด ์ ๋ณด์ด๋ค์.
๊ธด ๋ฌธ์ฅ์ ์ธ๊ธํ๊ณ ์์ต๋๋ค. ์ด๋ค ๋ถ๋ถ์ ๋ํด ์์ธํ ์ค๋ช
ํด ์ฃผ์๊ฒ ์ต๋๊น? ํ ๊ฐ์ง ์ถ์ธก์ call_indirect
๋ฐ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๋ํ ์ ๋ฐ์ ์ธ ๋ฌธ์ ๋ฅผ ๋์น๊ณ ์์ ์ ์๋ค๋ ๊ฒ์
๋๋ค. ๊ทํ์ ์ ํํ ์ ํ ์ ์์ ํ์ ์
๋ ฅ ๋ฌธ์ ๋ง ํด๊ฒฐํ์ง๋ง, ์์์ call_indirect
ํ์ ์
๋ ฅ์ด ์์ด๋ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ์ต๋๋ค.
์ด๋ ๋ง์ ์ฌ์ฉ ์ฌ๋ก, ์ฆ
externref
(์ฝ๋ฐฑ, ํํฌ ๋ฑ)์์ ์๋ํ๋ ์ผ๊ธ ํจ์์ ๊ด๋ จ๋ ๋ชจ๋ ๊ฒ์ ์ฌ๊ฐํ๊ฒ ์์์ํฌ ๊ฒ์ ๋๋ค.
์, ์ด๊ฒ์ ๋ด๊ฐ ๋ ๋ง์ ์ ๋ณด๋ฅผ ์ป๊ณ ์ ํ๋ ๊ฒ์
๋๋ค. ๋ด ์ดํด๋ call_indirect
์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ C/C++ ํจ์ ํฌ์ธํฐ์ C++ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ง์ํ๋ ๊ฒ์
๋๋ค. ๋ํ ์ด ์ฌ์ฉ ์ฌ๋ก๋ ํ์ฌ ์ซ์ ์๋ช
์ผ๋ก ์ ํ๋์ด ์์์ ์ดํดํฉ๋๋ค. call_indirect
์ ๋ ๋ง์ ์ ์ฌ์ ์ธ ์ฉ๋๋ฅผ ์๊ณ ์์ง๋ง ์ธ๊ธํ๋ฏ์ด ์์ ์ ํ์ ์ ์ํ ๊ฒ์ด๋ฏ๋ก call_indirect
์ ํ์ฌ ์ฉ๋๊ฐ ๋ฌด์์ธ์ง๊ฐ ์ค์ํฉ๋๋ค. call_indirect
๊ฐ ๋จ์ํ funcref
์๋ ํ
์ด๋ธ๊ณผ ์ธ๋ฑ์ค๊ฐ ์ฌ์ ํ ํ์ํ๋ค๋ ์ ์ ๊ฐ์ํ ๋ ์ฝ๋ฐฑ ์ง์์ ์ํด ํน๋ณํ ์ ์ค๊ณ๋ ๊ฒ ๊ฐ์ง ์์ต๋๋ค. ํ์ฌ ๋ ์ด ์ฉ๋๋ก ์ฌ์ฉํ๊ณ ์์ง ์๊ธฐ ๋๋ฌธ์ธ์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค.
์ฌ๋ฌ๋ถ ๋ชจ๋๋ ์ด ๊ธฐ๋ฅ์ ๋์์ผ๋ก ํ๋ ์ฝ๋ ๊ธฐ๋ฐ์ ์ ๋ณด๋ค ํจ์ฌ ์ ์๊ณ ์์ผ๋ฏ๋ก ์ง๊ธ ์ด ๊ธฐ๋ฅ์ด ํ์ํ ์ค์ ํ๋ก๊ทธ๋จ์ ์๊ณ ์๋ค๋ฉด ์ฌ๊ธฐ์ ํ์ํ ์ฌ์ฉ ํจํด์ ๋ช ๊ฐ์ง ์๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋งค์ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค. ์ง๊ธ ์ด ๊ธฐ๋ฅ์ ์ง์ํด์ผ ํ๋์ง ์ฌ๋ถ๋ฅผ ํ์ ํ๋ ๋ฐ ์ ์ฉํ ๋ฟ๋ง ์๋๋ผ ๊ธฐ๋ฅ์ด ์ง๊ธ ํ์ํ ๊ฒฝ์ฐ ์ด๋ฌํ ์์ ๋ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ฉด์ ์ ์ํ๊ฒ ์ ๊ณตํ๋ ์ต์ ์ ๋ฐฉ๋ฒ์ ์๋ ค์ฃผ๋ ๋ฐ ๋์์ด ๋ ๊ฒ์ ๋๋ค.
@RossTate :
์ด๋ค ๊ฒ์ด๋ ์ ํํ ์ ํ์ ๊ทธ ์ง์ง์๋ค์ด ์ฌ์ ํ ํด๊ฒฐํ๊ธฐ ์ํด ๋ ธ๋ ฅํ๊ณ ์๋ ๋ฌธ์ ๋ฅผ ์ค์ ํ์ต๋๋ค. ํฅ๋ฏธ๋กญ๊ฒ๋ ์ฌ๊ธฐ์ TypeScript ํ์ด ์๋ ์ ์ํ๋ ์์์ ์ ํํ ์ ํ์ด ์ผ๋ถ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๋ ๋ฐฉ๋ฒ์ ๋ณด์์ง๋ง ๊ฒฐ๊ตญ ์ ํํ ์ ํ์ด ํด๊ฒฐํ ๊ฒ๋ณด๋ค ๋ ๋ง์ ๋ฌธ์ ๋ฅผ ์ผ๊ธฐํ๋ค๋ ๊ฒ์ ๊นจ๋ฌ์๋ ์ค๋ ๋๊ฐ ์์ต๋๋ค. (๋งฅ๋ฝ์ ๋ํ ์ฐธ๊ณ ์ฌํญ: Flow์ ์ ํํ ๊ฐ์ฒด ์ ํ์ ์ํด ๋ ผ์๊ฐ ์ด๋ฐ๋์์ต๋๋ค. ์ด ์ ํ์ ์ค์ ๋ก ์ ํํ ์ ํ์ ํํ๊ฐ ์๋๋ผ(์ด๋ก ์ ์๋ฏธ์์) ์ ๋์ฌ ํ์ ์ ํ ์ง์ ์ ๊ฐ์ฒด ์๋ ๋ก๊ทธ๋ฅผ ํ์ฉํ์ง ์์ต๋๋ค.) ์ฐ๋ฆฌ๊ฐ ํด๋น ์ค๋ ๋๋ฅผ ์ฌ์ํ๋ ๊ฒ์ ์์ํ ์ ์์ต๋๋ค. ์ฌ๊ธฐ.
์ฌ๊ธฐ์์ ๊ดํธ๊ฐ ํต์ฌ์
๋๋ค. ๊ทธ๋ค์ด ๊ทธ ์ค๋ ๋์์ ์ ํํ ๋ฌด์์ ์ผ๋์ ๋๊ณ ์๋์ง๋ ๋ชจ๋ฅด๊ฒ ์ง๋ง ๊ฐ์ ๊ฒ์ ์๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ ์ง ์์ผ๋ฉด " T & U
์ ํ์ ํญ์ T
ํ ๋นํ ์ ์๋ค๊ณ ๊ฐ์ ํ์ง๋ง T
๊ฐ ์ ํํ ์ ํ์ด๋ฉด ์คํจํฉ๋๋ค"์ ๊ฐ์ ๋ฌธ์ฅ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. T & U
๊ฐ ์ ํจํ์ง ์๊ฑฐ๋ ๋งจ ์๋์ ์์ผ๋ฏ๋ก ์คํจํฉ๋๋ค. ๋ค๋ฅธ ์ง๋ฌธ์ ์ฃผ๋ก ํ์ฉ๋ก ์ ๊ดํ ๊ฒ์
๋๋ค. ์๋ฅผ ๋ค์ด ํ๋ก๊ทธ๋๋จธ๊ฐ ์ด๋์์ (๊ฐ์ฒด์ ๋ํด) ๊ทธ๊ฒ๋ค์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ ๊น์? ์ฐ๋ฆฌ์ ๊ฒฝ์ฐ์๋ ์ ์ฉ๋์ง ์์ต๋๋ค.
์ ์์ค ์ ํ ์์คํ ์ ๊ฒฝ์ฐ, ๊ทํ์ ์ผ๋ถ ๋ ผ๋ฌธ์์๋ ์ ํํ ์ ํ์ด ์ค์ํ ์์๊ฐ ์๋์๋์?
์ด๋ฌํ ์ข ๋ฅ์ ๋ฌธ์ ๊ฐ WebAssembly์์ ์ด๋ป๊ฒ ๋ฐ์ํ ์ ์๋์ง์ ๋ํ ์๋ก, ํ์ ์ ํ ์ง์ ์ ์ฐ๊ธฐํ์ง ์์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ref.null์ ์ ํ์ ์ ํํ ์ ํ์ ์ฌ์ฉํ๋ ์ ํํ nullref์ ๋๋ค. ๊ทธ๋ฌ๋ ์ ํํ nullref๋ ์ ํํ anyref์ ํ์ ์ ํ์ด ์๋๋๋ค.
์ฌ๊ธฐ์๋ ์ด๊ฒฌ์ด ์์ต๋๋ค. ํ์ ์ ํ์ด ์๋ ๊ฒ์ด ์ ํํ ์ ํ์ ๋ชฉ์ ์ ๋๋ค.
์ฌ์ค, ์ ํํ ์ ํ์ ์ผ๋ฐ์ ์ธ ์๋ฏธ๋ก ์ ๋ฐ๋ฅด๋ฉด ๊ฐ์ ๋ฐํ์ ์ ํ์ด ์ ํํ anyref๊ฐ ์๋ ๊ฐ๋ฅ์ฑ์ด ๋๊ธฐ ๋๋ฌธ์ ์ ํํ anyref์ ์ํ๋ ๊ฐ์ด ์์ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค.
๋ค, (exact anyref)
์กฐํฉ์ anyref์ ์ ์ผํ ๋ชฉ์ ์ด ์์ ์ ํ์ด ๋๋ ๊ฒ์ด๋ฏ๋ก ์ ์ฉํ ์ ํ์ด ์๋๋๋ค. ๊ทผ๋ฐ ๊ทธ๊ฒ ์ ๋ฌธ์ ์ผ?
์ด๊ฒ์ call_indirect๋ฅผ anyref์ ๋ํด ์์ ํ ์ฌ์ฉํ ์ ์๊ฒ ๋ง๋ญ๋๋ค.
๋น์ ์ ์ง๊ธ ํผ๋์ค๋ฌ์ด ์์ค์ด ์๋๋ผ๊ณ ํ์ ํฉ๋๊น? (exact (func ... -> anyref))
ํจ์ ์ ํ์ ์๋ฒฝํ๊ฒ ์ ์ฉํฉ๋๋ค. (func ... -> (ref $T))
์ ๊ฐ์ ์ ํ๊ณผ ํธํ๋์ง ์์ต๋๋ค. ์ฆ, exact
๋ ํจ์ ์ ํ์ ๋ํ ์ฌ์ํ ํ์ ์
๋ ฅ์ ๋ฐฉ์งํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด ์์ ์
๋๋ค!
(exact (func ... -> anyref))
์ (func ... -> exact anyref)
? ์ด๋ค์ ๊ด๋ จ์ด ์๋ ์ ํ์
๋๋ค.
๊ทํ์ ์ ํํ ์ ํ ์ ์์ ํ์ ์ ํ์ ๋ฌธ์ ๋ง ํด๊ฒฐํ์ง๋ง ์์์ call_indirect๋ ํ์ ์ ํ์ด ์์ด๋ ๋ฌธ์ ๊ฐ ์์์ ํ์ธํ์ต๋๋ค.
์ถ์ ๋ฐ์ดํฐ ์ ํ์ ์ ์ํ๋ ์๋จ์ผ๋ก ์ ์ ์์ด ์ ํ์ ๋ด๋ณด๋ผ ์ ์๋ค๊ณ ์ด๋ป๊ฒ๋ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋์ ์ ํ ์บ์คํธ(call_indirect ๋๋ ๊ธฐํ)๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ML ์คํ์ผ ์ ํ ์ถ์ํ๊ฐ ์๋๋ผ newtype ์คํ์ผ ์ ํ ์ถ์ํ๊ฐ ํ์ํ๋ค๊ณ ๊ณ์ ๋งํ๋ ์ด์ ์ ๋๋ค.
๋ด ์ดํด๋ call_indirect์ ์ฃผ์ ์ฌ์ฉ ์ฌ๋ก๋ C/C++ ํจ์ ํฌ์ธํฐ๋ฅผ ์ง์ํ๋ ๊ฒ์ ๋๋ค
์, ํ์ง๋ง ์ด๊ฒ์ด ์ ๊ฐ ์ธ๊ธํ ref.func
์ ์ ์ผํ ์ฌ์ฉ ์ฌ๋ก๊ฐ ์๋๋๋ค. ์ ์ํ ์ ํ ์ฌํญ์ ํฌํจํ๊ธฐ ๋๋ฌธ์
๋๋ค(๋ถํ์ํ๊ฒ ๊ทธ๋ด ์๋ ์์ต๋๊น?). ํนํ ์ ํ ๊ฒ์ฌ๋ฅผ ํฌํจํ์ง ์๋ call_ref
๊ฐ ์์ต๋๋ค.
์ถ์ ๋ฐ์ดํฐ ์ ํ์ ์ ์ํ๋ ์๋จ์ผ๋ก ์ ์ ์์ด ์ ํ์ ๋ด๋ณด๋ผ ์ ์๋ค๊ณ ์ด๋ป๊ฒ๋ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋์ ์ ํ ์บ์คํธ(call_indirect ๋๋ ๊ธฐํ)๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ML ์คํ์ผ ์ ํ ์ถ์ํ๊ฐ ์๋๋ผ newtype ์คํ์ผ ์ ํ ์ถ์ํ๊ฐ ํ์ํ๋ค๊ณ ๊ณ์ ๋งํ๋ ์ด์ ์ ๋๋ค.
์ข์ต๋๋ค. call_indirect
๋ฐ ์ ํ ๊ฐ์ ธ์ค๊ธฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ ํํ ์ ํ์ ์๋ฌด ๊ฒ๋ ํ์ง ์๋๋ค๋ ๋ฐ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ฐํ์ ์บ์คํธ๋ก ์ธํด ์ด์จ๋ ๋ฌธ์ ๊ฐ ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ํด๋น ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์๋ฏธ๊ฐ ์๋ค๊ณ ๋ง์ํ์
จ์ต๋๋ค. ์ด ๋ฌธ์ ๋ฅผ ๋ฐฉ์งํ๋ ์ฌ์ด ๋ฐฉ๋ฒ์ด ์์ต๋๋ค. ์ฌ๋๋ค์ด ์ถ์ ์ ํ์ ๋ํด ๋ฐํ์ ์บ์คํธ๋ฅผ ์ํํ๋๋ก ํ์ฉํ์ง ๋ง์ญ์์ค(์ถ์ ์ ํ์ด ๋ช
์์ ์ผ๋ก ์บ์คํธ ๊ฐ๋ฅํ๋ค๊ณ ๋ช
์ํ์ง ์๋ ํ). ๊ฒฐ๊ตญ, ๊ทธ๊ฒ์ ๋ถํฌ๋ช
ํ ์ ํ์ด๋ฏ๋ก ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ด ์บ์คํธ๋ฅผ ์ํํ๋ ๋ฐ ํ์ํ ๊ตฌ์กฐ๋ฅผ ๋ํ๋ธ๋ค๊ณ ๊ฐ์ ํ ์ ์์ต๋๋ค. ๋ฐ๋ผ์ ์ ํํ ์ ํ์ด ํ์ ์ ํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ๊ฐ๋ฅ์ฑ์ด ์๋๋ผ๋ ๋ฌธ์ ์ ๋๋จธ์ง ์ ๋ฐ์ ๋ฌด์ํ๋ ๊ฒ์ ์๊ธฐ์์กฐ์
๋๋ค.
๋ด๊ฐ ๋งํ๋ฏ์ด ๋ชจ๋ ์๋ฃจ์ ์๋ ์ฅ๋จ์ ์ด ์์ต๋๋ค. ๊ทํ๋ ๊ทํ์ ์๋ฃจ์ ์ ๊ทํ๊ฐ ์๋ณํ ์ฅ๋จ์ ๋ง ์๋ค๊ณ ๊ฐ์ ํ๊ณ CG๊ฐ ๋ค๋ฅธ ์๋ฃจ์ ๋ณด๋ค ๊ทํ์ ์๋ฃจ์ ์ ์ ํธํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ๋ ๊ฒ ๊ฐ์ต๋๋ค. ๋ ์ญ์ ์ด ๋ฌธ์ ์ ๋ํ ์ ์ฌ์ ์ธ ํด๊ฒฐ์ฑ ์ด ์์ต๋๋ค. ์์ ์ ๊ฒ์ ๋ณด์ฅํ๊ณ , ์ด๋ฏธ ๊ฐ์ ๋จธ์ ์์ ์ฌ์ฉ๋๋ ๊ธฐ์ ์ ๊ธฐ๋ฐ์ผ๋ก ํ๋ฉฐ, ์ฌ๊ธฐ์์ ๋ชจ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ณ (๋ด ์๊ฐ์), ์๋ก์ด ์ ํ์ ์ถ๊ฐํ ํ์๊ฐ ์์ผ๋ฉฐ, ์ค์ ๋ก ์๋ ค์ง ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฌ์ฉํ์ฌ WebAssembly์ ์ถ๊ฐ ๊ธฐ๋ฅ์ ์ถ๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋๋ ๊ทธ๊ฒ์ด ๋ด๊ฐ ์์ํ ๋๋ก ์๋ํ๊ณ ๋น์ ๊ณผ ๋ค๋ฅธ ์ฌ๋๋ค์ด ๊ทธ๊ฒ์ ์ดํด๋ณผ ๊ธฐํ๊ฐ ์์๊ธฐ ๋๋ฌธ์ ๋ด๊ฐ ๋ช ๊ฐ์ง ๊ฒฐ์ ์ ๊ฐ๊ณผํ์ง ์์๋ค๊ณ ์ถ์ ํ์ง ์์ต๋๋ค. ๋๋ ๋ํ CG๊ฐ ๋์ฒด ์ต์ ๋ณด๋ค ํธ๋ ์ด๋์คํ๋ฅผ ์ ํธํ ๊ฒ์ด๋ผ๊ณ ๊ฐ์ ํ์ง ์์ต๋๋ค. ๊ทธ ๋์ , ์ ๋ฟ๋ง ์๋๋ผ CG๊ฐ ์ด ๊ต์ฐจ ์ฃผ์ ์ ๋ํด ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆด ์ ์๋๋ก ์ต์ ์ ๋ถ์ํ ์๊ฐ์ ์ฃผ๊ธฐ ์ํด ์ฐ๋ฆฌ๊ฐ ๋ฌด์์ ํ ์ ์๋์ง ์์๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๊ณ ์์ต๋๋ค.
ํนํ ์ ํ ๊ฒ์ฌ๋ฅผ ํฌํจํ์ง ์๋
call_ref
๊ฐ ์์ต๋๋ค.
๋ฌธ์ฅ์ ํต์ฌ ๋จ์ด๋ will ์
๋๋ค. ๋๋ ์ฌ๋๋ค์ด ์ง์ํ๊ธฐ ๋ฅผ ์ํ๋ ์ซ์๊ฐ ์๋ ์ ํ์ call_indirect
์์ฉ ํ๋ก๊ทธ๋จ์ด ์๋ค๋ ๊ฒ์ ์์ ํ ์๊ณ ์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์ฐ๋ฆฌ ๊ฐ ๊ทธ ๊ธฐ๋ฅ์ ์ง์ํ๊ณ ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋์์ธ์ ๋ด๋์ ๊ฒ์ด๋ผ๊ณ ๊ธฐ๋ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๋งํ๋ฏ์ด ์ด์์ ์ผ๋ก๋ ์ฐ๋ฆฌ๊ฐ ์ด๋ฌํ ์๋ฏธ๋ฅผ ์กฐ์ฌํ ๊ธฐํ๋ฅผ ๊ฐ๊ธฐ ์ ์ ํฌ๋ก์ค-์ปทํ
์๋ฏธ๊ฐ ์๋ ๊ธฐ๋ฅ์ ์ ์ํ๊ฒ ์ถ์ํ์ง ์๋๋ก ํด๋น ๋์์ธ์ ๊ฐ๋ฐํ ์๊ฐ์ ๊ฐ์ง ์ ์์ต๋๋ค. ๊ทธ๋์ ์ ์ง๋ฌธ ์ ์ง๊ธ ๊ทธ ๊ธฐ๋ฅ ์ ํ์ ๋ก ํ๋ ์ฃผ์ ํ๋ก๊ทธ๋จ ์ด ์๋ค๋ ๊ฒ์
๋๋ค . ์๋ค๋ฉด ๊ฐ์ ํ ํ์๊ฐ ์์ต๋๋ค. ์ผ๋ถ๋ฅผ ๊ฐ๋ฆฌํค๊ณ ํ์ฌ ์ด ๊ธฐ๋ฅ์ ์ด๋ป๊ฒ ์์กดํ๋์ง ์ค๋ช
ํ์ญ์์ค.
์ถ์ ๋ฐ์ดํฐ ์ ํ์ ์ ์ํ๋ ์๋จ์ผ๋ก ์ ์ ์์ด ์ ํ์ ๋ด๋ณด๋ผ ์ ์๋ค๊ณ ์ด๋ป๊ฒ๋ ๊ฐ์ ํ๊ณ ์์ต๋๋ค. ๋ถ๋ช ํ ๊ทธ ์ ๊ทผ ๋ฐฉ์์ ๋์ ์ ํ ์บ์คํธ(call_indirect ๋๋ ๊ธฐํ)๊ฐ ์๋ ๊ฒฝ์ฐ ์๋ํ์ง ์์ต๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ML ์คํ์ผ ์ ํ ์ถ์ํ๊ฐ ์๋๋ผ newtype ์คํ์ผ ์ ํ ์ถ์ํ๊ฐ ํ์ํ๋ค๊ณ ๊ณ์ ๋งํ๋ ์ด์ ์ ๋๋ค.
์ด๊ฒ์ ๋์๊ฒ ๊ทผ๋ณธ์ ์ธ ๋ฌธ์ ์ฒ๋ผ ๋ณด์ ๋๋ค. ๋ด๋ณด๋ธ ์ ํ ์ ์์ ๊ธฐ๋ฐ์ฑ์ ํ์ฑํํ๋ ๊ฒ์ด ์ ํ ๊ฐ์ ธ์ค๊ธฐ ์ ์์ ๋ชฉํ์ ๋๊น? ์ด ์ค๋ ๋์์ @RossTate ๋ ๋ชฉํ๊ฐ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ณ @rossberg ๋ ํ์ฌ ๋ชฉํ๊ฐ
@RossTate :
์ข์ต๋๋ค. ๋ฐ๋ผ์ ์ ํํ ์ ํ์ call_indirect ๋ฐ ์ ํ ๊ฐ์ ธ์ค๊ธฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ๋ฐ ์๋ฌด ๊ฒ๋ ํ์ง ์๋๋ค๋ ๋ฐ ๋์ํ๋ ๊ฒ ๊ฐ์ต๋๋ค.
์, ์ถ์ ๋ฐ์ดํฐ ์ ํ์ ์ ์ํ๊ธฐ ์ํ ๊ธฐ๋ฅ์ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ์ ๋ํ ์ง๋ฌธ์ ์๋ฏธํ๋ค๋ฉด ๊ทธ๋ ์ต๋๋ค. ์ ํ ์ถ์ํ๊ฐ ์ผ๊ด๋๊ฒ ์๋ํ๋ ๋ฐฉ๋ฒ์๋ ์ฌ๋ฌ ๊ฐ์ง๊ฐ ์์ง๋ง ๊ทธ๋ฌํ ๊ธฐ๋ฅ์ ๋ ๋์๊ฐ์ผ ํฉ๋๋ค.
๋น์ ์ ๋ฌธ์ฅ์ ํต์ฌ ๋จ์ด๋ ์์ง์ ๋๋ค. ์ฌ๋๋ค์ด ์ง์ํ๊ธฐ๋ฅผ ์ํ๋ ์ซ์๊ฐ ์๋ ์ ํ์ call_indirect ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋ค๋ ๊ฒ์ ์ถฉ๋ถํ ์๊ณ ์์ต๋๋ค.
call_ref
๋ช
๋ น์ด๋ ํจ์ ref ์ ์์ ์์ผ๋ฏ๋ก ์ด๋ค ๊ฒฝ์ฐ์๋ ์ ์ฌ์ ์ธ ์ถ์ ๋ฐ์ดํฐ ์ ํ ๋ฉ์ปค๋์ฆ ์ด์ ์ ๋งค์ฐ ๊ฐ๊น์ต๋๋ค. ๊ทธ๋๊น์ง ๋ณด๋ฅํ์๋ ๊ฑด๊ฐ์?
@tlively :
๋ด๋ณด๋ธ ์ ํ ์ ์์ ๊ธฐ๋ฐ์ฑ์ ํ์ฑํํ๋ ๊ฒ์ด ์ ํ ๊ฐ์ ธ์ค๊ธฐ ์ ์์ ๋ชฉํ์ ๋๊น? ์ด ์ค๋ ๋์์ @RossTate ๋ ๋ชฉํ๊ฐ ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ๊ณ @rossberg ๋ ํ์ฌ ๋ชฉํ๊ฐ
๋ชฉํ์ด์ง๋ง ์ถ์ ๋ฐ์ดํฐ ์ ํ ๋ฉ์ปค๋์ฆ์ ๋ณ๋์ ๊ธฐ๋ฅ์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ด๋ฌํ ๋ฉ์ปค๋์ฆ์ ์์ ํ์ ์ค๊ณ์ ์ํฅ์ ๋ฏธ์น์ง ์๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ๋ง์ฝ ๊ทธ๋ ๋ค๋ฉด, ์ฐ๋ฆฌ๋ ๊ทธ๊ฒ์ ๋งค์ฐ ์๋ชปํ๊ณ ์์ ๊ฒ์ ๋๋ค. ์ถ์ํ๋ ์ฌ์ฉ ์ฌ์ดํธ๊ฐ ์๋๋ผ ์ ์ ์ฌ์ดํธ์์ ๋ณด์ฅ๋์ด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋คํ์ค๋ฝ๊ฒ๋ ์ด๊ฒ์ ๋ก์ผ ๊ณผํ์ด ์๋๋ฉฐ ๋์์ธ ๊ณต๊ฐ์ ์๋นํ ์ ์๋ ค์ ธ ์์ต๋๋ค.
๊ฐ์ฌํฉ๋๋ค, @rossberg , ๊ทธ๊ฒ์ ์๋ฏธ๊ฐ ์์ต๋๋ค. ์ ํ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ ํ์ ํ์ ์ ์์ ์ถ์ํ ๊ธฐ๋ณธ์์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ๋์๊ฒ๋ ๊ด์ฐฎ๊ฒ ๋ค๋ฆด์ง ๋ชจ๋ฅด์ง๋ง, ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ด๋์ ๊ฐ ๊ณง ํ ๊ณํ์ ๋ํ ์ธ๋ถ์ฌํญ์ ๊ธฐ๋กํ ์ ์๋ค๋ฉด ์ข์ ๊ฒ์ ๋๋ค. ์ ํ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ์ ๋์์ธ์ ์ถ์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ ๋ฐ ๋ด๋ณด๋ด๊ธฐ์ ๋์์ธ์ ์ ํํ๊ณ ์ ๋ณด๋ฅผ ์ ๊ณตํ๋ฏ๋ก ์ด๊ธฐ ๋์์ธ์ ์๋ฃํ๊ธฐ ์ ์ ์ถ์ํ๊ฐ ํฅํ ์ด๋ป๊ฒ ์๋ํ ์ง์ ๋ํ ์ข์ ์์ด๋์ด๋ฅผ ๊ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
๊ทธ ๊ณํ์ ์์ธํ ์ค๋ช
ํ๋ ๊ฒ ์ธ์๋ call_indirect
์ ๋ํ ์ด ๋ฌธ์ ๋ ๊ธด๊ธํ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ฏ๋ก ์ถ์ ์ ํ์ ์บ์คํ
ํ ์ ์๋๋ก ๋ช
์์ ์ผ๋ก ์ ํํ์ง ์๋ ํ ๋ด ์ ์์ ๊ฑฐ๋ถํ๋ ๊ฒ์ฒ๋ผ ๋ณด์ด๋ ์ด์ ๋ฅผ ์ค๋ช
ํ ์ ์์ต๋๊น? )? ๊ทธ๊ฒ๋ค์ ๋ถํฌ๋ช
ํ๋ฏ๋ก ์ ์์ ์ถ์ ์ ํ์ ์ผ๋ฐ์ ์ธ ๊ดํ๊ณผ ์ผ์นํ๋ ๊ฒ์ฒ๋ผ ๋ณด์
๋๋ค.
@tlively ๋ค, ๋์ํฉ๋๋ค. ๊ทธ์ธ์ ์ ๊ฐ ์ ์ ์ฐ๋ ค๊ณ ํ๋ ๋ค์ํ ๋ค๋ฅธ ๊ฒ๋ค. #69 ์ ๋ชจ๋ ๋์ง์ ํด๊ฒฐํ ํ์ ํ ๊ฒ์ ๋๋ค. ;)
@RossTate , ์ถ์ ๋ฐ์ดํฐ ์ ํ์ด ์บ์คํธ์ ํธํ๋์ง ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ค๋ฅธ ์ฌ๋๋ค์ด ์ถ์ ์ ํ์ _ํตํด_ ๋ณผ ์ ์๋๋ก ํ๊ณ ์ถ๋ค๊ณ ํด์ ๊ทธ๋ค(๋๋ ๋ ์์ )์ด ์ถ์ ์ ํ์ _๋ณํํ์ง ๋ชปํ๋๋ก ๋ง๊ณ ์ถ์ ๊ฒ์ ์๋๋๋ค. ์ด๋ฌํ ์๋ชป๋ ์ด๋ถ๋ฒ์ ๋ง๋๋ ๊ฒ์ ์บ์คํธ์ ์ค์ฌ ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊นจ๋จ๋ฆด ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๋ฌผ๋ก ์ถ์ ์ ํ์ ๊ฐ์ ๋คํ์ฑ ํจ์์ ์ ๋ฌํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
@rossberg ์ผ๋์ ๋๊ณ ์๋ ์ด ์ค์ ์ฌ์ฉ ์ฌ๋ก๊ฐ ๋ฌด์์ธ์ง ๋ช ํํ
@RossTate , ๋คํ์ฑ ํจ์๋ฅผ ๊ณ ๋ คํ์ญ์์ค. Wasm-generics๊ฐ ๋ถ์กฑํ๋ฉด anyref์์ up/down ์บ์คํธ๋ฅผ ์ฌ์ฉํ์ฌ ์ปดํ์ผํ ๋ ๋ค๋ฅธ ๊ฐ์ฒด๋ก ์ถ๊ฐ ๋ํํ์ง ์๊ณ ๋ ๋ค๋ฅธ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ถ์ ์ ํ์ ๊ฐ๊ณผ ํจ๊ป ์ฌ์ฉํ ์ ์์ด์ผ ํฉ๋๋ค. ์ผ๋ฐ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก ์ถ์ ์ ํ์ ๊ฐ์ ์ฒ๋ฆฌํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๋ค.
์, ๋คํ์ฑ ํจ์๋ฅผ ๊ณ ๋ คํ๊ณ ๊ฐ์ ธ์จ ์ ํ์ด Handle
๋ผ๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค.
CHandle
์ง์ ํ ๊ฐ๋ฅ์ฑ์ด ๋์ต๋๋ค. ์ด ํด๋์ค์ ์ธ์คํด์ค์๋ Handle
์ ํ์ (wasm ์์ค) ๋ฉค๋ฒ์ ๋ค์ํ ํด๋์ค ๋ฐ ์ธํฐํ์ด์ค ๋ฉ์๋ ๊ตฌํ์ ๋ํ ํจ์ ํฌ์ธํฐ๋ฅผ ์ ๊ณตํ๋ v-ํ
์ด๋ธ์ด ์์ต๋๋ค. wasm ์์ค์์ ๊ฐ์ฒด์ ๋ํ ํจ์์ผ ๋ฟ์ธ ํ๋ฉด ์์ค ๋คํ์ฑ ํจ์์ ์ ๊ณต๋๋ฉด ๋ชจ๋์ CHandle
๋ก ์บ์คํ
ํ๊ธฐ ์ํด ๋ค๋ฅธ ํด๋์ค๋ก ์บ์คํ
ํ๋ ๋ฐ ์ฌ์ฉํ๋ ๊ฒ๊ณผ ๋์ผํ ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.Handle
์ ํ์ (wasm ์์ค) ๋ฉค๋ฒ๊ฐ ์๋ ๋์ ๋ฐ์ดํฐ ์ ํ ๋๋ ๋ ์ฝ๋ ์ ํ THandle
์ ์ง์ ํ ์ ์์ต๋๋ค. ๋คํ์ฑ ํจ์๋ ๋ค๋ฅธ ๋์ ๋ฐ์ดํฐ ์ ํ์ด๋ ๋ ์ฝ๋ ์ ํ๊ณผ ๋ง์ฐฌ๊ฐ์ง๋ก OCaml ๊ฐ์ THandle
ํฉ๋๋ค.์ฆ, ๋ชจ๋์ ๋คํ์ฑ ํจ์์ ๊ฐ์ ๊ฒ์ ๊ตฌํํ๊ธฐ ์ํด ํ๋ฉด ์์ค ๊ฐ์ด ํํ๋๋ ๋ฐฉ์์ ๋ํ ๊ท๋ฒ์ ์์กดํ๊ณ Handle๊ณผ ๊ฐ์ ์ถ์ ๊ฐ์ ธ์ค๊ธฐ ํ์์ ์ด๋ฌํ ๊ท๋ฒ์ ์ถฉ์กฑํ์ง ์๊ธฐ ๋๋ฌธ์ ๊ฐ์ ๋ํ์ด ๋ถ๊ฐํผํฉ๋๋ค. ์ด๊ฒ์ anyref
์ ๋ํ ์๋ ์์ฉ ํ๋ก๊ทธ๋จ ์ค ํ๋๊ฐ ์ธํฐํ์ด์ค ์ ํ์ผ๋ก ๋์ฒด๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ์
๋๋ค. ๊ทธ๋ฆฌ๊ณ ์ฐ๋ฆฌ๋ anyref
๊ฐ ๋คํ์ฑ ๊ธฐ๋ฅ์ ์ง์ํ๋ ๋ฐ ํ์ํ์ง๋ ์๊ณ ์ ์ ํ์ง๋ ์๋ค๋ ๊ฒ์ ๋ณด์ฌ์ฃผ๋ ์ฌ๋ก ์ฐ๊ตฌ ๋ฅผ ๊ฐ๋ฐํ์ต๋๋ค.
๋ฐ๋ฉด์ ์ ์ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ ์ฐํํ๋ ๋ฐ ์บ์คํ
๊ฐ๋ฅํ anyref
์ฌ์ฉํ ์ ์์์ ๋ณด์ฌ์ฃผ์์ต๋๋ค. ๋น์ ์ด ์ธ๊ธํ ์ถ์ํ ๋ฉ์ปค๋์ฆ ๊ณํ์ ๋์ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ ํตํด ์ด ๋ฌธ์ ๋ฅผ ํจ์นํ๋ ค๋ ์๋์
๋๋ค. ๊ทธ๋ฌ๋ ๋์ ์ถ์ํ ๋ฉ์ปค๋์ฆ์๋ ๋ง์ ๋ฌธ์ ๊ฐ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, anyref
ํ๊ณ ํธ๋ค์ ์์กฐํ๊ธฐ ์ํด ์บ์คํ
(์: ๊ธฐ๋ฅ)ํ๋ ๋ค๋ฅธ ๋ชจ๋์ ์ํ ์์ด i31ref
์ ํ์ ์ถ์ Handle
์ ํ์ผ๋ก ๋ด๋ณด๋ผ ์ ์์ต๋๋ค. ๋์ ์ ํ์ค ์ ์ ์ถ์ํ๋ง ๋ณด์ฅํ๋ค๋ฉด ๋ถํ์ํ ์ถ๊ฐ ๊ณ ๋ฆฌ์ ์ค๋ฒํค๋๋ฅผ ๊ฑด๋๋ฐ์ด์ผ ํฉ๋๋ค.
๋ํ (๋ด ์๊ฐ์) ์ ํํ ์ ํ์ ์ฌ์ฉํ๋ ค๋ ๋ฐฉ๋ฒ์ ๋ ์ ์ดํดํ๊ธฐ ๋๋ฌธ์ call_indirect
๋ฐ ํ์ ์ ํ์ผ๋ก ์ฃผ์๋ฅผ ํ๊ธฐ์ํจ ๋ ๊ฐ์ง ์ฃผ์ ๋ฌธ์ ์ค ์ด๋ ๊ฒ๋ ๊ทํ์ ์๋๊ฐ ํด๊ฒฐ๋์ง ์๋๋ค๋ ๊ฒ์ ๊นจ๋ฌ์์ต๋๋ค.
call_indirect
์๋ธํ์ดํ์ ์กด์คํ๋๋ก ํ๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค(์ด๋ฏธ ๋ช
์์ ์ผ๋ก ๋งํ ๊ฒ ๊ฐ์ต๋๋ค).call_indirect
๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ง ์์ต๋๋ค.๋ฐ๋ผ์ ์ด๊ฒ์ ๊ฐ๋จํ ํด๊ฒฐํ ์ ์๋ ๋ฌธ์ ๊ฐ ์๋๋๋ค. ๊ทธ๋ ๊ธฐ ๋๋ฌธ์ ์๊ฐ ์ ์ฝ์ด ์๋ ๊ฒฝ์ฐ ๋ฌธ์ ๋ฅผ ์ ์ ํ๊ฒ ํด๊ฒฐํ ์๊ฐ์ ์ฃผ๋ ๋ฐฉ๋ฒ์ ํ๊ฐํ๋ ๋ฐ ์ค์ ์ ๋๋ ๊ฒ์ด ์ข์ต๋๋ค. anyref
๊ฐ ์ ์ ์ถ์ํ๋ฅผ ๋ฒ๋ฆด ๊ฐ์น๊ฐ ์๋์ง ์ฌ๋ถ์ ๋ํด ๋จผ์ ๋
ผ์ํ ํ์๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๊ฒ์ ๋ด๊ฐ ์ผ์ ๋ ๋ฏธ๋ฃจ์ง ์๊ธฐ ์ํด ํผํ๊ณ ์ถ์๋ ์ผ์ข
์ ํฐ ํ ๋ก ์ด์์ต๋๋ค.
๋ฐ๋ฉด์ ์ ์ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ ์ฐํํ๋ ๋ฐ ์บ์คํ ๊ฐ๋ฅํ anyref๋ฅผ ์ฌ์ฉํ ์ ์์์ ์์ฐํ์ต๋๋ค.
๋์ ์ ํ ์บ์คํธ๊ฐ ์๋ ์ธ์ด์์๋ ์ ์ ์ ํ ์ถ์ํ๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ ์ ์ถ์ํ๋ ๋งค๊ฐ๋ณ์์ ์์กดํ๊ณ ์บ์คํธ๋ ์ด๋ฅผ ๊นจ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ์๋ก์ด ๊ฒ์ ์์ผ๋ฉฐ ๊ทธ๊ฒ์ ๋ํด ๋ฌธ์๊ฐ ์์ฑ๋์์ต๋๋ค. ์ด๋ฌํ ์ปจํ ์คํธ์์๋ ๋ค๋ฅธ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
์ถ์ ์ ํ์ ์ฌ์ฉ์ ์ ํํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋ฉด ๋ชฉ์ ์ด ๋ฌดํจํ๋ฉ๋๋ค. WASI ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค. WASI ๋ชจ๋๊ณผ WASI ๋ชจ๋์ด ๋ด๋ณด๋ด๋ ๋ชจ๋ ์ ํ์ด ํธ์คํธ์ ์ํด ๊ตฌํ๋๋์ง ๋๋ Wasm์์ ๊ตฌํ๋๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ์ถ์ ์ ํ์ ์์๋ก ์ ํํ๋ฉด Wasm ๊ตฌํ์ ์ผ๋ฐ์ ์ผ๋ก ํธ์คํธ ๊ตฌํ๊ณผ ๋ ์ด์ ํธํ๋์ง ์์ต๋๋ค.
- call_indirect๊ฐ ํ์ ์ ํ์ ์กด์คํ๋๋ก ๋ง๋๋ ๋ฐ ๋์์ด ๋์ง ์์ต๋๋ค(์ด๋ฏธ ๋ช ์์ ์ผ๋ก ๋งํ ๊ฒ ๊ฐ์ต๋๋ค).
๋ญ? ์ ์์ ๋ฐ๋ผ ํ์ ์ ํ ์ง์ ๊ท์น์ ์ผ๋ถ์ ๋๋ค.
- ๋ด๋ณด๋ธ ์๋ช ์ด ์๋ ์ ์๋ ์๋ช ์ด ์๋ ๋ด๋ณด๋ธ ํจ์๋ฅผ ์ฌ์ฉํ๋ ๋ฐ call_indirect๊ฐ ์ฌ์ฉ๋๋ ๊ฒ์ ๋ฐฉ์งํ์ง ์์ต๋๋ค.
ํ๋ค๊ณ ๋งํ์ง ์์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด call_indirect ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์บ์คํธ๊ฐ ์๋ ์ธ์ด์ ์ ํฉํ ์ ํ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ ์ ํํ๋ ๋ฌธ์ ๋ผ๊ณ ๋งํ์ต๋๋ค.
์ ์ณ๋๊ณ , OCaml(๋๋ ์ ์ฌํ ์ธ์ด)์ ์ปดํ์ผํ ๋ ๋ณํ ์ ํ์ ๋์ ํด์ผ ํ๋ ์ค๋๋ ฅ ์๋ ์ด์ ๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ด๋ก ์ ์ฝ๊ฐ ๋ ๋น ๋ฅผ ์ ์๋ค ํ๋๋ผ๋(ํ์ฌ ์ธ๋ ์์ง์ ๊ฒฝ์ฐ๋ ์์ฌ์ค๋ฝ์ต๋๋ค. ๊ทธ ๋ฐ๋์ผ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์), ๋ณํ ์ ํ์ MVP์ ํ์ํ์ง ์์์ผ ํ๋ ์ค์ํ ํฉ๋ณ์ฆ์ ๋๋ค. ๋๋ ๋น์ ์ ์กฐ๊ธฐ ๋ณต์ก์ฑ์ ๋ํ ์๊ตฌ์ ๋์ํ์ง ์์ต๋๋ค. ;)
ํจ์์ ๋ํ ๋๋ฑ์ฑ: Haskell ๋๋ SML๊ณผ ๊ฐ์ ์ธ์ด๊ฐ ์ด๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก func refs์ ์ง์ ์ ์ธ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. OCaml์ ๊ตฌ์กฐ์ ํ๋ฑ์ ์ํด ๋์ง๊ณ ๋ฌผ๋ฆฌ์ ์ธ ๊ฒ์ ๋ํ ๊ตฌํ ์ ์ ๋์์ ๋ช ์์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค. ํญ์ false๋ฅผ ๋ฐํํ๊ฑฐ๋ ํจ์์ ๋ํด throwํ๋ ๊ฒ์ ํ์ฉํ๋์ง ์ฌ๋ถ๋ ์ด๋ ค ์์ง๋ง ์ค์ ๋ก๋ ์ถฉ๋ถํ ์ ์์ผ๋ฉฐ ๊ฐ๋น์ผ ์ถ๊ฐ ๋ํ์ ์ปค๋ฐํ๊ธฐ ์ ์ ํ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
[๋ฉํ ๋ ผํ์ผ๋ก์, ๋๋ ๋น์ ์ด ๋น์ ์ ๊ฐ์์ ํค์ ๋ฎ์ถ๊ณ ์๋ง๋ ์ด๊ฒ์ด ์๋ง๋ ์ ๋ฅํ ์ฌ๋๋ค์ ์งํฉ์ด ์ฑ๊ธ ํค์ด ์๋๋ฉฐ ์ด์ ์ ๋๋๋ก ๋๋์ ํ์ ์ด ์ ์ฉ๋ ์ธ๊ณ๋ผ๋ ์์ด๋์ด๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.]
๋ฉํ ๋๊ธ๋ก์ ๊ฐ์๋ฅผ ์ข ์์ ํด ์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
๋ค์๋ค.
๊ทธ๋ฆฌ๊ณ ์๋ง๋ ์ด๊ฒ์ ์ ๋ฅํ ์ฌ๋๋ค์ ์งํฉ์ด ์ฑ๊ธํค์ด ์๋๊ณ ๋๋์ ํ์ ์ด ์ด์ ์ ๋๋๋ก ์ ์ฉ๋์๋ ์ธ๊ณ๋ผ๋ ์๊ฐ์ ๊ณ ๋ คํ์ ๊ฒ์ ๋๋ค.
์ ์กฐ์ธ์ ์ฌ๋ฌ ์ ๋ฌธ๊ฐ์์ ์๋ด์ ๊ธฐ๋ฐ์ผ๋ก ํฉ๋๋ค.
๋์ ์ ํ ์บ์คํธ๊ฐ ์๋ ์ธ์ด์์๋ ์ ์ ์ ํ ์ถ์ํ๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ ์ ์ถ์ํ๋ ๋งค๊ฐ๋ณ์์ ์์กดํ๊ณ ์บ์คํธ๋ ์ด๋ฅผ ๊นจ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ์๋ก์ด ๊ฒ์ ์์ผ๋ฉฐ ๊ทธ๊ฒ์ ๋ํด ๋ฌธ์๊ฐ ์์ฑ๋์์ต๋๋ค. ์ด๋ฌํ ์ปจํ ์คํธ์์๋ ๋ค๋ฅธ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
๋ด๊ฐ ์๋ดํ ์ด ์ ๋ฌธ๊ฐ๋ค์ ์ผ๋ถ ๋ ผ๋ฌธ์ ์ ์๋ฅผ ํฌํจํฉ๋๋ค.
์ด์ ๋ด๊ฐ ๊ทธ๋ค์ ์กฐ์ธ์ ์ฌ๋ฐ๋ฅด๊ฒ ํฉ์ฑํ๋์ง ํ์ธํ๊ธฐ ์ํด ์ด์ ์ ์ด ์ฃผ์ ์ ๋ํด ๋ ผ์ํ ์ ์ด ์๋ ์ผ๋ถ ํด๋น ๋ ผ๋ฌธ์ ๋ค๋ฅธ ์ ์์๊ฒ ์ด๋ฉ์ผ์ ๋ณด๋์ต๋๋ค. ์ ๊ฐ ์ง๋ฌธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋คํ์ฑ ํจ์ f๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
(...). ๋ด ์ ๋ ฅ ์ธ์ด์๋ (๊ฐ์ ) ํ์ ์ ํ ์ง์ ๋ฐ ๋ช ์์ ์บ์คํ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ t1์์ t2๋ก์ ์บ์คํธ๋ t2๊ฐ t1์ ํ์ ์ ํ์ธ์ง ์ฌ๋ถ๋ง ํ์ธํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก X์ ๊ฐ์ ์ ํ ๋ณ์์ ํ์ ์ ํ์ด๋ ์์ ์ ํ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(๋ฌผ๋ก ์์ฒด ์ ์ธ). f๊ฐ X์ ๋ํด ๊ด๊ณ์ ์ผ๋ก ๋ชจ์์ ์ด๋ผ๊ณ ์์ํ์๊ฒ ์ต๋๊น?
๊ทธ๋ค์ ์๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์, ์ด๊ฒ์ด ์ ๊ณตํ๋ ์ ์ผํ ๊ธฐ๋ฅ์ ์ด๋ฏธ ๊ด๊ณ์ ์ผ๋ก ๋งค๊ฐ๋ณ์์ธ ํญ๋ฑ ํจ์์ ๋์ผํ X์ ์บ์คํธ๋ฅผ ์์ฑํ๋ ๊ฒ์ด๊ธฐ ๋๋ฌธ์ ์ด๊ฒ์ด ๋งค๊ฐ๋ณ์๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์ด๊ฒ์ ๋ด ์กฐ์ธ๊ณผ ์ผ์นํฉ๋๋ค. ๋ฌผ๋ก ์ด๊ฒ์ ๋น๋ฉดํ ๋ฌธ์ ์ ๋จ์ํ์ด์ง๋ง WebAssembly์ ๋ํด ๋ณด๋ค ๊ตฌ์ฒด์ ์ผ๋ก ๋ฌธ์ ๋ฅผ ์กฐ์ฌํ๊ธฐ ์ํด ๋
ธ๋ ฅํ์ผ๋ฉฐ ์ง๊ธ๊น์ง ์ฐ๋ฆฌ์ ํ์์ ์ด๋ฌํ ๊ธฐ๋๊ฐ WebAssembly ๊ท๋ชจ์์๋ ๊ณ์ ์ ์ง๋๋ค๊ณ ์ ์ํ์ต๋๋ค. call_indirect
์ ์ธํ๊ณ ์ด ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
์ธ๊ธํ๊ณ ์๋ ์ ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ ์บ์คํ ํ ์ ์๋ ์ธ์ด์ ์ ์ฉ๋ฉ๋๋ค. ์ด ๊ด์ฐฐ์ ์บ์คํ ๊ฐ๋ฅ์ฑ์ ์ ํํ๋ ์์ด๋์ด๋ฅผ ์ป์ ๊ณณ์ ๋๋ค.
WASI ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค.
๋๋ ๋น์ ์ด ์ฃผ์ฅํ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค. ์ฐ๋ฆฌ๋ WASI ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ต๋๋ค. ์ฐ๋ฆฌ๋ ๋ณด์ ๋ฐ ํนํ ๊ธฐ๋ฅ ๊ธฐ๋ฐ ๋ณด์ ๋ถ์ผ์ ์ฌ๋ฌ ์ ๋ฌธ๊ฐ๋ฅผ ํฌํจํฉ๋๋ค.
๋ฉํ ์๊ฒฌ์ผ๋ก์ ๊ถ์์๋ CG์ ํธ์ํ์ฌ ๋ด ์ ์์ ๋ค์ด์ค ํ์๊ฐ ์๋ค๋ ์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค. ์บ์คํธ๋ฅผ ์ ํํ๋ฉด ์บ์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ์๋ ์ ์ ๋งค๊ฐ๋ณ์์ฑ์ ๋ณด์ฅํ ์ ์๋ค๊ณ ์ ์ํ์ต๋๋ค. ๋น์ ์ ์ฆ์ ๊ทธ ์ ์์ ๋ฌด์ํ๊ณ ํด๊ณ ๋ฅผ ์ ๋นํํ๊ธฐ ์ํด ์ด์ ๋ฌธ์์ ํธ์ํ์ต๋๋ค. ๊ทธ๋ฌ๋ ๋ด๊ฐ ๊ทธ ๋ ผ๋ฌธ์ ์ ์์๊ฒ ๋์ผํ ์ ์์ ํ์ ๋ ๊ทธ๋ค์ ์ฆ์ ๋์ ๋น์ ์ด ํ ์ ์์๋ ๊ฒ๊ณผ ๊ฐ์ ๊ฒฐ๋ก ์ ๋๋ฌํ์ต๋๋ค. ๊ทธ ์ ์๋ ์ ์ฌ์ ์ธ ์๋ฃจ์ ์ ํ๊ฐํ๋ ๊ฒ์ด ๊ธด ๊ณผ์ ์ด ๋ ๊ฒ์ด๋ผ๊ณ ์ ์ํ์ต๋๋ค. ๋น์ ์ ๊ทธ ์ ์์ ๋ฌด์ํ๊ณ ๋น์ ์ด (๋น์ ์ค์ค๋ก) ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ค๊ณ ์ฃผ์ฅํ์ฌ ์ฐ๋ฆฌ ๋์ ์ด ๊ธด ๋ํ๋ก ๋์ด๋ค์์ต๋๋ค. ํ ์ฌ๋์ ์ ์์ด ๋๋ฌด ๋ฌด์ฌ์ฝ ๋ฐ๋ณต์ ์ผ๋ก ๋ฌต์ด๋๋ฉด ์ง์ ์ ์ด๋ฃจ๊ณ ์ข์ ํ์ง ์๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค. (์ฌ๊ธฐ์ ๊ทํ์ ์ ์์ ๊ฐ๋ฅํ ํด๊ฒฐ์ฑ ์ผ๋ก ๋ฌด์ํ๋ ค๋ ๊ฒ์ด ์๋์ ๋ถ๋ช ํ ํด์ผ ํฉ๋๋ค. ์ ๋ ์ด๊ฒ์ด ์ ์ผํ ํด๊ฒฐ์ฑ ์ด ์๋๋ฏ๋ก ๋ค์ํ ๋ค๋ฅธ ์ฌ๋๋ค๊ณผ ํจ๊ป ํ๊ฐ๋์ด์ผ ํจ์ ๋ณด์ฌ์ฃผ๋ ค๊ณ ํฉ๋๋ค.)
์ด ๋ฌธ์ ์์ ์ ๊ธฐ๋ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ์ธ๋ถ์ ์ธ ๋์์ธ์ ์ ํ๊ณ ๋ฉด๋ฐํ ๊ฒํ ํ๋ ๊ฒ์ด ์ค์ํ๊ณ ์์์ ์ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค. ์ ๋ ์ค์ ๋ก ์ถ์ ์ ํ์ด ๋ ๋จผ ๊ธฐ๋ฅ์ผ๋ก ๊ฐ์ฃผ๋์ด์ผ ํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. WASI๋ ์ง๊ธ ๊ทธ๊ฒ๋ค์ด ํ์ํฉ๋๋ค.
๋๋ ๋ํ exact
+ newtype
๊ฐ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ ์ ์๊ธฐ๋ฅผ ํฌ๋งํ์ง๋ง, ๋ค์๊ณผ ๊ฐ์ ๊ฒฝ์ฐ ์ฑ๊ธํ๊ฒ ์ค๊ณ์ ์ ๋
ํจ์ผ๋ก์จ ํ ์์ ์์ ๋์ฅ์ ๋จ์ํ ์ด ์ง๊ฐ์ ๋ฒ ํ
ํ ์ ์๋ค๋ ๋ฐ ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ (๊ณง) ์ฐธ์กฐ ์ ํ์ ๋ฐฐ์กํฉ๋๋ค. ์ด์ ๋ํด ์ ๋๋ก ๋
ผ์ํ ์๊ฐ์ด ํ์ํฉ๋๋ค.
์ฆ, ์ฐธ์กฐ ์ ํ ์ ์์์ call_indirect
์๋ช
์ externref
๋ฅผ ํ์ฉํ๋ ๊ฒ์ด ์ํํ๋ค๊ณ ์๊ฐํ์ง ์์ต๋๋ค. ์, ๋ชจ๋์ด externref
๊ฐ์ ๋ด๋ณด๋ด๋ ๊ฒฝ์ฐ(const ์ ์ญ์ผ๋ก ๋๋ ํจ์์์ ๋ฐํํ๋ ...), ํด๋น externref
๋ค์ด์บ์คํธํ ์ ์๋์ง ์ฌ๋ถ๋ฅผ ๊ฒฐ์ ํ์ง ์์์ต๋๋ค. ๊ทธ๋ฌ๋ call_indirect
๋ externref
๋ค์ด์บ์คํ
ํ์ง ์์ต๋๋ค. funcref
๋ค์ด์บ์คํ
ํ๊ณ externref
๋ funcref-type-equality ๊ฒ์ฌ๋ฅผ ์ํํ๋ i32
์ ๋ค๋ฅธ ์ญํ ์ ํฉ๋๋ค. ๋ฐ๋ผ์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ, ์ ํ ๋ด๋ณด๋ด๊ธฐ ๋ฐ call_indirect
์์ ์ฌ์ ์ค์ธ ํ์ ์
๋ ฅ์ด ์๋ ๊ฒฝ์ฐ MVP์์ ์์ง ์ปค๋ฐํ์ง ์์ ์๋ก์ด ๋์์ธ ์ ํ์ ์ด๋ป๊ฒ ์ปค๋ฐํ๋์ง ์ ์ ์์ต๋๋ค. .
์ํ์ด ์๋ค๋ฉด ์๋ง๋ ์ด ๊ฒฉ๋ ฌํ ํ ๋ก ์ Type Imports ์ ์์์ ๋ ์ง์ค์ ์ธ ํ ๋ก ์ผ๋ก ์ค์ผ ์ ์์ ๊ฒ์ ๋๋ค(์ฌ๊ธฐ์ ๋๋ ์ฌ์ ํ ์ ์ ํ ์ถ์ ์ ํ ์ง์์ ํฌํจํด์ผ ํ๋ค๊ณ ์๊ฐํฉ๋๋ค)?
ํ์ ํ๋. ์ํ์์๊ฐ ์๋์ง ์๋์ง ์ดํด๋ณด๋ ๊ฒ์ด ์ข์ ๊ฒ ๊ฐ์์.
WASI์ ๊ด๋ จํ์ฌ ๋์์ธ์ ์ฌ์ ํ โโ์ ๋์ ์ด์ง๋ง ์ฌ์ ํ ์คํ ๊ฐ๋ฅํ ๊ฒ์ผ๋ก ๋ณด์ด๋ ํ ๊ฐ์ง ์ต์
์ ๋์ ๋ฉ๋ชจ๋ฆฌ ํ ๋น์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ "ํธ๋ค"์ i31ref
์ ๊ฐ์ ๊ฒ์ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค. WASI๋ ๋ค๋ฅธ ์ต์
์ ๊ฒฐ์ ํ ์ ์์ง๋ง ์์ ์ ํ์ฌ๋ก์๋ ์๋ฌด๋ ๋ชจ๋ฅด๋ฉฐ ์ง๊ธ ๋ด๋ฆฌ๋ ๊ฒฐ์ ์ด ์ด๋ฌํ ๊ฒฐ์ ์ ์ํฅ์ ๋ฏธ์น์ง ์๋ ๊ฒ์ด ์ข์ ๊ฒ์
๋๋ค.
ํ์ฌ externref
๋ ์ฌ์ฉ ๊ฐ๋ฅํ ์ ์ผํ ์ถ์ ์ ํ์ด๋ฏ๋ก WASI ๊ธฐ๋ฐ ํธ์คํธ๋ i31ref
(๋๋ WASI "ํธ๋ค"์ด ๋ฌด์์ด๋ )๋ก externref
๋ฅผ ์ธ์คํด์คํํฉ๋๋ค. ๊ทธ๋ฌ๋ ๋ด ์ดํด๋ WASI๊ฐ ํธ์คํธ ์ข
์ ์ฝ๋๋ฅผ ์ค์ด๊ธฐ ์ํด ๊ฐ๋ฅํ ํ WebAssembly๋ก ๊ตฌํ์ ์ฎ๊ธฐ๊ณ ์ถ์ดํ๋ค๋ ๊ฒ์
๋๋ค. ์ด๋ฅผ ์ฉ์ดํ๊ฒ ํ๊ธฐ ์ํด ์ด๋ ์์ ์์ WASI ์์คํ
์ externref
๋ค๋ฅธ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ทจ๊ธํ๊ณ WASI์ ์ถ์ ๋ด๋ณด๋ธ Handle
์ ํ์ผ๋ก ์ธ์คํด์คํํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ Handle
๊ฐ i31ref
์ด๋ฉด ๋ชจ๋ ๊ฒฝ๊ณ๋ฅผ ๋์ด ์๋ํ๋๋ก ํ๋ ๋ฐ ํ์ํ ์์ call_indirect
๊ตฌํ์ ์ฌ์ฉํ์ฌ ์ฌ๋๋ค์ด externref
๋ฅผ ํตํด ํธ๋ค์ ์์กฐํ๋๋ก ํ ์๋ ์์ต๋๋ค.
๊ทธ๋์ ์ ์ง๋ฌธ ์ค ํ๋๊ฐ ์ ์๋ ๊ฒ์๋ฌผ์ ๋ช
ํํ๊ฒ ๋ช
์๋์ง ์์์์ ์ ์ ์์ต๋๋ค. ์ฌ๋๋ค์ด externref
๋ฅผ ๋ค๋ฅธ ์ถ์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ฒ๋ผ ์ธ์คํด์คํํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๊น?
๊ทธ๋์ ๋ด ์ง๋ฌธ ์ค ํ๋๋, ์ด์ ๋ด ์๋ ๊ฒ์๋ฌผ์ ๋ช ํํ๊ฒ ๋ช ์๋์ง ์์์ผ๋ฉฐ, ์ฌ๋๋ค์ด
externref
๋ฅผ ๋ค๋ฅธ ์ถ์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ธ์คํด์คํํ ์ ์๊ธฐ๋ฅผ ์ํฉ๋๊น?
์ด ์ง๋ฌธ์ ๋ช
์์ ์ผ๋ก ์ ๊ธฐํด ์ฃผ์
์ ๊ฐ์ฌํฉ๋๋ค. FWIW, externref
๊ฐ WebAssembly ๋ชจ๋ ๋ด๋ถ์์ ์ธ์คํด์คํํ ์ ์๋ค๋ ๊ฒ์ ์ดํดํ ์ ์ด ์์ต๋๋ค. ์ด๋ WASI๊ฐ externref
๋ฅผ ํธ๋ค๋ก ์ฌ์ฉํ๋ ค๋ ๊ฒฝ์ฐ ๊ฐ์ํ์ ํธ์คํธ ์ฐธ์ฌ๋ฅผ ์๋ฏธํ์ง๋ง, ๋์๊ฒ๋ ๊ด์ฐฎ์ ๋ณด์ด๊ฑฐ๋ ์ต์ํ ๋ถ๋ฆฌ ๊ฐ๋ฅํ ํ ๋ก ์ผ๋ก ๋ณด์
๋๋ค.
ํ , ๋ด๊ฐ ๋ช ํํ ํ ์ ์๋์ง ๋ณด์. ๋๋ ๋น์ ์ด ์ด๋ฏธ ๋ค์๊ณผ ๊ฐ์ ๋ง์ ๊ฒ์ ์ดํดํ๊ณ ์๋ค๊ณ ์๊ฐํ์ง๋ง ์ฒ์๋ถํฐ ์์ํ๋ ๊ฒ์ด ๋ ์ฝ์ต๋๋ค.
wasm ๋ชจ๋์ ๊ด์ ์์ externref
๋ ํธ์คํธ ์ฐธ์กฐ๋ฅผ ์๋ฏธํ์ง ์์ต๋๋ค. ๋ชจ๋์ด ์๋ฌด๊ฒ๋ ๋ชจ๋ฅด๋ ๋ถํฌ๋ช
ํ ์ ํ์ผ ๋ฟ์
๋๋ค. ์คํ๋ ค ํธ์คํธ ์ฐธ์กฐ๋ก ํด์ํ๋ ๊ฒ์ externref
์ฃผ๋ณ์ ๊ท์น์
๋๋ค. ์๋ฅผ ๋ค์ด, externref
๋ฅผ ์ฌ์ฉํ์ฌ DOM๊ณผ ์ํธ ์์ฉํ๋ ๋ชจ๋์ ๊ท์น์ parentNode : [externref] -> [externref]
๋ฐ childNode : [externref, i32] -> [externref]
์ ๊ฐ์ด ๋ชจ๋์ด ๊ฐ์ ธ์ค๋ externref
์ ๊ด๋ จ๋ ํจ์์์ ๋ถ๋ช
ํฉ๋๋ค. childNode : [externref, i32] -> [externref]
. ํธ์คํธ ์์ฒด์ ๊ฐ์ ๋ชจ๋์ ํ๊ฒฝ์ ์ค์ ๋ก externref
์ ํด์์ ํธ์คํธ ์ฐธ์กฐ๋ก ์ ๊ณตํ๊ณ ํด๋น ํด์์ ํ์ฆํ๋ ๊ฐ์ ธ์จ ๋ฉ์๋์ ๊ตฌํ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ๋ฌ๋, ๋ชจ๋์ ํ๊ฒฝ์ ํธ์คํธ๋กํ์ง ์๊ณ externref
ํธ์คํธ ์ฐธ์กฐ ํ ํ์๊ฐ ์์ต๋๋ค. ํ๊ฒฝ์ ์์๋๋ ๊ท์น์ ๋ํ๋ด๋ ํธ์คํธ ์ฐธ์กฐ์ฒ๋ผ ๋ณด์ด๋ ์ผ๋ถ ์ ํ์ ๋ํ ๊ธฐ๋ฅ์ ์ ๊ณตํ๋ ๋ ๋ค๋ฅธ ๋ชจ๋์ผ ์ ์์ต๋๋ค. ๋ชจ๋ E๊ฐ ๋ชจ๋ M์ ํ๊ฒฝ์ด๊ณ ๊ทธ ๋ชจ๋ M์ด ์์ ๊ฐ์ด parentNode
๋ฐ childNode
๋ฅผ ๊ฐ์ ธ์๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. E๊ฐ M ๋ชจ๋์ ์ฌ์ฉํ๊ธฐ๋ฅผ ์ํ์ง๋ง DOM์ ๋ํ M์ ์ก์ธ์ค๋ฅผ ์ ํํ๊ธฐ๋ฅผ ์ํ๋ค๊ณ ๊ฐ์ ํด ๋ด
์๋ค. ์๋ฅผ ๋ค์ด E๊ฐ M์ ์ ํ์ ์ผ๋ก ์ ๋ขฐํ๊ฑฐ๋ E๊ฐ M์ด ๊ฐ์ง ์ ์๋ ๋ฒ๊ทธ๋ฅผ ์ ํํ๊ณ M์ ์๊ตฌ๊ฐ ์ด๋ฌํ ์ ํ์ ์ด๊ณผํด์๋ ์ ๋๋ค๋ ๊ฒ์ ์๊ณ ์๊ธฐ ๋๋ฌธ์
๋๋ค. E๊ฐ ํ ์ ์๋ ์ผ์ M์ externref
๋ก "MonitoredRef"๋ฅผ ์ฌ์ฉํ์ฌ M์ ์ธ์คํด์คํํ๋ ๊ฒ์
๋๋ค. ํนํ E๊ฐ M DOM ๋
ธ๋๋ฅผ ์ ๊ณตํ๋ ค๊ณ ํ์ง๋ง M์ด DOM ํธ๋ฆฌ ์๋ก ์ฌ๋ผ๊ฐ์ง ์๋๋ก ํ๋ ค๊ณ ํ๋ค๊ณ ๊ฐ์ ํด ๋ณด๊ฒ ์ต๋๋ค. ๊ทธ๋ฌ๋ฉด E์ MonitoredRef๋ ๊ตฌ์ฒด์ ์ผ๋ก ref (struct externref externref)
์ผ ์ ์์ต๋๋ค. ์ฌ๊ธฐ์ ๋ ๋ฒ์งธ externref
(E์ ๊ด์ ์์)๋ M์ด ์๋ํ๋ DOM ๋
ธ๋์ด์ง๋ง ์ฒซ ๋ฒ์งธ externref
๋ ์ ์กฐ์์
๋๋ค. M์ด ์ง๋๊ฐ ์ ์๋ ๋
ธ๋์
๋๋ค. ๊ทธ๋ฐ ๋ค์ E๋ M์ parentNode
๋ฅผ ์ธ์คํด์คํํ์ฌ ์ด ๋ ์ฐธ์กฐ๊ฐ ๋์ผํ ๊ฒฝ์ฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋๋ก ํ ์ ์์ต๋๋ค. E ์์ฒด๋ ์์ฒด parentNode
๋ฐ childNode
ํจ์๋ฅผ ๊ฐ์ ธ์์ E๋ฅผ DOM ์ํธ์์ฉ์ ๋ฐํ์ ๋ชจ๋ํฐ๋ก ํจ๊ณผ์ ์ผ๋ก ๋ง๋ญ๋๋ค.
์ธ๋ถ ์ฌํญ์ ๋ํด ๊ธธ์ ์๊ธฐ์๋ ๋๋ฌด ๊ตฌ์ฒด์ ์ด์ง ์์ผ๋ฉด์ ์ฌ๋ฐ๋ฅธ ๊ทธ๋ฆผ์ ๊ทธ๋ฆด ์ ์์ ๋งํผ ์ถฉ๋ถํ ๊ตฌ์ฒด์ ์ด๊ธฐ๋ฅผ ๋ฐ๋๋๋ค. ๋ถ๋ช
ํ ์ด์ ๊ฐ์ ํจํด์ด ๋ง์ด ์์ต๋๋ค. ๋ฐ๋ผ์ ์ง๋ฌธ์ ํํํ๋ ๋ ๋ค๋ฅธ ๋ฐฉ๋ฒ์ externref
๊ฐ ์ ํํ ํธ์คํธ ์ฐธ์กฐ๋ง ๋ํ๋ด๊ธฐ๋ฅผ ์ํฉ๋๊น?
๋์๊ฒ ์์ฌ์ค๋ฝ๊ฒ ๋ค๋ฆฌ๋ ์ ์ผํ ๋ถ๋ถ์ "E๊ฐ ํ ์ ์๋ ์ผ์ M์ externref
๋ก "MonitoredRef"๋ฅผ ์ฌ์ฉํ์ฌ M์ ์ธ์คํด์คํํ๋ ๊ฒ์
๋๋ค." ์ถ์ํํ๋ ๊ฒ์ ๋ค๋ฅธ ๋ชจ๋์์ externref
๋ก ํ์ํ๋๋ก ํ์ฉํ ๊ณํ์ด ์๋ค๋ ์ธ์์ ๋ฐ์ง๋ ์์ต๋๋ค. ๋ด ์ดํด๋ externref
๊ฐ ์ถ์ํ ๋๊ตฌ๊ฐ ์ ํ ์๋๋ผ๋ ๊ฒ์
๋๋ค.
๋๋ ๊ทธ๋ฐ ๊ณํ์ ๋ชจ๋ฅธ๋ค. ๋๋ ๋ํ ๋๊ตฐ๊ฐ๊ฐ ์ต์
์ ๊ณ ๋ คํ๋์ง ๋ชจ๋ฅด๊ฒ ์ต๋๋ค. ์ฆ, externref
๋ i32
์ ๊ฐ์ "๊ธฐ๋ณธ" ์ ํ์ด์ด์ผ ํฉ๋๊น, ์๋๋ฉด ๊ฐ์ ธ์จ ์ ํ๊ณผ ๊ฐ์ "์ธ์คํด์คํ ๊ฐ๋ฅํ" ์ ํ์ด์ด์ผ ํฉ๋๊น?
๋ด ์๋ ๊ฒ์๋ฌผ์์ ์ด๋ ์ชฝ์ด๋ ๊ด๋ฆฌํ ์ ์๋ค๊ณ ํ์ํ์ต๋๋ค. "์์์ " ํด์์ผ๋ก ๊ฐ๋ ์ ์ถฉ์์ externref
๊ฐ ๊ฐ์ ธ์จ ์ ํ๋ณด๋ค ํจ์ฌ ๋ ์ ์ฉํ๊ฑฐ๋ ๊ตฌ์ฑ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์
๋๋ค. ํ์๋ externref
์ ์ฌ์ฉ ์ฌ๋ก์ ์์ ํจํด์ ์ง์ํ๊ธฐ ๋๋ฌธ์
๋๋ค. ๋ฐ๋ผ์ "primitive" externref
๋ ์ด์ ๋ฒ์ ๊ณผ์ ํธํ์ฑ์ ์ํด์๋ง ์กด์ฌํ๋ฉฐ ํ์ ์ด ๋จ์ ๊ฒ ๊ฐ์ต๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ํน๋ณํ ๋ฌธ์ ๊ฐ ๋ ๊ฒ ๊ฐ์ง๋ ์์ผ๋ฉฐ ๋จ์ง ์ฑ๊ฐ์ ์ผ์
๋๋ค. ๋ด๊ฐ ๋ณผ ์์๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๋ ๋จ์ง์ ์ behavedness์ฒ๋ผ, ์ฆ call_indirect
์ซ์ ์ ํ์ ๊ทธ๋ค์ ๋ ์ํผ ํ์
์ ์ behavedness์ด ์๊ธฐ ๋๋ฌธ์ ๋ฐ์ผ๋ก ์๋ call_indirect
์ ๋ฐ๋ผ ๋๋ผ ์ ์์ต๋๋ค externref
์ํผํ์
๋ ์์ต๋๋ค.
์ํ, ์, ์ด๊ฒ์ ์ดํด์ ์ฐจ์ด๋ฅผ ์ค๋ช
ํฉ๋๋ค. externref
๊ฐ ์ ํ ์ถ์์ ์ด์ง ์๊ณ " externref
๋ฅผ ์ ํ์ผ๋ก ์ธ์คํด์คํ"ํ๋ค๋ ๊ฐ๋
์ด ์๋ค๋ @tlively์ ์๊ฒฌ์ ๋์ํฉ๋๋ค. ์ฐ๋ฆฌ๋ ์์ผ๋ก ์ด๊ฒ์ ๋ํด ๊ฝค ํ์ ํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค. ( externref
๋ ๋ช
์์ ์ผ๋ก ์ ์ธ๋ ์ ํ ๋งค๊ฐ๋ณ์์ ๋ฌ๋ฆฌ ๊ธฐ๋ณธ ์ ํ์ด๋ฏ๋ก ๋ชจ๋๋ณ๋ก ์ธ์คํด์คํ๋ฅผ ์๋ํ๋ ๋ฐฉ๋ฒ์ด ๋ช
ํํ์ง ์์ต๋๋ค.)
๋ค์ด์บ์คํธ๊ฐ ์๋ ๊ฒฝ์ฐ ์ด ์ฌ์ค์ WASI API๋ฅผ ๊ตฌํ/๊ฐ์ํํ๋ ๋ฐ wasm์ ๊ฑฐ์ ์ธ๋ชจ๊ฐ ์๊ฒ ๋ง๋ญ๋๋ค. ์ด๊ฒ์ด WASI์ ๋ํ ๊ณํ์ด i32
ํธ๋ค์์ Type Imports๋ก ์ง์ ์ ํํ๋ ๊ฒ์ด์์ต๋๋ค(๊ทธ๋ฆฌ๊ณ ๋ด๊ฐ type-imports๋ฅผ ์ ์ถํ ์ด์
externref
๋ ๋ช ์์ ์ผ๋ก ์ ์ธ๋ ์ ํ ๋งค๊ฐ๋ณ์์ ๋ฌ๋ฆฌ ๊ธฐ๋ณธ ์ ํ์ด๊ธฐ ๋๋ฌธ์ ์ด๋ป๊ฒ ๋ชจ๋๋ณ๋ก ์ธ์คํด์คํ๋ฅผ ์๋ํ ์ ์๋์ง ๋ช ํํ์ง ์์ต๋๋ค.
์ ํ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ถ๊ฐํ ๋ ์ ํ ๊ฐ์ ธ์ค๊ธฐ๊ฐ ์๋ ๋ชจ๋์ ์ฒ๋ฆฌํ ์ ์์ง๋ง externref
๊ฐ ์๋ ๋ชจ๋์ ๋งจ ์์ import type externref
๊ฐ ์๋ ๊ฒ์ผ๋ก ๊ฐ์ฃผ๋ฉ๋๋ค. ๋ค๋ฅธ ๊ธฐ๋ณธ ์ ํ๊ณผ ๋ฌ๋ฆฌ externref
์๋ ์ฐ๊ด๋ ๊ธฐ๋ณธ ์์
์ด ์๊ธฐ ๋๋ฌธ์ ๋ชจ๋ ๊ฒ์ด ๋์ผํ๊ฒ ์ ํ ๊ฒ์ฌ๋ฉ๋๋ค(๊ธฐ๋ณธ๊ฐ์ ๊ฐ๋ ๊ฒ ์ธ์). ๊ทธ๋ฌ๋ ์์์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ํตํด ์ด์ ๊ฐ์ํ, ์๋๋ฐ์ฑ ๋ฐ ๋ฐํ์ ๋ชจ๋ํฐ๋ง๊ณผ ๊ฐ์ ์์
์ ์ํํ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋ํด ์๋ค๋ก ๋์๊ฐ๊ธฐ ์ ์, ์ฐ๋ฆฌ ๋ชจ๋๊ฐ ๋ฌด์ธ๊ฐ์ ๋ํด ๊ฐ์ ํ์ด์ง์ ์๋์ง ํ๋จํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๋ค์ ์ง์ ์ ๋์ํ๊ฑฐ๋ ๋์ํ์ง ์๋์ง ์๋ ค์ฃผ์ญ์์ค. "์ผ๋จ ํ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์์ผ๋ฉด ๋ชจ๋์์ externref
๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์์ผ๋ฉฐ ๋์ ํ์ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ฉด ์ฉ๋ ๋ณ๊ฒฝ/๊ตฌ์ฑ์ด ๋ ์ฌ์์ง๋๋ค."
๋ค์ ์ง์ ์ ๋์ํ๊ฑฐ๋ ๋์ํ์ง ์๋์ง ์๋ ค์ฃผ์ญ์์ค. "์ผ๋จ ์ ํ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ฉด ๋ชจ๋์
externref
๋ฅผ ์ฌ์ฉํ ์ด์ ๊ฐ ์์ผ๋ฉฐ ๋์ ์ ํ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๋ ๋ง์ ์ฉ๋/๊ตฌ์ฑ์ด ๊ฐ๋ฅํฉ๋๋ค."
๋๋ ์ด๋ก์์ ์ด ๋ง์ ๋์ํฉ๋๋ค. ์ค์ ๋ก externref๋ ์ธ์คํด์คํ ์ ์ถ๊ฐ ๊ตฌ์ฑ์ด ํ์ํ์ง ์๊ธฐ ๋๋ฌธ์ ์ธ๋ถ JS ๊ฐ์ฒด๋ฅผ ์ฐธ์กฐํ๊ธฐ ์ํด ์น ์ปจํ ์คํธ์์ ์ผ๋ฐ์ ์ผ๋ก ์ ์ง๋ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค. ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ ๋จ์ง ์์ธก์ผ ๋ฟ์ด๋ฉฐ ๋ด๊ฐ ์๋ชป๋ ๊ฒ์ผ๋ก ํ๋ช ๋์ด ๋ชจ๋ ์ฌ๋๋ค์ด ๊ฒฐ๊ตญ ์ ํ ๊ฐ์ ธ์ค๊ธฐ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ผ๋ก ์ ํํ๋๋ผ๋ ์๊ดํ์ง ์์ ๊ฒ์ ๋๋ค. externref์ ๊ฐ์น๋ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ๋ ํ๋ถํ ๋ฉ์ปค๋์ฆ์ ๊ฐ์ง ์ ์๋ ๊ฒ๋ณด๋ค ๋ ๋นจ๋ฆฌ ๊ฐ์ง ์ ์๋ค๋ ๊ฒ์ ๋๋ค. ๋๋ externref๋ฅผ ๋จ์ํ๊ฒ ์ ์งํ๊ณ ๋์ค์ ๋ ์ฐ์ํ ๋์์ด์์ ๋ ์ด์ํ๊ฒ ๋ ๊ฐ๋ ฅํ ๊ฒ์ผ๋ก ๊ตฌ๋ถ๋ฆฌ๊ธฐ๋ณด๋ค ์ฌ์ฉํ์ง ์๋ ๊ฒ์๋ณด๊ณ ์ถ์ต๋๋ค.
@tlively ,
FWIW, ๋๋ WebAssembly ๋ชจ๋ ๋ด๋ถ์์ externref๋ฅผ ์ธ์คํด์คํํ ์ ์๋ค๋ ๊ฒ์ ์ดํดํ ์ ์ด ์์ต๋๋ค.
๋ง์ต๋๋ค. ์์ด๋์ด๋ externref๊ฐ ์ธ๋ถ ํฌ์ธํฐ์ "์์" ์ ํ์ด๋ผ๋ ๊ฒ์ ๋๋ค. ์ฐธ์กฐ ์ ํ์ ๊ตฌํ ์ธ๋ถ ์ฌํญ์ ์ถ์ํํ๋ ค๋ฉด anyref ๋๋ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ๊ฐ์ ๋ค๋ฅธ ๊ฒ์ด ํ์ํฉ๋๋ค.
@lukewagner , ๋๋ ๊ทธ๊ฒ์ด ๋ฐ๋์งํ๋ค๋ฉด ์ ํ ๊ฐ์ ธ์ค๊ธฐ ์ ์์ ๋ฒ์๋ฅผ ๋ํ๋ ๋ฐ
@RossTate :
๋ด๊ฐ ์๋ดํ ์ด ์ ๋ฌธ๊ฐ๋ค์ ์ผ๋ถ ๋ ผ๋ฌธ์ ์ ์๋ฅผ ํฌํจํฉ๋๋ค.
ํ๋ฅญํ. ๊ทธ๋ฐ ๋ค์ ๋ ๋ง์ ๊ถ์๋ฅผ ์ฐพ๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๊ทํ๊ฐ ์ด ๋ ๋ ผ๋ฌธ์ ์ ์๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. :)
์ ๊ฐ ์ง๋ฌธํ ๋ด์ฉ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
๋คํ์ฑ ํจ์ f(...)๊ฐ ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. ๋ด ์ ๋ ฅ ์ธ์ด์๋ (๊ฐ์ ) ํ์ ์ ํ ์ง์ ๋ฐ ๋ช ์์ ์บ์คํ ์ด ์์ต๋๋ค. ๊ทธ๋ฌ๋ t1์์ t2๋ก์ ์บ์คํธ๋ t2๊ฐ t1์ ํ์ ์ ํ์ธ์ง ์ฌ๋ถ๋ง ํ์ธํฉ๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก X์ ๊ฐ์ ์ ํ ๋ณ์์ ํ์ ์ ํ์ด๋ ์์ ์ ํ์ด ์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค(๋ฌผ๋ก ์์ฒด ์ ์ธ). f๊ฐ X์ ๋ํด ๊ด๊ณ์ ์ผ๋ก ๋ชจ์์ ์ด๋ผ๊ณ ์์ํ์๊ฒ ์ต๋๊น?
ํ์จ์ ์ฌ๋ค. ๋๋ ๊ทธ ํน์ ํ ์ง๋ฌธ์ ๊ฐ์ ๋๋ต์ ํ ๊ฒ์ด๋ค. ๊ทธ๋ฌ๋ ์ด ์ง๋ฌธ์ ์๋ฅผ ๋ค์ด ์บ์คํธ์ ํน์ฑ, ๊ทธ๋ฆฌ๊ณ ์ด๋ค ํ๋ก๊ทธ๋๋ฐ ์ธ์ด์๋ ๊ฑฐ์ ์กด์ฌํ์ง ์๋ ์ ํ๋ ์๋ํ์ ๋ฌด์ ํ ์๋ํ ๊ฐ์ ๋ค์ ํน์ดํ ๊ตฌ๋ณ์ ๋ํ ๋ช ๊ฐ์ง ํน์ ๊ฐ์ ์ ๊ตฌํํฉ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ๊ทธ๊ฒ์ด ์ด์ ๊ฐ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋ด๊ฐ "์ ์ ์ ํ ์ถ์ํ๊ฐ ๋ถ์ถฉ๋ถํ๋ค"๊ณ ๋งํ์ ๋ ๋๋ ๊ทธ๊ฒ์ด _๊ธฐ์ ์ ์ผ๋ก_ ๊ฐ๋ฅํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํ์ง ์์์ต๋๋ค(๋ฌผ๋ก ๊ฐ๋ฅํฉ๋๋ค). ๊ทธ๋ฌ๋ ๊ทธ๊ฒ์ด _์ค์ ์ ์ผ๋ก_ ์ ์ ํ์ง ์๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค. ์ค์ ๋ก๋ ์ ํ ์ถ์ํ์ ํ์ ์ ํํ/์บ์คํ ๊ฐ๋ฅ์ฑ(๋๋ ๋งค๊ฐ๋ณ์ ์ ํ๊ณผ ๋น ๋งค๊ฐ๋ณ์ ์ ํ ์ฌ์ด)์ ๋ถ๊ธฐ๋ฅผ ์ํ์ง ์์ต๋๋ค. ์ด๋ ์บ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ตฌ์ฑ์ ์ธ์์ ์ผ๋ก ๊นจ๋จ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
๋๋ ๋น์ ์ด ์ฃผ์ฅํ๋ ๊ฒ์ ์ดํดํ์ง ๋ชปํฉ๋๋ค.
์ถ์ ์ ํ์ ๊ฐ์ ๋ฐ์ ๊ฒฝ์ฐ์๋ ์ ํํ ์ ํ์ ์์ด๋ฒ๋ฆฌ๊ณ ์ถ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ์ด๋ฅผ ์ผ์ข ์ ํฉ์งํฉ์ ๋ฃ๊ณ ๋์ค์ ๋ค์ด์บ์คํธ๋ฅผ ํตํด ๋ณต๊ตฌํ๊ธฐ๋ฅผ ์ํ ์ ์์ต๋๋ค. ๋ค๋ฅธ ์ฐธ์กฐ ์ ํ์ ๋ํด ์ํ๋ ๊ฒ๊ณผ ๊ฐ์ ์ด์ ๋ก ๊ทธ๋ ๊ฒ ํ ์ ์์ต๋๋ค. ์ ํ ์ถ์ํ๋ ๋์ผํ ์ข ๋ฅ์ ์ผ๋ฐ ์ ํ์ ์ ํจํ ํน์ ์ฌ์ฉ ํจํด์ ๋ฐฉํดํด์๋ ์ ๋ฉ๋๋ค.
๊ทํ์ ๋๋ต์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค. ๊ทธ๋์ ๊ฐ ์ฌ์ฉ ์ฌ์ดํธ์ ๋ณด์กฐ ์ ํ, ์๋ฅผ ๋ค์ด ๋ณํ์ผ๋ก ๋ชจ๋ ๊ฒ์ ๋ํํ์ญ์์ค. ๊ทธ๋ฌ๋ ์ด๋ ์๋นํ ๋ํ/์ธ๋ํ ์ค๋ฒํค๋๋ฅผ ์๋ฏธํ ์ ์์ผ๋ฉฐ ๋ ๋ณต์กํ ์ ํ ์์คํ ๊ธฐ๋ฅ์ด ํ์ํ๋ฉฐ ์ฌ์ฉํ๊ธฐ๊ฐ ๋ ๋ณต์กํฉ๋๋ค.
MVP๊ฐ ์ฐธ์กฐ ์ ํ์ ํฉ์งํฉ์ ์ง์ํด์ผ ํ๋์ง, ๋๋ ๋ช ์์ ๋ณํ ์ ํ์ ๋์ ํ๊ณ ์ธ์ฝ๋ฉํด์ผ ํ๋์ง ์ฌ๋ถ์ ๋ํด ์๊ฒฌ์ด ๋ถ๋ถํฉ๋๋ค. ์ข๋ ๋์๋ , ๊ณต์ฉ์ฒด๋ ์ผ๋ฐ์ ์ธ ์์ง์ ํ ์ธํฐํ์ด์ค์ ์์ฐ์ค๋ฝ๊ฒ ์ผ์นํ๋ฉฐ ์ค๋๋ ์ง์ํ๊ธฐ ์ฝ๊ณ ์ ๋ ดํฉ๋๋ค. ๋ณํ์ด ๋ง์ง๋ ์์ง๋ง ์ต์ํ ๊ธฐ์กด ์์ง์์ ์ถ๊ฐ ์ค๋ฒํค๋์ ์์ธก ๋ถ๊ฐ๋ฅํ ์ฑ๋ฅ์ ์ ๋ฐํ ๊ฐ๋ฅ์ฑ์ด ์๋ ํจ์ฌ ๋ ์ฐ๊ตฌ์ ์ธ ์ ๊ทผ ๋ฐฉ์์ ๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋๋ ์ ํ ์์คํ ์ฌ๋์ผ๋ก์ ์ฌ์ฉ์ ๋๋ฉด ์ธ์ด์ ๊ฐ์ ๋ค๋ฅธ ์ํฉ์์ ๊ณต์ฉ์ฒด๋ณด๋ค ๋ณํ์ ํจ์ฌ ์ ํธํ๋ค๊ณ ๋งํ๊ณ ์์ต๋๋ค. ;)
๋ฉํ ์๊ฒฌ์ผ๋ก์ ๊ถ์์๋ CG์ ํธ์ํ์ฌ ๋ด ์ ์์ ๋ค์ด์ค ํ์๊ฐ ์๋ค๋ ์ ์ ์ ๋ง ๊ฐ์ฌ๋๋ฆฝ๋๋ค.
๋ค์ํ ์ ์์ ๋ํ ๋ํ๊ฐ _๊ฐ์ _ํ๊ธฐ ์ ์ ํน์ ๊ทผ๊ฑฐ๋ ๋ฏธ๋ ๊ณํ(ํญ์ ๋ช ํํ์ง ์๊ฑฐ๋ ์์ง ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ)๊ณผ ๊ฐ์ด ๋ช ํํ์ง ์์ ๊ฒ์ ๋ํด ๊ฐ ์ฑํผ์ธ์๊ฒ _๋ฌป๋_ ์์ํ๋ฉด ๋ ํจ๊ณผ์ ์ผ ์ ์๋ค๊ณ ์น์ ํ๊ฒ ์ ์ํฉ๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ ๊ธฐ์ดํ์ฌ ๋๋ตํ๊ณ ๊ด๋ฒ์ํ ์ฃผ์ฅ๊ณผ ์ ์์ ํฉ๋๊น?
ํ๋ฅญํ. ๊ทธ๋ฐ ๋ค์ ๋ ๋ง์ ๊ถ์๋ฅผ ์ฐพ๊ณ ์๋ ๊ฒฝ์ฐ๋ฅผ ๋๋นํ์ฌ ๊ทํ๊ฐ ์ด ๋ ๋ ผ๋ฌธ์ ์ ์๋ผ๋ ์ฌ์ค์ ์๊ฒ ๋์๋ค๊ณ ๊ฐ์ ํฉ๋๋ค. :)
์, ๋ด ์ ์์ด ๊ทธ๋ฌํ ์ฃผ์ฅ์ด ์ด๋ฃจ์ด์ง ์กฐ๊ฑด์ ๊ตฌ์ฒด์ ์ผ๋ก ๋ค๋ฃจ๊ณ ์์์ ์๊ณ ์์์๋ ๋ถ๊ตฌํ๊ณ ๋ด ์ ์์ด ํจ๊ณผ๊ฐ ์๋ค๊ณ ์ฃผ์ฅํ๋ ๋ฌธ์๊ฐ ์๋ค๊ณ ์ ์ํ๋ฉด ๋งค์ฐ ๋ฌธ์ ๊ฐ ๋ฉ๋๋ค.
์ค์ ๋ก๋ ์ ํ ์ถ์ํ์ ํ์ ์ ํํ/์บ์คํ ๊ฐ๋ฅ์ฑ(๋๋ ๋งค๊ฐ๋ณ์ ์ ํ๊ณผ ๋น ๋งค๊ฐ๋ณ์ ์ ํ ์ฌ์ด)์ ๋ถ๊ธฐ๋ฅผ ์ํ์ง ์์ต๋๋ค. ์ด๋ ์บ์คํธ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ํ๋ ๊ตฌ์ฑ์ ์ธ์์ ์ผ๋ก ๊นจ๋จ๋ฆด ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค.
์ด๊ฒ์ ์ฌ์ค์ด ์๋๋ผ ์๊ฒฌ์ ๋๋ค. ๋ค๊ตญ์ด ์์คํ ์ ์ํ ์ธ์ด์ ๊ตฌ์ ๋ฐ์ง ์๋ ์ฐ์ ์ ํ ์ด์ ๋ธ๋ฆฌ ์ธ์ด๋ ์์ผ๋ฉฐ ๋ฐ๋ผ์ ์คํ์ ๋ํด ์ฃผ์ฅํ๋ ๊ฒ์ ๋ถ๊ฐ๋ฅํฉ๋๋ค. ์ด๊ฒ์ ์ฒ ์ ํ(๋ณ๋์) ๋ ผ์๊ฐ ํ์ํ ๊ฒ์ ๋๋ค. ๊ทธ ๋ ผ์๋ฅผ ์ํด ๋จผ์ CG๊ฐ ์ฅ๋จ์ ์ ๋น๊ตํ ์ ์๋๋ก ๋ช ๊ฐ์ง ์์ธํ ์ฌ๋ก ์ฐ๊ตฌ๋ฅผ ์ ๊ณตํ๋ ๊ฒ์ด ๋์์ด ๋ ๊ฒ์ ๋๋ค.
๋ค์ํ ์ ์์ ๋ํ ๋ํ๊ฐ ํน์ ๊ทผ๊ฑฐ๋ ๋ฏธ๋ ๊ณํ(ํญ์ ๋ช ํํ์ง ์๊ฑฐ๋ ์์ง ์์ฑ๋์ง ์์ ๊ฒฝ์ฐ)๊ณผ ๊ฐ์ด ๋ช ํํ์ง ์์ ์ฌํญ์ ๋ํด ๊ฐ ์ฑํผ์ธ์๊ฒ ๋ฌผ์ด๋ณด๋ ๊ฒ๋ถํฐ ์์ํ๋ฉด ๋ค์ํ ์ ์์ ๋ํ ๋ํ๊ฐ ๋ ํจ๊ณผ์ ์ผ ์ ์๋ค๋ ์ ์ ์ ์ํ๊ณ ์ถ์ต๋๋ค. ์ด๋ฌํ ๊ฐ์ ์ ๊ธฐ์ดํ์ฌ ๋๋ตํ๊ณ ๊ด๋ฒ์ํ ์ฃผ์ฅ๊ณผ ์ ์์ ํฉ๋๊น?
WebAssembly/proposal-type-imports#4, WebAssembly/proposal-type-imports#6 ๋ฐ WebAssembly/proposal-type-imports#7์ ๊ฐ๊ฐ ๋ณธ์ง์ ์ผ๋ก ์ด ๊ณํ์ ๋ํ ๋ ์์ธํ ๋ด์ฉ์ ์์ฒญํ์ต๋๋ค. ์ด ์ค ๋ง์ง๋ง์ GC์ ๋ฌธ์ ๋ฅผ ์ ๊ธฐํ์ง๋ง WebAssembly/gc#86์ ํ์ฌ GC ์ ์์ด ์ค์ ๋ก ๋์ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ ์ง์ํ์ง ์๋๋ค๊ณ ์ง์ ํฉ๋๋ค.
๋ฉํ ์์ค์์ ์ฐ๋ฆฌ๋ ์ด ํ ๋ก ์ ์ ์ณ๋๊ณ ๋น๋ฉดํ ์ฃผ์ ์ ์ง์คํ๋ผ๋ ์์ฒญ์ ๋ฐ์์ต๋๋ค. ๋ด ์ง๋ฌธ์ ๋ํ @tlively ์ ๋ต๋ณ์ด ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์
@RossTate :
๋ด ์ง๋ฌธ์ ๋ํ @tlively ์ ๋ต๋ณ์ด ๋งค์ฐ ์ ์ฉํ๋ค๋ ๊ฒ์
ํ , ์์์ ์ด๋ฏธ ๋๊ธ์ ๋ฌ์๋ ๊ฒ ๊ฐ์์. ์๋๋ฉด ๋ค๋ฅธ ๋ป์ธ๊ฐ์?
์๋์. ๊ทธ ๋๊ธ์ด ๊ทธ์ ๋๋ต์ ๋์ํ๋ค๋ ๋ป์ผ ์๋ ์๋ค๊ณ ์๊ฐํ์ง๋ง ๋จผ์ ํ์ธํ๊ณ ์ถ์๋ค. ๊ฐ์ฌ ํด์!
@lukewagner , ์ด๋ป๊ฒ ์๊ฐํ์ธ์?
๋๋ externref
๊ฐ ์์ํ ๊ธฐ๋ณธ ์ ํ์ด ๋ ๊ฒ์ด๋ฉฐ ์๊ธํด์ ์ ํ ๋งค๊ฐ๋ณ์๋ก ์ฌํด์๋์ง ์์ ๊ฒ์ด๋ผ๋ ์ ์ ๋์ํฉ๋๋ค. ๊ทธ๋ฐ ์ ์ ๊ฐ์ํ ๋ ์ฐธ์กฐ ์ ํ์ ๊ทธ๋๋ก ์ฌ์ฉํ ์ ์๋ค๊ณ ์๊ฐํฉ๋๋ค.
๋๋ ๊ทธ๊ฒ์ด ์ถ์์ ์ธ ํํ๋ฅผ ๊ตฌํํ๋ wasm ์์๋ ๊ธฐ๋ฅ์ ํฌํจํ๋๋ก ์ ํ ์์ ์ ์์ ๋ฒ์๋ฅผ ํ์ฅํ๊ธฐ ์ํด ์ ์์ @rossberg์ ์ฐจ์ง ์ถ์ต๋๋ค. ์ผ๋จ ์ฐ๋ฆฌ๊ฐ ๊ทธ๊ฒ์ ์ ๋ฆฌํ ์ ์๋ค๋ฉด, ํจ์ ์ฐธ์กฐ ๋ฐ ํ์ ์ ํ ์ง์ ์ ๋ํ ์ถ๊ฐ ๋ ผ์๋ฅผ ์ฐจ๋จ ํด์ ํ ๊ฒ์ด๋ผ๊ณ ์๊ฐํฉ๋๋ค.
์์ฒญ๋. ๊ทธ๋ฐ ๋ค์ ์ฐ๋ฆฌ๋ ๋ชจ๋ ๊ฐ์ ํ์ด์ง์ ์์ต๋๋ค(์ ๋ @tlively๊ฐ ๊ด๋ จ๋ ์ ์ถฉ์ ๊ณผ ๊ฒฐ์ ์ ๋ํ ๊ทผ๊ฑฐ์ ๋ํ ํ๋ฅญํ ์์ฝ์ ์ ๊ณตํ๋ค๊ณ ์๊ฐํฉ๋๋ค).
๋ฐ๋ผ์ externref
๋ ์ธ์คํด์คํํ ์ ์์ผ๋ฉฐ ์ ํ ๊ฐ์ ธ์ค๊ธฐ์ ์ถ๊ฐ ์ ์ฐ์ฑ์ ์ฐพ๋ ๋ชจ๋์ ๊ธฐ๋ฅ์ด ๋ฆด๋ฆฌ์ค๋ ๋ ์ ํ ๊ฐ์ ธ์ค๊ธฐ๋ก ๋ณํ๋ ๊ฒ์ผ๋ก ์์๋ฉ๋๋ค. ๊ทธ ์ ํ์ ์ํํ๊ฒ ํ๋ ค๋ฉด ์ธ์คํด์คํ๊ฐ ์ ๊ณต๋์ง ์์ ๊ฒฝ์ฐ ๊ธฐ๋ณธ์ ์ผ๋ก (์ผ๋ถ?) ์ ํ ๊ฐ์ ธ์ค๊ธฐ๊ฐ externref
๋ก ์ธ์คํด์คํ๋๋๋ก ๋ง๋ค์ด์ผ ํ ๊ฒ ๊ฐ์ต๋๋ค.
๊ทธ๋ฆฌ๊ณ Type Imports์ ๋ฒ์๋ฅผ ํ์ฅํ์๋ ์ ์๋ ๋ฐ์๋ค์ด๊ณ ์ถ์ต๋๋ค. ํ์ ๊ฐ์ ธ์ค๊ธฐ์ ์ฃผ์ ์์ฉ ํ๋ก๊ทธ๋จ ์ค ๋ง์ ๋ถ๋ถ์ด ์ถ์ํ๋ฅผ ํ์๋ก ํ๋ฏ๋ก ์ถ์ํ๊ฐ ํด๋น ์ ์์ ์ผ๋ถ์ธ ๊ฒ์ด ๋น์ฐํด ๋ณด์ ๋๋ค.
ํํธ, externref
์ ๋ํ ๊ธด๊ธํ ์ง๋ฌธ์ ํด๊ฒฐํ์ง๋ง call_indirect
์ ๋ํด ๋ณด๋ค ์ผ๋ฐ์ ์ผ๋ก ๋ฌด์์ ํด์ผ ํ๋์ง๋ ์ฌ์ ํ ํด๊ฒฐ๋์ง ์๊ณ ์์ต๋๋ค. ์ฌ์ ํ ๋ฌธ์ ๋ฅผ ์ด์ด๋ ๊ฒ์
๋๋ค.
๊ฐ์ฌ ํด์!
๊ฐ์ฅ ์ ์ฉํ ๋๊ธ
๋์ ์ ํ ์บ์คํธ๊ฐ ์๋ ์ธ์ด์์๋ ์ ์ ์ ํ ์ถ์ํ๊ฐ ์ถฉ๋ถํ์ง ์์ต๋๋ค. ์ ์ ์ถ์ํ๋ ๋งค๊ฐ๋ณ์์ ์์กดํ๊ณ ์บ์คํธ๋ ์ด๋ฅผ ๊นจ๊ธฐ ๋๋ฌธ์ ๋๋ค. ๊ทธ๊ฒ์ ๋ํด ์๋ก์ด ๊ฒ์ ์์ผ๋ฉฐ ๊ทธ๊ฒ์ ๋ํด ๋ฌธ์๊ฐ ์์ฑ๋์์ต๋๋ค. ์ด๋ฌํ ์ปจํ ์คํธ์์๋ ๋ค๋ฅธ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ด ํ์ํฉ๋๋ค.
์ถ์ ์ ํ์ ์ฌ์ฉ์ ์ ํํ์ฌ ์ด ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๋ ค๊ณ ํ๋ฉด ๋ชฉ์ ์ด ๋ฌดํจํ๋ฉ๋๋ค. WASI ์ฌ์ฉ ์ฌ๋ก๋ฅผ ๊ณ ๋ คํ์ญ์์ค. WASI ๋ชจ๋๊ณผ WASI ๋ชจ๋์ด ๋ด๋ณด๋ด๋ ๋ชจ๋ ์ ํ์ด ํธ์คํธ์ ์ํด ๊ตฌํ๋๋์ง ๋๋ Wasm์์ ๊ตฌํ๋๋์ง๋ ์ค์ํ์ง ์์ต๋๋ค. ์ฌ์ฉ์ ์ ์ ์ถ์ ์ ํ์ ์์๋ก ์ ํํ๋ฉด Wasm ๊ตฌํ์ ์ผ๋ฐ์ ์ผ๋ก ํธ์คํธ ๊ตฌํ๊ณผ ๋ ์ด์ ํธํ๋์ง ์์ต๋๋ค.
๋ญ? ์ ์์ ๋ฐ๋ผ ํ์ ์ ํ ์ง์ ๊ท์น์ ์ผ๋ถ์ ๋๋ค.
ํ๋ค๊ณ ๋งํ์ง ์์์ต๋๋ค. ๋๋ ์ด๊ฒ์ด call_indirect ์์ฒด์ ๋ฌธ์ ๊ฐ ์๋๋ผ ์บ์คํธ๊ฐ ์๋ ์ธ์ด์ ์ ํฉํ ์ ํ ์ถ์ํ ๋ฉ์ปค๋์ฆ์ ์ ํํ๋ ๋ฌธ์ ๋ผ๊ณ ๋งํ์ต๋๋ค.
์ ์ณ๋๊ณ , OCaml(๋๋ ์ ์ฌํ ์ธ์ด)์ ์ปดํ์ผํ ๋ ๋ณํ ์ ํ์ ๋์ ํด์ผ ํ๋ ์ค๋๋ ฅ ์๋ ์ด์ ๋ ์์ต๋๋ค. ๊ทธ๊ฒ์ด ์ด๋ก ์ ์ฝ๊ฐ ๋ ๋น ๋ฅผ ์ ์๋ค ํ๋๋ผ๋(ํ์ฌ ์ธ๋ ์์ง์ ๊ฒฝ์ฐ๋ ์์ฌ์ค๋ฝ์ต๋๋ค. ๊ทธ ๋ฐ๋์ผ ๊ฐ๋ฅ์ฑ์ด ๋ ๋์), ๋ณํ ์ ํ์ MVP์ ํ์ํ์ง ์์์ผ ํ๋ ์ค์ํ ํฉ๋ณ์ฆ์ ๋๋ค. ๋๋ ๋น์ ์ ์กฐ๊ธฐ ๋ณต์ก์ฑ์ ๋ํ ์๊ตฌ์ ๋์ํ์ง ์์ต๋๋ค. ;)
ํจ์์ ๋ํ ๋๋ฑ์ฑ: Haskell ๋๋ SML๊ณผ ๊ฐ์ ์ธ์ด๊ฐ ์ด๋ฅผ ์ง์ํ์ง ์์ผ๋ฏ๋ก func refs์ ์ง์ ์ ์ธ ์ด์ ์ ์ป์ ์ ์์ต๋๋ค. OCaml์ ๊ตฌ์กฐ์ ํ๋ฑ์ ์ํด ๋์ง๊ณ ๋ฌผ๋ฆฌ์ ์ธ ๊ฒ์ ๋ํ ๊ตฌํ ์ ์ ๋์์ ๋ช ์์ ์ผ๋ก ๊ฐ์ง๊ณ ์์ต๋๋ค. ํญ์ false๋ฅผ ๋ฐํํ๊ฑฐ๋ ํจ์์ ๋ํด throwํ๋ ๊ฒ์ ํ์ฉํ๋์ง ์ฌ๋ถ๋ ์ด๋ ค ์์ง๋ง ์ค์ ๋ก๋ ์ถฉ๋ถํ ์ ์์ผ๋ฉฐ ๊ฐ๋น์ผ ์ถ๊ฐ ๋ํ์ ์ปค๋ฐํ๊ธฐ ์ ์ ํ์ํ ๊ฐ์น๊ฐ ์์ต๋๋ค.
[๋ฉํ ๋ ผํ์ผ๋ก์, ๋๋ ๋น์ ์ด ๋น์ ์ ๊ฐ์์ ํค์ ๋ฎ์ถ๊ณ ์๋ง๋ ์ด๊ฒ์ด ์๋ง๋ ์ ๋ฅํ ์ฌ๋๋ค์ ์งํฉ์ด ์ฑ๊ธ ํค์ด ์๋๋ฉฐ ์ด์ ์ ๋๋๋ก ๋๋์ ํ์ ์ด ์ ์ฉ๋ ์ธ๊ณ๋ผ๋ ์์ด๋์ด๋ฅผ ๊ณ ๋ คํ๋ค๋ฉด ์ ๋ง ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.]