Design: ์ œ์•ˆ: ์–ธ์–ด ๊ฐ„ ์œ ํ˜• ๋ฐ”์ธ๋”ฉ ์ถ”๊ฐ€

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

WebAssembly๋Š” ํ˜„์žฌ ์ฃผ์–ด์ง„(๋ณดํ†ต JS) ์ธํ„ฐํ”„๋ฆฌํ„ฐ์—์„œ ์ž„์˜์˜ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜๋Š” ๋ฐ ๋งค์šฐ ๋Šฅ์ˆ™ํ•˜์ง€๋งŒ ์—ฌ๋Ÿฌ ์ž„์˜์˜ ์–ธ์–ด๋ฅผ ํ•จ๊ป˜ ๊ฒฐํ•ฉํ•  ๋•Œ ๋ช‡ ๊ฐ€์ง€ ์ฃผ์š” ๊ธฐ๋Šฅ์ด ๋ถ€์กฑ

์ด๋Ÿฌํ•œ ๊ธฐ๋Šฅ ์ค‘ ํ•˜๋‚˜๋Š” ์–ธ์–ด์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋Š” ์œ ํ˜• ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. WebAssembly์— ์ด๋Ÿฌํ•œ ์‹œ์Šคํ…œ์„ ํ•˜๋‚˜ ๋˜๋Š” ์—ฌ๋Ÿฌ ๊ฐœ ์ถ”๊ฐ€ํ•  ๊ฒƒ์„ ์ œ์•ˆํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

์ œ์ณ๋‘๊ณ , ์ด์ „ ๊ธฐ๋Šฅ ํ† ๋ก ์—์„œ ์ผ๋ถ€ ๊ธฐ๊ณ ์ž๋Š” ์–ธ์–ด ์ƒํ˜ธ ์šด์šฉ์„ฑ์ด WebAssembly์˜ ์„ค๊ณ„ ๋ชฉํ‘œ๊ฐ€ ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๊ณ  ํ‘œํ˜„ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋“œ์‹œ ์šฐ์„ ์ˆœ์œ„ ๊ฐ€

์–ธ์–ด ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ๊ด€์‹ฌ์„ ๊ฐ–๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

๋‚ฎ์€ ์–ธ์–ด ๋Œ€ ์–ธ์–ด ์žฅ๋ฒฝ์˜ ์ด์ ์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • wasm ์‚ฌ์šฉ์ž๋ฅผ ์œ„ํ•œ ๋” ๋งŽ์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ : ๋งํ•  ํ•„์š”๋„ ์—†์ด ์–ธ์–ด ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๊ฐœ์„ ํ•˜๋ฉด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์‚ฌ์šฉ ์ค‘์ธ ๊ฒƒ๊ณผ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๊ฒฝ์šฐ์—๋„ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋” ์ž์ฃผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์š”๊ตฌ ์‚ฌํ•ญ

์ด๋ฅผ ์—ผ๋‘์— ๋‘๊ณ  ์–ธ์–ด ๊ฐ„ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ํ†ต๊ณผํ•ด์•ผ ํ•˜๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

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

wasm ์„ค์ •์—์„œ ์ง„์ •์œผ๋กœ ์œ ์šฉํ•˜๋ ค๋ฉด ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

1 - ์•ˆ์ „

  • ์œ ํ˜• ์•ˆ์ „: ํ˜ธ์ถœ ์ˆ˜์‹ ์ž๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์ง€์ •ํ•œ ๋ฐ์ดํ„ฐ์—๋งŒ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค(object-capabilities-style).

    • ํ†ตํ™”๊ฐ€ ๋๋‚˜๋ฉด ๋ฉ”๋ชจ๋ฆฌ๋ฅผ "์žŠ์–ด์•ผ" ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ถœ ๋ฐ›๋Š” ์‚ฌ๋žŒ์€ ํ˜ธ์ถœ์ž์˜ ๋ฐ์ดํ„ฐ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์–ด์•ผ ํ•˜๋ฉฐ, ๋ฐ˜ํ™˜ํ•œ ๋‹ค์Œ ์–ด๋–ค ํ˜•์‹์œผ๋กœ๋“  ํ•ด๋‹น ๋ฐ์ดํ„ฐ์— ๋‹ค์‹œ ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

2 - ๊ฐ„์ ‘๋น„

  • ๊ฐœ๋ฐœ์ž๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด ๋ Œ๋” ๋ฃจํ”„์—์„œ ์ •๊ธฐ์ ์œผ๋กœ ๋ชจ๋“ˆ ๊ฐ„ ํ˜ธ์ถœ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ์ด ํŽธ์•ˆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • Zero-copy: ์œ ํ˜• ์‹œ์Šคํ…œ์€ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๊ฐ€ ์›ํ•  ๊ฒฝ์šฐ Zero-copy ์ „๋žต์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์„ ๋งŒํผ ์ถฉ๋ถ„ํžˆ ํ‘œํ˜„๋ ฅ์ด ์žˆ์–ด์•ผ ํ•˜๊ณ  ์ด๋Ÿฌํ•œ ๊ตฌํ˜„์ž๊ฐ€ Zero-copy๊ฐ€ ์ตœ์ ์ธ ์‹œ๊ธฐ๋ฅผ ์•Œ ์ˆ˜ ์žˆ์„ ๋งŒํผ ํ‘œํ˜„๋ ฅ์ด ์ถฉ๋ถ„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

3 - ๊ตฌ์กฐ ๊ทธ๋ž˜ํ”„

  • ์œ ํ˜• ์‹œ์Šคํ…œ์—๋Š” ๊ตฌ์กฐ, ์„ ํƒ์  ํฌ์ธํ„ฐ, ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฐฐ์—ด, ์Šฌ๋ผ์ด์Šค ๋“ฑ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

    • ์ด์ƒ์ ์œผ๋กœ๋Š” ํ˜ธ์ถœ์ž๊ฐ€ ์š”๊ตฌ ์‚ฌํ•ญ 1๊ณผ 2๋ฅผ ์ค€์ˆ˜ํ•˜๋ฉด์„œ ๋ฉ”๋ชจ๋ฆฌ์— ํฉ์–ด์ ธ ์žˆ๋Š” ๊ฐœ์ฒด ๊ทธ๋ž˜ํ”„๋ฅผ ๋ณด๋‚ผ ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

4 - ์ฐธ์กฐ ์œ ํ˜•

  • ๋ชจ๋“ˆ์€ ๊ตฌ์กฐ ๊ทธ๋ž˜ํ”„ ๋‚ด ๊นŠ์ˆ™์ด ์ค‘์ฒฉ๋œ ์ฐธ์กฐ ์œ ํ˜•์„ ๊ตํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

5 - ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋ธŒ๋ฆฌ์ง€

  • ์ด๊ฒƒ์€ ๋งค์šฐ ์ค‘์š”ํ•œ ํฌ์ธํŠธ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ๋ฒ”์ฃผ์— ๋”ฐ๋ผ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ์˜์กดํ•˜๋Š” ์–ธ์–ด๋Š” ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์ „๋‹ฌํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ๋ฐ˜๋ฉด GC์— ์˜์กดํ•˜๋Š” ์–ธ์–ด๋Š” GC ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๊ธฐ๋ฅผ ์›ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

    • ์ถ”๊ฐ€ ๋ฐ”์ธ๋”ฉ์€ ์บ์‹ฑ ๋ฐ ๊ธฐํƒ€ ์ตœ์ ํ™” ์ „๋žต์„ ํ—ˆ์šฉํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

    • ์˜๋ฏธ ์œ ํ˜•์ด ํ˜ธํ™˜๋˜๋Š” ํ•œ ๋‘ ๋ชจ๋“ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ณ€ํ™˜ ์ž‘์—…์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

6 - ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ

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

7 - ์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ ์ž‘์šฉ์„ ์œ„ํ•œ ์…ธ๋ง ํฌ์ธํŠธ ์ œ๊ณต

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

์ œ์•ˆ๋œ ๊ตฌํ˜„

๋‚ด๊ฐ€ ์ œ์•ˆํ•˜๋Š” ๊ฒƒ์€ @kentonv๊ฐ€ Cap'n'Proto IDL ์— ๋ฐ”์ธ๋”ฉํ•˜์—ฌ Webassembly ์— ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๋“ค์€ WebIDL ๋ฐ”์ธ๋”ฉ๊ณผ ์œ ์‚ฌํ•œ ๋ฐฉ์‹์œผ๋กœ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. wasm ๋ชจ๋“ˆ์€ ๊ธฐ๋Šฅ์„ ๋‚ด๋ณด๋‚ด๊ณ  ํŠน์ˆ˜ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ํ˜•์‹ํ™”๋œ ์„œ๋ช…์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ชจ๋“ˆ์€ ์ด๋Ÿฌํ•œ ์„œ๋ช…์„ ๊ฐ€์ ธ์™€์„œ ์ž์ฒด ๊ธฐ๋Šฅ์— ๋ฐ”์ธ๋”ฉํ•ฉ๋‹ˆ๋‹ค.

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

Capnproto ๋ฐ”์ธ๋”ฉ ์ง€์นจ์€ ๋ชจ๋‘ ์ƒˆ๋กœ์šด Cap'n'proto ๋ฐ”์ธ๋”ฉ ์„น์…˜์— ์ €์žฅ๋ฉ๋‹ˆ๋‹ค.

Cap'n'proto ์œ ํ˜•

ํ‘œ์ค€์—๋Š” capnproto์˜ ์Šคํ‚ค๋งˆ ์–ธ์–ด์— ๋Œ€ํ•œ ๋‚ด๋ถ€ ํ‘œํ˜„์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋‹ค์Œ Capnproto ์œ ํ˜•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

```์บก์•ค ํ”„๋กœํ† 
๊ตฌ์กฐ์ฒด ์‚ฌ๋žŒ {
์ด๋ฆ„ @0 :ํ…์ŠคํŠธ;
์ƒ๋…„์›”์ผ @3 :๋‚ ์งœ;

์ด๋ฉ”์ผ @1 :ํ…์ŠคํŠธ;
์ „ํ™” @2 :List(PhoneNumber);

๊ตฌ์กฐ์ฒด ์ „ํ™”๋ฒˆํ˜ธ {
๋ฒˆํ˜ธ @0 :ํ…์ŠคํŠธ;
์œ ํ˜• @1 :์œ ํ˜•;

enum Type {
  mobile @0;
  home @1;
  work @2;
}

}
}

๊ตฌ์กฐ์ฒด ๋‚ ์งœ {
์—ฐ๋„ @0 : Int16;
์›” @1 :UInt8;
์ผ @2 :UInt8;
}

might be represented as

```wasm
(<strong i="32">@capnproto</strong> type $Date (struct
    (field "year" Int16)
    (field "month" UInt8)
    (field "day" UInt8)
))
(<strong i="33">@capnproto</strong> type $Person_PhoneNumber_Type (enum 0 1 2))
(<strong i="34">@capnproto</strong> type $Person_PhoneNumber (struct
    (field "number" Text)
    (field "type" $Person_PhoneNumber_Type)
))
(<strong i="35">@capnproto</strong> type $Person (struct
    (field "name" Text)
    (field "email" Text)
    (field "phones" (generic List $Person_PhoneNumber))
    (field "birthdate" $Data)
))

์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง๋ ฌํ™”

Capnproto ๋ฉ”์‹œ์ง€๋Š” ์„ธ๊ทธ๋จผํŠธ(์›์‹œ ๋ฐ”์ดํŠธ)์™€ ๊ธฐ๋Šฅ์ด๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ์œ ํ˜•์˜ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค.

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

(๋Ÿฐํƒ€์ž„ ์œ ํ˜• ๊ฒ€์‚ฌ๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•ด ๋” ๋‚˜์€ ์ ‘๊ทผ ๋ฐฉ์‹์„ ๊ณ ์•ˆํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

์‹ค์ œ ์ง๋ ฌํ™” ๊ณ„์‚ฐ์€ ๊ธ€๋ฃจ ์ฝ”๋“œ์—์„œ ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค(๊ธ€๋ฃจ ์ฝ”๋“œ ์ƒ์„ฑ ์ฐธ์กฐ).

๋ฐ”์ธ๋”ฉ ์—ฐ์‚ฐ์ž

| ์—ฐ์‚ฐ์ž | ์ฆ‰์‹œ | ์–ด๋ฆฐ์ด | ์„ค๋ช… |
| :--- | :--- | :--- | :--- |
| ์„ธ๊ทธ๋จผํŠธ | off-idx
lenโ€‘idx | | ์†Œ์Šค ํŠœํ”Œ์˜ off-idx '๋ฒˆ์งธ ๋ฐ len-idx '๋ฒˆ์งธ wasm ๊ฐ’์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค i32 ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„ธ๊ทธ๋จผํŠธ๊ฐ€ ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. |
| ํฌ๋กœ | off-idx
lenโ€‘idx | | ์†Œ์Šค ํŠœํ”Œ์˜ off-idx '๋ฒˆ์งธ ๋ฐ len-idx '๋ฒˆ์งธ wasm ๊ฐ’์„ ์ทจํ•ฉ๋‹ˆ๋‹ค. ๋‘˜ ๋‹ค i32 ์—ฌ์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋Šฅ๋ ฅ ํ…Œ์ด๋ธ”์ด ์ €์žฅ๋ฉ๋‹ˆ๋‹ค. |
| ๋ฉ”์‹œ์ง€ | capnprotoํ˜•
๋Šฅ๋ ฅ ํ…Œ์ด๋ธ” | ์„ธ๊ทธ๋จผํŠธ | ์ œ๊ณต๋œ ๊ธฐ๋Šฅ ํ…Œ์ด๋ธ”๊ณผ ์„ธ๊ทธ๋จผํŠธ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ capnproto-type ํ˜•์‹์˜ capnproto ๋ฉ”์‹œ์ง€๋ฅผ ๋งŒ๋“ญ๋‹ˆ๋‹ค. |

๊ด€๋ฆฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์ง๋ ฌํ™”

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

์ €์ˆ˜์ค€ ์œ ํ˜•์— ๋Œ€ํ•œ ๋ณ€ํ™˜ ๊ทœ์น™์€ ๋งค์šฐ ๊ฐ„๋‹จํ•ฉ๋‹ˆ๋‹ค. i8์€ Int8, UInt8 ๋ฐ bool๋กœ ๋ณ€ํ™˜ํ•˜๊ณ , i16์€ Int16์œผ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค. ๊ณ ๊ธ‰ ์œ ํ˜•์€ capnproto ๋“ฑ๊ฐ€๋ฌผ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๊ตฌ์กฐ ๋ฐ ๋ฐฐ์—ด ์ฐธ์กฐ๋Š” ํฌ์ธํ„ฐ, ๋ถˆํˆฌ๋ช… ์ฐธ์กฐ๋กœ ๋ณ€ํ™˜๋ฉ๋‹ˆ๋‹ค. ๋Šฅ๋ ฅ์œผ๋กœ ์ „ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

๋ณด๋‹ค ์™„์ „ํ•œ ์ œ์•ˆ์€ enum ๋ฐ unions์— ๋Œ€ํ•œ ์ „๋žต์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ฐ”์ธ๋”ฉ ์—ฐ์‚ฐ์ž

| ์—ฐ์‚ฐ์ž | ์ฆ‰์‹œ | ์–ด๋ฆฐ์ด | ์„ค๋ช… |
| :--- | :--- | :--- | :--- |
| ๋กœ | capnprotoํ˜•
์•„์ด๋”” | | ์ฐธ์กฐ์—ฌ์•ผ ํ•˜๋Š” ์†Œ์Šค ํŠœํ”Œ์˜ idx '๋ฒˆ์งธ wasm ๊ฐ’์„ ์ทจํ•˜์—ฌ capnproto-type ์˜ capnproto ๊ฐ’์„ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. |

์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋กœ ์—ญ์ง๋ ฌํ™”

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

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

๋˜ ๋‹ค๋ฅธ ํ•ด๊ฒฐ์ฑ…์€ ๋“ค์–ด์˜ค๋Š” ๋ฐ”์ธ๋”ฉ ๋งต ์ด ๋‘ ๊ฐœ์˜ ๋“ค์–ด์˜ค๋Š” ๋ฐ”์ธ๋”ฉ ์‹ (๋”ฐ๋ผ์„œ ๋‘ ๊ฐœ์˜ ํ•จ์ˆ˜)์—

๊ด€๋ฆฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋กœ ์—ญ์ง๋ ฌํ™”

๊ด€๋ฆฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ๋กœ ์—ญ์ง๋ ฌํ™”ํ•˜๋ฉด ๋ฐ˜๋Œ€ ๋ฐฉํ–ฅ๊ณผ ๊ฐ™์€ ์ข…๋ฅ˜์˜ ๋ณ€ํ™˜ ์—ฐ์‚ฐ์ž๊ฐ€ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

๊ธ€๋ฃจ ์ฝ”๋“œ ์ƒ์„ฑ

๋‘ ๊ฐœ์˜ wasm ๋ชจ๋“ˆ์„ ํ•จ๊ป˜ ์—ฐ๊ฒฐํ•  ๋•Œ(์ •์ ์œผ๋กœ๋“  ๋™์ ์œผ๋กœ๋“ ) ์ž„๋ฒ ๋”๋Š” ๋‘ ๋ชจ๋“ˆ์— ๊ณตํ†ต์ ์ธ ๋ชจ๋“  capnproto ์œ ํ˜•, ํ•จ์ˆ˜ ์œ ํ˜•๊ณผ capnproto ์œ ํ˜• ๊ฐ„์˜ ๋ฐ”์ธ๋”ฉ์„ ๋‚˜์—ดํ•˜๊ณ  ๋ชจ๋“  ๋‹ค๋ฅธ ํ•จ์ˆ˜ ์œ ํ˜• ์Œ ์‚ฌ์ด์— ๊ธ€๋ฃจ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€๋ฃจ ์ฝ”๋“œ๋Š” ๋ฐ”์ธ๋”ฉ๋œ ๋ฐ์ดํ„ฐ์˜ ์œ ํ˜•์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์ธ๋”ฉ ๊ฐ„์˜ ๊ธ€๋ฃจ ์ฝ”๋“œ๋Š” memcpy ํ˜ธ์ถœ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ๊ด€๋ฆฌ๋˜๋Š” ๋ฉ”๋ชจ๋ฆฌ ๋ฐ”์ธ๋”ฉ ๊ฐ„์˜ ๊ธ€๋ฃจ ์ฝ”๋“œ๋Š” ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์š”์•ฝ๋ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์™€ ๊ด€๋ฆฌ ๋ฉ”๋ชจ๋ฆฌ ๊ฐ„์˜ ๊ธ€๋ฃจ ์ฝ”๋“œ์—๋Š” ๋” ๋ณต์žกํ•œ ์ค‘์ฒฉ ๋ณ€ํ™˜ ์ž‘์—…์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

์˜ˆ๋ฅผ ๋“ค์–ด, Java ๋ชจ๋“ˆ์€ ์ธ์ˆ˜๋ฅผ GC ์œ ํ˜•์œผ๋กœ ์‚ฌ์šฉํ•˜์—ฌ ํ•จ์ˆ˜๋ฅผ ๋‚ด๋ณด๋‚ด๊ณ  ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ์œ ํ˜•์ด ์ง€์ •๋œ ์„œ๋ช…์— ๋ฐ”์ธ๋”ฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋Š” Python ๋ชจ๋“ˆ๊ณผ C++๊ฐ€ ํ•ด๋‹น ์œ ํ˜• ์„œ๋ช…์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. C++ ๋ฐ”์ธ๋”ฉ์€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•˜๋Š” ๋ฐ˜๋ฉด Python ๋ฐ”์ธ๋”ฉ์€ GC ๋ฉ”๋ชจ๋ฆฌ์—์„œ ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”ํ•œ ๋ณ€ํ™˜ ์€ Java, Python ๋ฐ C++ ์ปดํŒŒ์ผ๋Ÿฌ์—

๋Œ€์ฒด ์†”๋ฃจ์…˜

์ด ์„น์…˜์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ๊ตํ™˜ํ•˜๋Š” ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•๊ณผ ์š”๊ตฌ ์‚ฌํ•ญ ์„น์…˜์— ์ •์˜๋œ ๋ฉ”ํŠธ๋ฆญ์— ๋Œ€ํ•œ ํ‰๊ฐ€ ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

JSON ๋ฉ”์‹œ์ง€ ๊ตํ™˜

๋ฌด์ฐจ๋ณ„ ๋Œ€์ž… ์†”๋ฃจ์…˜์ž…๋‹ˆ๋‹ค. ๊ทธ ๊ฒฐํ•จ์ด ์ƒ๋‹นํžˆ ๋ช…๋ฐฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋งŽ์€ ์‹œ๊ฐ„์„ ํ• ์• ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์š”๊ตฌ ์‚ฌํ•ญ 2, 4 ๋ฐ 6์„ ์ถฉ์กฑํ•˜์ง€ ๋ชปํ•ฉ๋‹ˆ๋‹ค.

์ง๋ ฌํ™” ํ˜•์‹์œผ๋กœ ์ธ์ฝ”๋”ฉ๋œ ์›์‹œ ๋ฐ”์ดํŠธ ๋ณด๋‚ด๊ธฐ

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

1๊ณผ 3์„ ์ „๋‹ฌํ•˜๊ณ  ์•ฝ๊ฐ„์˜ ์กฐ์ •์„ ํ†ตํ•ด 2์™€ 4๋ฅผ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ฐธ์กฐ๋ฅผ ํ…Œ์ด๋ธ”์— ๋Œ€ํ•œ ์ธ๋ฑ์Šค๋กœ ์ „๋‹ฌ). ์‚ฌ์šฉ์ž๊ฐ€ ์ง๋ ฌํ™” ์œ ํ˜•์„ ํ˜ธ์ถœ์ž์˜ ์–ธ์–ด๋กœ ๋œ ์œ ํ˜• ์ •์˜๋กœ ๋‚ด๋ณด๋‚ด๋„๋ก ํ•˜๋Š” ๊ฒฝ์šฐ 6์„ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ์š”๊ตฌ ์‚ฌํ•ญ 5์™€ 7์—์„œ๋Š” ์‹คํŒจํ•ฉ๋‹ˆ๋‹ค. ๋‘ GC ๊ตฌํ˜„ ๊ฐ„์— ๋ฐ”์ธ๋”ฉํ•  ๋•Œ๋Š” ๋น„์‹ค์šฉ์ ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Protobuf๋ฅผ ํ†ตํ•ด Java ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” Python ๋ชจ๋“ˆ์€ ์‚ฌ์ „์„ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  ํ•ด๋‹น ๋ฉ”๋ชจ๋ฆฌ ์กฐ๊ฐ์„ ์ „๋‹ฌํ•œ ๋‹ค์Œ Java ๊ฐ์ฒด๋กœ ์—ญ์ง๋ ฌํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JIT ๊ตฌํ˜„.

