Fable: ์šฐํ™” 2์—์„œ ์—ฐ์žฌ

์— ๋งŒ๋“  2018๋…„ 03์›” 02์ผ  ยท  17์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: fable-compiler/Fable

ํ† ๋ก ์˜ ๊ณ„์†์€ ์—ฌ๊ธฐ์—์„œ ์‹œ์ž‘๋˜์—ˆ์Šต๋‹ˆ๋‹ค. https://github.com/SaturnFramework/Saturn/issues/33

์ด Twitter ์Šค๋ ˆ๋“œ ์—๋Š” ์•”์‹œ์  ์ง๋ ฌํ™” ๋Œ€ ๋ช…์‹œ์  ์ง๋ ฌํ™”์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์˜๊ฒฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • Fable 2 ์•ŒํŒŒ ๋Š” ์ฒ˜์Œ ์— ๋ฐ˜์‚ฌ ์ง€์› ์—†์ด ๋ฐฐ์†ก๋ฉ๋‹ˆ๋‹ค. ๋‚ด ๊ฐ€์ •์€ ์ด๊ฒƒ์ด ํ˜„์žฌ Fable์— ๋ฐ˜์˜์˜ ๋‹ค๋ฅธ ๋งŽ์€ ๊ฒƒ์ด ์—†๋‹ค๊ณ  ์ƒ๊ฐํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์ฃผ๋กœ ofJson/toJson ์˜ํ–ฅ์„ ๋ฏธ์น  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ŒํŒŒ ๋ฒ„์ „์€ ๋ถ„๋ช…ํžˆ ํ”„๋กœ๋•์…˜์šฉ์ด ์•„๋‹ˆ๋ผ ์‚ฌ์šฉ์ž๊ฐ€ ์‚ฌ์šฉํ•ด ๋ณด๊ณ  ํ”ผ๋“œ๋ฐฑ์„ ์ œ๊ณตํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

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

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

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

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

  • Fable 2์—์„œ ์ž๋™ ์ง๋ ฌํ™”๊ฐ€ ์–ด๋–ป๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๊นŒ? ๋ ˆ์ฝ”๋“œ๋Š” ์ผ๋ฐ˜ JS ๊ฐœ์ฒด ๋ฐ ๊ณต์šฉ์ฒด, JS ๋ฐฐ์—ด์ด ๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ ๋„ค์ดํ‹ฐ๋ธŒ JSON.parse/stringify ํ˜ธ์ถœํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” Maps, Sets, dates, long ๋“ฑ๊ณผ ๊ฐ™์ด ๋ธŒ๋ผ์šฐ์ € JSON api์™€ ํ˜ธํ™˜๋˜์ง€ ์•Š๋Š” ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ Fable์€ ์ œ๋Œ€๋กœ ์ž‘๋™ํ•˜๊ธฐ ์œ„ํ•ด ๋Ÿฐํƒ€์ž„ ์‹œ ํ•„๋“œ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์—ฌ์ „ํžˆ ์•Œ์•„์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŒฝ์ฐฝ/์ˆ˜์ถ•ํ•ฉ๋‹ˆ๋‹ค.

  • ํ˜„์žฌ ์ง๋ ฌํ™”์—์„œ ๋งˆ์Œ์— ๋“ค์ง€ ์•Š๋Š” ์ ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ๋ช‡ ๊ฐ€์ง€๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค

    • ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ๋ฉฐ ๋Ÿฐํƒ€์ž„์— ๋†€๋ผ์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” _safe_ ์–ธ์–ด๋ฅผ ํŒ๋งคํ•˜๋Š” ๊ฒฝ์šฐ ์ข‹์ง€ ์•Š์€ ์ผ์ž…๋‹ˆ๋‹ค.
    • ๊ทธ๊ฒƒ์€ ์–ด๋–ป๊ฒŒ ๋“  ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ Newtonsoft.Json์„ _mirror__ํ•˜๊ณ  ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์ด๊ฒƒ์ด ์†์„ฑ, json์— ์œ ํ˜• ์ •๋ณด ํฌํ•จ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•˜๊ธฐ๋ฅผ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

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

  • ๋Œ€์•ˆ์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? ์œ„์˜ ๋ฌธ์ œ์—์„œ ์–ธ๊ธ‰ํ–ˆ๋“ฏ์ด ํ˜„์žฌ Fable 2 ์•ŒํŒŒ ์™€ ํ•จ๊ป˜ ์ž‘๋™ํ•ด์•ผ ํ•˜๋Š” ์ฃผ์š” ๋Œ€์•ˆ์€ Thot.Json ์ž…๋‹ˆ๋‹ค. ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ์ƒ์„ฑ๋œ JSON๊ณผ ํ›จ์”ฌ ๋” ๋‚˜์€ ์œ ํšจ์„ฑ ๊ฒ€์‚ฌ์— ๋Œ€ํ•œ ๋” ๋งŽ์€ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์œ ์ผํ•œ ๋‹จ์ ์€ ๋””์ฝ”๋”๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ ์ž๋™์œผ๋กœ ์ƒ์„ฑํ•˜๋Š” ์ž‘์—…์ด ์ด๋ฏธ ์žˆ๋‹ค๋Š”

dev2.0 discussion

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

