Design: call_indirect ๋Œ€ ์ถ”์ƒํ™”

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

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

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

  1. ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์„ ์‚ฌ์šฉํ•˜๋ฉด ์‹ค์ œ ํ•จ์ˆ˜์˜ ์ •์˜๋œ ์„œ๋ช…์ด ์˜ˆ์ƒ ์„œ๋ช…์˜ "ํ•˜์œ„ ์„œ๋ช…"์ธ ํ•œ ์ง์ ‘ ํ˜ธ์ถœ์ด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ๋ชจ๋“  ์ž…๋ ฅ ์œ ํ˜•์ด ํ•จ์ˆ˜ ๋งค๊ฐœ๋ณ€์ˆ˜ ์œ ํ˜•์˜ ํ•˜์œ„ ์œ ํ˜•์ด๊ณ  ๋ชจ๋“  ์ถœ๋ ฅ ์œ ํ˜•์ด ํ•จ์ˆ˜์˜ ์ƒ์œ„ ์œ ํ˜•์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ ์œ ํ˜•. ์ด๊ฒƒ์€ ๊ฐ„์ ‘ ํ˜ธ์ถœ์˜ ์˜ˆ์ƒ ์„œ๋ช…๊ณผ ํ•จ์ˆ˜์˜ ์ •์˜๋œ ์„œ๋ช… ๊ฐ„์˜ ๋™๋“ฑ์„ฑ ๊ฒ€์‚ฌ๊ฐ€ ์™„๋ฒฝํ•˜๊ฒŒ ์•ˆ์ „ํ•œ ์—ฌ๋Ÿฌ ์ƒํ™ฉ์—์„œ ํŠธ๋žฉ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•˜๋ฉฐ, ์ด๋Š” ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๋ฐ ๊ฐ„์ ‘ ํ˜ธ์ถœ์„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๋Š” ๋ฐ ๋ฌธ์ œ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์„œ๋ธŒํƒ€์ดํ•‘ ์—ฐ๊ธฐ). ๋˜ํ•œ ๋ชจ๋“ˆ์ด ํ•จ์ˆ˜์— ์ •์˜๋œ ๊ฒƒ๋ณด๋‹ค ์•ฝํ•œ ์„œ๋ช…์„ ๊ฐ€์ง„ ํ•จ์ˆ˜๋ฅผ ์˜๋„์ ์œผ๋กœ ๋‚ด๋ณด๋‚ด๋Š” ๊ฒฝ์šฐ call_indirect ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜์˜ ์•ฝํ•œ ๊ณต๊ฐœ ์„œ๋ช…( ๋ฐฉ๊ธˆ ๋ฐœ๊ฒฌ๋˜์–ด ์•„์ง ๋…ผ์˜๋˜์ง€ ์•Š์€ ๋ฌธ์ œ).
  2. ์œ ํ˜• ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“ˆ์€ ํ•ด๋‹น ์œ ํ˜•์˜ ์ •์˜๋ฅผ ๋‚ด๋ณด๋‚ด์ง€ ์•Š๊ณ  ์œ ํ˜•์„ ๋‚ด๋ณด๋‚ผ ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ WASI์™€ ๊ฐ™์€ ์‹œ์Šคํ…œ์ด ํฌ๊ฒŒ ์˜์กดํ•  ๊ณ„ํš์ธ ์ถ”์ƒํ™”๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด ์ถ”์ƒํ™”๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด ์ปดํŒŒ์ผ ์‹œ๊ฐ„์— ํŠน์ • ์ •์˜ ํ•ฉ๋‹ˆ๋‹ค . ๊ทธ๋Ÿฌ๋‚˜ ๋Ÿฐํƒ€์ž„์— ์ถ”์ƒ ๋‚ด๋ณด๋‚ธ ์œ ํ˜•์€ ๋‹จ์ˆœํžˆ ํ•ด๋‹น ์ •์˜๋กœ ๋Œ€์ฒด๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์˜ˆ๋ฅผ ๋“ค์–ด ๋‚ด๋ณด๋‚ธ ์„œ๋ช…์ด ๋‚ด๋ณด๋‚ธ ์œ ํ˜•์„ ์ฐธ์กฐํ•˜๋Š” ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜์—์„œ 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 ์˜ ํ•˜์œ„ ์œ ํ˜•์ž…๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค IA๋Š” [] -> [tsub] ์œ ํ˜•์œผ๋กœ ์ •์˜๋œ $fsub ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ MB๋Š” [] -> [tsuper] ์œ ํ˜•์˜ $fsuper ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค IB๋Š” IA์˜ $fsub ๋ฅผ $fsuper $fsub ๋กœ ์ธ์Šคํ„ด์Šคํ™”ํ•œ ๋ชจ๋“ˆ MB์ž…๋‹ˆ๋‹ค(์ง€๊ธˆ์€ ๋ถˆ๊ฐ€๋Šฅํ•˜๋”๋ผ๋„ ์ด ๋ฌธ์ œ๋Š” ์ž ์žฌ์ ์ธ ํ–ฅํ›„ ๋ฌธ์ œ์— ๊ด€ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค).