๊ทธ๋ฆฌ๊ณ  ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ž‘์„ฑ์ž๊ฐ€ ๊ณ ์œ ํ•œ ์ง๋ ฌํ™” ํ˜•์‹(JSON, Protobuf, FlatBuffer, Cap'n Proto, SBE)์„ ์‚ฌ์šฉํ•˜๋„๋ก ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. tool-conventions ์—์„œ ํ‘œ์ค€ ์ง๋ ฌํ™” ํ˜•์‹์„ ์ •์˜ํ•˜์—ฌ ์™„ํ™”ํ•  ์ˆ˜ ์žˆ์ง€๋งŒ.

๊ทธ๋Ÿฌ๋‚˜ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์˜ ์ž„์˜ ์กฐ๊ฐ์„ ์ „๋‹ฌํ•  ๊ฐ€๋Šฅ์„ฑ์„ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ด ์ข‹์€ ์ฒซ ๋ฒˆ์งธ ๋‹จ๊ณ„๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

GC ๊ฐ์ฒด ๋ณด๋‚ด๊ธฐ

์„œ๋กœ์—๊ฒŒ GC ๊ฐœ์ฒด๋ฅผ ๋ณด๋‚ด๋Š” ๋ชจ๋“ˆ์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅ

์ด ์†”๋ฃจ์…˜์—๋Š” ๋ช‡ ๊ฐ€์ง€ ์žฅ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค. GC ์ œ์•ˆ์ด ์ด๋ฏธ ์ง„ํ–‰ ์ค‘์ž…๋‹ˆ๋‹ค. 1, 3, 4, 7์„ ํ†ต๊ณผํ•ฉ๋‹ˆ๋‹ค. GC์—์„œ ์ˆ˜์ง‘ํ•œ ๋ฐ์ดํ„ฐ๋Š” ํ• ๋‹นํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ๋งŽ์ด ๋“ค์ง€๋งŒ ์ „๋‹ฌํ•˜๋Š” ๋ฐ ๋น„์šฉ์ด ์ €๋ ดํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๊ทธ ์†”๋ฃจ์…˜์€ C ๊ณ„์—ด ์–ธ์–ด์— ์ ํ•ฉํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, ๋ฐ์ดํ„ฐ๋ฅผ Rust ๋ชจ๋“ˆ์— ์ „๋‹ฌํ•˜๋Š” D ๋ชจ๋“ˆ์€ ๋ฐ์ดํ„ฐ๋ฅผ GC ๊ทธ๋ž˜ํ”„๋กœ ์ง๋ ฌํ™”ํ•˜๊ณ  ๊ทธ๋ž˜ํ”„๋ฅผ Rust ํ•จ์ˆ˜์— ์ „๋‹ฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ทธ๋ž˜ํ”„๊ฐ€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋กœ ์—ญ์ง๋ ฌํ™”๋ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ๋งŽ์€ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ์œ„ํ•ด ์ฆ‰์‹œ ํ๊ธฐ๋˜๋Š” GC ๋…ธ๋“œ๋ฅผ ํ• ๋‹นํ•ฉ๋‹ˆ๋‹ค.

๊ทธ ์™ธ์—๋Š” ํ˜„์žฌ GC ์ œ์•ˆ์—๋Š” ์—ด๊ฑฐํ˜• ๋ฐ ๊ณต์šฉ์ฒด์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ œ๊ณต ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ wasm GC ์œ ํ˜•์„ ์ฝ๊ณ  ์ดํ•ดํ•  ์ˆ˜ ์—†๋‹ค๋ฉด ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ๋Š” ์ปดํŒŒ์ผ ์‹œ๊ฐ„ ๋Œ€์‹  ๋งํฌ ์‹œ๊ฐ„ ๋˜๋Š” ๋Ÿฐํƒ€์ž„์— ์ˆ˜ํ–‰๋ฉ๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ ์‚ฌ์šฉ

์œ ํ˜• ์‹œ์Šคํ…œ์„ ์ •์˜ํ•˜๋Š” ์ง๋ ฌํ™” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” wasm์—์„œ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Capnproto๋Š” ์ œ๋กœ ์นดํ”ผ์— ๋Œ€ํ•œ ๊ฐ•์กฐ์™€ ์ฐธ์กฐ ์œ ํ˜•์— ๊น”๋”ํ•˜๊ฒŒ ๋งคํ•‘๋˜๋Š” ๋‚ด์žฅ ๊ฐ์ฒด ๊ธฐ๋Šฅ ๋•Œ๋ฌธ์— ๊ฐ€์žฅ ์ ์ ˆํ•ด ๋ณด์ž…๋‹ˆ๋‹ค.

๋‚จ์€ ์ผ

์ด ๊ธฐ๋ณธ์ ์ธ ์ œ์•ˆ์„ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ทธ๋ฃน์— ์ œ์ถœํ•  ์ˆ˜ ์žˆ๋Š” ๋ฌธ์„œ๋กœ ๋ฐ”๊พธ๋ ค๋ฉด ๋‹ค์Œ ๊ฐœ๋…์„ ๊ตฌ์ฒดํ™”ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ๋ฐ”์ธ๋”ฉ ์—ฐ์‚ฐ์ž
  • GC ์œ ํ˜• ๋“ฑ๊ฐ€๋ฌผ
  • ๊ฐœ์ฒด ๊ธฐ๋Šฅ
  • ๋ถ€์šธ ๋ฐฐ์—ด
  • ๋ฐฐ์—ด
  • ์ƒ์ˆ˜
  • ์ œ๋„ค๋ฆญ
  • ์œ ํ˜• ์ง„ํ™”
  • ์„ธ ๋ฒˆ์งธ "getters ๋ฐ setters" ๋ฐ”์ธ๋”ฉ ์œ ํ˜•์„ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.
  • ๊ฐ€๋Šฅํ•œ ์บ์‹ฑ ์ „๋žต
  • ๋‹ค์ค‘ ํ…Œ์ด๋ธ” ๋ฐ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ์ง€์›

๊ทธ๋™์•ˆ ์ œ๊ฐ€ ์ด๋ฏธ ์ž‘์„ฑํ•œ ๋‚ด์šฉ์— ๋Œ€ํ•œ ํ”ผ๋“œ๋ฐฑ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์˜ ๋ฒ”์œ„๋Š” ๊ฝค ๋ฐฉ๋Œ€ํ•˜๋ฏ€๋กœ ์ด ์ œ์•ˆ์„œ์—์„œ ๋‹ต๋ณ€ํ•ด์•ผ ํ•˜๋Š” ์งˆ๋ฌธ์„ ์ขํžˆ๋Š” ๋ฐ ๋„์›€์„ ์ฃผ์‹œ๋ฉด ๊ฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

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

IR ์œ ํ˜•๋ณ„๋กœ ๋ช‡ ๊ฐ€์ง€ ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹จ์ˆœํžˆ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ๊ณ  ๋ฏฟ๋Š” ๊ฒฐ์ •์ ์ธ ๊ธฐ๋ณธ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด (์ ์–ด๋„!) ์–ธ์–ด ๊ตฌํ˜„๋งŒํผ ๋งŽ์€ ํ‘œํ˜„ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์€ ์ž„์˜๋กœ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ, ์ด์ข… ๋กœํ”„ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ˆ˜์‹ญ(!)๊ฐœ์˜ ํ‘œํ˜„์ด ์žˆ๋Š” V8์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Haskell์˜ ๊ฒฝ์šฐ๋Š” ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. Haskell์˜ ๋ชฉ๋ก์€ ๊ฒŒ์œผ๋ฅด๋ฏ€๋กœ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋‹จ์ผ ๋ฌธ์ž์— ๋Œ€ํ•ด ์ฝํฌ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋‘ ๊ฐ€์ง€ ์˜ˆ๋Š” ์ด๋ฏธ ์„ ์–ธ์  ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์ด ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ์—๋Š” ๊ณ ์œ ํ•œ ํ˜ธ์ถœ ๊ทœ์น™์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ์ˆ˜์‹ ์ธก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

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

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

์ด๊ฒƒ์€ ์ •๋ง ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค! ๋‚˜๋Š” ๋นจ๋ฆฌ ์ฝ์—ˆ์„ ๋ฟ์ด๋ฉฐ ๋ช‡ ๊ฐ€์ง€ ์ดˆ๊ธฐ ์ƒ๊ฐ์ด ์žˆ์ง€๋งŒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์งˆ๋ฌธ์€ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๊ฐ€ ์ด๋ฏธ ์ œ๊ณต/์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด FFI ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด WebAssembly์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ฌป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ์นœ์ˆ™ํ•œ ๊ฑฐ์˜ ๋ชจ๋“  ์–ธ์–ด์—๋Š” C FFI ํ˜•์‹์ด ์žˆ์œผ๋ฏ€๋กœ ์˜ค๋Š˜๋‚ ์—๋„ ์ด๋ฏธ ์ƒํ˜ธ ์šด์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ธ์–ด ์ค‘ ์ƒ๋‹น์ˆ˜๋Š” ์ด๋Ÿฌํ•œ ๋ฐ”์ธ๋”ฉ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ์ •์  ์œ ํ˜• ๊ฒ€์‚ฌ๋„ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฒŒ๋‹ค๊ฐ€ ์ด๋ฏธ ์ด๋Ÿฌํ•œ ์ธํ„ฐํŽ˜์ด์Šค์— ๋Œ€ํ•œ ๋งŽ์€ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์˜ˆ: Rust์˜ ๊ฒฝ์šฐ bindgen crate, Erlang/BEAM์˜ ๊ฒฝ์šฐ erl_nif ๋“ฑ). C FFI๋Š” ์ด๋ฏธ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์š”๊ตฌ ์‚ฌํ•ญ์„ ๋‹ค๋ฃจ๊ณ  ์žˆ์œผ๋ฉฐ ์ด๋ฏธ ์ž…์ฆ๋˜๊ณ  ์‹ค์ œ๋กœ ๋„๋ฆฌ ์‚ฌ์šฉ๋˜๋Š” ์ฃผ์š” ์ด์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

5 - ๋ฉ”๋ชจ๋ฆฌ ๋ ˆ์ด์•„์›ƒ ๊ฐ„์˜ ๋ธŒ๋ฆฌ์ง€

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

์˜๋ฏธ ์œ ํ˜•์ด ํ˜ธํ™˜๋˜๋Š” ํ•œ ๋‘ ๋ชจ๋“ˆ ๊ฐ„์— ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ๋ณ€ํ™˜ ์ž‘์—…์€ ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํˆฌ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

FFI ์žฅ๋ฒฝ์„ ํ†ตํ•ด ๋ฐ์ดํ„ฐ๋ฅผ ์ „๋‹ฌํ•  ๋•Œ ํ•œ ๋ ˆ์ด์•„์›ƒ์„ ๋‹ค๋ฅธ ๋ ˆ์ด์•„์›ƒ์œผ๋กœ ํˆฌ๋ช…ํ•˜๊ฒŒ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ ๋˜๋Š” ์–ธ์–ด ๋Ÿฐํƒ€์ž„์„ ์œ„ํ•œ ์ž‘์—…์ฒ˜๋Ÿผ ๋ณด์ด๋ฉฐ C/C++/Rust/๋“ฑ๊ณผ ๊ฐ™์€ ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ์–ธ์–ด์—์„œ๋Š” ์ „ํ˜€ ๋ฐ”๋žŒ์งํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ, FFI๋ฅผ ํ†ตํ•ด ์ฃผ๊ณ ๋ฐ›์„ ๊ณ„ํš์ธ ๊ฒฝ์šฐ ๋ฒˆ์—ญ ๋น„์šฉ์ด ๋„ˆ๋ฌด ๋งŽ์ด ๋“ค ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋ฒˆ์—ญ๋ณด๋‹ค ๊ณตํ†ต ABI๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๋” ๋‚˜์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ”Œ๋žซํผ์˜ ๊ณตํ†ต ABI ์ด์™ธ์˜ ๋ ˆ์ด์•„์›ƒ์„ ์„ ํƒํ•˜๋Š” ์ด์ ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋Œ€์ฒด ๋ ˆ์ด์•„์›ƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Œ์„ ์‰ฝ๊ฒŒ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.

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

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