๋‚ด๊ฐ€ Fable์„ ์ข‹์•„ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” JSON ์ง€์› ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ธ์ฝ”๋”/๋””์ฝ”๋” ๊ธฐ๋Šฅ์„ ์—ฌ๊ธฐ์ €๊ธฐ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ฃผ ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์Šค์˜ F# ์œ ํ˜•์—์„œ JS ๊ฐœ์ฒด์— ๋งค์šฐ ๊ฐ€๊น๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ JSON.parse/stringify ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ œํ•œ ์‚ฌํ•ญ์„ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ Fable์ด ์ข‹์•„์ง€๋ฉด์„œ JSON์—์„œ Lists์™€ DateTimes๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๊ทธ๋“ค์ด ๊ฐ„๋‹ค๋ฉด ์•ฝ๊ฐ„์˜ ํ”„๋กœ์ ํŠธ ์žฌ์ž‘์„ฑ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Thot.Json ์ฝ”๋“œ ์ƒ์„ฑ์ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘์— ๋Œ€ํ•œ ๋นŒ๋“œ ์ฒด์ธ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด(net46x์—์„œ - ์˜ˆ, ์–ธ์  ๊ฐ€๋Š” ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค), ์•„๋งˆ๋„ ๊ฐ€์งœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ผ์ข…์˜ ์‚ฌ์ „ ๋นŒ๋“œ ์ด๋ฒคํŠธ(๋‚ด๊ฐ€ FSharp.Data.SqlClient์šฉ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด MS ๋นŒ๋“œ ์ž‘์—…/๋Œ€์ƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ... ์ž๋™ ๋ณต์›์— ๋Œ€ํ•œ ํŒจํ‚ท์€ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

_๋ช‡ ๋…„ ์ „์— Newtonsoft.Json๊ณผ ํ—ค์–ด์กŒ์Šต๋‹ˆ๋‹ค._

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

๋‚ด๊ฐ€ Fable์„ ์ข‹์•„ํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” JSON ์ง€์› ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ธ์ฝ”๋”/๋””์ฝ”๋” ๊ธฐ๋Šฅ์„ ์—ฌ๊ธฐ์ €๊ธฐ ์ถ”๊ฐ€ํ•ด์•ผ ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋ ค์šด ์ผ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•„์ฃผ ์ดˆ๊ธฐ ๋ฆด๋ฆฌ์Šค์˜ F# ์œ ํ˜•์—์„œ JS ๊ฐœ์ฒด์— ๋งค์šฐ ๊ฐ€๊น๊ณ  ๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ JSON.parse/stringify ๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์—ˆ๊ณ  ์ œํ•œ ์‚ฌํ•ญ์„ ์•Œ๊ณ  ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ๊ฑฐ์˜ ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ๋ถˆํ–‰ํžˆ๋„ Fable์ด ์ข‹์•„์ง€๋ฉด์„œ JSON์—์„œ Lists์™€ DateTimes๋ฅผ ์‚ฌ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŒ์•ฝ ๊ทธ๋“ค์ด ๊ฐ„๋‹ค๋ฉด ์•ฝ๊ฐ„์˜ ํ”„๋กœ์ ํŠธ ์žฌ์ž‘์„ฑ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Thot.Json ์ฝ”๋“œ ์ƒ์„ฑ์ด ํด๋ผ์ด์–ธํŠธ์™€ ์„œ๋ฒ„ ๋ชจ๋‘์— ๋Œ€ํ•œ ๋นŒ๋“œ ์ฒด์ธ์˜ ์ผ๋ถ€๊ฐ€ ๋  ์ˆ˜ ์žˆ๋‹ค๋ฉด(net46x์—์„œ - ์˜ˆ, ์–ธ์  ๊ฐ€๋Š” ์—…๊ทธ๋ ˆ์ด๋“œํ•ด์•ผ ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค), ์•„๋งˆ๋„ ๊ฐ€์งœ๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ์ผ์ข…์˜ ์‚ฌ์ „ ๋นŒ๋“œ ์ด๋ฒคํŠธ(๋‚ด๊ฐ€ FSharp.Data.SqlClient์šฉ SQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ฐฐํฌํ•˜๋Š” ๋ฐ ์‚ฌ์šฉ)์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ? ์•„๋‹ˆ๋ฉด MS ๋นŒ๋“œ ์ž‘์—…/๋Œ€์ƒ์ด ์—ฌ์ „ํžˆ ๋ฌธ์ œ์ž…๋‹ˆ๊นŒ... ์ž๋™ ๋ณต์›์— ๋Œ€ํ•œ ํŒจํ‚ท์€ ์–ด๋–ป๊ฒŒ ๋ฉ๋‹ˆ๊นŒ?

_๋ช‡ ๋…„ ์ „์— Newtonsoft.Json๊ณผ ํ—ค์–ด์กŒ์Šต๋‹ˆ๋‹ค._

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

https://github.com/intel-hpdd/device-scanner/blob/16233ff62ad710aa02d6c8fe8acdbcad0c3e1e3e/IML.DeviceScannerDaemon/src/Main.fs#L13 -L20

๋ณ€ํ™˜์„ ํ•จ๊ป˜ ๊ตฌ์„ฑํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์— ์˜ˆ์ƒ๋Œ€๋กœ ์œ ํ˜• ๊ฒ€์‚ฌ/๊ตฌ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋…ธ๋“œ ์ŠคํŠธ๋ฆผ์˜ ์ธ์ฝ”๋”ฉ ์œ ํ˜•์„ ์ž๋™ ๊ฒฐ์ •ํ•˜๊ธฐ ์œ„ํ•ด:

https://github.com/intel-hpdd/fable-import-node-powerpack/blob/4004f9c430517c1f26bf47f9c2f766598e500b0d/fable/Stream.fs#L99 -L120