์ด์ œ IB๊ฐ€ call_indirect[ -> tsuper](ref.func($fsuper)) ์‹คํ–‰ํ•˜๋ฉด ์–ด๋–ค ์ผ์ด ๋ฐœ์ƒํ•ด์•ผ ํ•˜๋Š”์ง€ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. ๋‹ค์Œ์€ ๊ฐ€์žฅ ๊ทธ๋Ÿด๋“ฏํ•ด ๋ณด์ด๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

  1. ์˜ˆ์ƒ ์„œ๋ช…๊ณผ ์ •์˜๋œ ์„œ๋ช…์ด ํ˜ธํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‘ ์„œ๋ช…์ด ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ ํŠธ๋žฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ 1์„ ์„ ํƒํ–ˆ๋‹ค๋ฉด ์ด๋ฅผ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ  ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ์Œ์„ ์ธ์‹ํ•˜์‹ญ์‹œ์˜ค.

  1. ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ call_indirect ์ •์˜ ์„œ๋ช…์ด ์•„๋‹Œ ๊ฐ€์ ธ์˜ค๊ธฐ ์„œ๋ช…๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  2. ์˜ˆ์ƒ ์„œ๋ช…๊ณผ ์ •์˜ ์„œ๋ช…์˜ ํ•˜์œ„ ์œ ํ˜• ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ์ตœ์†Œ ์„ ํ˜• ์‹œ๊ฐ„ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

๊ธฐ์ˆ  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 ๋ฐ ์œ ํ˜• ๊ฐ€์ ธ์˜ค๊ธฐ

์ด์ œ ํ•˜์œ„ ์œ ํ˜• ์ง€์ •์€ ์ œ์ณ๋‘๊ณ 

  • ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค IC๋Š” capability ์œ ํ˜•์„ ์ •์˜ ํ•˜๊ณ  $handle ๋กœ ์ •์˜ํ•˜์ง€ ์•Š๊ณ  ์œ ํ˜•์„ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค IC๋Š” [capability] -> [] ์œ ํ˜•์œผ๋กœ ์ •์˜๋˜์—ˆ์ง€๋งŒ [$handle] -> [] ์œ ํ˜•์œผ๋กœ ๋‚ด๋ณด๋‚ธ $do_stuff ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ MD๋Š” $extern ์œ ํ˜•๊ณผ [$extern] -> [] ์œ ํ˜•์˜ ํ•จ์ˆ˜ $run ๋ฅผ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค.
  • ๋ชจ๋“ˆ ์ธ์Šคํ„ด์Šค ID๋Š” IA๊ฐ€ $handle ๋กœ ๋‚ด๋ณด๋‚ธ $extern ๋กœ IA๊ฐ€ ๋‚ด๋ณด๋‚ธ $do_stuff ๋กœ ์ธ์Šคํ„ด์Šคํ™”๋œ ๋ชจ๋“ˆ MD์ž…๋‹ˆ๋‹ค $run

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