Apache Arrow ๋„ ์ด๋ฅผ ์œ„ํ•ด ์กด์žฌํ•˜์ง€๋งŒ ๊ณ ์„ฑ๋Šฅ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์— ๋” ์ค‘์ ์„ ๋‘ก๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ๊ธฐ์˜ ์ผ๋ฐ˜์ ์ธ ๋™๊ธฐ์— ๋™์˜ํ•˜๊ณ  ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฏธ๋ž˜์— Web IDL ๋ฐ”์ธ๋”ฉ ์„ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋…ผ์˜ํ•œ ๋‚ด์šฉ๊ณผ ์ผ์น˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์‹ค์ œ๋กœ, ์„ค๋ช…์ž์˜ ์ดˆ๊ธฐ ์ดˆ์•ˆ์—๋Š” ์ด ์–ธ์–ด ๊ฐ„ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์–ธ๊ธ‰ํ•˜๋Š” FAQ ํ•ญ๋ชฉ์ด ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ(๊ทธ๋ฆฌ๊ณ  ๊ทธ FAQ ํ•ญ๋ชฉ์„ ์ƒ๋žตํ•œ ์ด์œ )๋Š” ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. N๊ฐœ ์–ธ์–ด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ํŠนํžˆ ์•„๋ฌด๋„ ์ด๋ฏธ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋งŽ์€ ๊ฐœ๋ฐฉํ˜•(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋น„์ข…๋ฃŒํ˜•) ํ† ๋ก ์„ ์ƒ์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค( ๋ฌผ๋ก  ๋‹ญ๊ณผ ๋‹ฌ๊ฑ€์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.) ๋Œ€์กฐ์ ์œผ๋กœ, Web IDL Bindings์— ์˜ํ•ด ํ•ด๊ฒฐ๋œ ๋ฌธ์ œ๋Š” ์˜ค๋Š˜๋‚  Rust/C++์—์„œ ์ƒ๋‹นํžˆ ๊ตฌ์ฒด์ ์ด๊ณ  ์‰ฝ๊ฒŒ ์ž…์ฆ๋˜์–ด ์šฐ๋ฆฌ๊ฐ€ (์‚ฌ์†Œํ•˜์ง€ ์•Š์€) ๋…ธ๋ ฅ์„ ํ‘œ์ค€ํ™”/๊ตฌํ˜„ํ•˜๊ณ  ์ œ์•ˆ๋œ ์†”๋ฃจ์…˜์˜ ํ”„๋กœํ† ํƒ€์ž…/๊ฒ€์ฆ์— ๋Œ€ํ•œ ๋™๊ธฐ๋ฅผ ๋ถ€์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฌ๋‚˜ ๋‚ด ํฌ๋ง์€ Web IDL ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ด ๋‹ญ๊ณผ ๋‹ฌ๊ฑ€์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  Web IDL์— ๊ตญํ•œ๋˜์ง€ ์•Š๋Š” ์ƒˆ๋กœ์šด ํ™•์žฅ์ด๋‚˜ ๋ฐ”๋ž๋‹ˆ๋‹ค . (ํ˜„์žฌ ์ œ์•ˆ๋œ ๋Œ€๋กœ ํ˜ธํ™˜ ๊ฐ€๋Šฅํ•œ Web IDL ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‘ ๊ฐœ์˜ wasm ๋ชจ๋“ˆ์ด ์„œ๋กœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๊ฒฝ์šฐ, Cap'n Proto์˜ ์™„์ „ํ•œ ํ‘œํ˜„ ์—†์ด๋„ ์ตœ์ ํ™” impl์ด ์—ฌ๊ธฐ์—์„œ ์–ธ๊ธ‰ํ•œ ์ตœ์ ํ™”๋ฅผ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.)

๋‚˜๋Š” ์•„์ง ๊ทธ ์ œ์•ˆ์„ ์™„์ „ํžˆ ๋ฐ›์•„๋“ค์ผ ์‹œ๊ฐ„์ด ์—†์—ˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ฏธ๋ฆฌ ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.
๊ทธ ์ด์œ ๋Š” ๊ทธ ์ผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
NS. ๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ์œ ํ˜• ์ฃผ์„์—์„œ ๋ฐ˜๋“œ์‹œ ์บก์ฒ˜๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Prolog์˜ ํ‰๊ฐ€๋Š” C++์˜ ํ‰๊ฐ€์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. (Prolog์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์–ธ์–ด๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ)

NS. ์ •์˜์— ๋”ฐ๋ผ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ LCD๋Š” ์ง€์ •๋œ ์–ธ์–ด์˜ ๋ชจ๋“  ์œ ํ˜• ์–ธ์–ด๋ฅผ ์บก์ฒ˜ํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ณด์žฅ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์–ธ์–ด ๊ตฌํ˜„์ž์—๊ฒŒ ๋งค์šฐ ๋ถˆํŽธํ•œ ์„ ํƒ์„ ๋‚จ๊น๋‹ˆ๋‹ค. ์ž์‹ ์˜ ์–ธ์–ด๋ฅผ ์ง€์›ํ•˜๊ฑฐ๋‚˜ ํ•ด๋‹น ์–ธ์–ด์˜ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์ด์ ์„ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋ก€: Haskell์—๋Š” '์œ ํ˜• ํด๋ž˜์Šค'๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ Haskell์˜ ๊ตฌํ˜„์€ ํšจ๊ณผ์ ์œผ๋กœ ์ด๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.
๋˜ ๋‹ค๋ฅธ ์˜ˆ: C++์—์„œ ์ œ๋„ค๋ฆญ์„ ์ง€์›ํ•˜๋ ค๋ฉด ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ œ๋„ค๋ฆญ์„ ์ œ๊ฑฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ML, Java(๋ฐ ๊ธฐํƒ€ ์—ฌ๋Ÿฌ ์–ธ์–ด)๋Š” ๋ฒ”์šฉ ํ‘œํ˜„ ํ˜•์‹์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” C++์—์„œ ์‚ฌ์šฉํ•˜๋Š” ์ ‘๊ทผ ๋ฐฉ์‹๊ณผ ํ˜ธํ™˜๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

@lukewagner ๋งํฌ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ํ™•์‹คํžˆ ๊ทธ ๋ฌธ์„œ๋ฅผ ์ฝ์„ ๊ธฐํšŒ๊ฐ€ ์ƒ๊ฒจ์„œ ๊ธฐ์ฉ๋‹ˆ๋‹ค!

์ด ํŠน์ • ํ† ๋ก ์—๋Š” ๋‘ ๊ฐ€์ง€๊ฐ€ ํ˜ผํ•ฉ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„๋ž˜ ๋‚ด์šฉ ์ค‘ ์ผ๋ถ€๋Š” ๋‚ด๊ฐ€ ์ดํ•ดํ•œ ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ™•์ธํ•  ์ˆ˜ ์žˆ๋„๋ก ์ž‘์„ฑ๋˜์—ˆ์œผ๋ฏ€๋กœ ๋‚ด๊ฐ€ ์˜คํ•ดํ•˜๊ฑฐ๋‚˜ ๋†“์นœ ๋ถ€๋ถ„์ด ์žˆ์œผ๋ฉด ์ž์œ ๋กญ๊ฒŒ ์ง€์ ํ•ด ์ฃผ์‹ญ์‹œ์˜ค.

  1. ํšจ์œจ์ ์ธ ํ˜ธ์ŠคํŠธ ๋ฐ”์ธ๋”ฉ

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

  2. ํšจ์œจ์ ์ธ ์ด๊ธฐ์ข… ๋ชจ๋“ˆ ๊ฐ„ ๋ฐ”์ธ๋”ฉ.

    • ์ฆ‰, source ์ž‘์„ฑ๋œ ๋ชจ๋“ˆ๊ณผ dest ์ž‘์„ฑ๋œ ๋‘ ๋ชจ๋“ˆ์ด ์ฃผ์–ด์ง€๋ฉด ์†Œ์Šค->dest ๋ฐ/๋˜๋Š” dest->source์—์„œ ํ˜ธ์ถœํ•˜์—ฌ ์„œ๋กœ ์œ ํ˜•์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

    • ๊ณตํ†ต FFI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ณ  WebIDL๊ณผ ๊ฐ™์€ ๊ฒƒ์ด ์ฃผ์–ด์ง€๋ฉด(์˜ˆ: source type -> common type -> dest type ์–ธ์–ด ์žฅ๋ฒฝ์„ ๋„˜์–ด ํ˜ธ์ถœํ•  ๋•Œ ํ˜ธ์ŠคํŠธ ํ™˜๊ฒฝ์—์„œ ์ œ๊ณตํ•˜๋Š” ์ผ๋ถ€ ๊ณตํ†ต ๋ถ„๋ชจ ์œ ํ˜•์„ ํ†ตํ•ด ์ตœ์ ํ™”๋˜์ง€ ์•Š์€ ๊ฒฝ๋กœ๊ฐ€ ์ œ๊ณต๋ฉ๋‹ˆ๋‹ค. .



      • ์ตœ์ ํ™” ์—”์ง„์€ ์ด๋ก ์ ์œผ๋กœ ์ด ๋ฒˆ์—ญ์„ ์ค‘๊ฐœ ์—†์ด source ์—์„œ dest ๋กœ ์ง์ ‘ ๋งŒ๋“ค ์ˆ˜ ์žˆ์ง€๋งŒ ์—ฌ์ „ํžˆ ๋ฒˆ์—ญ ์˜ค๋ฒ„ํ—ค๋“œ๋ฅผ ๋ถ€๊ณผํ•ฉ๋‹ˆ๋‹ค.



    • ๊ณตํ†ต FFI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: source ๋ฐ dest ๊ฐ€ ABI(์˜ˆ: C ABI)๋ฅผ ๊ณต์œ ํ•˜๋ฉด source ๋ฐ dest ๊ฐ€ ๋‹ค์Œ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ์ง์ ‘ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. FFI๋ฅผ ํ†ตํ•ด ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์ „ํ˜€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„๋งˆ๋„ ์‹ค์ œ๋กœ ๊ฐ€์žฅ ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์€ ์‹œ๋‚˜๋ฆฌ์˜ค์ผ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ ๋‚ด ์ƒ๊ฐ์€ WebIDL ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ(์ฆ‰, ๊ด‘๋ฒ”์œ„ํ•œ ํ˜ธ์ŠคํŠธ API/ํ™˜๊ฒฝ ์„ธํŠธ๋ฅผ ์ง€์›ํ•˜๋Š” ์ƒ์œ„ ์„ธํŠธ)์„ ํ™œ์šฉํ•˜๋ฉด ํ™•์‹คํžˆ ์ด์ ์ด ์žˆ์ง€๋งŒ ์‹ค์ œ๋กœ๋Š” 1์— ์„ค๋ช…๋œ ๋ฌธ์ œ์— ๋Œ€ํ•œ ์†”๋ฃจ์…˜์ผ ๋ฟ์ด๋ฉฐ ํ•˜์œ„ ์ง‘ํ•ฉ์ž…๋‹ˆ๋‹ค. FFI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์–ธ์–ด ๊ฐ„ ๋ฐ”์ธ๋”ฉ์„ ์ฒ˜๋ฆฌํ•˜๋Š” 2๊ฐœ ์ค‘. FFI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” 2์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์€ ๊ทธ ์ž์ฒด๋กœ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋ฐœ์ƒํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— ๋Œ€์•ˆ๋ณด๋‹ค ๋ถ„๋ช…ํžˆ ์„ ํ˜ธ๋ฉ๋‹ˆ๋‹ค.

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

C FFI(์˜ˆ: ๊ฐ€์žฅ ์ผ๋ฐ˜์ ์ด๊ธฐ ๋•Œ๋ฌธ์—)์™€ IDL์ด ๋™์‹œ์— ์‚ฌ์šฉ/์กด์žฌํ•˜๋Š” ๊ฒฝ์šฐ ๋ช‡ ๊ฐ€์ง€ ์ถ”๊ฐ€ ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

  • source ๋ฐ dest ์–ธ์–ด๊ฐ€ ๊ณตํ†ต ABI์— ๋”ฐ๋ผ ๋™์ผํ•œ ๊ธฐ๋ณธ ๋ฉ”๋ชจ๋ฆฌ ๋‚ด ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ณต์œ  ์œ ํ˜•์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ์œ ํ˜• ์ •์˜๋ฅผ ์ œ๊ณตํ•˜๋Š” ๊ฒฝ์šฐ(์˜ˆ: ๊ฐ€๋ณ€ ๊ธธ์ด ๋ฐฐ์—ด์— ๋Œ€ํ•œ ๊ณตํ†ต ํ‘œํ˜„ ) - ํ˜ธ์ŠคํŠธ ์—”์ง„์ด ํ‘œ์ค€ FFI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  IDL ์ง€์‹œ๋ฌธ์ด ์žˆ๋‹ค๋Š” ์ด์œ ๋งŒ์œผ๋กœ ์ด๋Ÿฌํ•œ ์œ ํ˜• ๊ฐ„์— ๋ณ€ํ™˜์„ ์ˆ˜ํ–‰ํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๊นŒ?

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

    • ๊ทธ๋ ‡๋‹ค๋ฉด ํ˜ธ์ŠคํŠธ ์—”์ง„์€ ์œ ํ˜•์„ ์–ด๋–ป๊ฒŒ ํ†ตํ•ฉํ•ฉ๋‹ˆ๊นŒ?:



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


      • ์—”์ง„์ด ๋ ˆ์ด์•„์›ƒ๋ณด๋‹ค ๋” ๋งŽ์€ ๊ฒƒ์„ ๊ณ ๋ คํ•œ๋‹ค๋ฉด, ๋‹ค์‹œ ๋งํ•ด์„œ ์œ ํ˜• ์‹œ์Šคํ…œ์€ ๋ช…๋ชฉ์ƒ ๋ฐ ๊ตฌ์กฐ์  ํ˜ธํ™˜์„ฑ์„ ๋ชจ๋‘ ํ•„์š”๋กœ ํ•ฉ๋‹ˆ๋‹ค.





        • ์ผ๋ถ€ ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ ๊ถŒํ•œ ์œ ํ˜•์„ ์ •์˜ํ•˜๋Š” ์‚ฌ๋žŒ์€ ๋ˆ„๊ตฌ์ž…๋‹ˆ๊นŒ? ์ผ๋ถ€ ์–ธ์–ด์—์„œ ๊ถŒ์œ„ ์žˆ๋Š” ์œ ํ˜•์„ ์–ด๋–ป๊ฒŒ ์ฐธ์กฐํ•ฉ๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด, add/2 ํ•จ์ˆ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ํ˜ธ์ถœํ•˜๊ณ  ์žˆ๊ณ  add/2 size_t ์œ ํ˜•์˜ ๋‘ ์ธ์ˆ˜๋ฅผ ์˜ˆ์ƒํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋‚ด ์–ธ์–ด๋Š” ๋ช…๋ชฉ์ƒ size_t ์— ๋Œ€ํ•ด ๋ฐ˜๋“œ์‹œ ์•Œ์ง€๋Š” ๋ชปํ•˜์ง€๋งŒ, ๊ธฐ๊ณ„ ๋„ˆ๋น„์˜ ๋ถ€ํ˜ธ ์—†๋Š” ์ •์ˆ˜์— ๋Œ€ํ•œ ์ž์ฒด ABI ํ˜ธํ™˜ ํ‘œํ˜„์ธ usize ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ๋‚ด ์–ธ์–ด์˜ ํ•ด๋‹น ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ FFI ๋ฐ”์ธ๋”ฉ์€ ๋‚ด ์–ธ์–ด๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์–ธ์–ด ์œ ํ˜•. ์ด๋ฅผ ๊ฐ์•ˆํ•  ๋•Œ ๋‚ด ์ปดํŒŒ์ผ๋Ÿฌ๋Š” usize ๋ฅผ size_t ๋งคํ•‘ํ•˜๋Š” IDL์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.






  • FFI๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์ง€๋งŒ IDL ์„ค๋ช… ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์œ„ํ•ด ๋ช…์‹œ์ ์œผ๋กœ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š” ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“ˆ ๊ฐ„์— ํ˜ธ์ถœํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ๋˜๋Š” IDL ์ธํ„ฐํŽ˜์ด์Šค์˜ ์˜ˆ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ? ํŠนํžˆ WebAssembly๊ฐ€ ์•„๋‹Œ ๊ฒƒ์œผ๋กœ, ์ด๋Ÿฌํ•œ ๊ฒฝ์šฐ์˜ ์ด์ ์„ ์—ฐ๊ตฌํ•˜๋Š” ๋ฐ ์ฃผ๋กœ ๊ด€์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚˜๋Š” ์—ฌ์ „ํžˆ WebIDL๊ณผ ๊ทธ ์ „์ž„์ž์˜ ์ „์ฒด ์„ธ๋ถ€ ์‚ฌํ•ญ์„ ํŒŒํ—ค์น˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Œ์„ ์ธ์ •ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๋ชจ๋“  ๊ฒƒ์ด ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ(๋ธŒ๋ผ์šฐ์ € ๋Œ€ ๋น„ ๋ธŒ๋ผ์šฐ์ €)์— ์–ด๋–ป๊ฒŒ ๋“ค์–ด๋งž๋Š”์ง€ ๋“ฑ์ž…๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๊ฐ„๊ณผํ–ˆ๋‹ค๋ฉด ํ™•์‹คํžˆ ์•Œ๋ ค์ฃผ์‹ญ์‹œ์˜ค. ๋ฌด์—‡.

@bitwalker

์ด๊ฒƒ์€ ์ •๋ง ํฅ๋ฏธ ๋กญ์Šต๋‹ˆ๋‹ค!

๋„ค๊ฐ€ ์ข‹๋‹ค ๋‹ˆ ๊ธฐ์˜๋‹ค!

๊ทธ๋Ÿฌ๋‚˜ ์ œ ์ฒซ ๋ฒˆ์งธ์ด์ž ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์งˆ๋ฌธ์€ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๊ฐ€ ์ด๋ฏธ ์ œ๊ณต/์‚ฌ์šฉํ•˜๋Š” ๊ธฐ์กด FFI ๋ฉ”์ปค๋‹ˆ์ฆ˜์ด WebAssembly์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์ด์œ ๋ฅผ ๋ฌป๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

C ์œ ํ˜• ์‹œ์Šคํ…œ์€ ์–ธ์–ด ๊ฐ„ IDL๋กœ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

  • WebAssembly์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ์˜๋„์ ์œผ๋กœ ๋ณด์œ ํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ •ํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. (JS-to-C FFI์— ๋Œ€ํ•œ ๋‚ด ์ž์‹ ์˜ ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด ๊ตฌํ˜„์€ ์†๋„์™€ ์•ˆ์ „์„ ๊ฑฐ๋ž˜ํ•˜๋Š” ๊ฒฝํ–ฅ์ด ์žˆ์Œ)

  • ๋™์  ๊ธธ์ด ๋ฐฐ์—ด, ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๊ณต์šฉ์ฒด, ๊ธฐ๋ณธ๊ฐ’, ์ œ๋„ค๋ฆญ ๋“ฑ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค.

  • ์ฐธ์กฐ ์œ ํ˜•์— ์ง์ ‘์ ์œผ๋กœ ํ•ด๋‹นํ•˜๋Š” ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค.

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

ํŠนํžˆ FFI์—์„œ ์•ž๋’ค๋กœ ์ „๋‹ฌํ•  ๊ณ„ํš์ธ ๊ฒฝ์šฐ

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

ํ”Œ๋žซํผ์˜ ๊ณตํ†ต ABI ์ด์™ธ์˜ ๋ ˆ์ด์•„์›ƒ์„ ์„ ํƒํ•˜๋Š” ์ด์ ์€ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์—†์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ๋Œ€์ฒด ๋ ˆ์ด์•„์›ƒ์ด ์˜๋ฏธํ•˜๋Š” ๋ฐ”๋ฅผ ์˜คํ•ดํ•  ์ˆ˜ ์žˆ์Œ์„ ์‰ฝ๊ฒŒ ์ธ์ •ํ•ฉ๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ํ˜„์žฌ ์ผ๋ฐ˜์ ์ธ ABI๊ฐ€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ”์ดํŠธ ์กฐ๊ฐ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋ฏธ๋ž˜์— GC ์ œ์•ˆ์ด ๊ตฌํ˜„๋˜๋ฉด ์ผ๋ถ€ ์–ธ์–ด(Java, C#, Python)๋Š” ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ๊ฑฐ์˜ ์ €์žฅํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ „ํ˜€ ์ €์žฅํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋Œ€์‹  ๋ชจ๋“  ๋ฐ์ดํ„ฐ๋ฅผ GC ๊ตฌ์กฐ์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ธ์–ด ์ค‘ 2๊ฐœ๊ฐ€ ํ†ต์‹ ์„ ์‹œ๋„ํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Ÿฌํ•œ ๊ตฌ์กฐ๋ฅผ ๋ฐ”์ดํŠธ ์ŠคํŠธ๋ฆผ์œผ๋กœ ์ง๋ ฌํ™”ํ•˜์—ฌ ์ฆ‰์‹œ ์—ญ์ง๋ ฌํ™”ํ•˜๋Š” ๊ฒƒ์€ ๋ถˆํ•„์š”ํ•œ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.


@KronicDeth ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์กฐ์‚ฌํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค.

๋ฌธ์„œ ํ›‘์–ด๋ณด๊ธฐ์—์„œ ์ด๊ฒƒ์€ ํŠนํžˆ ์„ฑ๋Šฅ ํ–ฅ์ƒ์„ ์œ„ํ•œ Flatbuffer์˜ ์ƒ์œ„ ์ง‘ํ•ฉ์ธ ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์–ด๋Š ์ชฝ์ด๋“ , Flatbuffers ๋˜๋Š” Capnproto์™€ ๋น„๊ตํ•˜์—ฌ WebAssembly ๋ชจ๋“ˆ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๊ณ ์œ ํ•˜๊ฒŒ ๋„์šธ ์ˆ˜ ์žˆ๋Š” ํŠน์„ฑ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?


@lukewagner

๊ทธ๋Ÿฌ๋‚˜ ์ œ ํฌ๋ง์€ Web IDL ๋ฐ”์ธ๋”ฉ์„ ํ†ตํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ด ๋‹ญ๊ณผ ๊ณ„๋ž€์˜ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ณ  Web IDL์— ๊ตญํ•œ๋˜์ง€ ์•Š๊ณ  ์ƒˆ๋กœ์šด ํ™•์žฅ์˜ ๋ฌผ๊ฒฐ์„ ์ผ์œผํ‚ฌ ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด ๊ฐ„ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•œ ๊ฒฝํ—˜์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋™์˜. ์ด ์ œ์•ˆ์„ ์ž‘์„ฑํ•  ๋•Œ์˜ ๊ฐ€์ •์€ ๋ชจ๋“  capnproto ๋ฐ”์ธ๋”ฉ ๊ตฌํ˜„์ด WebIDL ์ œ์•ˆ ๊ตฌํ˜„์˜ ํ”ผ๋“œ๋ฐฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•œ๋‹ค๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

๋‚ด ์ฃผ์š” ๊ด€์‹ฌ์‚ฌ(๊ทธ๋ฆฌ๊ณ  ๊ทธ FAQ ํ•ญ๋ชฉ์„ ์ƒ๋žตํ•œ ์ด์œ )๋Š” ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค. N๊ฐœ ์–ธ์–ด๋ฅผ ๋ฐ”์ธ๋”ฉํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ๋Š” ํŠนํžˆ ์•„๋ฌด๋„ ์ด๋ฏธ ํ•˜๊ณ  ์žˆ์ง€ ์•Š๋‹ค๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ๋งŽ์€ ๊ฐœ๋ฐฉํ˜•(๊ทธ๋ฆฌ๊ณ  ์•„๋งˆ๋„ ๋น„์ข…๋ฃŒํ˜•) ํ† ๋ก ์„ ์ƒ์„ฑํ•  ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค( ๋ฌผ๋ก  ๋‹ญ๊ณผ ๋‹ฌ๊ฑ€์˜ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค.)

์ €๋Š” capnproto ๊ตฌํ˜„์— ๋Œ€ํ•ด ๋…ผ์˜ํ•˜๋Š” ๊ฒƒ์ด ์ด ์ดˆ๊ธฐ์—๋„ ๊ฐ€์น˜๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ ๊ตฌํ˜„์ด ์ถฉ์กฑํ•ด์•ผ ํ•˜๊ฑฐ๋‚˜ ์‹œ๋„ํ•  ์ˆ˜ ์žˆ๋Š” ์š”๊ตฌ ์‚ฌํ•ญ์„ ๊ฐ„๋žตํ•˜๊ฒŒ ์„ค๋ช…ํ•˜๋ ค๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ๊ฐ„ ์œ ํ˜• ์‹œ์Šคํ…œ์ด ํ•ด๊ฒฐํ•˜๋ ค๊ณ  ํ•  ์ˆ˜ ์žˆ๋Š” ์ผ๋ฐ˜์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ๋‚˜์—ดํ•˜๋Š” ๊ฒƒ๋„ ์œ ์šฉํ•  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

N-to-N ๋ฌธ์ œ์™€ ๊ด€๋ จํ•˜์—ฌ ๋‹ค์Œ ์†”๋ฃจ์…˜์— ์ค‘์ ์„ ๋‘๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

  • RPC ์Šคํƒ€์ผ ๋ฐ์ดํ„ฐ ์ „์†ก์— ๋Œ€ํ•ด์„œ๋งŒ ๊ฑฑ์ •ํ•˜์‹ญ์‹œ์˜ค. "๋ฒกํ„ฐ์—๋Š” 'x', 'y' ๋ฐ 'z'๋ผ๋Š” ์„ธ ๊ฐœ์˜ ํ•„๋“œ๊ฐ€ ์žˆ์œผ๋ฉฐ ๋ชจ๋‘ ๋ถ€๋™ ์†Œ์ˆ˜์ ์ž…๋‹ˆ๋‹ค.

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


@fgmccabe

๊ทธ ์ด์œ ๋Š” ๊ทธ ์ผ์ด ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—๋Š” ๋‘ ๊ฐ€์ง€ ๊ทผ๋ณธ์ ์ธ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
NS. ๋‹ค๋ฅธ ์–ธ์–ด์—๋Š” ์œ ํ˜• ์ฃผ์„์—์„œ ๋ฐ˜๋“œ์‹œ ์บก์ฒ˜๋˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ์˜๋ฏธ ์ฒด๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด, Prolog์˜ ํ‰๊ฐ€๋Š” C++์˜ ํ‰๊ฐ€์™€ ๊ทผ๋ณธ์ ์œผ๋กœ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. (Prolog์˜ ๊ฒฝ์šฐ ๋‹ค๋ฅธ ์—ฌ๋Ÿฌ ์–ธ์–ด๋กœ ๋Œ€์ฒด ๊ฐ€๋Šฅ)

์œ ํ˜• ํด๋ž˜์Šค๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š๋Š” ๊ฒƒ๊ณผ ๊ด€๋ จ๋œ Haskell์˜ ๊ตฌํ˜„์€ ํšจ๊ณผ์ ์œผ๋กœ ์ด๋ฅผ ๋‚ด์žฅํ•˜๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

์˜ˆ, ์•„์ด๋””์–ด๋Š” ์™„๋ฒฝํ•œ "๋ชจ๋“  ์–ธ์–ด์™€ ์‰ฝ๊ฒŒ ํ˜ธํ™˜๋˜๋Š”" ์ถ”์ƒํ™”๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

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

์ด๋Ÿฌํ•œ ์œ ์‚ฌ์„ฑ์„ ํ™œ์šฉํ•˜์—ฌ ๋ชจ๋“ˆ ๊ฐ„์˜ ๋งˆ์ฐฐ์„ ํฌ๊ฒŒ ์ค„์ด๋Š” ๊ฒƒ์ด ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. (lukewagner์— ๋Œ€ํ•œ ๋‚ด ๋Œ€๋‹ต๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค)

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

์‘. ์—ฌ๊ธฐ์—์„œ ๊ฒฝํ—˜์  ๊ทœ์น™์€ "๊ณต์œ  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๊ฒฝ๊ณ„์ธ ๊ฒฝ์šฐ capnproto ์œ ํ˜•์œผ๋กœ ๋งŒ๋“ค๊ณ  ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ๊ธฐ๋ณธ ์œ ํ˜•์„ ์‚ฌ์šฉํ•˜์‹ญ์‹œ์˜ค"๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์˜ˆ, ์ฒ˜์Œ์—๋Š” ๋ถˆ๋ณ€ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ์„น์…˜๊ณผ ์œ ํ˜• ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์„น์…˜์„ ํฌํ•จํ•˜๊ณ  ์‹ถ์—ˆ์ง€๋งŒ ์šฉ๊ธฐ๋ฅผ ์žƒ์—ˆ์Šต๋‹ˆ๋‹ค.

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

Cํ˜• ์‹œ์Šคํ…œ์€ ์–ธ์–ด๊ฐ„ IDL๋กœ์„œ ๋ช‡ ๊ฐ€์ง€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ถ„๋ช…ํžˆ ํ•˜๊ธฐ ์œ„ํ•ด IDL๋กœ ์ œ์•ˆํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜คํžˆ๋ ค ์ €๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ธํ„ฐํŽ˜์ด์Šค(C ABI)๊ฐ€ ์ด๋ฏธ ์กด์žฌํ•˜๊ณ , ์ž˜ ์ •์˜๋˜์–ด ์žˆ์œผ๋ฉฐ, ์ด๋ฏธ ๊ด‘๋ฒ”์œ„ํ•œ ์–ธ์–ด ์ง€์›์„ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ์ œ์•ˆํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ ‡๋‹ค๋ฉด ํ•ด๊ฒฐ๋˜๋Š” ๋ฌธ์ œ๊ฐ€ ์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ๋„˜์–ด์„œ์ง€ ์•Š๋Š” ํ•œ WebAssembly๊ฐ€ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•  ํ•„์š”๊ฐ€ ์—†๋‹ค๋Š” ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

WebAssembly์—์„œ ์•ˆ์ „ํ•˜์ง€ ์•Š๊ณ  ์˜๋„์ ์œผ๋กœ ๋ณด์œ ํ•˜์ง€ ์•Š๋Š” ๊ณต์œ  ์ฃผ์†Œ ๊ณต๊ฐ„์„ ๊ฐ€์ •ํ•˜์—ฌ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ์ €๋Š” ์—ฌ๊ธฐ์„œ ์˜คํ•ด์˜ ์ผ๋ถ€๋ฅผ ๋ณธ ๊ฒƒ ๊ฐ™์•„์š”. ์—ฌ๊ธฐ์„œ ๋งํ•˜๋Š” FFI์—๋Š” ๋‘ ๊ฐ€์ง€ ํด๋ž˜์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋Š” ๊ฒƒ(๋ณด๋‹ค ์ „ํ†ต์ ์ธ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ FFI)์ด๊ณ  ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ๊ทธ๋ ‡์ง€ ์•Š์Šต๋‹ˆ๋‹ค(๋ณด๋‹ค ์ „ํ†ต์ ์ธ IPC/RPC). ๋‚˜๋Š” ์ „์ž์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ๊ณ , ๋‚˜๋Š” ๋‹น์‹ ์ด ํ›„์ž์— ๋” ์ดˆ์ ์„ ๋งž์ถ˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ FFI, ์ฆ‰ IPC/RPC๋ฅผ _์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”_ ๋ชจ๋“ˆ ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ์€ WebIDL, capnproto ๋˜๋Š” ๊ทธ ๋งฅ๋ฝ์—์„œ ๋‹ค๋ฅธ ์ œ์•ˆ ์ค‘ ํ•˜๋‚˜์™€ ํ™•์‹คํžˆ ์ž˜ ๋งž๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ๊ทธ๊ฒƒ์ด ๊ทธ๋“ค์˜ ๋นต๊ณผ ๋ฒ„ํ„ฐ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

๋™์  ๊ธธ์ด ๋ฐฐ์—ด, ํƒœ๊ทธ๊ฐ€ ์ง€์ •๋œ ๊ณต์šฉ์ฒด, ๊ธฐ๋ณธ๊ฐ’, ์ œ๋„ค๋ฆญ ๋“ฑ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ ์ง€์›์ด ์—†์Šต๋‹ˆ๋‹ค.

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

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

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. IPC/RPC์˜ ๊ฒฝ์šฐ C๋Š” ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐ ๋”์ฐํ•œ ์–ธ์–ด์ž…๋‹ˆ๋‹ค.

๋ฌธ์ œ๋Š” ํ˜„์žฌ ์ผ๋ฐ˜์ ์ธ ABI๊ฐ€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋œ ๋ฐ”์ดํŠธ ์กฐ๊ฐ์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ™•์‹คํžˆ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ์›์‹œ์ ์ด์ง€๋งŒ C ABI๋Š” ๊ทธ ์œ„์— ๋งŽ์€ ๊ฒƒ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค.

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

๋‚˜๋Š” ๊ทธ ์–ธ์–ด๋“ค์ด GC๋ฅผ ํ˜ธ์ŠคํŠธ๋กœ ๋ฏธ๋ฃจ๋Š” ๊ฒƒ์„ ๋›ฐ์–ด๋„˜์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•˜์ง€ ๋ชปํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ๋‚ด ์ถ”์ธก์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ํ˜ธ์ŠคํŠธ GC ๊ด€๋ฆฌ ๊ตฌ์กฐ๋ฅผ ์ดํ•ดํ•˜๋Š” ์–ธ์–ด๋Š” capnproto๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์‰ฝ๊ฒŒ CA ABI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ๊ตฌ์กฐ์— ๋Œ€ํ•œ ๊ณตํ†ต ํ‘œํ˜„์„ ๊ฒฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์œ ์ผํ•œ ์ฐจ์ด์ ์€ ํ•ด๋‹น ํ‘œํ˜„์˜ ์‚ฌ์–‘์ด ์–ด๋””์— ์žˆ๋Š”์ง€์ž…๋‹ˆ๋‹ค. ๊ทธ๋ ‡๊ธด ํ•˜์ง€๋งŒ, ๋‚˜๋Š” GC ์ œ์•ˆ์˜ ์„ธ๋ถ€ ์‚ฌํ•ญ๊ณผ ๊ทธ๊ฒƒ์ด ํ˜ธ์ŠคํŠธ ๋ฐ”์ธ๋”ฉ ์ œ์•ˆ๊ณผ ์–ด๋–ป๊ฒŒ ์—ฐ๊ฒฐ๋˜๋Š”์ง€์— ๋Œ€ํ•ด ์•„์ฃผ ๋ฏธ์•ฝํ•˜๊ฒŒ ์ดํ•ดํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๊ธฐ์—์„œ ๋‚ด๊ฐ€ ๊ณผ๋„ํ•˜๊ฒŒ ๋ฒ—์–ด๋‚˜๋”๋ผ๋„ ์ž์œ ๋กญ๊ฒŒ ๋ฌด์‹œํ•ด๋„ ๋ฉ๋‹ˆ๋‹ค.

TL;DR: ๊ณต์œ  ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ž‘๋™ํ•˜์ง€ ์•Š๋Š” ๋ชจ๋“ˆ ์ƒํ˜ธ ์šด์šฉ์„ฑ์— ๋Œ€ํ•ด ๋™์˜ํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณต์œ  ๋ฉ”๋ชจ๋ฆฌ๋Š” ์ง€์›ํ•˜๋Š” _is_ ์ค‘์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ณ  C ABI๋Š” ๊ธฐ์กด ์–ธ์–ด ์ง€์›์œผ๋กœ ์ธํ•ด ํ•ด๋‹น ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๊ฐ€์žฅ ํ•ฉ๋ฆฌ์ ์ธ ์„ ํƒ์ž…๋‹ˆ๋‹ค. ์ด ์ œ์•ˆ์ด ๋ฐœ์ „ํ•จ์— ๋”ฐ๋ผ ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ๋ฐ”๋ž๋‹ˆ๋‹ค.

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

Cap'n Proto์™€ ํšจ์œจ์„ฑ์ด ๋น„์Šทํ•˜์ง€๋งŒ ๋” ์œ ์—ฐํ•˜๊ณ  ๋” ๋„๋ฆฌ ์ง€์›๋˜๋Š” FlatBuffers๋ฅผ ๋งŒ๋“ค์—ˆ

์ฃผ์–ด์ง„ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ ์ด ๋‘ ๊ฐ€์ง€ ํ˜•์‹๋ณด๋‹ค ์„ ํ˜ธ๋  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ํ˜•์‹์ด ๋งŽ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Cap'n Proto์™€ FlatBuffers๋Š” ๋ชจ๋‘ ๋ณต์‚ฌ๊ฐ€ ์—†๊ณ  ์ž„์˜ ์•ก์„ธ์Šค๊ฐ€ ๊ฐ€๋Šฅํ•˜๋ฉฐ ์ค‘์ฒฉ ํ˜•์‹์—์„œ ํšจ์œจ์ ์ž…๋‹ˆ๋‹ค(๋‹ค๋ฅธ ํ˜•์‹์œผ๋กœ ๋ž˜ํ•‘๋œ ํ˜•์‹์ด ๋ž˜ํ•‘๋˜์ง€ ์•Š์€ ๊ฒƒ๋ณด๋‹ค ๋œ ํšจ์œจ์ ์ด์ง€ ์•Š์Œ์„ ์˜๋ฏธํ•จ). ์ด๋Š” ์–ธ์–ด ๊ฐ„์„ ์œ„ํ•ด ๊ณ ๋ คํ•ด์•ผ ํ•  ์‹ค์ œ ์†์„ฑ์ž…๋‹ˆ๋‹ค. ์˜์‚ฌ ์†Œํ†ต. "๋‹ค์Œ ๋ฐ”์ดํŠธ๋Š” Cap'n Proto schema X"๋ฅผ ํฌํ•จํ•˜์—ฌ ๋ฒ„ํผ์— ๋Œ€ํ•ด ๋งค์šฐ ์ •ํ™•ํ•œ ๋ฐ”์ดํŠธ ๋ ˆ์ด์•„์›ƒ์„ ์ง€์ •ํ•  ์ˆ˜ ์žˆ๋Š” IDL์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‚ด๊ฐ€ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์ž๊ธฐ ํ™๋ณด๋ฅผ ํ•˜๋Š” ๋™์•ˆ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋Š” FlatBuffers์™€ ๊ฐ™์€ FlexBuffers ์—์„œ ์‚ฌ๋žŒ๋“ค์„

@aardappel

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

๋‚˜๋Š” wasm์ด ๋‹ค๋ฅธ ๊ฒฝ์Ÿ์ž๋“ค์—๊ฒŒ ํ•˜๋‚˜์˜ ํ‘œ์ค€์„ ๋ถ€๊ณผํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ์‚ฌ์šฉ๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ์•”์‹œ์ ์ธ ์š”์ ์„ ์ดํ•ดํ•˜๊ณ , IDL์ด ์„ ํƒ๋˜๋Š” ๊ฒƒ์— ๊ฐœ์ธ์ ์œผ๋กœ ๋ฌด๊ด€์‹ฌํ•ฉ๋‹ˆ๋‹ค.

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

๋‚ด๊ฐ€ ๋ฏธ๋ฌ˜ํ•˜๊ฒŒ ์ž๊ธฐ ํ™๋ณด๋ฅผ ํ•˜๋Š” ๋™์•ˆ ์Šคํ‚ค๋งˆ๊ฐ€ ์—†๋Š” FlatBuffers์™€ ๊ฐ™์€ FlexBuffers์—์„œ ์‚ฌ๋žŒ๋“ค์„ ๊ฐ€๋ฆฌํ‚ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋™์ผํ•œ ๋ฐ”๋žŒ์งํ•œ ์ œ๋กœ ์นดํ”ผ, ๋žœ๋ค ์•ก์„ธ์Šค ๋ฐ ์ €๋ ดํ•œ ์ค‘์ฒฉ ์†์„ฑ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ JSON์ด ์‚ฌ์šฉ๋˜๋Š” ๋ฐฉ์‹๊ณผ ์œ ์‚ฌํ•˜๊ฒŒ codegen์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š๊ณ  ์Šคํ‚ค๋งˆ์— ๋™์˜ํ•˜์ง€ ์•Š๊ณ ๋„ ์–ธ์–ด๊ฐ€ ํ†ต์‹ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

assert(myObj.foo);
assert(isJsonObject(myObj.foo));
assert(myObj.foo.bar);
assert(isString(myObj.foo.bar));
loadUrl(myObj.foo.bar);

๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์ž ์žฌ์ ์ธ ๋ณด์•ˆ ์ทจ์•ฝ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

์œ„์˜ 6 - ์ปดํŒŒ์ผ ํƒ€์ž„ ์˜ค๋ฅ˜ ์ฒ˜๋ฆฌ ๋„ ์ฐธ์กฐํ•˜์‹ญ์‹œ์˜ค.


@bitwalker

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

์˜ˆ๋ฅผ ๋“ค์–ด, FFI๋Š” ํ˜ธ์ŠคํŠธ ์–ธ์–ด๊ฐ€ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ๋„ค์ดํ‹ฐ๋ธŒ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— malloc ํ•จ์ˆ˜์— ๋Œ€ํ•œ ์ง์ ‘ ์•ก์„ธ์Šค ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ์‚ฌ์‹ค์— ์ž์ฃผ ์˜์กดํ•ฉ๋‹ˆ๋‹ค. ๋‘ ๊ฐœ์˜ ์ƒํ˜ธ ์˜์‹ฌ์Šค๋Ÿฌ์šด ๋ชจ๋“ˆ์˜ ๋งฅ๋ฝ์—์„œ ๊ทธ ์ „๋žต์„ was๋กœ ์–ผ๋งˆ๋‚˜ ์ž˜ ๋ฒˆ์—ญํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

Cap'n Proto์˜ ์ฐฝ์‹œ์ž๋กœ์„œ ์ด ์Šค๋ ˆ๋“œ์— ๋Œ€ํ•ด ๋งํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ ์ด์ƒํ•˜๊ฒŒ๋„ ์ œ ์˜๊ฒฌ์ด ๋ณ„๋กœ ์—†๋‹ค๋Š” ๊ฒƒ์„ ๋ฐœ๊ฒฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กญ๊ฑฐ๋‚˜ ๊ทธ๋ ‡์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ๋ช‡ ๊ฐ€์ง€ ์ธ์ ‘ํ•œ ์ƒ๊ฐ์„ ํ‘œํ˜„ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

์ €๋Š” JavaScript์™€ WASM์„ ์‹คํ–‰ํ•˜๋Š” "์„œ๋ฒ„๋ฆฌ์Šค" ํ™˜๊ฒฝ์ธ Cloudflare Workers์˜ ๊ธฐ์ˆ  ์ฑ…์ž„์ž์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

์šฐ๋ฆฌ๋Š” ์ž‘์—…์ž๋“ค์ด ์„œ๋กœ ๋Œ€ํ™”ํ•  ์ˆ˜ ์žˆ๋Š” ํ”„๋กœํ† ์ฝœ๋กœ Cap'n Proto RPC ์ง€์›์„ ๊ณ ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ HTTP๋กœ ์ œํ•œ๋˜์–ด ์žˆ์–ด ๊ธฐ์ค€์ด ์ƒ๋‹นํžˆ ๋‚ฎ๊ฒŒ ์„ค์ •๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. :)

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

์ด๊ฒƒ์ด ์ ํ•ฉํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋Š” ์ž˜ ์•Œ๋ ค์ง€์ง€ ์•Š์€ ๋‘ ๋ฒˆ์งธ ์ด์œ ๋Š” RPC ์‹œ์Šคํ…œ์ž…๋‹ˆ๋‹ค. Cap'n Proto๋Š” CapTP๋ฅผ ๋ชจ๋ธ๋กœ ํ•œ Promise ํŒŒ์ดํ”„๋ผ์ด๋‹์ด ํฌํ•จ๋œ ์ „์ฒด ๊ฐœ์ฒด ๊ธฐ๋Šฅ RPC ํ”„๋กœํ† ์ฝœ์„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์ด๋ฅผ ํ†ตํ•ด ์•ˆ์ „ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ๋›ฐ์–ด๋‚œ ๋ฐฉ์‹์œผ๋กœ ํ’๋ถ€ํ•œ ๊ฐœ์ฒด ์ง€ํ–ฅ ์ƒํ˜ธ ์ž‘์šฉ์„ ์‰ฝ๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Cap'n Proto RPC๋Š” ๋‹จ์ˆœํ•œ ์ง€์  ๊ฐ„ ํ”„๋กœํ† ์ฝœ์ด ์•„๋‹ˆ๋ผ ๋„คํŠธ์›Œํฌ๋กœ ์—ฐ๊ฒฐ๋œ ์—ฌ๋Ÿฌ ๋‹น์‚ฌ์ž ๊ฐ„์˜ ์ƒํ˜ธ ์ž‘์šฉ์„ ๋ชจ๋ธ๋งํ•˜๋ฉฐ ์ด๋Š” ๊ฝค ํฐ ๋ฌธ์ œ๊ฐ€ ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํ•œํŽธ WASM ๋žœ๋“œ์—์„œ๋Š” WASI๊ฐ€ ๊ธฐ๋Šฅ ๊ธฐ๋ฐ˜ API๋ฅผ ๋„์ž…ํ•˜๊ณ  ์žˆ๋‹ค. ์—ฌ๊ธฐ์— ํฅ๋ฏธ๋กœ์šด "์‹œ๋„ˆ์ง€"๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๊ธด ํ•ด๋„ Cap'n Proto์˜ ๋ช‡ ๊ฐ€์ง€ ์„ค๊ณ„ ๋ชฉํ‘œ๋Š” FFI์˜ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ ํ•ฉํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

ํ”ผ๋“œ๋ฐฑ์„ ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

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

๊ณต์œ  ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด wasm์— ์–ผ๋งˆ๋‚˜ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(์œ„ ์ฐธ์กฐ).

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

Cap'n Proto ๋ฉ”์‹œ์ง€๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ๋ชฐ๋ผ๋„ ๋ฌด์†์‹ค๋กœ ๊ฐœ์ฒด์™€ ํ•˜์œ„ ํŠธ๋ฆฌ๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ธฐ๋Šฅ์„ ํฌํ•จํ•˜์—ฌ ์Šคํ‚ค๋งˆ ๋ฒ„์ „ ๊ฐ„์— ์•ž๋’ค๋กœ ํ˜ธํ™˜๋˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. [...] FFI๋ฅผ ํ†ตํ•ด ํ†ต์‹ ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ๋ชจ๋“ˆ์ด ๋™์‹œ์— ์ปดํŒŒ์ผ๋˜๋ฉด ์ด ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๋ฌด์˜๋ฏธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ์˜ ๋” ํฐ ์›์ธ์€ capnproto xor ๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•ด ๋ณ€์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” 0๋ฐ”์ดํŠธ๊ฐ€ ์••์ถ•๋  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ ์ œ๋กœ ๋ณต์‚ฌ ์›Œํฌํ”Œ๋กœ์—์„œ๋Š” ๋น„์ƒ์‚ฐ์ ์ž…๋‹ˆ๋‹ค.

๊ณต์œ  ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ์ ‘๊ทผ ๋ฐฉ์‹์ด wasm์— ์–ผ๋งˆ๋‚˜ ์‹คํ˜„ ๊ฐ€๋Šฅํ•œ์ง€ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค(์œ„ ์ฐธ์กฐ).

์•„, TBH ํ† ๋ก ์˜ ๊ทธ ๋ถ€๋ถ„์„ ๋”ฐ๋ฅผ ์ถฉ๋ถ„ํ•œ ๋งฅ๋ฝ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ณต์œ  ์ฃผ์†Œ ๊ณต๊ฐ„์ด ์—†๋‹ค๋ฉด ์˜ˆ, Cap'n Proto๊ฐ€ ๋งŽ์€ ์˜๋ฏธ๋ฅผ ๊ฐ–๊ธฐ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค.

์ด์™€ ๊ฐ™์€ ํ˜•์‹์„ ๋””์ž์ธํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ์กฐ์–ธ์„ ์ œ๊ณตํ•˜๊ฒŒ ๋˜์–ด ๊ธฐ์ฉ๋‹ˆ๋‹ค. FWIW ์˜ค๋Š˜๋‚  ์ด๋ฏธ ์กด์žฌํ•˜๋Š” ์•ฑ๊ณผ์˜ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•ด ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๋Š”๋‹ค๋ฉด Cap'n Proto์—์„œ ๋ณ€๊ฒฝํ•  ๋ช‡ ๊ฐ€์ง€ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋Œ€๋ถ€๋ถ„์€ ๋‚ฎ์€ ์ˆ˜์ค€์˜ ํฌ์ธํ„ฐ ์ธ์ฝ”๋”ฉ ์„ธ๋ถ€ ์ •๋ณด์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ฌด์˜๋ฏธํ•œ ์˜ค๋ฒ„ํ—ค๋“œ์˜ ๋” ํฐ ์›์ธ์€ capnproto๊ฐ€ ๊ธฐ๋ณธ๊ฐ’์— ๋Œ€ํ•ด ๋ณ€์ˆ˜๋ฅผ xorํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๋Š” 0๋ฐ”์ดํŠธ๊ฐ€ ์••์ถ•๋  ๋•Œ ์œ ์šฉํ•˜์ง€๋งŒ ์ œ๋กœ ๋ณต์‚ฌ ์›Œํฌํ”Œ๋กœ์—์„œ๋Š” ๋น„์ƒ์‚ฐ์ ์ž…๋‹ˆ๋‹ค.

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

@lukewagner "์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ๊ณต์œ " ๋ถ€๋ถ„์— ๋Œ€ํ•œ ์ƒ๊ฐ์ด

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

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

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

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

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

WASI/ESM+npm ๊ด€์ ์—์„œ ์ด ํ˜•์‹์˜ ์†”๋ฃจ์…˜์ด ๊ฐ€์žฅ ์˜๋ฏธ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต์œ  ABI์— ์˜์กดํ•˜์ง€ ์•Š๊ณ  ABI์— ๋Œ€ํ•œ ์ถ”์ƒํ™”์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ schema-lang API๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์„ค๋ช…ํ•˜๊ณ  ์–‘์ชฝ ๋์—์„œ ๋„ค์ดํ‹ฐ๋ธŒ์ฒ˜๋Ÿผ ๋ณด์ด๋Š” ABI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ด๋Ÿฌํ•œ ์–ธ์–ด ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด ํ˜ธ์ถœํ•˜์—ฌ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋ฒˆ์—ญ์„ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

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

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

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

C์—์„œ Rust๋กœ, Nim์œผ๋กœ ํšจ์œจ์ ์œผ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์•„๋‹ ์ˆ˜๋„ ์žˆ์ง€๋งŒ ๊ทธ ์˜๋ฏธ๋ฅผ ์•Œ๊ณ  ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. C ์œ ์‚ฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์œ ๋ฐœ๋˜๊ธฐ ๋•Œ๋ฌธ์— Haskell์ด Haskell ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์ด ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฐจ๋ก€๋กœ ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๋™์ผํ•œ "npm" ์ƒํƒœ๊ณ„์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ "Haskell"์€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณ ๊ธ‰ ์–ธ์–ด์˜ ๋Œ€๋ช…์‚ฌ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” C์™€ ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

C ์œ ์‚ฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์œ ๋ฐœ๋˜๊ธฐ ๋•Œ๋ฌธ์— Haskell์ด Haskell ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์ด ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฐจ๋ก€๋กœ ์ž์ฒด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•ด ๋™์ผํ•œ "npm" ์ƒํƒœ๊ณ„์— ์ฐธ์—ฌํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ "Haskell"์€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณ ๊ธ‰ ์–ธ์–ด์˜ ๋Œ€๋ช…์‚ฌ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” C์™€ ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ œ๊ณตํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์ด์ƒ์ ์œผ๋กœ๋Š” ์ง๋ ฌํ™” ์Šคํ‚ค๋งˆ๋กœ ๋ณ€ํ™˜ํ•˜๊ธฐ ์–ด๋ ค์šด Haskell ๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์˜ ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

ํŠนํžˆ Haskell์—์„œ๋Š” ๋ณต์‚ฌ๊ฐ€ ๊ฒŒ์œผ๋ฆ„์˜ ์˜๋ฏธ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š”๋‹ค๋Š” ์ถ”๊ฐ€ ๋ฌธ์ œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์—์„œ๋Š” ์ƒํƒœ ์ €์žฅ ๋ฐ์ดํ„ฐ์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

ํ˜ธ์ŠคํŠธ๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ๋Š” ๋ฐ”์ดํŠธ๋ฅผ ์ „ํ˜€ ์„ค๋ช…ํ•˜์ง€ ์•Š์œผ๋ฉฐ ๊ตฌํ˜„ ์„ธ๋ถ€ ์‚ฌํ•ญ์ด ๋˜๋„๋ก ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ด C ๊ตฌ์กฐ์ฒด์—์„œ WebIDL ์œ ํ˜•์œผ๋กœ์˜ ๋ณ€ํ™˜์— ์žˆ๋Š” WebIDL ๋ฐ”์ธ๋”ฉ ์ œ์•ˆ์˜ ๋””์ž์ธ์—์„œ ์ฐจ์šฉํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ข…๋ฅ˜์˜ ๋””์ž์ธ์€ WebIDL ์œ ํ˜• ๋Œ€์‹  Wasm ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค ์œ ํ˜•(์•ฝ์–ด: WAIT)์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. WebIDL ์ œ์•ˆ์—์„œ ์šฐ๋ฆฌ๋Š” "WebIDL๋กœ ๋ณ€ํ™˜"๋˜์—ˆ์„ ๋•Œ ๋ฐ์ดํ„ฐ์˜ ์ด์ง„ ํ‘œํ˜„์„ ์š”๊ตฌํ•˜๊ฑฐ๋‚˜ ์š”๊ตฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์™œ๋ƒํ•˜๋ฉด ์šฐ๋ฆฌ๋Š” ์ค‘๊ฐ„์— ์ค‘๋‹จ ์—†์ด wasm์—์„œ ๋ธŒ๋ผ์šฐ์ € API๋กœ ๋ฐ”๋กœ ์ด๋™ํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

C ์œ ์‚ฌ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•œ๋‹ค๋Š” ๊ฒƒ์€ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์œ ๋ฐœ๋˜๊ธฐ ๋•Œ๋ฌธ์— Haskell์ด Haskell ๋ชจ๋“ˆ์— ๋Œ€ํ•ด ์ด ์ถ”์ƒํ™”๋ฅผ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

์•„, 100% ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๋” ๋ช…ํ™•ํ•˜๊ฒŒ ํ•˜๊ธฐ ์œ„ํ•ด ์˜ˆ์ œ๋ฅผ ์™„๋ฃŒํ–ˆ์–ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•œํŽธ, Haskell์—์„œ Elm์—์„œ C#์œผ๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๊ฒƒ๋„ ์œ ์‚ฌํ•˜๊ฒŒ ํšจ์œจ์ ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ(wasm gc ์œ ํ˜•์„ ์‚ฌ์šฉํ•œ๋‹ค๊ณ  ๊ฐ€์ •ํ•  ๋•Œ), C#์—์„œ Rust๋กœ ๋ณ€ํ™˜ํ•˜๋Š” ๋ฐ ์˜ค๋ฒ„ํ—ค๋“œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ํŒจ๋Ÿฌ๋‹ค์ž„์„ ๋›ฐ์–ด ๋„˜์„ ๋•Œ ์˜ค๋ฒ„ ํ—ค๋“œ๋ฅผ ํ”ผํ•  ์ˆ˜์žˆ๋Š” ๋ฐฉ๋ฒ•์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

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

์ฝœ ์ฒด์ธ์ด๋ž€ ๋‹ค์Œ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.

  1. C -> Rust -> Zig -> Fortran, ํšจ์œจ์ 
  2. Haskell -> C# -> Haskell, ํšจ์œจ์ 
  3. C -> Haskell -> Rust -> Scheme, ๋น„ํšจ์œจ์ 
  4. ์ž๋ฐ” -> ๋Ÿฌ์ŠคํŠธ, ๋น„ํšจ์œจ์ 

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ์—์„œ "Haskell"์€ ๊ฑฐ์˜ ๋ชจ๋“  ๊ณ ๊ธ‰ ์–ธ์–ด์˜ ๋Œ€๋ช…์‚ฌ์ž…๋‹ˆ๋‹ค. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋Š” C์™€ ์œ ์‚ฌํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๋„ค, ์ด๊ฒƒ์ด Haskell์„ ๊ตฌ์ฒด์ ์ธ ์–ธ์–ด๋กœ ์‚ฌ์šฉํ•˜๋ ค๋Š” ์˜๋„์˜€์Šต๋‹ˆ๋‹ค. (Nim์€ GC๋„ ๋งŽ์ด ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— C์™€ ๊ฐ™์€ ์–ธ์–ด์˜ ๋‚˜์œ ์˜ˆ์ผ ์ˆ˜ ์žˆ์ง€๋งŒ)

--

๋‚ด๊ฐ€ ์ถ”์ƒ ์œ ํ˜•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•ด ์˜จ ๋˜ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์€ IR์ž…๋‹ˆ๋‹ค. LLVM์ด ๋‹ค๋Œ€์ผ ๊ด€๊ณ„(๋งŽ์€ ์–ธ์–ด -> ํ•˜๋‚˜์˜ IR -> ๋งŽ์€ ๋Œ€์ƒ)๋ฅผ ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ wasm ์ถ”์ƒ ์œ ํ˜•์€ ์–ธ์–ด+ํ˜ธ์ŠคํŠธ์˜ ๋‹ค๋Œ€๋‹ค ๋งคํ•‘์„ ์ค‘์žฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ธ์–ด+ํ˜ธ์ŠคํŠธ. ์ด ๋””์ž์ธ ๊ณต๊ฐ„์˜ ์–ด๋–ค ๊ฒƒ์ด N^2 ๋งคํ•‘ ๋ฌธ์ œ๋ฅผ ๊ฐ€์ ธ์™€ N+N ๋ฌธ์ œ๋กœ ๋ฐ”๊ฟ‰๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ๋Š” ์Šคํ‚ค๋งˆ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค.

๊ธ€์Ž„์š”, ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ์€ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋ญ”๊ฐ€ ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๊ฐ€ C ๋ ˆ์ด์•„์›ƒ์„ ๊ธฐ๋Œ€ํ•œ๋‹ค๋ฉด ์ด C ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•ด์•ผ ํ•˜๊ณ  ๋ชจ๋“  ํด๋ผ์ด์–ธํŠธ๋Š” ๋‚ด๋ถ€์ ์œผ๋กœ ๋งˆ์ƒฌ๋ง/๋งˆ์ƒฌ๋ง ํ•ด์ œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ง๋ ฌํ™” ํ˜•์‹๊ณผ ํฌ๊ฒŒ ๋‹ค๋ฅด์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

๊ธ€์Ž„์š”, ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๊ฐ ๋ชจ๋“ˆ์€ ํ˜ธ์ŠคํŠธ๊ฐ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋„๋ก ๋ญ”๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ˜ธ์ŠคํŠธ๊ฐ€ C ๋ ˆ์ด์•„์›ƒ์„ ์˜ˆ์ƒํ•˜๋Š” ๊ฒฝ์šฐ ์ด C ๋ ˆ์ด์•„์›ƒ์„ ์ •์˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํ˜ธ์ŠคํŠธ๋Š” ์•„๋ฌด๊ฒƒ๋„ ๊ธฐ๋Œ€ํ•˜์ง€ํ•ด์•ผํ•˜์ง€๋งŒ, ํ•„์š”์— ๋ชจ๋“  ๊ฒƒ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. ์ข€ ๋” ๊ตฌ์ฒด์ ์œผ๋กœ ์„ค๋ช… ํ•˜๋ฉด webidl-bindings ์ œ์•ˆ์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ๊ฐ i32 (ptr) ๋ฐ i32 (ptr), i32 (len) utf8-cstr ๋ฐ utf8-str ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ์–‘์—์„œ "ํ˜ธ์ŠคํŠธ๊ฐ€ ๋‚ด๋ถ€์ ์œผ๋กœ ์ด๊ฒƒ์„ C-๋ฌธ์ž์—ด๋กœ ๋‚˜ํƒ€๋ƒ„"์„ ์ง€์ •ํ•˜์—ฌ ๋‘˜ ์‚ฌ์ด๋ฅผ ๊ตฌ์ฒด์ ์œผ๋กœ ๋งคํ•‘ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.
๋”ฐ๋ผ์„œ ๊ฐ ๋ชจ๋“ˆ์€ ๋ฌด์–ธ๊ฐ€๋ฅผ ๊ตฌํ˜„ํ•˜์ง€๋งŒ ๋ฐ์ดํ„ฐ์˜ ํ‘œํ˜„์€ ์ถ”์ƒ ๋ฐ์ดํ„ฐ/์Šคํ‚ค๋งˆ ๊ณ„์ธต์—์„œ ํ‘œํ˜„๋  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ์—๊ฒŒ ํ•ด๋‹น ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์— ๋Œ€ํ•œ ์ถ”์ƒํ™” ์†์„ฑ์„ ์ œ๊ณตํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค.
๋˜ํ•œ ์ด๊ฒƒ์€ ๊ตฌ์ฒด์ ์ธ wasm ์œ ํ˜•๊ณผ ์ถ”์ƒ ์ค‘๊ฐ„ ์œ ํ˜•์„ ๋งคํ•‘ํ•˜๋Š” ๋ฐ”์ธ๋”ฉ ๋ ˆ์ด์–ด์—์„œ ํ™•์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Haskell ์ง€์›(๋ฌธ์ž์—ด์„ ๋‹จ์  ๋ชฉ๋ก๊ณผ ๋ฌธ์ž ๋ฐฐ์—ด๋กœ ๋ชจ๋ธ๋ง)์„ ์ถ”๊ฐ€ํ•˜๊ธฐ ์œ„ํ•ด utf8-cons-str ๋ฐ utf8-array-str ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. gc ์ œ์•ˆ ๊ตฌ๋ฌธ) (type $haskellString (struct (field i8) (field (ref $haskellString)))) ๋ฐ (type $haskellText (array i8)) .

์ฆ‰, ๊ฐ ๋ชจ๋“ˆ์€ ๋ฐ์ดํ„ฐ๊ฐ€ ์ƒ์„ฑ๋˜๋Š” ๋ฐฉ์‹์„ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค. ์ถ”์ƒ ์œ ํ˜• + ๋ฐ”์ธ๋”ฉ์€ ๋ชจ๋“ˆ์ด ๋™์ผํ•œ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋Š” ๋ฐฉ์‹ ๊ฐ„์˜ ๋ณ€ํ™˜์„ ํ—ˆ์šฉํ•˜๋ฉฐ, ๋‹จ์ผ ํ‘œํ˜„์ด ์–ด๋–ป๊ฒŒ๋“  ํ‘œ์ค€์ด ๋˜๋Š” ๊ฒƒ์„ ์ถ•๋ณตํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ถ”์ƒ ์œ ํ˜•(์ผ๋ถ€ ํ•˜์œ„ ์ง‘ํ•ฉ)์— ๋Œ€ํ•œ ์ง๋ ฌํ™” ํ˜•์‹์€ ์œ ์šฉํ•˜์ง€๋งŒ ์Šคํ‚ค๋งˆ ํ˜•์‹์˜ ์†Œ๋น„์ž๋กœ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์ง๊ต ๋ฌธ์ œ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. FIDL์—๋Š” ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•ด ์ „์†กํ•  ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์˜ ํ•˜์œ„ ์ง‘ํ•ฉ์— ๋Œ€ํ•œ ์ง๋ ฌํ™” ํ˜•์‹์ด ์žˆ์œผ๋ฉฐ ๋ถˆํˆฌ๋ช… ํ•ธ๋“ค์˜ ๊ตฌ์ฒดํ™”๋ฅผ ํ—ˆ์šฉํ•˜์ง€ ์•Š๋Š” ๋ฐ˜๋ฉด ์‹œ์Šคํ…œ ๋‚ด์—์„œ ์ „์†ก๋˜๋Š” ๋ถˆํˆฌ๋ช… ํ•ธ๋“ค์„ ํ—ˆ์šฉํ•ฉ๋‹ˆ๋‹ค(IPC ์˜ˆ, RPC ์•„๋‹ˆ์š”).

๋‹น์‹ ์ด ์„ค๋ช…ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋‚ด๊ฐ€ ์—ผ๋‘์— ๋‘์—ˆ๋˜ ๊ฒƒ๊ณผ ๋งค์šฐ ๋น„์Šทํ•˜์ง€๋งŒ ํ•œ ๊ฐ€์ง€ ํฐ ์ฃผ์˜ ์‚ฌํ•ญ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์Šคํ‚ค๋งˆ์—๋Š” ๊ฐ€๋Šฅํ•œ ์ ์€ ์ˆ˜์˜ ๊ณ ์ •๋œ ํ‘œํ˜„์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์„œ๋กœ ๋‹ค๋ฅธ ํ‘œํ˜„ ์‚ฌ์ด๋ฅผ ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์€ N*N ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ฆ‰, VM ์ž‘์„ฑ์ž์—๊ฒŒ ๊ณผ๋ถ€ํ•˜๊ฐ€ ๊ฑธ๋ฆฌ์ง€ ์•Š๋„๋ก ํ‘œํ˜„ ์ˆ˜๋ฅผ ์ž‘๊ฒŒ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Haskell ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋ช‡ ๊ฐ€์ง€ ๊ฐ€๋Šฅํ•œ ํ‘œํ˜„:

  • C ์Šคํƒ€์ผ ๊ตฌ์กฐ์ฒด์™€ ํฌ์ธํ„ฐ.
  • ์‹ค์ œ capnproto ๋ฐ”์ดํŠธ.
  • GC ์ˆ˜์—….
  • getter ๋ฐ setter ์—ญํ• ์„ ํ•˜๋Š” ํด๋กœ์ €.
  • ํŒŒ์ด์ฌ ์Šคํƒ€์ผ์˜ ์‚ฌ์ „.

๊ฐ ์–ธ์–ด๊ฐ€ ๋‹ค๋ฅด๊ณ  ์ผ๋ถ€ ๊ทน๋‹จ์ ์ธ ์ด์ƒ๊ฐ’์ด ์žˆ์ง€๋งŒ ์ƒ๋‹นํžˆ ์ ์€ ์ˆ˜์˜ ๋ฒ”์ฃผ์— ์ƒ๋‹นํžˆ ๋งŽ์€ ์ˆ˜์˜ ์–ธ์–ด๋ฅผ ๋งž์ถœ ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด์ž…๋‹ˆ๋‹ค.

๋”ฐ๋ผ์„œ Haskell ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๋ ค๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์ง€ ์•Š๊ณ  ๊ธฐ์กด ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๊ธฐ์กด ๋ฐ”์ธ๋”ฉ์˜ ์„ธ๋ถ„์„ฑ ์ˆ˜์ค€์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ๊ฐ€๋Šฅํ•œ ๊ฐ ๋ฐ”์ธ๋”ฉ์„ ์ธ์ฝ”๋”ฉํ•˜๋Š” N<->N ์–ธ์–ด๋Š” 2*N*N์ด์ง€๋งŒ N<->IR์€ 2*N์ด๋ฉฐ N<->[๊ณตํ†ต ๋ฐ”์ธ๋”ฉ ์Šคํƒ€์ผ]<->IR์ด๋ผ๊ณ  ํ•˜๋ฉด ์—ฌ๊ธฐ์„œ ์ˆซ์ž ์ผ๋ฐ˜์ ์ธ ํ˜•์‹์€ k์ด๋ฉฐ, ์—ฌ๊ธฐ์„œ k < N์ธ 2*k๋ฅผ ๋งํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ, ๋‚ด๊ฐ€ ์„ค๋ช…ํ•˜๋Š” ๊ตฌ์„ฑํ‘œ๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด Scheme์„ ๋ฌด๋ฃŒ๋กœ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค( utf8-cons-str ์žฌ์‚ฌ์šฉ). Java๊ฐ€ ๋ฌธ์ž์—ด์„ char ๋ฐฐ์—ด๋กœ๋„ ๋ชจ๋ธ๋งํ•˜๋Š” ๊ฒฝ์šฐ ์ด๋Š” utf8-array-str ๋ฐ”์ธ๋”ฉ์ž…๋‹ˆ๋‹ค. Nim์ด ๋‚ด๋ถ€์ ์œผ๋กœ string_views๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ utf8-str . Zig๊ฐ€ C ABI๋ฅผ ์ค€์ˆ˜ํ•˜๋Š” ๊ฒฝ์šฐ utf8-cstr . (์ €๋Š” Java/Nim/Zig์˜ ABI๋ฅผ ๋ชฐ๋ผ์„œ ์•ž์—์„œ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋กœ ์–ธ๊ธ‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.)

๋”ฐ๋ผ์„œ ๊ฐ€๋Šฅํ•œ ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ IR ์œ ํ˜•๋ณ„๋กœ ๋ช‡ ๊ฐ€์ง€ ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋ฅผ ํฌ๊ด„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ๋™์˜ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ๋Š” ์—ฌ์ง€๊ฐ€ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ์ด "๋ช‡ ๊ฐœ"์ธ์ง€, ์Šค์œ„ํŠธ ์Šคํฟ์ด ๋ฌด์—‡์ธ์ง€, ์–ธ์–ด์˜ ABI๋ฅผ ์ง€์›ํ•˜๋Š”์ง€ ์—ฌ๋ถ€์— ๋Œ€ํ•œ ๊ธฐ์ค€์€ ์–ผ๋งˆ๋‚˜ ์—„๊ฒฉํ•ด์•ผ ํ• ๊นŒ์š”?
์ด ์งˆ๋ฌธ์— ๋Œ€ํ•œ ๊ตฌ์ฒด์ ์ธ ๋‹ต๋ณ€์€ ์—†์Šต๋‹ˆ๋‹ค. ๋””์ž์ธ ๊ณต๊ฐ„์„ ๋” ์ž˜ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ๋งŽ์€ ๊ตฌ์ฒด์ ์ธ ์˜ˆ๋ฅผ ์ œ๊ณตํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ํ•œ ๊ฐ€์ง€ ์Šคํƒ€์ผ์˜ ๋ฐ์ดํ„ฐ์— ๋Œ€ํ•œ ํŠน๊ถŒ์„ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ถ”์ƒ ์œ ํ˜•๋ณ„๋กœ ์—ฌ๋Ÿฌ ๋ฐ”์ธ๋”ฉ์„ ์ง€์ •ํ•˜๊ธฐ๋ฅผ ์ ˆ๋Œ€์ ์œผ๋กœ ์›ํ•œ๋‹ค๊ณ  ์ฃผ์žฅํ•ฉ๋‹ˆ๋‹ค. Strings์— ๋…ธ์ถœํ•˜๋Š” ์œ ์ผํ•œ ๋ฐ”์ธ๋”ฉ์ด utf8-cstr ์ธ ๊ฒฝ์šฐ C-ABI๊ฐ€ ์•„๋‹Œ ๋ชจ๋“  ์–ธ์–ด๋Š” ํ•ด๋‹น ๋ถˆ์ผ์น˜๋ฅผ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. VM ์ž‘์„ฑ ๋ณต์žก์„ฑ์„ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.
์ƒํƒœ๊ณ„์˜ ์ด ์ž‘์—…์€ O(VM ์ž‘์—… + ์–ธ์–ด ๊ตฌํ˜„ ์ž‘์—…)์ด๋ฉฐ ๋‘ ์šฉ์–ด ๋ชจ๋‘ N=์–ธ์–ด ์ˆ˜์™€ ํ•จ๊ป˜ ์–ด๋–ค ์‹์œผ๋กœ๋“  ํ™•์žฅ๋ฉ๋‹ˆ๋‹ค. M = ์ž„๋ฒ ๋” ์ˆ˜, k = ๋ฐ”์ธ๋”ฉ ์ˆ˜, a = ์ฃผ์–ด์ง„ ์–ธ์–ด๊ฐ€ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ํ‰๊ท  ๋ฐ”์ธ๋”ฉ ์ˆ˜๋ฅผ a<=k๋กœ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ์ตœ์†Œํ•œ M+N๊ฐœ์˜ ๋ณ„๋„ wasm ๊ตฌํ˜„์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ชจ๋“  N ์–ธ์–ด๊ฐ€ ๋…๋ฆฝ์ ์œผ๋กœ ๋‹ค๋ฅธ ๋ชจ๋“  N ์–ธ์–ด์™€ ํ•จ๊ป˜ ABI FFI๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ์ˆœ์ง„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์€ O(M + N*N)์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์šฐ๋ฆฌ๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์— ๋Œ€ํ•ด ๊ฐ€์ง€๊ณ  ์žˆ๋Š” ๊ฒƒ์ธ๋ฐ, ์ด๋Š” ๋ชจ๋“  O(N*N)์ด ๋„ค์ดํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ๊ณผ ๋‹ค๋ฅด์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋กœ ์ด์–ด์งˆ ๊ฒƒ์ด๋ผ๋Š” ๊ฐ•๋ ฅํ•œ ์‹ ํ˜ธ์ž…๋‹ˆ๋‹ค.
๋ชจ๋“  VM์ด ๋ชจ๋“  N*N ๋ฐ”์ธ๋”ฉ์„ ๊ตฌํ˜„ํ•ด์•ผ ํ•˜๋Š” ๋‘ ๋ฒˆ์งธ ์ˆœ์ง„ํ•œ ์ ‘๊ทผ ๋ฐฉ์‹: O(M*N*N + N), ์ด๋Š” ๋ถ„๋ช…ํžˆ ํ›จ์”ฌ ๋” ๋‚˜์ฉ๋‹ˆ๋‹ค.
์šฐ๋ฆฌ๊ฐ€ ์ œ์•ˆํ•˜๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ์€ ์ถ”์ƒ ์–ธ์–ด ์‚ฌ์ด์— ๋งคํ•‘๋˜๋Š” k ๋ฐ”์ธ๋”ฉ์ด ์žˆ๊ณ  ๋ชจ๋“  ์–ธ์–ด์— ๋‹ค์‹œ ๋งคํ•‘๋œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๋Š” ๊ฐ VM์— ๋Œ€ํ•ด k ์ž‘์—…์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ ์–ธ์–ด์— ๋Œ€ํ•ด ๋ฐ”์ธ๋”ฉ์˜ ํ•˜์œ„ ์ง‘ํ•ฉ๋งŒ ๊ตฌํ˜„ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ M*k + N*a์ด๋ฉฐ O(M*k + N*k)์ž…๋‹ˆ๋‹ค. k=N์ธ ๊ฒฝ์šฐ VM ์ธก์ด "์œ ์ผํ•œ" M*N์ด๋ฏ€๋กœ ์ฃผ์–ด์ง„ VM์— ๋Œ€ํ•ด ์–ธ์–ด ์ˆ˜์—์„œ "์œ ์ผํ•œ" ์„ ํ˜•์ž…๋‹ˆ๋‹ค. ๋ถ„๋ช…ํžˆ ์šฐ๋ฆฌ๋Š” k << N์„ ์›ํ•˜์ง€๋งŒ, ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์—ฌ์ „ํžˆ O(N*N)์ด๋ฏ€๋กœ ์ฒซ ๋ฒˆ์งธ ์†”๋ฃจ์…˜๋ณด๋‹ค ๋‚ซ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๊ทธ๋ž˜๋„ O(M*k + N*k)๊ฐ€ ํ›จ์”ฌ ๋” ๋ง›์žˆ์Šต๋‹ˆ๋‹ค. k๊ฐ€ O(1)์ด๋ฉด ์ „์ฒด ์ƒํƒœ๊ณ„๋ฅผ ๊ตฌํ˜„ ํšŸ์ˆ˜์—์„œ ์„ ํ˜•์œผ๋กœ ๋งŒ๋“ค๋ฉฐ, ์ด๋Š” ๊ด€๋ จ๋œ ๋…ธ๋ ฅ์˜ ์–‘์— ๋Œ€ํ•œ ํ•˜ํ•œ์„ ์ž…๋‹ˆ๋‹ค. ๋” ๊ฐ€๋Šฅ์„ฑ์ด ์žˆ๋Š” ๊ฒฝ๊ณ„๋Š” k๊ฐ€ O(log(N))์ด๊ณ  ๋‚˜๋Š” ์—ฌ์ „ํžˆ ๊ฝค ๋งŒ์กฑํ•ฉ๋‹ˆ๋‹ค.

๊ธด ๋ง์ด์ง€๋งŒ ์ €๋Š” ์ด ๊ธฐ๋Šฅ์— ๋Œ€ํ•œ VM ๋ณต์žก์„ฑ์„ ์ผ์ •ํ•œ ์š”์†Œ๋กœ ์ฆ๊ฐ€์‹œํ‚ค๋Š” ๋ฐ ์™„์ „ํžˆ ๋ฌธ์ œ๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

IR ์œ ํ˜•๋ณ„๋กœ ๋ช‡ ๊ฐ€์ง€ ๋ฐ”์ธ๋”ฉ์„ ์ถ”๊ฐ€ํ•˜์—ฌ ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด๋ฅผ ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹จ์ˆœํžˆ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ๊ณ  ๋ฏฟ๋Š” ๊ฒฐ์ •์ ์ธ ๊ธฐ๋ณธ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด (์ ์–ด๋„!) ์–ธ์–ด ๊ตฌํ˜„๋งŒํผ ๋งŽ์€ ํ‘œํ˜„ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์€ ์ž„์˜๋กœ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์ธ์ฝ”๋”ฉ, ์ด์ข… ๋กœํ”„ ๋“ฑ์„ ํฌํ•จํ•˜์—ฌ ๋ฌธ์ž์—ด์— ๋Œ€ํ•ด ์ˆ˜์‹ญ(!)๊ฐœ์˜ ํ‘œํ˜„์ด ์žˆ๋Š” V8์„ ์˜ˆ๋กœ ๋“ค์–ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

Haskell์˜ ๊ฒฝ์šฐ๋Š” ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. Haskell์˜ ๋ชฉ๋ก์€ ๊ฒŒ์œผ๋ฅด๋ฏ€๋กœ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋‹จ์ผ ๋ฌธ์ž์— ๋Œ€ํ•ด ์ฝํฌ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋‘ ๊ฐ€์ง€ ์˜ˆ๋Š” ์ด๋ฏธ ์„ ์–ธ์  ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์ด ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ์—๋Š” ๊ณ ์œ ํ•œ ํ˜ธ์ถœ ๊ทœ์น™์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋ฆฌ๊ณ  ์ˆ˜์‹ ์ธก์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋ฐ์ดํ„ฐ ๊ตฌ์กฐ๋ฅผ ์ƒ์„ฑ ํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค!

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

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

์™„์ „ํžˆ ๋™์˜ ํ•ด. ๋Œ€๋ถ€๋ถ„์˜ ์–ธ์–ด์˜ ๋ฐ์ดํ„ฐ ๋‚ด๋ถ€ ํ‘œํ˜„์„ ์–ด๋–ป๊ฒŒ๋“  ๋‹ค๋ฃฐ ์ˆ˜ ์žˆ๋Š” ์œ ํ˜•์„ ์„ค๊ณ„ํ•˜๋Š” ๊ฒƒ์€ ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๊ณ  ์ƒํƒœ๊ณ„๋ฅผ ์ง€๋‚˜์น˜๊ฒŒ ๋ณต์žกํ•˜๊ฒŒ ๋งŒ๋“ค ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

์‚ฌ์‹ค, ํฌ์ธํ„ฐ + len ์Œ์ด๋ผ๋Š” ๋‹จ์ผ ๋ฐ์ดํ„ฐ ์œ ํ˜•์œผ๋กœ ๋งค์šฐ ๋ฉ€๋ฆฌ ๊ฐˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ํ•ด๋‹น ๋ฐ”์ดํŠธ์— ์žˆ๋Š” ๋‚ด์šฉ์„ ๋‚˜ํƒ€๋‚ด๋Š” "์Šคํ‚ค๋งˆ"๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. UTF-8 ์ค€์ˆ˜๋ฅผ ์•ฝ์†ํ•ฉ๋‹ˆ๊นŒ? ๋งˆ์ง€๋ง‰ ๋ฐ”์ดํŠธ๋Š” ํ•ญ์ƒ 0์œผ๋กœ ๋ณด์žฅ๋ฉ๋‹ˆ๊นŒ? ์ฒ˜์Œ 4/8๋ฐ”์ดํŠธ ๊ธธ์ด/์šฉ๋Ÿ‰ ํ•„๋“œ์ž…๋‹ˆ๊นŒ? ์ด ๋ชจ๋“  ๋ฐ”์ดํŠธ๊ฐ€ WebGL๋กœ ๋ฐ”๋กœ ๋ณด๋‚ผ ์ˆ˜ ์žˆ๋Š” ๋ฆฌํ‹€ ์—”๋””์•ˆ ๋ถ€๋™ ์†Œ์ˆ˜์ ์ž…๋‹ˆ๊นŒ? ์ด ๋ฐ”์ดํŠธ๊ฐ€ ๊ธฐ์กด ์ง๋ ฌํ™” ํ˜•์‹์˜ ์Šคํ‚ค๋งˆ X์ž…๋‹ˆ๊นŒ? ๋“ฑ?

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

์ด๊ฒƒ์€ ๋‚ด๊ฐ€ ๋‹จ์ˆœํžˆ ์‚ฌ์‹ค์ด ์•„๋‹ˆ๋ผ๊ณ  ๋ฏฟ๋Š” ๊ฒฐ์ •์ ์ธ ๊ธฐ๋ณธ ๊ฐ€์ •์ž…๋‹ˆ๋‹ค. ๋‚ด ๊ฒฝํ—˜์— ๋”ฐ๋ฅด๋ฉด (์ ์–ด๋„!) ์–ธ์–ด ๊ตฌํ˜„๋งŒํผ ๋งŽ์€ ํ‘œํ˜„ ์„ ํƒ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ๋“ค์€ ์ž„์˜๋กœ ๋ณต์žกํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

๋ฐ”์ธ๋”ฉ์€ ๋ชจ๋“  ์–ธ์–ด ํ‘œํ˜„์— ์™„๋ฒฝํ•˜๊ฒŒ ๋งคํ•‘๋˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ๋ชจ๋“  ์–ธ์–ด์—

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

Haskell์˜ ๊ฒฝ์šฐ๋Š” ์„ค๋ช…ํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋ณต์žกํ•ฉ๋‹ˆ๋‹ค. Haskell์˜ ๋ชฉ๋ก์€ ๊ฒŒ์œผ๋ฅด๋ฏ€๋กœ ๋ฌธ์ž์—ด์˜ ๋ชจ๋“  ๋‹จ์ผ ๋ฌธ์ž์— ๋Œ€ํ•ด ์ฝํฌ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

์ด ๋‘ ๊ฐ€์ง€ ์˜ˆ๋Š” ์ด๋ฏธ ์„ ์–ธ์  ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ์ด ์ž˜๋ฆฌ์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ๊ฐ€ ๋งŽ์œผ๋ฉฐ, ๋Ÿฐํƒ€์ž„ ์ฝ”๋“œ์—๋Š” ๊ณ ์œ ํ•œ ํ˜ธ์ถœ ๊ทœ์น™์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”์ธ๋”ฉ์„ ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•(๋˜๋Š” ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ๋ฌด์—‡์ด๋“  ์ง€์ •ํ•˜๋Š” ๊ฒฝ์šฐ)์— ๊ด€๊ณ„์—†์ด ์ด๋ฅผ ๋ชจ๋ธ๋งํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์–ธ์–ด์˜ ํ˜•์‹ ํ‘œํ˜„์ด ๋ฐ”์ธ๋”ฉ์— ์ง์ ‘ ๋งคํ•‘๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ ๋งคํ•‘ํ•˜๋Š” ํ‘œํ˜„์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด Haskell์˜ ๋ฌธ์ž์—ด์ด ์‹ค์ œ๋กœ (type $haskellString (struct (field i8) (field (func (result (ref $haskellString)))))) ๋กœ ํ‘œํ˜„๋œ๋‹ค๋ฉด ์—„๊ฒฉํ•œ ๋ฌธ์ž์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Scheme๊ณผ ์œ ์‚ฌํ•œ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ Text ๋ฐฐ์—ด๋กœ ๋ณ€ํ™˜ํ•˜๊ณ  Java์™€ ๊ฐ™์€ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CFFIString์„ ์‚ฌ์šฉํ•˜๊ณ  C์™€ ๊ฐ™์€ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋ถˆ์™„์ „ํ•œ ๋ฐ”์ธ๋”ฉ ์œ ํ˜•์ด ์—ฌ๋Ÿฌ ๊ฐœ ์žˆ๋‹ค๋Š” ๊ฐ€์น˜ ์ œ์•ˆ์€ ๊ทธ ์ค‘ ์ผ๋ถ€๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค Haskell์— ๋œ ์–ด์ƒ‰ํ•˜๊ณ  ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ์ˆ˜์ •ํ•  ํ•„์š” ์—†์ด Wasm-FFI ์œ ํ˜•์„ ๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

๋Œ€์‹ , ์šฐ๋ฆฌ๋Š” ๋ช‡ ๊ฐ€์ง€ ํŠน๊ถŒ์„ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค

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

์ด๋ฏธ ์ž„์˜์ ์ธ ๊ฒƒ๋“ค์˜ ํฐ ๋™๋ฌผ์›์„ ์„ฑ์žฅ์‹œํ‚ค๋Š” ๋™์•ˆ.

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

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

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

@jgravelle-google ์ฐธ์กฐ ์œ ํ˜•์„ ๋ณ„๋„๋กœ ์œ ์ง€ํ•ด์•ผ ํ•ฉ๋‹ˆ๊นŒ? ๋”ฐ๋ผ์„œ ์ฃผ์–ด์ง„ ํ•จ์ˆ˜์˜ ์›์‹œ ์„œ๋ช…์€ ref ref i32 i32 i32 i32 ์ด๋Š” ์‹ค์ œ๋กœ 2๊ฐœ์˜ anyref ๋’ค์— ํŠน์ • ์œ ํ˜•์˜ 2๊ฐœ์˜ ๋ฒ„ํผ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค(์œ„์˜ ๊ฐ€์ƒ ์Šคํ‚ค๋งˆ์— ์ง€์ •๋จ).

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

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

๊ทธ๊ฒƒ์ด ๋‚ด๊ฐ€ capnproto๋ฅผ ์ธ์ฝ”๋”ฉ์œผ๋กœ ์ œ์•ˆํ•œ ์ด์œ  ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ฐธ์กฐ ํ…Œ์ด๋ธ”์€ ๋‹ค์†Œ ๋‚ด์žฅ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

์–ด์จŒ๋“  ์šฐ๋ฆฌ๋Š” ๋ฐ์ดํ„ฐ ๊ทธ๋ž˜ํ”„์˜ ์–ด๋Š ๊ณณ์—๋‚˜ ๋ฐฐ์น˜ํ•  ์ˆ˜ ์žˆ๋Š” 1๊ธ‰ ์‹œ๋ฏผ์œผ๋กœ ์ฐธ์กฐ ์œ ํ˜•์„ ๊ฐ–๋„๋ก ์„ ํƒํ•œ ๋ชจ๋“  ํ˜•์‹์„ ์›ํ•ฉ๋‹ˆ๋‹ค. (์˜ˆ: ์„ ํƒ ์‚ฌํ•ญ, ๋ฐฐ์—ด, ๋ณ€ํ˜• ๋“ฑ)

์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์‹  ๋ชจ๋“  ๋ถ„๋“ค๊ป˜ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค.

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

์ง€๊ธˆ๊นŒ์ง€์˜ ํ”ผ๋“œ๋ฐฑ์„ ์š”์•ฝํ•˜์ž๋ฉด:

  • ์ง๋ ฌํ™” ํ˜•์‹์ด ์žˆ๋Š” ๊ฒฝ์šฐ wasm์— ๊ฐ€์žฅ ์ ํ•ฉํ•œ ํ˜•์‹์— ๋Œ€ํ•œ ํ•ฉ์˜๋Š” ๊ฑฐ์˜ ์—†์Šต๋‹ˆ๋‹ค. ๋Œ€์•ˆ์—๋Š” FlatBuffers, ์›์‹œ ํฌ์ธํ„ฐ๊ฐ€ ์žˆ๋Š” C ABI ๊ตฌ์กฐ ๊ทธ๋ž˜ํ”„, ๋งž์ถคํ˜• wasm IDL ํ˜•์‹ ๋˜๋Š” ์œ„์˜ ์ผ๋ถ€ ์กฐํ•ฉ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

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

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

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

  • ๋ช‡๋ช‡ ๋…์ž๋“ค์€ ์–ธ์–ด ๊ฐ„ ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์‹คํ–‰ ๊ฐ€๋Šฅ์„ฑ์— ๋Œ€ํ•ด ์šฐ๋ ค๋ฅผ ํ‘œ๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์šฐ๋ ค๋Š” ๋ถ€๋ถ„์ ์œผ๋กœ ์ฃผ์ œ๊ฐ€ ๋งค์šฐ ์ถ”์ƒ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ๋‹ค์†Œ ๋ชจํ˜ธํ•˜๊ณ  ์ •์˜ํ•˜๊ธฐ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ถ€๋ถ„์ ์œผ๋กœ๋Š” ์ง€๊ธˆ๊นŒ์ง€ ์ œ์•ˆ ์ž์ฒด๊ฐ€ @lukewagner ์˜ ๋‹ญ๊ณผ ๋‹ฌ๊ฑ€ ๋ฌธ์ œ๋ฅผ ๋ฐ˜์˜ํ•˜๋Š” ๋งค์šฐ ๋ชจํ˜ธํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํŠน์ • ์˜ค๋ฅ˜ ์ƒํƒœ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

    • ๋ˆˆ์— ์ž˜ ๋„๋Š” ์–ธ์–ด์— ๋„ˆ๋ฌด ๋งŽ์€ ์ดˆ์ ์„ ๋งž์ถ”๊ณ  ๋” ๋งŽ์€ ํ‹ˆ์ƒˆ ์–ธ์–ด๋ฅผ ๋’ค์— ๋‚จ๊ฒจ๋‘ก๋‹ˆ๋‹ค.
    • ๋„ˆ๋ฌด ์ผ๋ฐ˜์ ์ด๋ ค๊ณ  ํ•˜์ง€๋งŒ ๋ˆ„๊ตฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ํŽธ๋ฆฌํ•˜๊ฑฐ๋‚˜ ํšจ์œจ์ ์œผ๋กœ ๋‹ค๋ฃจ์ง€ ์•Š๋Š” ๋ˆ„์ˆ˜ ์ถ”์ƒํ™”๋ฅผ ๊ฐ€์ง‘๋‹ˆ๋‹ค.
    • ๋„ˆ๋ฌด ๋งŽ์€ ๊ฒฝ์šฐ๋ฅผ ๋‹ค๋ฃจ๋ฉด์„œ ์—ฌ์ „ํžˆ ์œ„์˜ ๋ฌธ์ œ๋กœ ๊ณ ํ†ต๋ฐ›๋Š” ๋ถ€ํ’€๋ ค์ง„ N*N ๊ตฌํ˜„์„ ๋งŒ๋“ญ๋‹ˆ๋‹ค.

๋‹ค์Œ ์ œ์•ˆ ๋ฐ˜๋ณต์—์„œ๋Š” ์–ด๋–ค ์‹์œผ๋กœ๋“  ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

ํŠนํžˆ, ํ† ๋ก ์€ ๋ช‡ ๊ฐ€์ง€ ์—‰๋šฑํ•œ ์˜ˆ์—์„œ ์ถ”๋ก ํ•˜๋Š” ๋ฐ ๋งŽ์€ ๋„์›€์ด ๋  ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์˜ˆ์—๋Š” n*n ๋ฌธ์ œ๋ฅผ ์„ค๋ช…ํ•˜๊ธฐ ์œ„ํ•ด ์„œ๋กœ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ ๋ ˆ์ด์•„์›ƒ(์˜ˆ: C++ ๋ฐ Java)์„ ์‚ฌ์šฉํ•˜์—ฌ ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด๋กœ ์ž‘์„ฑ๋œ ์ตœ์†Œ ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜๋ฉฐ ์„œ๋กœ ๋‹ค๋ฅธ ์–ธ์–ด(์˜ˆ: Rust ๋ฐ Python)์˜ ์ตœ์†Œ ๋‘ ๊ฐœ ์ด์ƒ์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ „๋žต์ž…๋‹ˆ๋‹ค.

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

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

@jgravelle-google:

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

๋„ค, ์ €๋„ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ฃผ์žฅ์€ @aardappel ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ผ๋ฐ˜์ ์œผ๋กœ ํ•ด์•ผ ํ•˜๋Š” ์ผ์ด๋ผ๋ฉด ๊ทธ๋ƒฅ ๋ฐ›์•„๋“ค์—ฌ์•ผ ํ•˜๊ณ  ์ด์ƒํ•œ ๊ฒฝ์šฐ๋ฅผ ๊ฐœ์„ ํ•˜๊ธฐ ์œ„ํ•ด ์ž„์‹œ๋กœ ์‹œ๋„ํ•˜์ง€ ์•Š์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. Userland๋Š” Wasm์˜ ๋‹ค๋ฅธ ๋ชจ๋“  ๊ฒƒ์˜ ์ •์‹ ์œผ๋กœ ์ „ํ™˜์ด ์†ํ•˜๋Š” ๊ณณ์ž…๋‹ˆ๋‹ค.

ํ˜ผ๋ž€์Šค๋Ÿฌ์›Œ์„œ "์–ธ์–ด ๊ฐ„์˜ ๋ฐ”์ธ๋”ฉ์€ ์™„์ „ํžˆ ๋ถˆ๊ฐ€๋Šฅํ•˜๋ฏ€๋กœ ์ „ํ˜€ ์‹œ๋„ํ•˜์ง€ ์•Š์•„์•ผํ•ฉ๋‹ˆ๋‹ค."

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

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

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜์— ๋Œ€ํ•ด ๋งค์šฐ ํ‘œ์ค€์ ์ธ ๊ฒƒ์€ ์—†์„ ๊ฒƒ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์„ ํƒ์€ "์ž„์˜"์™€ ๊ฐœ๋ณ„ ์˜๋ฏธ์ž…๋‹ˆ๋‹ค.

์ฐธ์กฐ ์œ ํ˜•์„ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

GC ์œ ํ˜•์ด ์žˆ์œผ๋ฉด GC ๊ฐ’์œผ๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ณตํ•˜๋Š” ๋Œ€์ฒด ๋ฐฉ๋ฒ•์ด ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ ์ฐธ์กฐ๋Š” ์ž์œ ๋กญ๊ฒŒ ํ˜ผํ•ฉ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋ฌธ์ œ๊ฐ€ ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

@PoignardAzur :

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

๋„ค, ์š”์ฆ˜์€ ๊ทธ๊ฒƒ์ด ์‹ค์ˆ˜๋กœ ๋„๋ฆฌ ๊ฐ„์ฃผ๋˜๊ณ  ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ "๋‹จ์ˆœํ•œ" ๋ฐ์ดํ„ฐ ์œ ํ˜•์— ๋Œ€ํ•ด์„œ๋„ ์–ผ๋งˆ๋‚˜ ๋งŽ์€ ๋‹ค์–‘์„ฑ์ด ์žˆ๋Š”์ง€ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค.

@rossberg

์–ธ์–ด ๊ฐ„์˜ ๋ฐ์ดํ„ฐ ์ƒํ˜ธ ์šด์šฉ์„ฑ์„ ์œ„ํ•ด DDL(์œ ํ˜• ์ฒด๊ณ„)์„ ์ •์˜ํ•˜๋Š” ๊ฒƒ์ด ์™„์ „ํžˆ ๋ฐ”๋žŒ์งํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” Wasm์œผ๋กœ์˜ ๋ณ€ํ™˜์„ ๊ตฌ์ถ•ํ•˜๋Š” ๊ฒƒ์ด ๋‹ค๋ฃจ๊ธฐ ํž˜๋“ค๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ณ€ํ™˜์€ ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋ง๋ถ™์ด์ž๋ฉด: ์ €๋Š” wasm์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ๋ณด๋‹ค ์–ธ์–ด ๊ฐ„ ์†”๋ฃจ์…˜์ด ๋” ํ•„์š” ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— wasm ์‚ฌ์–‘์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์— ํšŒ์˜์ ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  wasm๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค ๋‹ค๋ฅธ ํ”Œ๋žซํผ๋ณด๋‹ค ์ด๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•  ์ˆ˜ ์žˆ๋Š” ๋Šฅ๋ ฅ์ด ๋›ฐ์–ด๋‚ฉ๋‹ˆ๋‹ค . ์—ฌ๊ธฐ์„œ was์— ๋Œ€ํ•ด ๋‚˜์—๊ฒŒ ๋ช…๋ฐฑํ•˜๊ฒŒ ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์šฐ๋ฆฌ๊ฐ€ @aardappel์ด ์–ธ๊ธ‰ํ•œ ๋ฒ„ํผ์™€ ๊ฐ™์ด ์ด ์˜์—ญ์—์„œ ํ‘œ์ค€ ์†”๋ฃจ์…˜๋ณด๋‹ค ๋” ๋‚˜์€ ์ด์œ ๋ฅผ

์ ์–ด๋„ ์›น์—์„œ wasm์ด ๊ฐ€์ง„ ํ•œ ๊ฐ€์ง€ ํŠน๋ณ„ํ•œ ๊ฒƒ์€ ๋ฌธ์ž์—ด ๋ฐ ๋ฐฐ์—ด ๋“ฑ์— ๋Œ€ํ•œ JavaScript/Web API ์œ ํ˜•์ž…๋‹ˆ๋‹ค. ๊ทธ๋“ค๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ๋ถ„๋ช…ํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” wasm์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ๋ณด๋‹ค ์–ธ์–ด ๊ฐ„ ์†”๋ฃจ์…˜์ด ๋” ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ณ  ์‹คํ–‰๋  ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. <script src="http://some.other.site/jquery.js"> ์™€ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ๋‚˜๋Š” ์‚ฌ๋žŒ๋“ค์ด cross-origin ๋ฐฉ์‹์œผ๋กœ wasm ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฒฐํ•ฉํ•˜๋Š” ๊ฒƒ์„ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์›น์ด ์ œ๊ณตํ•˜๋Š” ์ž„์‹œ์„ฑ๊ณผ ๊ตฌ์„ฑ์„ฑ ์†์„ฑ์œผ๋กœ ์ธํ•ด ์™ธ๋ถ€ ๋ชจ๋“ˆ๊ณผ ์ธํ„ฐํŽ˜์ด์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๋ถ€๊ฐ€๊ฐ€์น˜๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์‹œ์Šคํ…œ์—์„œ ๊ทธ ์–ด๋Š ๋•Œ๋ณด๋‹ค ๋†’์Šต๋‹ˆ๋‹ค.

๊ทธ๋ฆฌ๊ณ  ๋‚˜๋Š” wasm์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ๋ณด๋‹ค ๊ทธ๋Ÿฌํ•œ ์†”๋ฃจ์…˜์„ ๊ตฌํ˜„ํ•˜๋Š” ๋Šฅ๋ ฅ์ด ๋” ๋›ฐ์–ด๋‚˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

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

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

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

(๊ทธ๋ฆฌ๊ณ  NPM์ด๋‚˜ WAPM ๋˜๋Š” ์•„์ง ์ƒ์„ฑ๋˜์ง€ ์•Š์€ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ž…๋‹ˆ๊นŒ?)

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

์žˆ๋Š” ๊ทธ๋Œ€๋กœ WAPM์— ์ข…์†์„ฑ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๋‚˜๋Š” wasm์ด ๋‹ค๋ฅธ ํ”Œ๋žซํผ๋ณด๋‹ค ์–ธ์–ด ๊ฐ„ ์†”๋ฃจ์…˜์ด ๋” ํ•„์š”ํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ œ ์ƒ๊ฐ์—๋Š” ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์›น์—์„œ ์‚ฌ์šฉ๋œ๋‹ค๋Š” ๊ฒƒ์€ ์ฝ”๋“œ๊ฐ€ ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰๋  ์ˆ˜ ์žˆ๊ณ  ์‹คํ–‰๋  ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ๊ฐ™์€ ๋ฐฉ๋ฒ•์œผ๋กœ

๋ณ€ํ™˜์€ ์‚ฌ์šฉ์ž ์˜์—ญ์—์„œ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ธ๋”ฉ ๋ ˆ์ด์–ด๋Š” ์‚ฌ์šฉ์ž ์ฝ”๋“œ๊ฐ€ ์ƒ์„ฑ/์†Œ๋น„ํ•ด์•ผ ํ•˜๋Š” ํ˜•์‹์„ ๊ทœ์ •ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ๋‚˜์—๊ฒŒ ์ข‹์€ ์š”์•ฝ์ž…๋‹ˆ๋‹ค.

์ƒˆ ์ดˆ์•ˆ์„ ์ž‘์„ฑํ•˜๋Š” ๋™์•ˆ ์ด ์Šค๋ ˆ๋“œ์˜ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ์—ด๋ ค ์žˆ๋Š” ์งˆ๋ฌธ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

WebAssembly๋กœ ์ปดํŒŒ์ผ๋œ ๊ฒฝ์šฐ ๋ชจ๋“  ์–ธ์–ด์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๊ธฐ์กด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ €๋Š” ๋ณธ์งˆ์ ์œผ๋กœ ๋””์ž์ธ์˜ ๊ธฐ๋ฐ˜์ด ๋  ์ž ์žฌ์ ์ธ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋งŒ์˜ ๊ฒƒ(ํŠนํžˆ React, Bullet ์—”์ง„ ๋ฐ ํ”Œ๋Ÿฌ๊ทธ์ธ ์‹œ์Šคํ…œ)์ด ์žˆ์ง€๋งŒ ์ž‘์—…ํ•  ์˜ˆ์ œ๊ฐ€ ๋” ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

@PoignardAzur C์˜ ๋งŽ์€ ์–ธ์–ด๋Š” ๋™์ผํ•œ Perl ํ˜ธํ™˜ ์ •๊ทœ์‹(PCRE) ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์ง€๋งŒ ๋ธŒ๋ผ์šฐ์ € ์ž„๋ฒ ๋”ฉ์—์„œ๋Š” JS์˜ Regex API๋ฅผ ์‚ฌ์šฉํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@PoignardAzur BoringSSL๊ณผ libsodium์ด

๋˜ํ•œ Cap'n Proto RPC ๊ตฌํ˜„๋„ ์žˆ์ง€๋งŒ ์ด๊ฒƒ์€ ์ด์ƒํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. Cap'n Proto์˜ _serialization_ ๋ ˆ์ด์–ด๋Š” ๋Œ€๋ถ€๋ถ„์ด ๊ด€์šฉ์ ์ด๊ณ  ์ธ๋ผ์ธ์ด์–ด์•ผ ํ•˜๋Š” ๋„“๊ณ  ์–•์€ API ๋ ˆ์ด์–ด์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์‹ค์ ์œผ๋กœ ๊ฐ ์–ธ์–ด์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. -์นœ์ˆ™ํ•œ. RPC ๊ณ„์ธต์ธ OTOH๋Š” ์ข์ง€๋งŒ ๊นŠ์Šต๋‹ˆ๋‹ค. ์›์น™์ ์œผ๋กœ FFI ๊ฒฝ๊ณ„๋ฅผ ๋„˜์–ด capnp๋กœ ์ธ์ฝ”๋”ฉ๋œ ๋ฐ”์ดํŠธ ๋ฐฐ์—ด ์ฐธ์กฐ๋ฅผ ์ „๋‹ฌํ•˜์—ฌ ์ž„์˜์˜ ์–ธ์–ด์˜ ์ง๋ ฌํ™” ๊ตฌํ˜„ ๋’ค์—์„œ C++ RPC ๊ตฌํ˜„์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค...

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

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

Web IDL์ด ๋ฐ”์ธ๋”ฉ ์–ธ์–ด๋กœ์„œ์˜ ๊ธฐ๋ณธ ์ œ์•ˆ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. Web IDL์€ ์›น์„ ์œ„ํ•œ ์—ญ์‚ฌ์ ์ด๋ฉฐ ์–ด๋Š ์ •๋„ ์„ฑ์ˆ™ํ•œ ๋ฐ”์ธ๋”ฉ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. ๋‚˜๋Š” ๊ทธ ๊ฒฐ์ •์„ ํฌ๊ฒŒ ์ง€์ง€ํ•˜๋ฉฐ, ๋‚˜๋„ ๊ฐ™์€ ๊ฒฐ์ •์„ ํ–ˆ์„ ๊ฐ€๋Šฅ์„ฑ์ด ๋งค์šฐ ํฝ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋‹ค๋ฅธ ์ปจํ…์ŠคํŠธ(์ดํ•ด, ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ/์–ธ์–ด)์— ๊ฑฐ์˜ ๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Wasm์€ ํ˜ธ์ŠคํŠธ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๊ฑฐ๋‚˜ ์–ธ์–ด/ํ”Œ๋žซํผ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ฑ์ˆ™ํ•œ ์›น ๊ธฐ์ˆ ์„ ์‚ฌ์šฉํ•˜๊ณ  ์›น์ด ์•„๋‹Œ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฐพ๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•˜์ง€๋งŒ Web IDL์˜ ๊ฒฝ์šฐ ์›น๊ณผ ์‹ค์ œ๋กœ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ๋‚ด๊ฐ€ ์—ฌ๊ธฐ์—์„œ ๊ทธ ๋Œ€ํ™”๋ฅผ ๋งค์šฐ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฅด๋Š” ์ด์œ ์ž…๋‹ˆ๋‹ค.

https://github.com/WebAssembly/webidl-bindings/issues/40 ์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ด์— ๋Œ€ํ•œ ์–ธ๊ธ‰์ด ์—†์—ˆ๊ธฐ ๋•Œ๋ฌธ์—(๋˜๋Š” ๋†“์ณค๊ธฐ ๋•Œ๋ฌธ์—) ์—ฌ๊ธฐ์— ์งˆ๋ฌธ์„ ํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

์ „์ฒด ๋ฐ”์ธ๋”ฉ ์ด์•ผ๊ธฐ์—์„œ "๋ˆ„๊ฐ€"๊ฐ€ ๋ฐ”์ธ๋”ฉ์„ ์ƒ์„ฑํ•  ์ฑ…์ž„์ด ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • ์ปดํŒŒ์ผ๋Ÿฌ(ํ”„๋กœ๊ทธ๋žจ์„ Wasm ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜)์ž…๋‹ˆ๊นŒ?
  • ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž์ž…๋‹ˆ๊นŒ(๋ฐ”์ธ๋”ฉ๋„ ์†์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ)?

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

๋ชฉํ‘œ๊ฐ€ Web IDL์„ ๋œ ์›น โ€‹โ€‹์ค‘์‹ฌ์ ์œผ๋กœ "์žฌ์ง‘์ค‘"ํ•˜๋Š” ๊ฒƒ์ด์ง€๋งŒ ํ˜„์žฌ๋กœ์„œ๋Š” ๋งค์šฐ ์›น ์ค‘์‹ฌ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  ๋Œ€์•ˆ์„ ์ œ์•ˆํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์ด ๋ฐœ์ƒํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ์Šค๋ ˆ๋“œ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ž ์žฌ์ ์ธ ๋‹จํŽธํ™”๊ฐ€ ์šฐ๋ ค๋ฉ๋‹ˆ๋‹ค. ์ด์ƒ์ ์œผ๋กœ(๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ Wasm์ด ์„ค๊ณ„๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค) ๋ฐ”์ธ๋”ฉ์„ ํฌํ•จํ•˜๋Š” Wasm ๋ชจ๋“ˆ์ด ์ฃผ์–ด์ง€๋ฉด ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์–ด๋””์—์„œ๋‚˜ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Web IDL, Cap'n' Proto, FlatBuffers ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฐ”์ธ๋”ฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ๋‚˜ ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž๊ฐ€ ์ง„์ •ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ด ๋˜๊ธฐ ์œ„ํ•ด ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์œผ๋กœ ๋™์ผํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ž‘์„ฑํ•˜์ง€ ์•Š์„ ๊ฒƒ์ด๋ผ๊ณ  ํ™•์‹ ํ•ฉ๋‹ˆ๋‹ค. ์›ƒ๊ธฐ๊ฒŒ๋„ ์ด๊ฒƒ์€ ์†์œผ๋กœ ์“ด ๋ฐ”์ธ๋”ฉ์„ ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ์ž…๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์€ ํ”Œ๋žซํผ P์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ž‘์„ฑํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ์— ๊ธฐ์—ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์ด ์ „ํ˜€ ์ด์ƒ์ ์ด์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์„ ์ธ์ •ํ•ฉ์‹œ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด ์ €๋Š” ์›น ๋ฐ”์ธ๋”ฉ๊ณผ ์›น์ด ์•„๋‹Œ ๋ฐ”์ธ๋”ฉ ๊ฐ„์˜ ๊ฐ€๋Šฅํ•œ ๋‹จํŽธํ™”์— ๋Œ€ํ•ด ์šฐ๋ คํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋น„ ์›น ๋ฐ”์ธ๋”ฉ ์–ธ์–ด๊ฐ€ ์œ ์ง€๋œ๋‹ค๋ฉด ์›น ๋ธŒ๋ผ์šฐ์ €์—์„œ ํ˜„์‹ค์ ์œผ๋กœ ๊ตฌํ˜„๋ ๊นŒ์š”? ๊ทธ๋“ค์€ ๋ฐ”์ธ๋”ฉ "Wasm โŸถ ๋ฐ”์ธ๋”ฉ ์–ธ์–ด B โŸถ Web IDL"์„ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋“  ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด ๋™์ผํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์ž…๋‹ˆ๋‹ค: Wasm โŸถ ๋ฐ”์ธ๋”ฉ ์–ธ์–ด B โŸถ ํ˜ธ์ŠคํŠธ API.

ํ˜ธ๊ธฐ์‹ฌ์ด ์‚ฌ๋žŒ๋“ค์„ ์œ„ํ•ด, ๋‚˜๋Š” Wasmer์—์„œ ์ผ์„ํ•˜๊ณ  ๋‚˜๋Š”์˜ ์ €์ž ํ•ด์š” PHP- , Python- , Ruby- ๋ฐ ์ด๋™ - Wasm ํ†ตํ•ฉ. ์šฐ๋ฆฌ๋Š” ๋งค์šฐ ๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•ด ๋‹ค๋ฅธ ๋ฐ”์ธ๋”ฉ์„ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๋†€์ดํ„ฐ๋ฅผ ๊ฐ–๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ํ†ตํ•ฉํ•˜๊ฑฐ๋‚˜, ํ”ผ๋“œ๋ฐฑ์„ ์ˆ˜์ง‘ํ•˜๊ฑฐ๋‚˜, ์‹คํ—˜์„ ์‹œ๋„ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด, ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์—ด๋ ค ์žˆ๊ณ  ํ˜‘์—…ํ•˜๊ณ  ๋” ๋งŽ์€ ๋ฆฌ์†Œ์Šค๋ฅผ ํˆฌ์ž…ํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.

'webIDL ๋ฐ”์ธ๋”ฉ'์˜ ํ˜„์žฌ ๋ฐฉํ–ฅ์€ ์•„๋งˆ๋„ webIDL์—์„œ ๋ฉ€์–ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
๊ทธ ์ž์ฒด. ๊ทธ๋Ÿฌ๋‚˜ ๋”œ๋ ˆ๋งˆ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋ชจ๋“ˆ๊ฐ„ ๋ฐ ๋ชจ๋“ˆ-ํ˜ธ์ŠคํŠธ ํ‘œํ˜„์„ ์œ„ํ•œ '์ž์—ฐ' ์–ธ์–ด
์ƒํ˜ธ ์šด์šฉ์„ฑ์€ WASM์˜ ์ž์—ฐ์–ด๋ณด๋‹ค ํ›จ์”ฌ ํ’๋ถ€ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ
์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ IDL์— ํ•ด๋‹นํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์ด ์ƒ๋‹นํžˆ ์ž„์˜์ ์œผ๋กœ ๋ณด์ผ ๊ฒƒ์ž„์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค.
WASM์˜ ๊ด€์ 

๋ฐ˜๋ฉด์— C/C++์˜ ๋ Œ์ฆˆ๋กœ ์„ธ์ƒ์„ ๋ณด๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ๋Š”
(๊ทธ๋ฆฌ๊ณ  Rust์™€ ๊ทธ ์œ ์‚ฌ) WASM์˜ ๋ชจ๋ธ๋ณด๋‹ค ๋” ํ’๋ถ€ํ•œ ๊ฒƒ์€
์“ธ ์ˆ˜ ์—†๋Š”. ref ํ†ตํ•ฉ์˜ ์–ด๋ ค์›€์œผ๋กœ ์ด๋ฏธ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
๋„๊ตฌ ์ฒด์ธ์— ์ž…๋ ฅํ•ฉ๋‹ˆ๋‹ค.

๋˜ํ•œ ์ผ๋ฐ˜ ์ง€์›์„ ํ•˜๋Š” ๊ฒƒ์ด WASM์˜ ์ง์ ‘์ ์ธ ๊ถŒํ•œ์€ ์•„๋‹™๋‹ˆ๋‹ค.
์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ. IMO๋„ ์•ˆ๋ฉ๋‹ˆ๋‹ค.

(๋‚ด๊ฐ€ ๋งํ•œ ๋” ์ œํ•œ๋œ ๋ฒ„์ „์˜ ์–ธ์–ด ๊ฐ„ ์ƒํ˜ธ ์šด์šฉ์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค.
๋ฏฟ์Œ์€ ์ง€์ง€ํ•  ์ˆ˜ ์žˆ์„ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ๋Šฅ ์ œ๊ณต์ž์™€ ๊ธฐ๋Šฅ ์‚ฌ์šฉ์ž๊ฐ€ ์ถฉ์กฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ด€์‹ฌ
์ตœ์†Œํ•œ์˜ ๋งˆ์ฐฐ๋กœ. (๋Šฅ๋ ฅ์€ ๊ฒฝ์˜์ง„์˜ ๋ง์ด์ง€๋งŒ ๋‚˜๋Š”
๋” ๋‚˜์€ ์šฉ์–ด๋ฅผ ์ฐพ์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.) ์ด๊ฒƒ์€ ๋‹ค๋ฅธ ์Šคํƒ€์ผ์˜ IDL๊ณผ ํ•˜๋‚˜์˜
์™„์ „ํ•œ ์–ธ์–ด ๊ฐ„ ๊ตฌํ˜„์— ํ•„์š”ํ•œ ๊ฒƒ๋ณด๋‹ค ๊ตฌํ˜„ํ•˜๊ธฐ๊ฐ€ ๋” ์‰ฝ์Šต๋‹ˆ๋‹ค.
์ธํ„ฐ์˜ต.)

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

2019๋…„ 6์›” 24์ผ ์›”์š”์ผ ์˜ค์ „ 7:02 Ivan Enderlin [email protected]
์ผ๋‹ค:

Web IDL์ด ๋ฐ”์ธ๋”ฉ ์–ธ์–ด๋กœ ๊ธฐ๋ณธ ์ œ์•ˆ์ธ ์ด์œ ๋ฅผ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค.
๊ทธ๊ฒƒ์€ ์›น์„ ์œ„ํ•œ ์—ญ์‚ฌ์ ์ด๋ฉฐ ์–ด๋Š ์ •๋„ ์„ฑ์ˆ™ํ•œ ๋ฐ”์ธ๋”ฉ ์–ธ์–ด์ž…๋‹ˆ๋‹ค. NS
๊ทธ ๊ฒฐ์ •์„ ํฌ๊ฒŒ ์ง€์ง€ํ•ฉ๋‹ˆ๋‹ค.
๊ฐ™์€. ๊ทธ๋Ÿผ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  ์šฐ๋ฆฌ๋Š” ๊ทธ๊ฒƒ์ด ๋‹ค๋ฅธ ๋งฅ๋ฝ์— ๊ฑฐ์˜ ๋“ค์–ด๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์„ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
(๋‹ค๋ฅธ ํ˜ธ์ŠคํŠธ/์–ธ์–ด ์ดํ•ด). Wasm์€ ํ˜ธ์ŠคํŠธ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š๋„๋ก ์„ค๊ณ„๋˜์—ˆ์Šต๋‹ˆ๋‹ค.
๋˜๋Š” ์–ธ์–ด/ํ”Œ๋žซํผ์— ๊ตฌ์• ๋ฐ›์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋‚˜๋Š” ์„ฑ์ˆ™ํ•œ ์›น์„ ์‚ฌ์šฉํ•˜๋Š” ์•„์ด๋””์–ด๋ฅผ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค.
๊ธฐ์ˆ  ๋ฐ ์›น ์ด์™ธ์˜ ์‹œ๋‚˜๋ฆฌ์˜ค์— ๋Œ€ํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋ฅผ ์ฐพ๊ธฐ ์œ„ํ•ด
Web IDL์˜ ๊ฒฝ์šฐ ์‹ค์ œ๋กœ ์›น๊ณผ ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋งค์šฐ
์—ฌ๊ธฐ์—์„œ ๊ทธ ๋Œ€ํ™”๋ฅผ ๋ฐ€์ ‘ํ•˜๊ฒŒ ๋”ฐ๋ฅด์‹ญ์‹œ์˜ค.

WebAssembly/webidl-bindings#40์„ ์—ด์—ˆ์Šต๋‹ˆ๋‹ค.
https://github.com/WebAssembly/webidl-bindings/issues/40 , ๋‚˜๋ฅผ ์ด๋Œ์—ˆ์Šต๋‹ˆ๋‹ค.
๋‚˜๋Š” ๊ทธ๊ฒƒ์— ๋Œ€ํ•œ ์–ธ๊ธ‰์„ ๋ณธ ์ ์ด ์—†๊ธฐ ๋•Œ๋ฌธ์— ์—ฌ๊ธฐ์—์„œ ์งˆ๋ฌธ์„ ํ•˜์‹ญ์‹œ์˜ค(๋˜๋Š” ๋†“์ณค์Šต๋‹ˆ๋‹ค).

์ „์ฒด ๊ตฌ์†๋ ฅ์žˆ๋Š” ์ด์•ผ๊ธฐ์—์„œ "๋ˆ„๊ฐ€"๊ฐ€ ์ฑ…์ž„์ด ์žˆ๋Š”์ง€ ๋ช…ํ™•ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
๋ฐ”์ธ๋”ฉ ์ƒ์„ฑ:

  • ์ปดํŒŒ์ผ๋Ÿฌ(ํ”„๋กœ๊ทธ๋žจ์„ Wasm ๋ชจ๋“ˆ๋กœ ๋ณ€ํ™˜)์ž…๋‹ˆ๊นŒ?
  • ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž์ž…๋‹ˆ๊นŒ(๋ฐ”์ธ๋”ฉ๋„ ์†์œผ๋กœ ์ž‘์„ฑํ•ฉ๋‹ˆ๊นŒ)?

๋‚˜๋Š” ๋‘˜ ๋‹ค ์œ ํšจํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ฆฌ๊ณ  Web IDL์˜ ๊ฒฝ์šฐ ์•ฝ๊ฐ„์˜
์ œํ•œ ์‚ฌํ•ญ(์œ„ ๋งํฌ ์ฐธ์กฐ). ์–ด์ฉŒ๋ฉด ๋‚ด๊ฐ€ ์ค‘์š”ํ•œ ๋‹จ๊ณ„๋ฅผ ๋†“์นœ ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.
๋‚ด ๋ฉ”์‹œ์ง€๋ฅผ ์žŠ์–ด ๋ฒ„๋ฆฌ๋Š” ๊ฒƒ์„ ๊ณ ๋ คํ•˜์‹ญ์‹œ์˜ค.

๋ชฉํ‘œ๊ฐ€ Web IDL์„ ๋œ ์›น โ€‹โ€‹์ค‘์‹ฌ์ ์œผ๋กœ "์žฌ์ง‘์ค‘"ํ•˜๋Š” ๊ฒƒ์ด๋”๋ผ๋„ ์ง€๊ธˆ ๋‹น์žฅ์€
๊ทธ๊ฒƒ์€ ๋งค์šฐ ์›น ์ค‘์‹ฌ์ด๋‹ค. ๋Œ€์•ˆ์„ ์ œ์‹œํ•˜๊ธฐ ์œ„ํ•œ ์ œ์•ˆ์ด ๋ฐœ์ƒํ•˜๊ณ ,
๋”ฐ๋ผ์„œ ์ด ์Šค๋ ˆ๋“œ. ๋”ฐ๋ผ์„œ ์ž ์žฌ์ ์ธ ๋‹จํŽธํ™”๊ฐ€ ์šฐ๋ ค๋ฉ๋‹ˆ๋‹ค.
์ด์ƒ์ ์œผ๋กœ(๊ทธ๋ฆฌ๊ณ  ์ด๊ฒƒ์ด ์ง€๊ธˆ๊นŒ์ง€ Wasm์ด ์„ค๊ณ„๋œ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค), ์ฃผ์–ด์ง„ Wasm ๋ชจ๋“ˆ
๋ฐ”์ธ๋”ฉ์„ ํฌํ•จํ•˜์—ฌ ์–ด๋””์—์„œ๋‚˜ ์žˆ๋Š” ๊ทธ๋Œ€๋กœ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์™€ ํ•จ๊ป˜
Web IDL, Cap'n' Proto, FlatBuffers ๋“ฑ์œผ๋กœ ์ž‘์„ฑ๋œ ๋ฐ”์ธ๋”ฉ, ์ €๋Š”
๋ชจ๋“  ์ปดํŒŒ์ผ๋Ÿฌ ๋˜๋Š” ํ”„๋กœ๊ทธ๋žจ ์ž‘์„ฑ์ž๊ฐ€ ๋™์ผํ•˜๊ฒŒ ์ž‘์„ฑํ•˜์ง€๋Š” ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์„œ๋กœ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์˜ ๋ฐ”์ธ๋”ฉ์€ ์ง„์ •ํ•œ ํฌ๋กœ์Šค ํ”Œ๋žซํผ์ž…๋‹ˆ๋‹ค. ์›ƒ๊ธฐ๊ฒŒ๋„ ์ด๊ฒƒ์€
์†์œผ๋กœ ์“ด ์ œ๋ณธ์„ ์ฐฌ์„ฑํ•˜๋Š” ์ฃผ์žฅ: ์‚ฌ๋žŒ๋“ค์€
ํ”Œ๋žซํผ P์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ž‘์„ฑํ•˜์—ฌ ํ”„๋กœ๊ทธ๋žจ
์ „ํ˜€ ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.

์š”์•ฝํ•˜์ž๋ฉด, ์ €๋Š” ์›น๊ณผ
๋น„ ์›น ๋ฐ”์ธ๋”ฉ. ์›น ๋ฐ”์ธ๋”ฉ ์–ธ์–ด๊ฐ€ ์•„๋‹Œ ๊ฒฝ์šฐ
์›น ๋ธŒ๋ผ์šฐ์ €์— ์˜ํ•ด ํ˜„์‹ค์ ์œผ๋กœ ๊ตฌํ˜„๋ฉ๋‹ˆ๊นŒ? ๊ทธ๋“ค์€ ์ž‘์„ฑํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค
๋ฐ”์ธ๋”ฉ "Wasm โŸถ ๋ฐ”์ธ๋”ฉ ์–ธ์–ด B โŸถ Web IDL". ๋™์ผํ•˜๋‹ˆ ์ฐธ๊ณ ํ•˜์„ธ์š”
๋ชจ๋“  ํ˜ธ์ŠคํŠธ์— ๋Œ€ํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค: Wasm โŸถ ๋ฐ”์ธ๋”ฉ ์–ธ์–ด B โŸถ ํ˜ธ์ŠคํŠธ API.

๊ถ๊ธˆํ•œ ๋ถ„๋“ค์„ ์œ„ํ•ด ์ €๋Š” Wasmer์—์„œ ์ผํ•˜๊ณ  PHP-
https://github.com/wasmerio/php-ext-wasm , ํŒŒ์ด์ฌ-
https://github.com/wasmerio/python-ext-wasm , ๋ฃจ๋น„-
https://github.com/wasmerio/ruby-ext-wasm ๋ฐ Go-
https://github.com/wasmerio/go-ext-wasm Wasm ํ†ตํ•ฉ. ์šฐ๋ฆฌ๋Š” ์‹œ์ž‘ํ•œ๋‹ค
๋งค์šฐ ๋‹ค๋ฅธ ๋ฐ”์ธ๋”ฉ์„ ํ•ดํ‚นํ•  ์ˆ˜ ์žˆ๋Š” ๋ฉ‹์ง„ ๋†€์ดํ„ฐ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.
ํ˜ธ์ŠคํŠธ. ๋ˆ„๊ตฐ๊ฐ€ ๋‚ด๊ฐ€ ๋‹ค๋ฅธ ์†”๋ฃจ์…˜์„ ํ†ตํ•ฉํ•˜๊ณ  ์ˆ˜์ง‘ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋ฉด
ํ”ผ๋“œ๋ฐฑ์„ ๋ฐ›๊ฑฐ๋‚˜ ์‹คํ—˜์„ ์‹œ๋„ํ•  ๋•Œ ์šฐ๋ฆฌ๋Š” ๋ชจ๋‘ ์—ด๋ ค ์žˆ๊ณ  ํ˜‘๋ ฅํ•  ์ค€๋น„๊ฐ€ ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค.
๊ทธ๋ฆฌ๊ณ  ๊ทธ๊ฒƒ์— ๋” ๋งŽ์€ ์ž์›์„ ํˆฌ์ž…ํ•˜์‹ญ์‹œ์˜ค.

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/WebAssembly/design/issues/1274?email_source=notifications&email_token=AAQAXUD6WA22DDUS7PYQ6F3P4DHYRA5CNFSM4HJUHVG2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAQAXUGM66AWN7ZCIVBTXVTP4DHYRANCNFSM4HJUHVGQ
.

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

์šฐ๋ฆฌ๋Š” ref ์œ ํ˜•์„ ๋„๊ตฌ ์ฒด์ธ์— ํ†ตํ•ฉํ•˜๋Š” ์–ด๋ ค์›€์œผ๋กœ ์ด๋ฏธ ์ด๊ฒƒ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋‹ค๋ฅธ ์–ธ์–ด๋กœ๋Š” ๋งํ•  ์ˆ˜ ์—†์ง€๋งŒ Rust + wasm-bindgen์€ ์ด๋ฏธ ๋‹ค์Œ์„ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์–ด๋–ค ์–ด๋ ค์›€์„ ๋ง์”€ํ•˜์‹œ๋Š” ๊ฑด๊ฐ€์š”?

์–ด๋ ค์›€์— ๋Œ€ํ•œ ๋‚˜์˜ ์ดํ•ด๋Š” C++์— ๋” ๊ฐ€๊น์Šต๋‹ˆ๋‹ค. Rust๋Š” ์–ธ์–ด ์ธก๋ฉด์—์„œ ์ด๊ฒƒ์„ ๋” ํ•ฉ๋ฆฌ์ ์œผ๋กœ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์ถฉ๋ถ„ํžˆ ๊ฐ•๋ ฅํ•œ ๋ฉ”ํƒ€ํ”„๋กœ๊ทธ๋ž˜๋ฐ์„ ๊ฐ€์ง€๊ณ  ์žˆ์ง€๋งŒ, userland C++๋Š” ์˜ˆ๋ฅผ ๋“ค์–ด anyref์— ๋Œ€ํ•ด ์ถ”๋ก ํ•˜๋Š” ๊ฒƒ์ด ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ C++ ๊ด€๋ จ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (C++ ์ „์šฉ์ž…๋‹ˆ๊นŒ ์•„๋‹ˆ๋ฉด LLVM ์ „์šฉ์ž…๋‹ˆ๊นŒ?)

C++๋Š” ref ์œ ํ˜•์ด ๋ฌด์—‡์ธ์ง€ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ๊ทธ๊ฒƒ์„ ์•ˆ์— ๊ฐ€์งˆ ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค
์ž„์˜์˜ ๊ฐœ์ฒด. ์‹ค์ œ๋กœ ์–ธ์–ด์˜ ์ผ๋ถ€๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ํŒŒ์ผ์ฒ˜๋Ÿผ
์„ค๋ช…์ž. ๋ฌธ์ž์—ด์— ๋Œ€ํ•œ ์žฌ๋ฏธ์žˆ๋Š” ์žฅ์†Œ.

2019๋…„ 6์›” 24์ผ ์›”์š”์ผ ์˜คํ›„ 3์‹œ 77๋ถ„ Alon Zakai [email protected]์—์„œ ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค.

์—ฌ๊ธฐ์—์„œ C++ ๊ด€๋ จ ๋ฌธ์ œ์— ๋Œ€ํ•ด ๋” ๋“ฃ๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. (๊ทธ๋“ค์€
C++ ํŠน์ • ๋˜๋Š” LLVM ํŠน์ •?)

โ€”
๋‹น์‹ ์ด ์–ธ๊ธ‰๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ด๊ฒƒ์„ ๋ฐ›๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.
์ด ์ด๋ฉ”์ผ์— ์ง์ ‘ ๋‹ต์žฅํ•˜๊ณ  GitHub์—์„œ ํ™•์ธ
https://github.com/WebAssembly/design/issues/1274?email_source=notifications&email_token=AAQAXUDW237MUBBUUJLKS6LP4FARJA5CNFSM4HJUHVG2YY3PNVWWK3TUL52HS4DFVREXG43VMVBW63LN
๋˜๋Š” ์Šค๋ ˆ๋“œ ์Œ์†Œ๊ฑฐ
https://github.com/notifications/unsubscribe-auth/AAQAXUB4O3ZX4LRQSQRL763P4FARJANCNFSM4HJUHVGQ
.

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

@fgmccabe์™€ ์˜คํ”„๋ผ์ธ์œผ๋กœ ์ด์•ผ๊ธฐํ•˜๋ฉด ๊ตฌ์กฐ๊ฐ€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅ๋˜๊ธฐ ๋•Œ๋ฌธ์— C++์™€ Rust ๋ชจ๋‘ ๊ตฌ์กฐ์— ref ์œ ํ˜•์„ ์ง์ ‘ ์ €์žฅํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ด ์‚ฌ์‹ค์ž…๋‹ˆ๋‹ค. C++์™€ Rust๋Š” ๋ฌผ๋ก  ์ •์ˆ˜ ํ•ธ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํŒŒ์ผ ์„ค๋ช…์ž, OpenGL ํ…์Šค์ฒ˜ ๋“ฑ์„ ์ฒ˜๋ฆฌํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ๋ฐฉ์‹์œผ๋กœ ref ์œ ํ˜•์„ ๊ฐ„์ ‘์ ์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‚ด ์ƒ๊ฐ์— ๊ทธ์˜ ์š”์ ์€ ๋‘ ์–ธ์–ด ์ค‘ ์–ด๋Š ๊ฒƒ๋„ ref ์œ ํ˜•์„ "์ž˜"/"๊ธฐ๋ณธ์ ์œผ๋กœ" ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ œ๊ฐ€ ํ‹€๋ ธ๋‹ค๋ฉด ์ˆ˜์ •ํ•ด ์ฃผ์„ธ์š”!). ์ด ์–ธ์–ด๋Š” ํ•ญ์ƒ ref ์œ ํ˜•์—์„œ ๋ถˆ๋ฆฌํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. GC ์–ธ์–ด์™€ ๋น„๊ตํ•˜์—ฌ ์ž‘์—….

์—ฌ๊ธฐ์— C++์— ํŠน์ •ํ•œ ๊ฒƒ์ด ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ์—†๋Š” ๊ฒƒ ๊ฐ™์€๋ฐ?

์—ฌ๊ธฐ์„œ C++๋ฅผ ์–ด๋ ต๊ฒŒ ๋งŒ๋“œ๋Š” ์š”์†Œ์— ๋Œ€ํ•œ ๋‚ด ์ดํ•ด๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

struct Anyref; // opaque declaration
void console_log(Anyref* item); // declaration of ref-taking external JS API
Anyref* document_getElementById(const char* str);

void wellBehaved() {
  // This should work
  Anyref* elem = document_getElementById("foo");
  console_log(elem);
}

void notSoWellBehaved() {
  // ????
  Anyref* elem = document_getElementById("bar");
  Anyref* what = (Anyref*)((unsigned int)elem + 1);
  console_log(what);
}

์ข‹์€ ์†Œ์‹์€ ํ›„์ž์˜ ์˜ˆ๊ฐ€ UB๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค(์ž˜๋ชป๋œ ํฌ์ธํ„ฐ๋Š” ์ƒ์„ฑ๋˜์ž๋งˆ์ž UB๊ฐ€ ๋จ). ๊ทธ๋Ÿฌ๋‚˜ LLVM IR์—์„œ ์ด๋ฅผ ๋ชจ๋ธ๋งํ•˜๋ ค๋ฉด ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ๊นŒ์š”?

@jgravelle-google struct Anyref; ์กฐ์ฐจ๋„ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์—์„œ ์˜๋ฏธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด๋ผ๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋Œ€์‹ , OpenGL ํ…์Šค์ฒ˜, ํŒŒ์ผ ํ•ธ๋“ค ๋“ฑ๊ณผ ๊ฐ™์ด ์•ž์—์„œ ์–ธ๊ธ‰ํ•œ ์ •์ˆ˜ ํ•ธ๋“ค๋กœ ๋ชจ๋ธ๋งํ•˜์ง€ ์•Š๋Š” ์ด์œ ๋Š” ๋ฌด์—‡์ž…๋‹ˆ๊นŒ?

using Anyref = uint32_t; // handle declaration
void console_log(Anyref item); // declaration of ref-taking external JS API
Anyref document_getElementById(const char* str);

void wellBehaved() {
  // This should work
  Anyref elem = document_getElementById("foo");
  console_log(elem);
}

์ •์ˆ˜ ํ•ธ๋“ค์€ ์‚ฌ์šฉ๋  ๋•Œ ํ…Œ์ด๋ธ”์—์„œ ์กฐํšŒ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋งํ•˜์ง€๋งŒ ์ด๊ฒƒ์€ C++ ๋ฐ Rust์™€ ๊ฐ™์€ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์–ธ์–ด์˜ ๋‹จ์ ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ LLVM์ด ์•„๋‹Œ ๊ฒฝ์šฐ wasm ์ˆ˜์ค€์—์„œ ์ตœ์†Œํ•œ ๋กœ์ปฌ๋กœ ์ตœ์ ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ์ž‘๋™ํ•˜์ง€๋งŒ table_free(elem) ๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด ์˜์›ํžˆ ์ฐธ์กฐ๋ฅผ ์œ ์ง€ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. C++์—์„œ ์ด์ƒํ•˜์ง€ ์•Š์€ ๊ฒƒ์€ ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

๋ ˆ์ด์–ด๋ง์ด ์ž˜ ๋˜์ง€ ์•Š์•„์„œ ์ด์ƒํ•œ ๋งคํ•‘์ด ๋œ ๊ฒƒ ๊ฐ™์€๋ฐ์š”? ๋งˆ์น˜ OpenGL๊ณผ ๊ฐ™์€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ฒ˜๋Ÿผ ๋Š๊ปด์ง€์ง€๋งŒ ์ œ๊ณตํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋งˆ๋ฒ•์— ์˜์กดํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ - ๋ณ„๋„์˜ ์„ ์–ธ์— ์˜์กดํ•˜๋Š” ๊ฒฝ์šฐ ์ธ๋ผ์ธ-wasm์œผ๋กœ๋„ C++์—์„œ anyref.h ๋ฅผ ๋นŒ๋“œํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ…Œ์ด๋ธ”.

์–ด์จŒ๋“  ๋‚˜๋Š” ๊ทธ๊ฒƒ์ด ๋ชจ๋‘ ๊ฐ€๋Šฅํ•˜๊ณ  ๋‹ค๋ฃจ๊ธฐ ์‰ฝ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ ๊ฐ„๋‹จํ•˜์ง€ ์•Š์€ ๊ฒƒ์ด ์ „๋ถ€์ž…๋‹ˆ๋‹ค.

@kripken "์ ์ ˆํ•œ" ๊ธฐ๋ณธ anyref ์ง€์›์„ ์œ„ํ•ด์„œ๋Š” LLVM(๋ฐ rustc)์— ์•ฝ๊ฐ„์˜ ๋ณ€๊ฒฝ์ด ํ•„์š”ํ•œ ๊ฒƒ์ด ์‚ฌ์‹ค์ด์ง€๋งŒ ์‹ค์ œ๋กœ ์žฅ์• ๋ฌผ์€ ์•„๋‹™๋‹ˆ๋‹ค.

wasm-bindgen์€ ์‹ค์ œ wasm anyref s๋ฅผ wasm ํ…Œ์ด๋ธ”์— ์ €์žฅํ•˜๊ณ  ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ์ •์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ wasm table.get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ anyref ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

wasm-gc๊ฐ€ ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ GC ์–ธ์–ด๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ „๋žต์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ Rust( et al)๊ฐ€ ๋ˆ„๋ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด LLVM์˜ ๊ธฐ๋ณธ anyref ์ง€์›์ด ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ๊ฐ€์ ธ๋‹ค ์ค„๊นŒ์š”? ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ wasm ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด anyref ๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ํ•„์š”๋กœ ํ•˜์ง€ ์•Š๊ณ  ํ•จ์ˆ˜์—์„œ anyref ๋ฅผ ์ง์ ‘ ์ „๋‹ฌ/๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์ผ ๋ฟ์ด๋ฉฐ ์‹ค์ œ๋กœ anyref ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

@ํŒŒ์šฐ์•ˆ

wasm-bindgen์€ ์‹ค์ œ wasm anyref๋ฅผ wasm ํ…Œ์ด๋ธ”์— ์ €์žฅํ•œ ๋‹ค์Œ ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ์— ์ •์ˆ˜ ์ธ๋ฑ์Šค๋ฅผ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ wasm table.get ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ anyref์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ฐ”๋กœ, ์˜ˆ, ์ œ๊ฐ€ ์–ธ๊ธ‰ํ•œ ๋ชจ๋ธ์ž…๋‹ˆ๋‹ค.

wasm-gc๊ฐ€ ๊ตฌํ˜„๋  ๋•Œ๊นŒ์ง€ GC ์–ธ์–ด๋Š” ์ •ํ™•ํžˆ ๋™์ผํ•œ ์ „๋žต์„ ์‚ฌ์šฉํ•ด์•ผ ํ•˜๋ฏ€๋กœ Rust( et al)๊ฐ€ ๋ˆ„๋ฝ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์˜ˆ, ํ˜„์žฌ GC ์–ธ์–ด๋Š” ๊ธฐ๋ณธ wasm GC๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์ด์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ํฌ๋ง์ ์œผ๋กœ ๊ทธ๊ฒƒ์€ ๋ฐ”๋€” ๊ฒƒ์ž…๋‹ˆ๋‹ค! :) ๊ฒฐ๊ตญ ์ ์–ด๋„ GC๋ฅผ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด GC ์–ธ์–ด๊ฐ€ ์—ฌ๊ธฐ์„œ ๋ถ„๋ช…ํ•œ ์ด์ ์„ ๊ฐ€์งˆ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ ‡๋‹ค๋ฉด LLVM์˜ ๊ธฐ๋ณธ anyref ์ง€์›์€ ์šฐ๋ฆฌ์—๊ฒŒ ๋ฌด์—‡์„ ๊ฐ€์ ธ๋‹ค ์ค„๊นŒ์š”? ๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ wasm ํ…Œ์ด๋ธ”์„ ํ†ตํ•ด anyref๋ฅผ ๊ฐ„์ ‘์ ์œผ๋กœ ์ „๋‹ฌํ•  ํ•„์š” ์—†์ด ํ•จ์ˆ˜์—์„œ anyref๋ฅผ ์ง์ ‘ ์ „๋‹ฌ/๋ฐ˜ํ™˜ํ•˜๋Š” ๊ฒƒ์„ ๊ฐ€๋Šฅํ•˜๊ฒŒ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ์œ ์šฉํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๊ฒƒ์€ ๋‹จ์ง€ ์„ฑ๋Šฅ ์ตœ์ ํ™”์ผ ๋ฟ์ด๋ฉฐ ์‹ค์ œ๋กœ anyref๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๋ง‰์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์˜ˆ, ์ด๊ฒƒ์€ C++ ๋ฐ Rust ๋“ฑ์— ๋น„ํ•ด (๊ฒฐ๊ตญ) GC ์–ธ์–ด์˜ ์„ฑ๋Šฅ ์ด์ ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค. ์‚ฌ์šฉ์„ ๋ฐฉํ•ดํ•˜์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