https://github.com/intel-hpdd/device-scanner/blob/16233ff62ad710aa02d6c8fe8acdbcad0c3e1e3e/IML.DeviceScannerDaemon/src/Main.fs#L23 -L42

์ด ์„œ๋น„์Šค์˜ ์†Œ๋น„์ž๋Š” ์ŠคํŠธ๋ฆฌ๋ฐ ๋ฐ์ดํ„ฐ๋ฅผ ๊ฐ€์ ธ์˜ค๊ธฐ ์œ„ํ•ด ๋ฐ๋ชฌ์— ๋ฉ”์‹œ์ง€๋ฅผ ๋ณด๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. https://github.com/intel-hpdd/device-scanner/tree/master/IML.DeviceScannerDaemon (๊ทธ๋ž˜์„œ ๋Œ€์‹  ๋ ˆ์ฝ”๋“œ/๋ฌธ์ž์—ด๋กœ ์œ ์ง€ ๋ฐฐ์—ด์ด ์ด์ƒ์ ์ž…๋‹ˆ๋‹ค.) ํ•˜์ง€๋งŒ ์ง๋ ฌํ™”๋ฅผ ์‹œ๋„ํ•˜๊ธฐ ์ „์— ๋ฌธ์ž์—ด ์ผ์น˜๋ฅผ ํ•ด๊ฒฐํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

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

@davidtme ๋นŒ๋“œ ์ฒด์ธ ๋˜๋Š” TP ์ง€์› ๋“ฑ์„ ํ†ตํ•ด Thot.Json ๋””์ฝ”๋”/์ธ์ฝ”๋” ์ƒ์„ฑ์„ ํ†ตํ•ฉํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์ฐพ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ์ฃผ์ œ์— ๋Œ€ํ•œ ๋‚˜์˜ ๋ฏธ๋ž˜ ์ง„ํ–‰ ์ƒํ™ฉ์„ ์ถ”์ ํ•˜๊ธฐ ์œ„ํ•ด Thot.Json์—์„œ ๋ฌธ์ œ๋ฅผ ์—ด โ€‹โ€‹๊ฒƒ์ž…๋‹ˆ๋‹ค.

์ฐธ๊ณ ๋กœ ์ €๋Š” Fable์šฉ Thot.Json๊ณผ ๋™์ผํ•œ API๋ฅผ ์ œ๊ณตํ•˜๋Š” Thot.Json.Net ์„ ๊ฒŒ์‹œํ•ฉ๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ ์ง€์‹œ๋ฌธ์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์•„์ด๋””์–ด:

// By adding this condition, you can share you code between your client and server 
#if FABLE_COMPILER
open Thot.Json
#else
open Thot.Json.Net
#endif

์„ ์  ์„œ๋ฅ˜ ๋น„์น˜

@alfonsogarciacaro ์ปดํŒŒ์ผ ์‹œ ์œ ํ˜• ์ •๋ณด๋ฅผ ๊ฐ์ง€ํ•˜๊ณ  ์ด์— ๋”ฐ๋ผ serialization ํ”„๋กœ์„ธ์Šค๋ฅผ ์กฐ์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

์œ ํ˜• ์ •๋ณด๋Š” ์ปดํŒŒ์ผ ์œ ํ˜•์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ. _both_๊ฐ€ ๋ฆฌํ”Œ๋ ‰์…˜ ์—†์ด ์œ ํ˜• ์ •๋ณด์— ์•ก์„ธ์Šคํ•˜๊ณ  ์ง๋ ฌํ™”๋ฅผ ์ปดํŒŒ์ผ๋Ÿฌ ์™ธ๋ถ€๋กœ ์ด๋™ํ•˜๊ธฐ๋ฅผ ์›ํ•˜๋”๋ผ๋„ ์ผ์ข…์˜ ํ”Œ๋Ÿฌ๊ทธ์ธ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค(Fable 2 alpha :wink:์—์„œ๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†์Œ). ๊ทธ๋Ÿฌ๋‚˜ "์ง๋ ฌํ™” ํ”„๋กœ์„ธ์Šค ์กฐ์ •"์ด ์ •ํ™•ํžˆ ๋ฌด์—‡์„ ์˜๋ฏธํ•ฉ๋‹ˆ๊นŒ?

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

๋Œ€๋ถ€๋ถ„์˜ ๊ฒฝ์šฐ์— ์ž‘๋™ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒฝ์šฐ๋Š” ์•„๋‹ˆ๋ฉฐ ๋Ÿฐํƒ€์ž„์— ๋†€๋ผ์›€์„ ์ค„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋Š” ์•ˆ์ „ํ•œ ์–ธ์–ด๋ฅผ ํŒ๋งคํ•˜๋Š” ๊ฒฝ์šฐ ์ข‹์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