์ด์ œํ•˜์ž ๊ฐ€์ • ํ•ด ์ธ์Šคํ„ด์Šค ID๋Š” ๊ฐ’์„ ์–ป์„ ์ˆ˜์žˆ๊ฒŒ๋˜์—ˆ๋‹ค e ์œ ํ˜•์˜ $extern ํ•˜๊ณ  ์‹คํ–‰ํ•˜๋Š”์—๊ฒŒ call_indirect[$extern -> ](ref.func($run), e) . ๋‹ค์Œ์€ ๊ฐ€์žฅ ๊ทธ๋Ÿด๋“ฏํ•ด ๋ณด์ด๋Š” ๋‘ ๊ฐ€์ง€ ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

  1. ์˜ˆ์ƒ ์„œ๋ช…๊ณผ ์ •์˜๋œ ์„œ๋ช…์ด ํ˜ธํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์— ํ˜ธ์ถœ์ด ์„ฑ๊ณตํ•ฉ๋‹ˆ๋‹ค.
  2. ๋‘ ์„œ๋ช…์ด ์„œ๋กœ ๋‹ค๋ฅด๊ธฐ ๋•Œ๋ฌธ์— ์ฝœ ํŠธ๋žฉ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ณผ 2๋Š” ๊ฐ€์ ธ์˜จ ์œ ํ˜•์—์„œ call_indirect ๊ฑฐ์˜ ์“ธ๋ชจ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๊ฒฐ๊ณผ 1์˜ ๊ฒฝ์šฐ ์ž…๋ ฅ ์œ ํ˜• $extern ์ด ์ •์˜๋œ $do_stuff (๋Œ€์‹  capability ) ์ž…๋ ฅ ์œ ํ˜•์ด ์•„๋‹ˆ๋ฏ€๋กœ ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฉ์ฐจ๋ฅผ ํ•ด์†Œํ•˜๊ธฐ ์œ„ํ•œ ๋‘ ๊ฐ€์ง€ ๊ธฐ์ˆ :

  1. ๊ฐ€์ ธ์˜จ ํ•จ์ˆ˜์˜ ๊ฒฝ์šฐ call_indirect ์ •์˜ ์„œ๋ช…์ด ์•„๋‹Œ ๊ฐ€์ ธ์˜ค๊ธฐ ์„œ๋ช…๊ณผ ๋น„๊ตํ•ฉ๋‹ˆ๋‹ค.
  2. ๋Ÿฐํƒ€์ž„์— ์ธ์Šคํ„ด์Šค ID์˜ $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 ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋”ฐ๋ผ ์ œํ•œ์„ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

๋ฐ˜๋ฉด์— ์ •์  ์ถ”์ƒํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜๋Š” ๋ฐ ์บ์ŠคํŒ… ๊ฐ€๋Šฅํ•œ anyref๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์—ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ถ”์ƒ ์œ ํ˜•์˜ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ชฉ์ ์ด ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. WASI ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. WASI ๋ชจ๋“ˆ๊ณผ WASI ๋ชจ๋“ˆ์ด ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“  ์œ ํ˜•์ด ํ˜ธ์ŠคํŠธ์— ์˜ํ•ด ๊ตฌํ˜„๋˜๋Š”์ง€ ๋˜๋Š” Wasm์—์„œ ๊ตฌํ˜„๋˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์ถ”์ƒ ์œ ํ˜•์„ ์ž„์˜๋กœ ์ œํ•œํ•˜๋ฉด Wasm ๊ตฌํ˜„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ ๊ตฌํ˜„๊ณผ ๋” ์ด์ƒ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. call_indirect๊ฐ€ ํ•˜์œ„ ์œ ํ˜•์„ ์กด์ค‘ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

๋ญ? ์ •์˜์— ๋”ฐ๋ผ ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๊ทœ์น™์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

  1. ๋‚ด๋ณด๋‚ธ ์„œ๋ช…์ด ์•„๋‹Œ ์ •์˜๋œ ์„œ๋ช…์ด ์žˆ๋Š” ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ call_indirect๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํ–ˆ๋‹ค๊ณ  ๋งํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๊ฒƒ์ด call_indirect ์ž์ฒด์˜ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋ผ ์บ์ŠคํŠธ๊ฐ€ ์žˆ๋Š” ์–ธ์–ด์— ์ ํ•ฉํ•œ ์œ ํ˜• ์ถ”์ƒํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์„ ํƒํ•˜๋Š” ๋ฌธ์ œ๋ผ๊ณ  ๋งํ–ˆ์Šต๋‹ˆ๋‹ค.

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

ํ•จ์ˆ˜์— ๋Œ€ํ•œ ๋™๋“ฑ์„ฑ: Haskell ๋˜๋Š” SML๊ณผ ๊ฐ™์€ ์–ธ์–ด๊ฐ€ ์ด๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์œผ๋ฏ€๋กœ func refs์˜ ์ง์ ‘์ ์ธ ์ด์ ์„ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OCaml์€ ๊ตฌ์กฐ์  ํ‰๋“ฑ์„ ์œ„ํ•ด ๋˜์ง€๊ณ  ๋ฌผ๋ฆฌ์ ์ธ ๊ฒƒ์— ๋Œ€ํ•œ ๊ตฌํ˜„ ์ •์˜ ๋™์ž‘์„ ๋ช…์‹œ์ ์œผ๋กœ ๊ฐ€์ง€๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ false๋ฅผ ๋ฐ˜ํ™˜ํ•˜๊ฑฐ๋‚˜ ํ•จ์ˆ˜์— ๋Œ€ํ•ด throwํ•˜๋Š” ๊ฒƒ์„ ํ—ˆ์šฉํ•˜๋Š”์ง€ ์—ฌ๋ถ€๋Š” ์—ด๋ ค ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” ์ถฉ๋ถ„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ๊ฐ’๋น„์‹ผ ์ถ”๊ฐ€ ๋ž˜ํ•‘์„ ์ปค๋ฐ‹ํ•˜๊ธฐ ์ „์— ํƒ์ƒ‰ํ•  ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