์‚ฌ์ดํด์€ ํ…Œ์ด๋ธ”์ด ๋ฃจํŠธ์ด๊ธฐ ๋•Œ๋ฌธ์— C++์™€ Rust์—์„œ ๋” ํฐ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์™ธ๋ถ€ GC๊ฐ€ ์ดํ•ดํ•  ์ˆ˜ ์žˆ๋„๋ก C++/Rust ๋‚ด๋ถ€์˜ GC ๋งํฌ ๊ตฌ์กฐ๋ฅผ ๋งคํ•‘ํ•˜๋Š” ์–ด๋–ค ๋ฐฉ๋ฒ•์œผ๋กœ ์ถ”์  API ๋˜๋Š” "๊ทธ๋ฆผ์ž ๊ฐœ์ฒด"๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋‚˜๋Š” ์•„์ง ๊ทธ๋“ค ์ค‘ ์–ด๋–ค ๊ฒƒ์— ๋Œ€ํ•œ ์‹ค์งˆ์ ์ธ ์ œ์•ˆ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

๊ฒฐ๊ตญ ์ ์–ด๋„ GC๋ฅผ ์ œ๋Œ€๋กœ ์ˆ˜ํ–‰ํ•œ๋‹ค๋ฉด GC ์–ธ์–ด๊ฐ€ ๋ถ„๋ช…ํ•œ ์ด์ ์„ ๊ฐ€์งˆ ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

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