๊ทธ๋Ÿฐ ๋‹ค์Œ ์‹คํŒจํ•œ ์˜ˆ์™ธ์ ์ธ ๊ฒฝ์šฐ๋ฅผ ๊ตฌํ˜„ํ•ฉ๋‹ˆ๋‹ค. ์ž๋™ ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™” ์‹คํŒจ๋Š” ๋Ÿฐํƒ€์ž„์— ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๊ฐ€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์€ ์œ„์น˜์—์„œ ๋ฐœ์ƒํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๊ทธ๊ฒƒ์€ ํ”„๋ก ํŠธ์—”๋“œ ์ธก์—์„œ Newtonsoft.Json์„ ์–ด๋–ป๊ฒŒ๋“  ๋ฏธ๋Ÿฌ๋งํ•˜๊ณ  ์ผ๋ถ€ ์‚ฌ๋žŒ๋“ค์€ ์†์„ฑ, json์— ์œ ํ˜• ์ •๋ณด ํฌํ•จ ๋“ฑ๊ณผ ๊ฐ™์€ ๊ฒƒ์„ ์ง€์›ํ•  ๊ฒƒ์œผ๋กœ ๊ธฐ๋Œ€ํ•ฉ๋‹ˆ๋‹ค.

Newtonsoft.Json๊ณผ ๋™์ผํ•œ ์šฉ์ด์„ฑ ์„ ์ œ๊ณตํ•˜๋ฉฐ ์‚ฌ์šฉ์ž๋Š” ์ด๋ฏธ ๊ธฐ๋ณธ๊ฐ’์œผ๋กœ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์— ๋งค์šฐ ๋งŒ์กฑํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์ด ๋” ๋งŽ์€ ์ œ์–ด ๋ฐ ์‚ฌ์šฉ์ž ์ •์˜๋ฅผ ์›ํ•˜๋ฉด Thot.Json ๋˜๋Š” Fable.SimpleJson ์ด ํ•„์š”ํ•œ ์ˆ˜์ค€์˜ ์ œ์–ด๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

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