[๋ฉ”ํƒ€ ๋…ผํ‰์œผ๋กœ์„œ, ๋‚˜๋Š” ๋‹น์‹ ์ด ๋‹น์‹ ์˜ ๊ฐ•์˜์˜ ํ†ค์„ ๋‚ฎ์ถ”๊ณ  ์•„๋งˆ๋„ ์ด๊ฒƒ์ด ์•„๋งˆ๋„ ์œ ๋Šฅํ•œ ์‚ฌ๋žŒ๋“ค์˜ ์ง‘ํ•ฉ์ด ์‹ฑ๊ธ€ ํ†ค์ด ์•„๋‹ˆ๋ฉฐ ์ด์ „์— ๋•Œ๋•Œ๋กœ ๋‘๋‡Œ์˜ ํ”์ ์ด ์ ์šฉ๋œ ์„ธ๊ณ„๋ผ๋Š” ์•„์ด๋””์–ด๋ฅผ ๊ณ ๋ คํ–ˆ๋‹ค๋ฉด ์ •๋ง ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.]

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

์ž์„ธํ•œ ๊ธ€์„ ์จ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, 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๊ฐ€ ์„ฑ๊ณตํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค๋ฅผ ๋”ฐ๋ฅด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‹น์‹ ์€ (์œ ํ˜•ํ™”๋œ ํ•จ์ˆ˜ ์ฐธ์กฐ๋กœ ์ธํ•ด) ์šฐ๋ฆฌ๋„ ํ•„์š”ํ•˜๋‹ค๊ณ  ์ถ”๊ฐ€ํ–ˆ์Šต๋‹ˆ๋‹ค.

  1. ์˜ˆ์ƒ ์„œ๋ช…๊ณผ ์ •์˜ ์„œ๋ช…์˜ ํ•˜์œ„ ์œ ํ˜• ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ์ตœ์†Œ ์„ ํ˜• ์‹œ๊ฐ„ ๋Ÿฐํƒ€์ž„ ๊ฒ€์‚ฌ๋ฅผ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