์ด์— ๋น„ํ•ด Rust๋Š” ํ• ๋‹น์ด ํ•„์š”ํ•˜์ง€ ์•Š๊ณ (ํ…Œ์ด๋ธ”์— ํ• ๋‹นํ•˜๊ธฐ๋งŒ ํ•˜๋ฉด ๋จ) ์ •์ˆ˜๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๋ฉฐ, wasm ์—”์ง„์€ GC ๋ชฉ์ ์„ ์œ„ํ•ด 1๊ฐœ์˜ ์ •์  ์ด๋™ ํ…Œ์ด๋ธ”๋งŒ ์ถ”์ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค.

anyref ์•ก์„ธ์Šค ๊ฐ€ table.get ๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†๊ธฐ ๋•Œ๋ฌธ์— GC ์–ธ์–ด์— ๋Œ€ํ•ด ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•˜์ง€๋งŒ table.get ๋Š” ์ƒ๋‹นํžˆ ๋น ๋ฅผ ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๊ทธ๋ž˜์„œ wasm-gc ํ”„๋กœ๊ทธ๋žจ์ด wasm ํ…Œ์ด๋ธ”์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ๋ณด๋‹ค ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๊ธฐ๋Œ€ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ๋” ์ž์„ธํžˆ ์„ค๋ช…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์ถ”์‹ : ์ด๊ฒƒ์€ ์ฃผ์ œ์—์„œ ์ƒ๋‹นํžˆ ๋ฒ—์–ด๋‚˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด ํ† ๋ก ์„ ์ƒˆ ์Šค๋ ˆ๋“œ๋กœ ์˜ฎ๊ฒจ์•ผ ํ• ๊นŒ์š”?