ofJson<'a> ๋ฐ 'toJson`์œผ๋กœ ์œ ์ง€ ๊ด€๋ฆฌ ๋น„์šฉ์ด ์ฆ๊ฐ€ํ•œ๋‹ค๋Š” ๋ฐ ๋™์˜ํ•˜์ง€๋งŒ ๊ทธ๋งŒํ•œ ๊ฐ€์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์™ธ๋ถ€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๋งŒ๋“ค๋ ค๋ฉด ์†Œ๋น„์ž๊ฐ€ ์ด๋Ÿฌํ•œ ๋ณ€ํ™˜๊ธฐ๋ฅผ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ๋ฆฌํ”Œ๋ ‰์…˜์„ ์ž˜ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

@Zaid-Ajaj ์ œ ๊ด€์ ์—์„œ๋Š” ์ƒ์„ฑ๋œ ์ž๋ฐ”์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด๊ธฐ ์ข‹๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

ํŠนํžˆ ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ์—ฌ์ „ํžˆ ๋Š๋ฆฐ ๊ตญ๊ฐ€์—์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ๊ทธ๊ฒƒ์— ๋Œ€ํ•ด ๋ถˆํ‰ํ•˜๋Š” ๊ฒƒ์„ ๋ด…๋‹ˆ๋‹ค. :)

@alfonsogarciacaro ์†์„ฑ ์ด๋ฆ„์„ ํ‚ค๋กœ ์‚ฌ์šฉํ•˜์—ฌ Maps, Sets ๋“ฑ์„ ์ง€์›ํ•˜๊ธฐ ์œ„ํ•ด ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ ํ˜ธ์ถœ์„ Fable์—์„œ ์‚ฌ์šฉ์ž ์ง€์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜๊ณ  ์žˆ์—ˆ์ง€๋งŒ ๊ทธ๊ฒƒ์€ ์ผ์ข…์˜ ๋‚˜์œ ์ƒ๊ฐ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋งŽ์€ ์ฝ”๋“œ ์ค‘๋ณต์„ ์˜๋ฏธํ•˜๊ณ  ๋˜ํ•œ ๊ฐ ์ง๋ ฌ ๋ณ€ํ™˜๊ธฐ ํ˜ธ์ถœ์ด ๋™์ผํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ์•„์ด๋””์–ด๋Š” ์žŠ์–ด ๋ฒ„๋ฆฌ์ž :)

@alfonsogarciacaro ์œ ํ˜• ์ •๋ณด๋ฅผ "์œ ํ˜• ๋ชจ๋“ˆ"์— ํฌํ•จํ•  ์ˆ˜

๋ชจ๋“ˆ์€ ์•ฑ์˜ ๋ชจ๋“  ์œ ํ˜• ์ •๋ณด๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ๊ฒฝ์šฐ Webpack์—์„œ ์ œ๊ฑฐํ•  ์ˆ˜ ์žˆ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ํ˜„์žฌ ofJson/toJson ๋„์šฐ๋ฏธ๊ฐ€ ๋งค์šฐ ํŽธ๋ฆฌํ•˜๊ณ  ์‚ฌ์šฉํ•˜๊ธฐ ์‰ฌ์šด ๊ฒƒ์„ ์ œ๊ณตํ•˜์ง€ ์•Š๋Š” ํ•œ ๋Œ€์ฒด๋˜์–ด์„œ๋Š” ์•ˆ ๋œ๋‹ค๋Š” ๊ฒƒ์„ ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. @jgrund ์ƒ˜ํ”Œ๋„ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. Fable์ด ํ”„๋กœ๋•์…˜์—์„œ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉ๋˜๋Š”์ง€ ๋ณด๋Š” ๊ฒƒ์€ ๋งค์šฐ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋‚ด๊ฐ€ ๋ณผ ์ˆ˜์žˆ๋Š” ๊ฒƒ์€ ๋ฆฌํ”Œ๋ ‰์…˜์ด ofJson ์—๋งŒ ์‚ฌ์šฉ๋˜๋Š” ๊ฒƒ์œผ๋กœ typeof<'T> ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ๊ณณ์ด ์žˆ์Šต๋‹ˆ๊นŒ?

ํ†ต์ฐฐ๋ ฅ @Zaid-Ajaj์—๋„ ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. Maxime์ด ๋งํ–ˆ๋“ฏ์ด ์ฝ”๋“œ๋ฅผ ๋” ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋งŒ๋“œ๋Š” ๊ฒƒ(์‹ค์ œ๋กœ ์–ด๋–ค ๊ณณ์—์„œ๋Š” _less_ ๊ฐ€๋…์„ฑ์ด ๋˜์ง€๋งŒ Fable 2์—์„œ๋Š” ๋” ์ตœ์ ํ™”๋  ์ˆ˜ ์žˆ์Œ)์„ ๋งŒ๋“œ๋Š” ๊ฒƒ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋ฒˆ๋“ค ํฌ๊ธฐ๋ฅผ ์ค„์ด๊ณ  ์ƒ์„ฑ๋œ ์ฝ”๋“œ๋ฅผ JS ์ตœ์ ํ™” ๋„๊ตฌ์— ๋” ์ ํ•ฉํ•˜๊ฒŒ ๋งŒ๋“œ๋Š” ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ๋ฒˆ๋“ค ํฌ๊ธฐ๊ฐ€ ๋„ˆ๋ฌด ํฌ๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋‹ค๋ฅธ ์˜ต์…˜์„ ๊ณ ๋ คํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ Fulma์™€ ๊ฐ™์ด ๋” ์„ฑ์ˆ™ํ•˜๊ณ  ๋ณต์žกํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ์œผ๋ฏ€๋กœ ์ƒ์กด์˜ ๋ฌธ์ œ์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. Fable์€ ๊ธฐ๋Šฅ์˜ _๋Œ€๋ถ€๋ถ„_๊ณผ BCL์˜ FSharp.Core ๋ฐ _์ผ๋ถ€_๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ F# ์–ธ์–ด๋ฅผ ์ปดํŒŒ์ผํ•˜๋ ค๊ณ  ์‹œ๋„ํ•˜๊ณ  ๋ฆฌํ”Œ๋ ‰์…˜์ด F# ์–ธ์–ด ๊ธฐ๋Šฅ์ธ์ง€ BCL/.NET ๋Ÿฐํƒ€์ž„์˜ ์ผ๋ถ€์ธ์ง€ ๊ฒฐ์ •ํ•˜๋Š” ๊ฒƒ์€ ๋˜ ๋‹ค๋ฅธ ์ฃผ์ œ์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ๋งค์šฐ ์œ ์šฉํ•œ ๊ธฐ๋Šฅ์ด์ง€๋งŒ Fable 2 ์•ŒํŒŒ ๋ฆด๋ฆฌ์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋น„์šฉ/ํ˜œํƒ๊ณผ ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ ๋Œ€์•ˆ์ด ์žˆ๋Š”์ง€ ์—ฌ๋ถ€๋ฅผ ํ‰๊ฐ€ํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

@MangelMaxime ์˜ˆ, ์œ„์—์„œ ๊ณ ๋ คํ•œ ์„ธ ๋ฒˆ์งธ ์˜ต์…˜์ž…๋‹ˆ๋‹ค. ์ด Types ๋ชจ๋“ˆ์ด ์ผ๊ด€์„ฑ ์—†๋Š” ์ƒํƒœ๊ฐ€ ๋  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ์‹œ๊ณ„ ์ปดํŒŒ์ผ์— ๋Œ€ํ•ด ์•ฝ๊ฐ„์˜ ์˜์‹ฌ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํ™•์‹คํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์‹œ๋„ํ•ด ๋ณผ ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

๋‹ค์‹œ ํ•œ ๋ฒˆ, ๊ท€ํ•˜์˜ ์˜๊ฒฌ์— ๊ฐ์‚ฌ๋“œ๋ฆฝ๋‹ˆ๋‹ค. ์˜๊ฒฌ์€ ์ •๋ง ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ˜„์žฌ Fable ์‚ฌ์šฉ์ž์—๊ฒŒ ํ”ผํ•ด๋ฅผ ์ค„ ์ˆ˜ ์žˆ๋Š” ์ผ์„ ํ•˜๋ ค๋Š” ๊ฒƒ์ด ์ €์˜ ์ตœ์†Œํ•œ์˜ ์˜๋„์ธ์ง€ ํ™•์ธํ•˜์‹ญ์‹œ์˜ค. ๋Œ€์•ˆ๊ณผ ๊ทธ ํšจ๊ณผ๋ฅผ ๋” ์‰ฝ๊ฒŒ ๋น„๊ตํ•  ์ˆ˜ ์žˆ๋„๋ก Fable 2 ์•ŒํŒŒ ๋ฒ„์ „์„ ์ถœ์‹œํ•˜๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. +1:

๋Š๋ฆ…๋‚˜๋ฌด ๋Œ€์‹  Fable์„ ์„ ํƒํ•œ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ด์œ ๋Š” F#์„ ์–‘์ชฝ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ์—ฌ๋Ÿฌ ๊ณ„์ธต์—์„œ ์œ ํ˜•์„ ์žฌ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฆฌํ”Œ๋ ‰์…˜ ์ž์ฒด๋Š” ํ•„์š”ํ•˜์ง€ ์•Š์ง€๋งŒ @davidtme๊ฐ€ ๋งํ–ˆ๋“ฏ์ด ์ด์ „ ๊ตฌํ˜„์€ "๊ทธ๋ƒฅ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค". JSON ์ง๋ ฌํ™”๋ฅผ ์œ„ํ•ด ์œ ํ˜• ์‹œ์Šคํ…œ์˜ ์ผ๋ถ€ ์ธก๋ฉด์„ ํฌ๊ธฐํ•˜๋Š” ๊ฒƒ์ด ํŽธํ•˜์ง€๋งŒ ๊ฑฐ์˜ ๋ชจ๋“  ํ”Œ๋žซํผ ๊ฐ„ ์ง๋ ฌํ™” ํ˜•์‹์— ํ•ด๋‹นํ•˜๋ฉฐ ์ €๋Š” ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค.

์ปดํŒŒ์ผ๋Ÿฌ ํ”Œ๋Ÿฌ๊ทธ์ธ์œผ๋กœ ์ถ”์ถœ๋œ ์ง๋ ฌํ™”๋Š” ํ•ด์ œํ•  ์ˆ˜ ์žˆ๋‹ค๋ฉด ํฐ ์ ˆ์ถฉ์•ˆ์ด ๋  ๊ฒƒ์ž…๋‹ˆ๋‹ค. ;)

typeof<'T> ๋˜๋Š” ์ด์™€ ์œ ์‚ฌํ•œ ๊ฒƒ์„ ์‚ฌ์šฉํ•˜๋Š” ๋‹ค๋ฅธ ์žฅ์†Œ๊ฐ€ ์žˆ์Šต๋‹ˆ๊นŒ?

์ฃ„์†กํ•ฉ๋‹ˆ๋‹ค. ๊ด€๋ จ ์„น์…˜์„ ๊ฐ•์กฐ ํ‘œ์‹œํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. https://github.com/intel-hpdd/fable-import-node-powerpack/blob/4004f9c430517c1f26bf47f9c2f766598e500b0d/fable/Stream.fs#L144

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

๊ทธ ๋ฐ”ํƒ•์œผ๋กœ, ๋‚˜๋Š” ๊ฝค ์ข‹์€ ์ธ ํ•จ๊ป˜ ์‚ฌ์ „์— ์˜ต์…˜์„ ํ•˜๋“œ ์ฝ”๋”ฉ์— ๋Œ€ํ•œ ๊ฑฑ์ •์—†์ด ์ž‘์„ฑ ์ŠคํŠธ๋ฆผ ๋“ฑ์˜ ์ž‘์—…์„ ์ˆ˜ํ–‰ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค : https://github.com/intel-hpdd/fable-import-node-powerpack/blob/4004f9c430517c1f26bf47f9c2f766598e500b0d/test/ ์ŠคํŠธ๋ฆผ.ํ…Œ์ŠคํŠธ.fs#L221 -L232

์—ฌ๊ธฐ์— ๋˜ ๋‹ค๋ฅธ ์˜๋ฆฌํ•œ ๋ฐ˜์‚ฌ ์‚ฌ์šฉ๋ฒ•์ด ์žˆ์Šต๋‹ˆ๋‹ค.
https://github.com/Zaid-Ajaj/Fable.Remoting/blob/master/Fable.Remoting.Client/Proxy.fs#L70

๊ทธ๋ฆฌ๊ณ  ์—ฌ๊ธฐ:
https://github.com/Zaid-Ajaj/Fable.Remoting/blob/master/Fable.Remoting.Client/Proxy.fs#L169

์ „์ฒด Fable.Remoting ํ”„๋กœ์ ํŠธ ์•„์ด๋””์–ด๋Š” ์„œ๋ฒ„์™€ ํด๋ผ์ด์–ธํŠธ ๋ชจ๋‘์—์„œ ๋ฐ˜์˜ ๊ฐ€๋Šฅ์„ฑ์„ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค.

ํ†ต์‹ ์ด ๋Œ€๊ธฐ ์‹œ๊ฐ„์ด๋‚˜ ์„ฑ๋Šฅ์— ๋ฏผ๊ฐํ•œ ๊ฒฝ์šฐ๊ฐ€ ์•„๋‹ˆ๋ฉด ๋Œ€์ค‘์ ์ธ ์š”์ฒญ์€ ์•„๋‹ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ „์†ก์„ ์œ„ํ•ด ์›์‹œ ๊ฐ’ ์œ ํ˜•์„ ์ง€์›ํ•˜๋Š” ๊ฒƒ์€ ์–ด๋–ป์Šต๋‹ˆ๊นŒ? ์˜ˆ๋ฅผ ๋“ค์–ด .NET ์••์ถ• ๋ฐ ๊ด€๋ฆฌ๋˜์ง€ ์•Š๋Š”("blittable") ๊ฐ’ ์œ ํ˜•์„ ์ง€์›ํ•ฉ๋‹ˆ๊นŒ? ์ •์˜์— ๋”ฐ๋ฅด๋ฉด ๋„ค์ดํ‹ฐ๋ธŒ์™€ .NET ๋ชจ๋‘์—์„œ ์–ด๋””์—์„œ๋‚˜ ๋™์ผํ•œ ํ‘œํ˜„์„ ๊ฐ–์Šต๋‹ˆ๋‹ค. ์ด ์›์‹œ ํ‘œํ˜„์€ ๋•Œ๋•Œ๋กœ json ์ง๋ ฌํ™”/์—ญ์ง๋ ฌํ™”๊ฐ€ ์„œ๋ฒ„์—์„œ ๋„ˆ๋ฌด cpu/memory/gc/์ง€์—ฐ ์ง‘์•ฝ์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ค‘์š”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ํŠนํžˆ ๋งŽ์€ ํด๋ผ์ด์–ธํŠธ ๋ฐ/๋˜๋Š” ๋†’์€ ๋ฉ”์‹œ์ง€ ์†๋„์—์„œ). ํด๋ผ์ด์–ธํŠธ์˜ ์ œ๋กœ ๋ณต์‚ฌ๋Š” ArrayView/TypedArray/DataView ์ง€์›์„ ์‚ฌ์šฉํ•˜์—ฌ ์ง€์›ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค(ํ•„๋“œ๋Š” ๋ฒ„ํผ์—์„œ ์ง์ ‘ ์ฝ๊ณ /์”๋‹ˆ๋‹ค).
์•„๋งˆ๋„ ์ด๊ฒƒ์€ NodeJS ๊ธฐ๋ณธ interop์—๋„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(ffi ํฌํ•จ).

[<Struct>]
[<StructLayout(LayoutKind.Sequential, Pack=1)>]
type Vector3 =
    val X: int32
    val Y: int32
    val Z: int32
    new(x,y,z) = {
      X=x;
      Y=y;
      Z=z;
    }
    new(dataview: DataView,offset) = {
    //TODO
    }

@zpodlovics์— ์˜๊ฒฌ์„ ๋ณด๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๋‚˜๋Š” ์ด๋Ÿฐ ์ข…๋ฅ˜์˜ ์ง๋ ฌํ™”์— ์ต์ˆ™ํ•˜์ง€ ์•Š๋‹ค๊ณ  ๋งํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. JSON ๋˜๋Š” ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง๋ ฌํ™”์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๊นŒ? (ํ•œ ํ”„๋กœ์ ํŠธ์—์„œ Google Flatbuffers ํ”„๋กœํ† ์ฝœ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ”์ด๋„ˆ๋ฆฌ ์ง๋ ฌํ™”๋ฅผ ์กฐ๊ธˆ ํ”Œ๋ ˆ์ดํ–ˆ์ง€๋งŒ ๋งŽ์€ ์ƒ์šฉ๊ตฌ ์ฝ”๋“œ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.) ์ง๋ ฌํ™”๋œ ๋ฐ์ดํ„ฐ๊ฐ€ ์–ด๋–ป๊ฒŒ ๋ณด์ด๋Š”์ง€ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์Šต๋‹ˆ๊นŒ? Fable์€ JS ์ฝ”๋“œ ๋ฐ ๋Ÿฐํƒ€์ž„์—์„œ ์ตœ์ ํ™”ํ•˜๊ธฐ ์œ„ํ•ด ์œ ํ˜•์—์„œ ์ผ๋ถ€ ๋ฐ์ดํ„ฐ๋ฅผ ์ œ๊ฑฐํ•˜๋ฏ€๋กœ .NET๊ณผ JS์—์„œ ์ •ํ™•ํžˆ ๋™์ผํ•œ ํ‘œํ˜„์„ ๊ฐ–๋Š” ๊ฒƒ์€ ์•ฝ๊ฐ„ ์–ด๋ ค์šธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ’(๊ตฌ์กฐ์ฒด) ์œ ํ˜•์„ ์ •์˜ํ•  ์ˆ˜ ์—†๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ JS์˜ ์ œํ•œ ์‚ฌํ•ญ ์™ธ์—๋„.

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

@alfonsogarciacaro ๋Œ“๊ธ€ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค!

๊ธ€์Ž„, ๊ทธ๊ฒƒ์€ ์‹ค์ œ๋กœ ์ง๋ ฌํ™” ํ˜•์‹์ด ์•„๋‹ˆ๋ผ ๋„ค์ดํ‹ฐ๋ธŒ C ๊ตฌ์กฐ์ฒด๋กœ ํ‘œํ˜„๋˜๋Š” ์ง์ ‘์ ์ธ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. "์ง๋ ฌํ™”๋œ" ํ˜•์‹์€ ์ •ํ™•ํžˆ ac ๊ตฌ์กฐ์ฒด(๋„ค์ดํ‹ฐ๋ธŒ)[1]์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋„ค์ดํ‹ฐ๋ธŒ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ๋™์ผํ•œ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์„ ์‚ฌ์šฉํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋„ค์ดํ‹ฐ๋ธŒ interop์—๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด์ „ ์˜ˆ์ œ์—์„œ๋Š” 3 * 4 = 12๋ฐ”์ดํŠธ ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. Struct๋Š” ์ง€์› ๋ฉ”๋ชจ๋ฆฌ ์˜์—ญ(.Wrap)์„ ๋Œ€์ฒดํ•˜๋Š” ๋ฉ”์„œ๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐœ์ฒด๋กœ "์—๋ฎฌ๋ ˆ์ด์…˜"๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด์ „ ๊ตฌ์กฐ์ฒด๋Š” JS DataView API(https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/DataView/getInt32)๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜์‚ฌ ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์˜ˆ:

type Vector3 =
    val mutable view: DataView
    val mutable offset: int32
    static member XOffset=0
    static member YOffset=4
    static member ZOffset=8
    new(v: DataView,o:int32) = {
      view=v;
      offset=o;
    }
    member __.Wrap(v: DataView,o:int32) = {
      view=v;
      offset=o;
    }
    member __.X
        with get() = __.view.getInt32(__.offset+Vector3.XOffset)
        and set(v) = __.view.setInt32(__.offset+Vector3.XOffset,v)
    member __.Y
        with get() = __.view.getInt32(__.offset+Vector3.YOffset)
        and set(v) = __.view.setInt32(__.offset+Vector3.YOffset,v)
    member __.Z
        with get() = __.view.getInt32(__.offset+Vector3.ZOffset)
        and set(v) = __.view.setInt32(__.offset+Vector3.ZOffset,v)       

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

interop(ffi ์ง€์›)์„ ์œ„ํ•œ ์ง๋ ฌํ™” ํ˜•์‹์œผ๋กœ ๊ธฐ๋ณธ ์ œ๊ณต๋˜๋Š” ์›์‹œ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ ๋†€๋ผ์šด ๊ฐ€์น˜๋ฅผ ๊ฐ€์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํ”Œ๋žซํผ์—์„œ ๊ฐœ๋ฐœ์ž๋Š” ํ”Œ๋žซํผ์„ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๋‘ ๊ฐ€์ง€ ์˜ต์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. 1) ํ”Œ๋žซํผ ๊ธฐ๋ณธ ์ฝ”๋“œ๋กœ interop ์ฝ”๋“œ ์ž‘์„ฑ(ํ”Œ๋žซํผ ์ปดํŒŒ์ผ๋Ÿฌ, ๋‹ค๋ฅธ ๋„๊ตฌ ์ฒด์ธ, ๋‹ค๋ฅธ ๋นŒ๋“œ/ํ…Œ์ŠคํŠธ/๋ฐฐํฌ ํ”„๋กœ์„ธ์Šค ๋“ฑ) 2) interop์— ๋Œ€ํ•œ ์›์‹œ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ์ฝ”๋“œ ์ž‘์„ฑ + ํ”ผํ”ผ. .NET์— ํ•€๋ณดํฌ ์ง€์› ๊ธฐ๋Šฅ์ด ๋‚ด์žฅ๋œ ๊ฒƒ์€ ์šฐ์—ฐ์ด ์•„๋‹™๋‹ˆ๋‹ค.

์”จ:
[1] https://en.wikipedia.org/wiki/Struct_ (C_programming_language)
.๊ทธ๋ฌผ
[2] https://www.developerfusion.com/article/84519/mastering-structs-in-c/
JS
[3] https://github.com/TooTallNate/ref-struct

@zpodlovics์— ๋Œ€ํ•œ ์ž์„ธํ•œ ์„ค๋ช… ์ •๋ง ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค! ๊ณผ๊ฑฐ์— ๋ฐ์ดํ„ฐ ๋ณด๊ธฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๊ตฌ์กฐ์ฒด๋ฅผ ์—๋ฎฌ๋ ˆ์ดํŠธํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์‚ดํŽด๋ณด์•˜์ง€๋งŒ ์—ฌ์ „ํžˆ ์ œํ•œ์ด ์žˆ๊ธฐ ๋•Œ๋ฌธ์— ๋งŽ์€ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค(์˜ˆ: ์ˆซ์ž๋งŒ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ  ๊ตฌ์กฐ์ฒด ์ค‘์ฒฉ์ด ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋ฐฐ์—ด์—์„œ ๊ตฌ์กฐ์ฒด๋ฅผ ๋ณต์‚ฌํ•˜๋Š” ๊ฒƒ๋„ ๊นŒ๋‹ค๋กญ์Šต๋‹ˆ๋‹ค ๋“ฑ). ). ๋˜ํ•œ ์ˆซ์ž ๋ฐฐ์—ด์„ ์‚ฌ์šฉํ•˜์—ฌ Fable๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ๋” ์ž˜ ์ œ์–ดํ•˜๋Š” โ€‹โ€‹๊ฒƒ์ด ์ด๋ฏธ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ˆซ์ž ๋ฐฐ์—ด์€ Typed Array๋กœ ๋ณ€ํ™˜๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์ด๊ฒƒ์€ ์ง€๊ธˆ๊นŒ์ง€ ์‚ฌ์šฉ์ž๋“ค ์‚ฌ์ด์—์„œ ๊ทธ๋‹ค์ง€ ๋งค๋ ฅ์ ์ด์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.

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

๊ทธ๋Ÿฌ๋‚˜ ๊ณ ๋ คํ•ด์•ผ ํ•  ํ•œ ๊ฐ€์ง€๋Š” WebAssembly ์ง€์›์ด .NET/F#์— ์ œ๊ณต๋˜๊ณ  ์ด ๊ฒฝ์šฐ ๋ฉ”๋ชจ๋ฆฌ ํ‘œํ˜„์ด .NET ๋ชจ๋ธ์— ๋” ๊ฐ€๊น๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ Fable์€ F#์„ JS ์—์ฝ”์‹œ์Šคํ…œ์— ๋” ๊ฐ€๊น๊ฒŒ ํ†ตํ•ฉํ•˜๊ณ  ์•ฑ์˜ ํ”„๋ก ํŠธ์—”๋“œ๋ฅผ ๊ตฌ์ถ•ํ•˜๋Š” ๋ฐ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ํ˜„์žฌ ๋„๊ตฌ/libs๋ฅผ ํ™œ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•์œผ๋กœ ๋‚จ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

@alfonsogarciacaro ์ด ๋ฌธ์ œ๋ฅผ ์ข…๋ฃŒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๊นŒ?

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

๊ด€๋ จ ๋ฌธ์ œ

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

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

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

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

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