์ด๊ฒƒ์ด "์˜ˆ์ƒ ์„œ๋ช…๊ณผ ๊ฐ€์ ธ์˜ค๊ธฐ ์„œ๋ช… " ๊ฐ„์˜ ํ˜ธํ™˜์„ฑ์ด์–ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? 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 ๋ผ๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  1. Java์—๋Š” ๋‹คํ˜•์„ฑ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜๋Š” ๋ชจ๋“ (Java ์ฐธ์กฐ) ๊ฐ’์ด ๊ฐ์ฒด์ผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ v-table์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Handle์„ ์‚ฌ์šฉํ•˜๋Š” Java ๋ชจ๋“ˆ์€ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” Java ํด๋ž˜์Šค CHandle ์ง€์ •ํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ์ด ํด๋ž˜์Šค์˜ ์ธ์Šคํ„ด์Šค์—๋Š” Handle ์œ ํ˜•์˜ (wasm ์ˆ˜์ค€) ๋ฉค๋ฒ„์™€ ๋‹ค์–‘ํ•œ ํด๋ž˜์Šค ๋ฐ ์ธํ„ฐํŽ˜์ด์Šค ๋ฉ”์„œ๋“œ ๊ตฌํ˜„์— ๋Œ€ํ•œ ํ•จ์ˆ˜ ํฌ์ธํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” v-ํ…Œ์ด๋ธ”์ด ์žˆ์Šต๋‹ˆ๋‹ค. wasm ์ˆ˜์ค€์—์„œ ๊ฐ์ฒด์— ๋Œ€ํ•œ ํ•จ์ˆ˜์ผ ๋ฟ์ธ ํ‘œ๋ฉด ์ˆ˜์ค€ ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜์— ์ œ๊ณต๋˜๋ฉด ๋ชจ๋“ˆ์€ CHandle ๋กœ ์บ์ŠคํŒ…ํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ํด๋ž˜์Šค๋กœ ์บ์ŠคํŒ…ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  2. OCaml์—๋Š” ๋‹คํ˜•์„ฑ ๊ธฐ๋Šฅ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์˜ ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜๋Š” ๋ชจ๋“  OCaml ๊ฐ’์ด ๋ฌผ๋ฆฌ์  ํ‰๋“ฑ์„ ์ง€์›ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค. wasm์€ OCaml์˜ ์œ ํ˜• ์•ˆ์ „์„ฑ์— ๋Œ€ํ•ด ์ถ”๋ก ํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋‹คํ˜•์„ฑ ๊ธฐ๋Šฅ๋„ ์บ์ŠคํŠธ๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํŠน์ˆ˜ ์ฃผ์กฐ ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ด๋ฅผ ๋ณด๋‹ค ํšจ์œจ์ ์œผ๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜ ๋•Œ๋ฌธ์— OCaml ๋ชจ๋“ˆ์€ ์ด๋Ÿฌํ•œ ๊ทœ๋ฒ”์— ์ ํ•ฉํ•˜๊ณ  Handle ์œ ํ˜•์˜ (wasm ์ˆ˜์ค€) ๋ฉค๋ฒ„๊ฐ€ ์žˆ๋Š” ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜• ๋˜๋Š” ๋ ˆ์ฝ”๋“œ ์œ ํ˜• THandle ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹คํ˜•์„ฑ ํ•จ์ˆ˜๋Š” ๋‹ค๋ฅธ ๋Œ€์ˆ˜ ๋ฐ์ดํ„ฐ ์œ ํ˜•์ด๋‚˜ ๋ ˆ์ฝ”๋“œ ์œ ํ˜•๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ OCaml ๊ฐ’์„ THandle ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

  1. call_indirect ์„œ๋ธŒํƒ€์ดํ•‘์„ ์กด์ค‘ํ•˜๋„๋ก ํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).
  2. ๋‚ด๋ณด๋‚ธ ์„œ๋ช…์ด ์•„๋‹Œ ์ •์˜๋œ ์„œ๋ช…์ด ์žˆ๋Š” ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ call_indirect ๊ฐ€ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์„ ๋ฐฉ์ง€ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋ฐ˜๋ฉด์— ์ •์  ์ถ”์ƒํ™” ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์šฐํšŒํ•˜๋Š” ๋ฐ ์บ์ŠคํŒ… ๊ฐ€๋Šฅํ•œ anyref๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Œ์„ ์‹œ์—ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

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

์ถ”์ƒ ์œ ํ˜•์˜ ์‚ฌ์šฉ์„ ์ œํ•œํ•˜์—ฌ ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•˜๋ฉด ๋ชฉ์ ์ด ๋ฌดํšจํ™”๋ฉ๋‹ˆ๋‹ค. WASI ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค. WASI ๋ชจ๋“ˆ๊ณผ WASI ๋ชจ๋“ˆ์ด ๋‚ด๋ณด๋‚ด๋Š” ๋ชจ๋“  ์œ ํ˜•์ด ํ˜ธ์ŠคํŠธ์— ์˜ํ•ด ๊ตฌํ˜„๋˜๋Š”์ง€ ๋˜๋Š” Wasm์—์„œ ๊ตฌํ˜„๋˜๋Š”์ง€๋Š” ์ค‘์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ •์˜ ์ถ”์ƒ ์œ ํ˜•์„ ์ž„์˜๋กœ ์ œํ•œํ•˜๋ฉด Wasm ๊ตฌํ˜„์€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ˜ธ์ŠคํŠธ ๊ตฌํ˜„๊ณผ ๋” ์ด์ƒ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. call_indirect๊ฐ€ ํ•˜์œ„ ์œ ํ˜•์„ ์กด์ค‘ํ•˜๋„๋ก ๋งŒ๋“œ๋Š” ๋ฐ ๋„์›€์ด ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค(์ด๋ฏธ ๋ช…์‹œ์ ์œผ๋กœ ๋งํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค).

๋ญ? ์ •์˜์— ๋”ฐ๋ผ ํ•˜์œ„ ์œ ํ˜• ์ง€์ • ๊ทœ์น™์˜ ์ผ๋ถ€์ž…๋‹ˆ๋‹ค.

  1. ๋‚ด๋ณด๋‚ธ ์„œ๋ช…์ด ์•„๋‹Œ ์ •์˜๋œ ์„œ๋ช…์ด ์žˆ๋Š” ๋‚ด๋ณด๋‚ธ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐ 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 ์— ๋Œ€ํ•ด ๋ณด๋‹ค ์ผ๋ฐ˜์ ์œผ๋กœ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋Š”์ง€๋Š” ์—ฌ์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ์ „ํžˆ ๋ฌธ์ œ๋ฅผ ์—ด์–ด๋‘˜ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”!

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