์ •๋ง ๊ทธ๋ƒฅ: table.get/table.set ํ•ฉ๋‹ˆ๋‹ค. GC๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์›์‹œ ํฌ์ธํ„ฐ๊ฐ€ ๋ฐ”๋กœ ๊ฑฐ๊ธฐ์— ์žˆ์–ด์•ผ ํ•˜๋ฉฐ ๊ฐ„์ ‘ ์ฐธ์กฐ๋ฅผ ์ €์žฅํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ๋„ค, Rust์™€ C++๋Š” ์ •์ˆ˜๋งŒ ์ €์žฅํ•˜๋ฉด ๋˜๋ฉฐ ์ „๋ฐ˜์ ์œผ๋กœ ๋งค์šฐ ๋น ๋ฅด๊ธฐ ๋•Œ๋ฌธ์— GC ์ด์ ์ด ์ค‘์š”ํ•˜์ง€ ์•Š์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค!

์šฐ๋ฆฌ๊ฐ€ ์ฃผ์ œ์—์„œ ๋ฒ—์–ด๋‚  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์ œ์— ์žˆ๋Š” ๊ฒƒ์€ ref ์œ ํ˜•์ด ์„ ํ˜• ๋ฉ”๋ชจ๋ฆฌ ์‚ฌ์šฉ ์–ธ์–ด์—์„œ ์ž์—ฐ์Šค๋Ÿฝ๊ฒŒ ๋งž์ง€ ์•Š๋Š”๋‹ค๋Š” @fgmccabe ์˜ ์š”์ ์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๊ฒƒ์€ ๋ฐ”์ธ๋”ฉ์— ๋Œ€ํ•ด ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ ์šฐ๋ฆฌ์—๊ฒŒ ์˜ํ–ฅ์„ ๋ฏธ์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ C++ ๋ฐ Rust๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†๊ธฐ ๋•Œ๋ฌธ์— ์‚ฌ์ดํด์ด ๊ฑฑ์ •๋˜์ง€๋งŒ ๋ฐ”์ธ๋”ฉ์ด ์ด๋ฅผ ๋ฌด์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?), ๊ทธ๋ž˜์„œ ์ œ๊ฐ€ ์ƒ๊ฐํ•˜๊ธฐ์— ์กฐ์‹ฌํ•ด์•ผ ํ•  ์‚ฌํ•ญ - ๋‘˜ ๋‹ค ๊ฐ€๋Šฅํ•œ ํ•œ ๋งŽ์€ ์–ธ์–ด์—์„œ ์ž‘๋™ํ•˜๋„๋ก ํ•˜๊ณ  ํŠน์ • ์–ธ์–ด์˜ ์ œํ•œ์— ์ง€๋‚˜์น˜๊ฒŒ ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š๋„๋ก ํ•ฉ๋‹ˆ๋‹ค.

@kentonv

Cap'n Proto์˜ ์ง๋ ฌํ™” ๊ณ„์ธต์€ ๋Œ€๋ถ€๋ถ„์ด ๊ด€์šฉ์ ์ด๊ณ  ์ธ๋ผ์ธ ์นœํ™”์ ์ด์–ด์•ผ ํ•˜๋Š” ๋„“๊ณ  ์–•์€ API ๊ณ„์ธต์ด๊ธฐ ๋•Œ๋ฌธ์— ํ˜„์‹ค์ ์œผ๋กœ ๊ฐ ์–ธ์–ด์—์„œ ๋…๋ฆฝ์ ์œผ๋กœ ๊ตฌํ˜„๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. RPC ๊ณ„์ธต์ธ OTOH๋Š” ์ข์ง€๋งŒ ๊นŠ๋‹ค.

์–ด๋–ค ํด๋”์ธ๊ฐ€์š”?

@PoignardAzur ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค, ๊ท€ํ•˜์˜ ์งˆ๋ฌธ์„ ์ดํ•ดํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค.

@kentonv capnproto Github ์ €์žฅ์†Œ๋ฅผ ์‚ดํŽด๋ณด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ง๋ ฌํ™” ๊ณ„์ธต์€ ์–ด๋””์— ์žˆ์Šต๋‹ˆ๊นŒ?

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

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

Cap'n Proto ๊ตฌํ˜„์—๋Š” ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋Š” ๋‚ด๋ถ€ ๋„์šฐ๋ฏธ ๊ธฐ๋Šฅ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŠนํžˆ layout.c++ / layout.h ์—๋Š” capnp์˜ ํฌ์ธํ„ฐ ์ธ์ฝ”๋”ฉ์„ ํ•ด์„ํ•˜๊ณ  ๊ฒฝ๊ณ„ ๊ฒ€์‚ฌ ๋“ฑ์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ชจ๋“  ์ฝ”๋“œ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ƒ์„ฑ๋œ ์ฝ”๋“œ ์ ‘๊ทผ์ž๋Š” ํฌ์ธํ„ฐ ํ•„๋“œ๋ฅผ ์ฝ๊ณ  ์“ธ ๋•Œ ํ•ด๋‹น ์ฝ”๋“œ๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์—ฌ๋Ÿฌ ์–ธ์–ด์—์„œ ํ˜ธ์ถœ๋˜๋„๋ก ํ•ด๋‹น ๋ถ€๋ถ„์„ FFI๋กœ ๋ž˜ํ•‘ํ•˜๋Š” ๊ฒƒ์„ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ๊ฐ ๋Œ€์ƒ ์–ธ์–ด์—์„œ ์ฝ”๋“œ ์ƒ์„ฑ๊ธฐ์™€ ์ผ์ •๋Ÿ‰์˜ ๋Ÿฐํƒ€์ž„ ์ง€์› ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๊ฒƒ์œผ๋กœ ์˜ˆ์ƒํ•ฉ๋‹ˆ๋‹ค.

๋„ค, ์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๋ฐ˜๋Œ€๋ฅผ ์˜๋ฏธํ–ˆ์Šต๋‹ˆ๋‹ค ^^ (RPC ๋ ˆ์ด์–ด)

@PoignardAzur Ohhh, ๊ทธ๋ฆฌ๊ณ  FFI์—์„œ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ž˜ํ•‘ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ๋ณด๋Š” ๋ฐ ํŠนํžˆ ๊ด€์‹ฌ์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋‹น์‹ ์€ ์›ํ•ฉ๋‹ˆ๋‹ค:

  • capability.h : ์ด๋ก ์ƒ ๋‹ค์–‘ํ•œ ๊ตฌํ˜„์œผ๋กœ ๋’ท๋ฐ›์นจ๋  ์ˆ˜ ์žˆ๋Š” ๊ธฐ๋Šฅ ๋ฐ RPC ํ˜ธ์ถœ์„ ๋‚˜ํƒ€๋‚ด๋Š” ์ถ”์ƒ ์ธํ„ฐํŽ˜์ด์Šค. (๊ฐ€์žฅ ์ค‘์š”ํ•œ ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค.)
  • rpc.h : ๋„คํŠธ์›Œํฌ๋ฅผ ํ†ตํ•œ RPC ๊ตฌํ˜„.
  • rpc-twoparty.h : ๋‹จ์ˆœ ์—ฐ๊ฒฐ์„ ํ†ตํ•œ RPC์šฉ ์ „์†ก ์–ด๋Œ‘ํ„ฐ.

์ด ์ œ์•ˆ์€ ์ด์ œ #1291: OCAP ๋ฐ”์ธ๋”ฉ์œผ๋กœ ๋Œ€์ฒด๋˜์—ˆ์Šต๋‹ˆ๋‹ค.

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

๊ด€๋ จ ๋ฌธ์ œ

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

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

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

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

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