Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Save coleea/013977b5f7c354b1c616383fd46f1b40 to your computer and use it in GitHub Desktop.
Save coleea/013977b5f7c354b1c616383fd46f1b40 to your computer and use it in GitHub Desktop.

https://www.youtube.com/watch?v=vSSpbAI_-t0&pp=ygU1VGhlIFN0YXRlIG9mIEZ1bGwtU3RhY2sgT0NhbWwgKHdpdGggQW50b25pbyBNb250ZWlybyk%3D

์ด๋ฒˆ ์ฃผ์—๋Š” OCaml ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๊ทธ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์˜์—ญ์„ ํ™•์žฅํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์•Œ์•„๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. OCaml์€ ํ•ญ์ƒ ๋ฐฑ์—”๋“œ ์–ธ์–ด์˜€์ง€๋งŒ, ์ด์ œ๋Š” ๋ธŒ๋ผ์šฐ์ €๊นŒ์ง€ ๋ชฉํ‘œ๋กœ ์‚ผ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜ ์ €์™€ ํ•จ๊ป˜ OCaml์ด JavaScript ์„ธ๊ณ„๋กœ ์ง„์ถœํ•˜๋„๋ก ๋•๋Š” ํฅ๋ฏธ๋กญ๊ณ  ์ •๊ตํ•œ ์ปดํŒŒ์ผ๋Ÿฌ ์ž‘์—…์„ ๋งŽ์ด ํ•ด์˜จ Antonio Monteiro๊ฐ€ ํ•จ๊ป˜ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ์กด JavaScript ๊ฐœ๋ฐœ์ž๋“ค์ด OCaml์˜ ํ•จ์ˆ˜ํ˜• ์„ธ๊ณ„๋กœ ๋„˜์–ด์˜ฌ ์ˆ˜ ์žˆ๋„๋ก ๋•๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Š” OCaml ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋‘ ๊ฐ€์ง€ ์ธก๋ฉด์—์„œ ํ™•์žฅํ•˜์—ฌ ์ด๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ์งธ, OCaml์„ ์ž‘์„ฑํ•˜๊ณ  JavaScript๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” Melange์˜ ์ œ์ž‘์ž์ž…๋‹ˆ๋‹ค. ๋‘˜์งธ, JavaScript์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ด์ง€๋งŒ ํƒ€์ž… ์•ˆ์ „ ๋ฐฑ์—”๋“œ ๋„ค์ดํ‹ฐ๋ธŒ OCaml์„ ์ƒ์„ฑํ•˜๋Š” ReasonML์˜ ์ฃผ์š” ๊ธฐ์—ฌ์ž์ž…๋‹ˆ๋‹ค. ๋ฌผ๋ก  ์ฒซ ๋ฒˆ์งธ ์งˆ๋ฌธ์€ "์™œ?"์ž…๋‹ˆ๋‹ค. ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๊ณ  ์‹ถ์–ดํ• ๊นŒ์š”? OCaml์ด ๋ธŒ๋ผ์šฐ์ €์— ๋„ฃ์„ ๋งŒํผ ํ›Œ๋ฅญํ•œ ์ ์€ ๋ฌด์—‡์ผ๊นŒ์š”? ๊ทธ๋ฆฌ๊ณ  Antonio๋Š” OCaml์˜ ์–ด๋–ค ์ ์ด ๊ทธ๋ ‡๊ฒŒ ํ›Œ๋ฅญํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ• ๊นŒ์š”? ์ด ๋ชจ๋“  ์ž‘์—…์„ ํ•˜๋Š” ๊ทธ์˜ ๊ฐœ์ธ์ ์ธ ์ด์œ ๋Š” ๋ฌด์—‡์ผ๊นŒ์š”? ํ•˜์ง€๋งŒ ํ›จ์”ฌ ๋” ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์€ "์–ด๋–ป๊ฒŒ?"์ž…๋‹ˆ๋‹ค. ๋‘ ๊ฐ€์ง€ ๋‹ค๋ฅธ ์–ธ์–ด ์‚ฌ์ด์—์„œ ์–ด๋–ป๊ฒŒ ์ปดํŒŒ์ผํ•˜๊ณ  ํŠธ๋žœ์ŠคํŒŒ์ผํ• ๊นŒ์š”? ๋ฌผ๋ก  ํ•œ ์–ธ์–ด์˜ for ๋ฃจํ”„ ๊ตฌ๋ฌธ์„ ํŒŒ์‹ฑํ•˜๊ณ  ๋‹ค๋ฅธ for ๋ฃจํ”„ ๊ตฌ๋ฌธ์„ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์†Œํ•œ ์ผ์ด์ง€๋งŒ, ๋™์‹œ์„ฑ ๋ชจ๋ธ์ด ๋‹ค๋ฅด๊ฑฐ๋‚˜ OCaml์˜ ์ผ๊ธ‰ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์„ JavaScript ์„ธ๊ณ„๋กœ ์ด์‹ํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์€ ์ฃผ์š” ์ฐจ์ด์ ์€ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ• ๊นŒ์š”? ์ด๋Ÿฌํ•œ ์งˆ๋ฌธ์— ๋‹ตํ•˜๋ ค๋ฉด ์ „๋ฌธ๊ฐ€์˜ ๋จธ๋ฆฌ๋ฅผ ์ข€ ๋นŒ๋ ค์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ €๋Š” ์—ฌ๋Ÿฌ๋ถ„์˜ ํ˜ธ์ŠคํŠธ Chris Jenkins์ด๊ณ , ์ด๊ฒƒ์€ Developer Voices์ด๋ฉฐ, ์˜ค๋Š˜์˜ ๋ชฉ์†Œ๋ฆฌ๋Š” Antonio Monteiro์ž…๋‹ˆ๋‹ค!

Chris Jenkins: ์˜ค๋Š˜ ์ €์™€ ํ•จ๊ป˜ํ•ด ์ฃผ์‹  Antonio Monteiro์ž…๋‹ˆ๋‹ค. Antonio, ์•ˆ๋…•ํ•˜์„ธ์š”?

Antonio Monteiro: ์•ˆ๋…•ํ•˜์„ธ์š”. ์ž˜ ์ง€๋‚ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์ €๋Š” ์ž์ฃผ ๊ฐ€์ง€ ์•Š๋Š”, ์‚ฌ์‹ค ํ•œ ๋ฒˆ๋„ ๊ฐ€๋ณธ ์ ์ด ์—†๋Š” ์„ธ์ƒ์œผ๋กœ ์ €๋ฅผ ์•ˆ๋‚ดํ•ด ์ฃผ์‹œ๋ ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”๋กœ OCaml์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค. OCaml ํ”„๋กœ์ ํŠธ ๋ชฉ๋ก์„ ์ญ‰ ์‚ดํŽด๋ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์ง€๋งŒ, OCaml์— ํ‘น ๋น ์ ธ ์žˆ๋‹ค๊ณ  ํ•ด๋„ ๊ณผ์–ธ์ด ์•„๋‹ˆ์ฃ ?

Antonio Monteiro: ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ฒ˜์Œ์—๋Š” ์ฒœ์ฒœํžˆ ์‹œ์ž‘ํ–ˆ์ง€๋งŒ, ๊ทธ ํ›„์—๋Š” ์ •๋ง ๋น ๋ฅด๊ฒŒ ๋”ฐ๋ผ์žก์•˜์ฃ .

Chris Jenkins: ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•˜๊ฒŒ ๋˜์—ˆ๋‚˜์š”? OCaml์— ๋Œ๋ฆฌ๊ฒŒ ๋œ ๊ณ„๊ธฐ๋Š” ๋ฌด์—‡์ด์—ˆ๋‚˜์š”?

Antonio Monteiro: ๋Œ€ํ•™์—์„œ OCaml์„ ์ฒ˜์Œ ์ ‘ํ–ˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ 13~15๋…„ ์ „์ฏค์ด์—ˆ์„ ๊ฒ๋‹ˆ๋‹ค. OCaml ์ˆ˜์—…์ด ์žˆ์—ˆ๋Š”๋ฐ, ๊ทธ๋•Œ๊นŒ์ง€ ๋ฐฐ์› ๋˜ ์–ธ์–ด์™€๋Š” ๋งค์šฐ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์› ์ง€๋งŒ, ๊ทธ ๋‹น์‹œ์—๋Š” ์ˆ˜์—… ํ”„๋กœ์ ํŠธ๋งŒ ํ•˜๊ณ  ์ œ์ณ๋‘์—ˆ์Šต๋‹ˆ๋‹ค. ์‹ค์ œ ์„ธ๊ณ„์—์„œ ๊ทธ ๊ฐ€์น˜๋ฅผ ์•Œ ์ˆ˜ ์—†์—ˆ๊ฑฐ๋“ ์š”. ๊ทธ๋Ÿฌ๋‹ค๊ฐ€ 2016๋…„์— Hacker News์—์„œ ReasonML์„ ๋ณด๊ณ  ๋‹ค์‹œ ์‚ดํŽด๋ณด๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. Jordan Walke๊ฐ€ Facebook์—์„œ ๋ฐœํ‘œํ•œ ReasonML ํ”„๋กœ์ ํŠธ๋ฅผ ๋ณด์•˜๋Š”๋ฐ, ๊ทธ ์ด๋ฆ„์ด ์ต์ˆ™ํ–ˆ์Šต๋‹ˆ๋‹ค. "OCaml์ด๋ผ๋Š” ๋ง์„ ๋“ค์–ด๋ณธ ์ ์ด ์žˆ๋Š”๋ฐ, ์™œ ์ƒˆ๋กœ์šด ๋ชจ์Šต์„ ํ•˜๊ณ  ์žˆ๋Š” ๊ฑฐ์ง€? ์™œ ํ•„์š”ํ• ๊นŒ? ์ด๊ฑธ๋กœ ๋ฌด์—‡์„ ํ•  ์ˆ˜ ์žˆ์„๊นŒ?"๋ผ๋Š” ์ƒ๊ฐ์ด ๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ํ•œ๋ฒˆ ์‹œํ—˜ํ•ด ๋ณด๊ธฐ๋กœ ํ–ˆ๊ณ , ์†”์งํžˆ ๋งํ•ด์„œ ์„ค์น˜๋ถ€ํ„ฐ ์—์ฝ”์‹œ์Šคํ…œ, ๋นŒ๋“œ ๋„๊ตฌ๊นŒ์ง€ ๋ชจ๋“  ๊ฒƒ์ด ์ •๋ง ํž˜๋“ค์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋‹น์‹œ์—๋Š” ์‹œ์ž‘ํ•˜๊ธฐ๊ฐ€ ์ •๋ง ์–ด๋ ค์› ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ ๊ทธ๋ž˜์„œ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜์ง€ ์•Š์•˜๋˜ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ณ„์† ์‚ฌ์šฉํ•ด ๋ณด๋ฉด์„œ ์–ธ์–ด ๊ฐœ๋…์„ ์ดํ•ดํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ๊ณ , Discord์™€ Slack ์ปค๋ฎค๋‹ˆํ‹ฐ์— ๊ฐ€์ž…ํ•ด์„œ ๋„์›€์„ ๋ฐ›์•˜์Šต๋‹ˆ๋‹ค. ์„ค์น˜ ๋ฐฉ๋ฒ•, ๋„๊ตฌ ๋“ฑ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์‹œ๋„ํ•ด ๋ณด์•˜๊ณ  ๊ฒฐ๊ตญ์—๋Š” ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ์ œ๊ฐ€ OCaml์„ ๊ณ„์† ์‚ฌ์šฉํ•˜๋Š” ์ด์œ ๋Š” ์ธ์ฒด ๊ณตํ•™์ ์ธ ํƒ€์ž… ์‹œ์Šคํ…œ, Hindley-Milner ๊ธฐ๋ฐ˜์˜ ํ›Œ๋ฅญํ•œ ํƒ€์ž… ์ถ”๋ก , ๊ด‘๋ฒ”์œ„ํ•œ ์ปค๋ฎค๋‹ˆํ‹ฐ, ํ›Œ๋ฅญํ•œ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. OCaml์—์„œ ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์— ๋งž๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์—†๋”๋ผ๋„, ํƒ€์ž…๊ณผ ๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž…์œผ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ •์˜ํ•˜๊ณ , ์ •์˜ํ•œ ํƒ€์ž…์—์„œ ํ”„๋กœ๊ทธ๋žจ์„ ํŒŒ์ƒ์‹œํ‚ฌ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ •๋ง ๋งค๋ ฅ์ ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์ด ์ปดํŒŒ์ผ๋˜๊ณ  ์ž‘๋™ํ•˜๋Š” ํ”„๋กœ๊ทธ๋žจ์„ ๊ฐ–๊ฒŒ ๋˜๋Š” ๊ฒƒ์€ ๋งˆ๋ฒ• ๊ฐ™์€ ๋А๋‚Œ, ์ข‹์€ ๋„ํŒŒ๋ฏผ ๋ถ„๋น„์™€ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ณ„์†ํ•ด์„œ ๋” ๋งŽ์€ ๊ฒƒ์„ ์“ฐ๊ณ  ์–ธ์–ด๋กœ ๋” ๋งŽ์€ ๊ฒƒ์„ ์‹œ๋„ํ•˜๊ฒŒ ๋งŒ๋“ญ๋‹ˆ๋‹ค. OCaml์€ C, C++, ์‹ฌ์ง€์–ด Rust์™€์˜ ํ›Œ๋ฅญํ•œ FFI(์™ธ๋ถ€ ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค)๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์–ด์„œ ํ”„๋กœ๊ทธ๋žจ์„ ๋งˆ์น˜ C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋งํฌ๋œ ๊ฒƒ์ฒ˜๋Ÿผ ๋ชจ๋ธ๋งํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์„œ๋กœ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: Haskell๊ณผ ๋งŽ์€ ๋ถ€๋ถ„์ด ๊ฒน์น˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์–ด๋А ๋Œ€ํ•™์—์„œ ์–ด๋–ค ์ด์ƒํ•œ ํ•จ์ˆ˜ํ˜• ์–ธ์–ด๋ฅผ ๊ฐ€๋ฅด์น˜๋А๋ƒ์— ๋‹ฌ๋ ค ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: OCaml์„ ์ดํ•ดํ•˜๊ฒŒ ๋œ ํŠน๋ณ„ํ•œ ์ˆœ๊ฐ„์ด ์žˆ์—ˆ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์ ์ฐจ ์ดํ•ดํ•˜๊ฒŒ ๋˜์—ˆ๋‚˜์š”?

Antonio Monteiro: Bloomberg์—์„œ ์‹œ์ž‘๋œ BuckleScript ํ”„๋กœ์ ํŠธ๊ฐ€ ์ƒ๊ฐ๋‚ฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ชฉํ‘œ๋Š” OCaml๊ณผ ReasonML์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ OCaml์„ ์‹œ์ž‘ํ–ˆ์„ ๋•Œ๋Š” ์•„๋งˆ๋„ OCaml์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ๊ฐ€์žฅ ์ž˜ ๋‹ค๋“ฌ์–ด์ง„ ์›Œํฌํ”Œ๋กœ์šฐ์˜€์„ ๊ฒ๋‹ˆ๋‹ค. ์ฐธ๊ณ ๋กœ ์ €๋Š” JavaScript์™€ JVM ํ”„๋กœ๊ทธ๋ž˜๋จธ์˜€์Šต๋‹ˆ๋‹ค. Closure๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ–ˆ๊ณ , ์ธํ„ฐํ”„๋ฆฌํ„ฐ ์–ธ์–ด์— ๋Œ€ํ•œ ๊ฒฝํ—˜๋งŒ ์žˆ์—ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋Œ€ํ•™์—์„œ C++๋ฅผ ์กฐ๊ธˆ ํ•ด๋ณด์•˜์ง€๋งŒ, makefile์„ ์‚ฌ์šฉํ–ˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ปดํŒŒ์ผ ์–ธ์–ด์™€ ์›Œํฌํ”Œ๋กœ์šฐ๋Š” ์กฐ๊ธˆ ๋‹ฌ๋ž์Šต๋‹ˆ๋‹ค. ์ด์ „์— Go๋ฅผ ์‚ฌ์šฉํ•ด ๋ณด์•˜์ง€๋งŒ, Go๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํ•˜๋‚˜์˜ ๋ช…๋ น์–ด๋กœ ์ž˜ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด OCaml์€ ๋ชจ๋“  ๊ฒƒ์ด ์กฐ๊ธˆ ๋ถ„์‚ฐ๋˜์–ด ์žˆ๊ณ , ์–ด๋–ค ๋ฉด์—์„œ๋Š” ์กฐ๊ฐ๋‚œ ๋А๋‚Œ์ด์—ˆ์Šต๋‹ˆ๋‹ค. BuckleScript๋Š” ์ด๋Ÿฌํ•œ ๊ฒฝํ—˜์„ ํ†ตํ•ฉํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ–ˆ์Šต๋‹ˆ๋‹ค. Facebook ๋‚ด๋ถ€์—์„œ๋„ ์—ด์‹ฌํžˆ ์ž‘์—…ํ–ˆ๋˜ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ๋•Œ messenger.com์˜ 50%๊ฐ€ ReasonML๋กœ ์ž‘์„ฑ๋˜๊ณ  BuckleScript๋กœ ์ปดํŒŒ์ผ๋˜์—ˆ๋‹ค๊ณ  ํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ €์—๊ฒŒ๋Š” BuckleScript๊ฐ€ ๋”ฑ ๋งž์•˜์Šต๋‹ˆ๋‹ค. npm ์„ค์น˜๋กœ OCaml ๋ชจ๋“ˆ์„ ๋ณผ ์ˆ˜ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚  ์šฐ๋ฆฌ๊ฐ€ ์‚ฌ์šฉํ•˜๋Š” ๋„๊ตฌ๋กœ๋Š” ์ •๋ง ์‚ฌ์†Œํ•œ ์ผ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ์ง€๋งŒ, ๋‹น์‹œ์—๋Š” ๊ผญ ๊ทธ๋ ‡์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ์ €์—๊ฒŒ๋Š” ๊ทธ๋žฌ์ฃ . ํ•˜์ง€๋งŒ ๋ช‡ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์™€ ๋ชจ๋“ˆ์„ ์กฐํ•ฉํ•ด์„œ ์ž‘๋™ํ•˜๋Š” JavaScript ํ”„๋กœ๊ทธ๋žจ์„ ์–ป์„ ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์ด ์ •๋ง ๋งค๋ ฅ์ ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ดํ›„๋กœ ์ €์˜ ๋ชฉํ‘œ๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋žจ์—์„œ๋„ ๋™์ผํ•œ ๊ฒฝํ—˜์„ ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์–ธ์–ด์— ๋Œ€ํ•ด ๋งํ•˜์ž๋ฉด, ์ปดํŒŒ์ผํ•  ์ˆ˜๋งŒ ์žˆ๋‹ค๋ฉด ํˆด์ฒด์ธ๋งŒ ์ œ๋Œ€๋กœ ๊ฐ–์ถ”๋ฉด ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ๋˜‘๊ฐ™์€ ๊ฒฝํ—˜์ด์ฃ . BuckleScript๋ฅผ ์–ธ๊ธ‰ํ•˜์…จ๋Š”๋ฐ, ์ €๋Š” OCaml ์—์ฝ”์‹œ์Šคํ…œ์„ ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ํ”„๋ŸฐํŠธ์—”๋“œ์ธ ReasonML๊ณผ ์ปดํŒŒ์ผ ๋ฐฑ์—”๋“œ์ธ BuckleScript๊ฐ€ ์žˆ๋Š”๋ฐ, BuckleScript๋Š” ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๊ฑฐ๋‚˜ ์ด๋ฆ„์ด ๋ฐ”๋€ ํ”„๋กœ์ ํŠธ์ธ๊ฐ€์š”?

Antonio Monteiro: ์ž์„ธํžˆ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ฒ˜์Œ ์‹œ์ž‘ํ•œ ๊ฒƒ์€ Hacker News์—์„œ ReasonML์„ ๋ณด๊ณ  ์–ธ์–ด๋ฅผ ์‹œํ—˜ํ•ด ๋ณด๊ธฐ๋กœ ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋จผ์ € OCaml์€ ์—ฌ๋Ÿฌ ๊ฐ€์ง€๋ฅผ ์˜๋ฏธํ•˜๋Š” ํฌ๊ด„์ ์ธ ๋‹จ์–ด์ž…๋‹ˆ๋‹ค. OCaml ์ปดํŒŒ์ผ๋Ÿฌ๋Š” OCaml ๊ตฌ๋ฌธ์„ ๊ฐ€์ ธ์™€์„œ ๋„ค์ดํ‹ฐ๋ธŒ ํ”„๋กœ๊ทธ๋žจ์ด๋‚˜ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ”„๋กœ๊ทธ๋žจ์œผ๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” ํˆด์ฒด์ธ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๋Š” ์‹ค์ œ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๋Š” ๋‘ ๊ฐ€์ง€ ๋ฐฑ์—”๋“œ๋ฅผ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. OCaml์˜ ํŠน์ง•์€ ํŠนํžˆ ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ๋งค์šฐ ํ”Œ๋Ÿฌ๊ทธํ˜•์ด๋ผ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” ๊ตฌ๋ฌธ, ์ „์ฒ˜๋ฆฌ๊ธฐ ํ™•์žฅ์„ ์˜๋ฏธํ•ฉ๋‹ˆ๋‹ค. ReasonML์€ ์ง€๊ธˆ๋„ ๊ทธ๋ ‡์ง€๋งŒ ๊ธฐ๋ณธ์ ์œผ๋กœ ํ‘œ๋ฉด ๊ตฌ๋ฌธ์„ ๋‹ค๋ฅธ ๊ฒƒ์œผ๋กœ ๋Œ€์ฒดํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OCaml ์–ธ์–ด๋ฅผ ์“ฐ๋Š” ๋Œ€์‹  Alol ๊ตฌ๋ฌธ์„ ์‚ฌ์šฉํ•ด ๋ณธ ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ต์ˆ™ํ•œ ReasonML์„ ์“ฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. JavaScript, C, OCaml, Rust, Go์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ์ต์ˆ™ํ•œ ๊ธฐ๋ณธ ๊ตฌ๋ฌธ, ์š”์ฆ˜ ๋ชจ๋‘๊ฐ€ ๋ฐฐ์šฐ๊ฑฐ๋‚˜ ์ ์–ด๋„ ์–ด๋А ์‹œ์ ์—๋Š” ์ต์ˆ™ํ•ด์ง€๋Š” ๊ตฌ๋ฌธ์ด์ฃ . ์ด๊ฒƒ์ด ๋ฐ”๋กœ ReasonML์ž…๋‹ˆ๋‹ค. OCaml์˜ ๋‹ค๋ฅธ ๊ตฌ๋ฌธ์ผ ๋ฟ์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: BuckleScript ๋˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ์— ๋Œ€ํ•ด ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. OCaml ์ปดํŒŒ์ผ๋Ÿฌ์—๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ฐ€์ƒ ๋จธ์‹ ๊ณผ ๋„ค์ดํ‹ฐ๋ธŒ ์–ด์…ˆ๋ธ”๋ฆฌ๋กœ ํ”„๋กœ๊ทธ๋žจ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๊ธฐ๋Šฅ์ด ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์ƒ์„ฑํ•˜๋Š” ์ผ์ข…์˜ ์ค‘๊ฐ„ ํ‘œํ˜„์„ ๊ฐ€์ ธ์™€์„œ JavaScript๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋„๊ตฌ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์•„๋Š” ํ•œ ๊ฐ€์žฅ ๋จผ์ € ์กด์žฌํ–ˆ๋˜ ๋„๊ตฌ๋Š” js_of_ocaml์ž…๋‹ˆ๋‹ค. js_of_ocaml์€ ๋ฐ”์ดํŠธ์ฝ”๋“œ ๊ฐ€์ƒ ๋จธ์‹ ์ด ํ•ด์„ํ•˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ๋ฐ”์ดํŠธ์ฝ”๋“œ, ์ฆ‰ OCaml ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ•ด์„ํ•˜์—ฌ ์›น์ด๋‚˜ JavaScript๊ฐ€ ์‹คํ–‰๋˜๋Š” ๋ชจ๋“  ๊ณณ์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋Š” JavaScript๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ ๋ถ€๋ถ„์€ ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ๋‚˜์ค‘์— ์žฅ๋‹จ์ ์— ๋Œ€ํ•ด ์ž์„ธํžˆ ์•Œ์•„๋ณด๊ฒ ์ง€๋งŒ, BuckleScript๊ฐ€ ํ•œ ์ผ์€ ๋žŒ๋‹ค ๋ฏธ์ ๋ถ„ํ•™๊ณผ ํ›จ์”ฌ ๋” ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ด๋Š” ์ดˆ๊ธฐ ์ปดํŒŒ์ผ๋Ÿฌ ์ค‘๊ฐ„ ํ‘œํ˜„์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๋ช‡ ๋‹จ๊ณ„ ์•„๋ž˜์— ์žˆ๊ฒ ์ฃ ?

Antonio Monteiro: ์ •ํ™•ํžˆ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ˆœ์„œ๋Š” ๊ตฌ๋ฌธ(OCaml ๋˜๋Š” Reason), ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ, ํƒ€์ž… ์ถ”๋ก , ํƒ€์ž… ๊ฒ€์‚ฌ ์•Œ๊ณ ๋ฆฌ์ฆ˜ ์‹คํ–‰, ํƒ€์ž… ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋กœ ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ๋ณด๊ฐ•ํ•˜๋Š” ์ˆœ์„œ์ž…๋‹ˆ๋‹ค. ์ด ์‹œ์ ์—์„œ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ๋ชจ๋“  ์ •์  ์ •๋ณด๋ฅผ ์–ป๊ฒŒ ๋˜๋ฏ€๋กœ ๋žŒ๋‹ค ์ค‘๊ฐ„ ํ‘œํ˜„์„ ์ƒ์„ฑํ•  ๋•Œ ๋ชจ๋“  ํƒ€์ž…์„ ๋ฒ„๋ฆฝ๋‹ˆ๋‹ค.

Chris Jenkins: OCaml์˜ ๋žŒ๋‹ค ๋ถ€๋ถ„์—๋Š” ํƒ€์ž…์ด ์—†์Šต๋‹ˆ๋‹ค. ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ๋žŒ๋‹ค ์ƒ์„ฑ ์‚ฌ์ด์— ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ฐ”์ดํŠธ์ฝ”๋“œ ์ค‘๊ฐ„ ํ‘œํ˜„๋ณด๋‹ค ํ›จ์”ฌ ๋” ๋งŽ์€ ์ •๋ณด๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๊ธฐ ๋•Œ๋ฌธ์— BuckleScript๋Š” ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ณด๋‹ค ๋žŒ๋‹ค๋ผ๋Š” ์ดˆ๊ธฐ ์ค‘๊ฐ„ ํ‘œํ˜„์— ์—ฐ๊ฒฐํ•˜๋Š” ๊ฒƒ์„ ์„ ํƒํ–ˆ์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: BuckleScript๊ฐ€ ๋” ์ด์ƒ ์‚ฌ์šฉ๋˜์ง€ ์•Š๋Š” ํ”„๋กœ์ ํŠธ์ธ ์ด์œ ์— ๋Œ€ํ•œ ๋‹ค๋ฅธ ์งˆ๋ฌธ์— ๋‹ตํ•˜์ž๋ฉด, 2020๋…„๊ฒฝ์— ๋งˆ์ผ€ํŒ…์„ ์œ„ํ•ด ์ฃผ๋กœ ์ด๋ฆ„์„ ๋ฐ”๊พธ์—ˆ์Šต๋‹ˆ๋‹ค. BuckleScript ๊ฐœ๋ฐœ์ž๋“ค์€ ํ”„๋กœ์ ํŠธ๋ฅผ OCaml์—์„œ ๋ฒ—์–ด๋‚˜ ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ณ  ์‹ถ์–ดํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ BuckleScript๋Š” ๋“ค์–ด๋ณด์…จ์„์ง€๋„ ๋ชจ๋ฅด๋Š” ReScript๋ผ๋Š” ์–ธ์–ด๋กœ ์ด๋ฆ„์ด ๋ฐ”๋€Œ์—ˆ์Šต๋‹ˆ๋‹ค. rescript-lang.org์—์„œ ํ™•์ธํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ์–ธ์–ด์ด๊ณ  ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” BuckleScript์˜ ์ž์—ฐ์Šค๋Ÿฌ์šด ํ›„์†์ž‘์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ OCaml๋กœ ๊ตฌ์ถ•๋˜์—ˆ์Œ์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ  OCaml์ด ์ „ํ˜€ ์•„๋‹™๋‹ˆ๋‹ค. ์—ญ์‚ฌ์ ์ธ ์„ ๋ก€๊ฐ€ ์žˆ์ง€๋งŒ JavaScript๋กœ ์ปดํŒŒ์ผ๋˜๋Š” ๋‹ค๋ฅธ ์–ธ์–ด์ด๋ฉฐ ๋งŽ์€ ์‚ฌ๋žŒ๋“ค์ด ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋ž˜์„œ ๋‹จ์ˆœํžˆ ์ตœ์ข… ์ปดํŒŒ์ผ ๋‹จ๊ณ„๊ฐ€ ์•„๋‹ˆ๋ผ ์™„์ „ํžˆ ๋ณ„๊ฐœ์˜ ๊ฒƒ์ด ๋˜์—ˆ๊ตฐ์š”.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ReScript์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ, ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ์—ฌ์ „ํžˆ ๋™์ผํ•œ ์ค‘๊ฐ„ ํ‘œํ˜„์— ์—ฐ๊ฒฐ๋˜์–ด ์žˆ๊ณ  ์—ฌ์ „ํžˆ OCaml ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํ•ฉ๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ OCaml ์ปดํŒŒ์ผ๋Ÿฌ์˜ ํฌํฌ์ด์ง€๋งŒ, JavaScript๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์™„์ „ํžˆ ๋‹ค๋ฅธ ์„ ํƒ์„ ํ–ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ฐฉํ–ฅ์œผ๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๊ฐ€์ ธ๊ฐ”์Šต๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ReScript์—์„œ ์ œ๊ณตํ•œ ์ฃผ์š” ๊ธฐ๋Šฅ์€ ์ปค๋ง ๋˜๋Š” ๋ถ€๋ถ„ ์ ์šฉ์„ ํšจ๊ณผ์ ์œผ๋กœ ์ œ๊ฑฐํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. OCaml์€ Haskell๊ณผ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  OCaml ํ•จ์ˆ˜๊ฐ€ ๋ชจ๋“  Haskell ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ์ž๋™์œผ๋กœ ์ปค๋ง๋ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์„ธ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›์•„ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•œ ๊ฐœ์˜ ์ธ์ˆ˜๋งŒ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ๊ทธ๋Ÿฌ๋ฉด ๊ฒฐ๊ณผ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ OCaml์ด๋‚˜ Haskell๊ณผ ๊ฐ™์€ ์–ธ์–ด์—์„œ๋Š” ์ž˜ ์ž‘๋™ํ•˜์ง€๋งŒ, ReScript ๊ฐœ๋ฐœ์ž๋“ค์€ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ํ•ด๋‹น ํ™˜๊ฒฝ์— ์žˆ๋Š” ํ•จ์ˆ˜์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ด ๋” ์ต์ˆ™ํ•˜๋‹ค๊ณ  ํŒ๋‹จํ•œ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ด์ œ ReScript์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปค๋ง๋˜์ง€ ์•Š์œผ๋ฉฐ, ์ด๊ฒƒ์€ OCaml ํ”„๋กœ๊ทธ๋žจ์— ํฐ ๋ณ€ํ™”์ž…๋‹ˆ๋‹ค.

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

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์ž˜ ์„ค๊ณ„๋˜์–ด ์žˆ์–ด์„œ ์กฐ๊ฐ์กฐ๊ฐ ๋ถ„๋ฆฌํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Antonio Monteiro: ๊ทธ ๋ถ€๋ถ„์€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๊ทธ๋Ÿฐ ํŒ๋‹จ์„ ๋‚ด๋ฆด ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ธ์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ตฌ๋ฌธ ์ธก๋ฉด์—์„œ๋Š” ์„ค๋ช…๋“œ๋ฆฐ ๋Œ€๋กœ ๊ตฌ๋ฌธ์„ ์ „ํ™˜ํ•  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ๋งค์šฐ ํ”Œ๋Ÿฌ๊ทธํ˜•์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‚ฌ๋žŒ๋“ค์—๊ฒŒ ์ต์ˆ™ํ•œ ๋˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์€ ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. OCaml์—์„œ๋Š” PPX ๋˜๋Š” ์ „์ฒ˜๋ฆฌ๊ธฐ ํ™•์žฅ์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์–ด๋–ค ์ข…๋ฅ˜์˜ ๋งคํฌ๋กœ์ธ๊ฐ€์š”?

Antonio Monteiro: AST ์ˆ˜์ค€์˜ ๋งคํฌ๋กœ์ž…๋‹ˆ๋‹ค. ์ข‹์€ ์ข…๋ฅ˜์ฃ . C ์ „์ฒ˜๋ฆฌ๊ธฐ ๋งคํฌ๋กœ์™€ ๊ฐ™์€ ์ข…๋ฅ˜๋Š” ์•„๋‹™๋‹ˆ๋‹ค. Rust ์ˆ˜์ค€์˜ ๋งคํฌ๋กœ์™€๋„ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. Rust ๋งคํฌ๋กœ๋Š” AST๋ฅผ ๊ฐ€์ ธ์™€์„œ ์–ด๋–ค ๋ฐฉ์‹์œผ๋กœ๋“  ๋ณ€ํ™˜ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ๋ฐฉ์‹์œผ๋กœ ์ •์˜๋˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. Rust ๋งคํฌ๋กœ์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค.

Chris Jenkins: Lisp ์Šคํƒ€์ผ์˜ ๋งคํฌ๋กœ์ฒ˜๋Ÿผ ๋“ค๋ฆฌ๋Š”๊ตฐ์š”.

Antonio Monteiro: Lisp ์Šคํƒ€์ผ์˜ ๋งคํฌ๋กœ์™€ ๋น„๊ตํ•˜๋Š” ๊ฒƒ์ด ํƒ€๋‹นํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. Lisp๋Š” ๋™ํ˜•์ด๊ณ  ํƒ€์ž…์ด ์—†์œผ๋ฉฐ AST๋ฅผ ์กฐ์ž‘ํ•˜๊ธฐ๊ฐ€ OCaml๋ณด๋‹ค ํ›จ์”ฌ ์‰ฝ์ง€๋งŒ, OCaml์˜ AST๋Š” ๋Œ€์ˆ˜์  ๋ฐ์ดํ„ฐ ํƒ€์ž…๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๋งŽ์€ ๋ณ€ํ˜•, ์—ด๊ฑฐํ˜• ๋˜๋Š” ์ผ€์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ‘œ๋ฉด์ ์ด ๊ฝค ๋„“๊ธฐ ๋•Œ๋ฌธ์— OCaml์—์„œ ๋งคํฌ๋กœ ๋˜๋Š” PPX๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ด ํ•ญ์ƒ ๊ฐ„๋‹จํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์–ด๋–ค ์–ธ์–ด ๊ตฌ๋ฌธ, ์–ด๋–ค ๊ตฌ๋ฌธ ๊ตฌ์กฐ์— ์—ฐ๊ฒฐํ• ์ง€ ๊ฒฐ์ •ํ•ด์•ผ ํ•˜๊ณ , ๋ชจ๋ธ๋งํ•˜๊ณ  ์ˆ˜์ •ํ•˜์—ฌ ํ•ด๋‹น ๊ตฌ๋ฌธ ๋…ธ๋“œ์˜ ์ƒˆ๋กœ์šด ๋ฒ„์ „์„ ์ƒ์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋˜ํ•œ ๊ธฐ๋ณธ์ ์œผ๋กœ ๋งคํฌ๋กœ์˜ ๊ฒฝ์šฐ ํ”„๋กœ๊ทธ๋žจ์— ๋Œ€ํ•œ ํƒ€์ž… ์ •๋ณด์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์—†์œผ๋ฉฐ ํ”„๋กœ๊ทธ๋žจ์˜ ๋‹ค๋ฅธ ๋ถ€๋ถ„์„ ์ฟผ๋ฆฌํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ๊ตฌ๋ฌธ ์ˆ˜์ค€์—์„œ๋งŒ ์ž‘๋™ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

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

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋Ÿฌ๋ฉด Antonio๋‹˜์˜ ํฐ ํ”„๋กœ์ ํŠธ ์ค‘ ํ•˜๋‚˜์ธ Melange์— ๋Œ€ํ•œ ์ด์•ผ๊ธฐ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. Melange๋Š” ๋‹ค๋ฅธ ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์—ฐ๊ฒฐํ•œ ๊ฒƒ์ด์ฃ ?

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์•ž์„œ BuckleScript๊ฐ€ ReScript๋ฅผ ๋งŒ๋“ค๊ธฐ ์œ„ํ•ด ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” OCaml์—์„œ ๋ฒ—์–ด๋‚ฌ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ฐœ์ธ์ ์œผ๋กœ OCaml ์—์ฝ”์‹œ์Šคํ…œ์— ํ‘น ๋น ์ ธ ์žˆ์—ˆ๊ณ , ์‰ฝ๊ฒŒ ๋†“์•„์ค„ ์ˆ˜ ์—†์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ๊ฑฐ์˜ 4๋…„ ์ „ ์˜ค๋Š˜, ReScript๊ฐ€ ๋˜๊ธฐ ์ „์— BuckleScript๋ฅผ ํฌํฌํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜ผ๋ž€์Šค๋Ÿฌ์šธ ์ˆ˜ ์žˆ์œผ๋‹ˆ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. OCaml๊ณผ ReasonML์„ JavaScript๋กœ ์ปดํŒŒ์ผํ•˜๋Š” BuckleScript๊ฐ€ ๊ตฌ๋ฌธ๊ณผ ์ปดํŒŒ์ผ์„ ์ƒˆ๋กœ์šด ๋ฐฉํ–ฅ์œผ๋กœ ๊ฐ€์ ธ๊ฐ€๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ƒˆ๋กœ์šด ์–ธ์–ด์ธ ReScript Lang์ด ๋˜๋ฉด์„œ, ์ €๋Š” BuckleScript์˜ ์ด๋…์„ ๊ณ ์ˆ˜ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์ œ ์ƒ๊ฐ์—๋Š” ReScript๋ณด๋‹ค OCaml์— ๋” ๊ฐ€๊น์ฃ .

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ BuckleScript๋ฅผ ํฌํฌํ•˜๊ณ  ๊ณ„์† ์ž‘์—…ํ•˜๋ฉด์„œ OCaml ์ปค๋ฎค๋‹ˆํ‹ฐ๋ฅผ ์œ„ํ•ด ๋” ๋‚˜์€ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๋งŒ๋“ค๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ด€์ ์—์„œ ๋ณด๋ฉด, ์˜ˆ๋ฅผ ๋“ค์–ด JavaScript ๊ฐœ๋ฐœ์ž์ธ ๊ฒฝ์šฐ ์ „์ฒด ์—์ฝ”์‹œ์Šคํ…œ์— ์ต์ˆ™ํ•˜๊ณ  npm์—์„œ ์„ค์น˜ํ•˜๋Š” ๊ฒƒ์„ ์ข‹์•„ํ•˜๊ธฐ ๋•Œ๋ฌธ์— ReScript๋ฅผ ์„ ํƒํ•  ๊ฐ€๋Šฅ์„ฑ์ด ๋†’์Šต๋‹ˆ๋‹ค. ReScript๋Š” npm ์„ค์น˜๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ-ํˆฌ-JS ์–ธ์–ด๋ฅผ ์ž์‹ ์˜ ํ”„๋กœ๊ทธ๋žจ์—์„œ ์‹œํ—˜ํ•ด ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ OCaml ํ”„๋กœ๊ทธ๋ž˜๋จธ์ด๊ณ  OCaml๊ณผ ์—์ฝ”์‹œ์Šคํ…œ์— ๋งค์šฐ ์ต์ˆ™ํ•˜๋ฉฐ npm ์„ธ๊ณ„์˜ ๋ชจ๋“  ์ตœ์‹  ๋„๊ตฌ๋กœ ํŒŒ์‹ฑํ•˜๊ณ  ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๋Š” ์ตœ์‹  JavaScript๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด, ์ œ๊ฐ€ ์‹œ์ž‘ํ•œ ํ”„๋กœ์ ํŠธ์ธ Melange๋ฅผ ์‚ฌ์šฉํ•  ๊ฒ๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋ž˜์„œ ํฐ ์ฐจ์ด์ ์€ JavaScript ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ OCaml์— ๊ฐ€๊นŒ์›Œ์ง€๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€, ์•„๋‹ˆ๋ฉด OCaml ํ”„๋กœ๊ทธ๋ž˜๋จธ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ง„์ถœํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š”์ง€์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๋ธŒ๋ผ์šฐ์ €๋กœ ์ง„์ถœํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ OCaml ํ”„๋กœ๊ทธ๋ž˜๋จธ์—๊ฒŒ ํ•„์š”ํ•œ ํˆด์ฒด์ธ์€ ์–ด๋–ค ๋ชจ์Šต์ผ๊นŒ์š”?

Antonio Monteiro: Melange๋Š” BuckleScript๊ฐ€ ์ž‘๋™ํ–ˆ๋˜ ๋ฐฉ์‹๊ณผ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์šฐ๋ฆฌ๊ฐ€ ๋ฐ”๊พผ ํ•œ ๊ฐ€์ง€๋Š” OCaml ํ”Œ๋žซํผ์˜ ๋‚˜๋จธ์ง€ ๋ถ€๋ถ„๊ณผ ์ƒํ˜ธ ์ž‘์šฉํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์š”์ฆ˜ Melange์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์ž…๋‹ˆ๋‹ค. Melange๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ˆ˜์ค€์—์„œ ์ž‘๋™ํ•ฉ๋‹ˆ๋‹ค. OCaml ์ปดํŒŒ์ผ๋Ÿฌ์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ๊ตฌ๋ฌธ, ๋ชจ๋“  ์ถ”์ƒ ๊ตฌ๋ฌธ ํŠธ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ๋žŒ๋‹ค ์ค‘๊ฐ„ ํ‘œํ˜„์— ์—ฐ๊ฒฐํ•˜์—ฌ ๊ฑฐ๊ธฐ์—์„œ ์•„๋ฆ„๋‹ต๊ณ  ์ฝ๊ธฐ ์‰ฌ์šด JavaScript๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์—์ฝ”์‹œ์Šคํ…œ๊ณผ ํ”Œ๋žซํผ ์ˆ˜์ค€์—์„œ๋Š” BuckleScript๊ฐ€ ์˜ˆ์ „์— ์ž‘๋™ํ–ˆ๋˜ ๋ฐฉ์‹๊ณผ ํฐ ์ฐจ์ด๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. Melange๋Š” OCaml ํ”Œ๋žซํผ์ด๋ผ๊ณ  ํ•˜๋Š” ๊ฒƒ๊ณผ ํ†ตํ•ฉ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ OCaml ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์—์ฝ”์‹œ์Šคํ…œ์„ ์ค‘์‹ฌ์œผ๋กœ ์ž‘๋™ํ•˜๋„๋ก ์„ค๊ณ„๋œ ์ „์ฒด ๋„๊ตฌ ์„ธํŠธ๋ฅผ ๋‚˜ํƒ€๋‚ด๋Š” ๊ณต์‹ ์šฉ์–ด์ž…๋‹ˆ๋‹ค. OCaml ํ”Œ๋žซํผ์—๋Š” ์ฝ”๋“œ๋ฅผ ๋นŒ๋“œํ•˜๊ณ , ํŒจํ‚ค์ง€๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , ํŽธ์ง‘๊ธฐ์—์„œ ํŽธ์ง‘๊ธฐ ํ†ตํ•ฉ(์–ธ์–ด ์„œ๋ฒ„ ํ”„๋กœํ† ์ฝœ ๋“ฑ)์„ ์œ„ํ•œ ๋„๊ตฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž๋™ ๋ฌธ์„œ ์ƒ์„ฑ์„ ์œ„ํ•œ ๋„๊ตฌ๋„ ์žˆ๊ณ , ์ง€๊ธˆ ๋‹น์žฅ ์ƒ๊ฐ๋‚˜์ง€ ์•Š๋Š” ๋‹ค๋ฅธ ๋„๊ตฌ๋„ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ธ์–ด๋ฅผ ๋งŒ๋“œ๋Š” ๊ฒƒ์ด ์–ด๋ ค์šด ์ด์œ  ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฐ”๋กœ ์ด๋Ÿฐ ๊ฒƒ๋“ค์ž…๋‹ˆ๋‹ค. ์–ธ์–ด๋ฅผ ๋‹ค ๋งŒ๋“ค๊ณ  ์Šค์Šค๋กœ์—๊ฒŒ ์นญ์ฐฌ์„ ํ•˜์ง€๋งŒ, ์—ฌ์ „ํžˆ ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž, ๋นŒ๋“œ ๋„๊ตฌ ๋“ฑ์„ ๋งŒ๋“ค์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๋งž์Šต๋‹ˆ๋‹ค.

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

Chris Jenkins: ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด์ œ OCaml ์—์ฝ”์‹œ์Šคํ…œ์˜ ๊ทผ๋ณธ์œผ๋กœ ๋Œ์•„๊ฐ‘๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค. Melange๋Š” OCaml ๋นŒ๋“œ ๋„๊ตฌ์ธ Dune์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์ž ๊น๋งŒ์š”. Dune์€ OCaml ํ…Œ๋งˆ์ธ๊ฐ€์š”? ํ”„๋žญํฌ ํ—ˆ๋ฒ„ํŠธ์˜ ๋ง์žฅ๋‚œ์„ ํ•ด์•ผ ํ•˜๋Š” ๊ฑด๊ฐ€์š”?

Antonio Monteiro: ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์†”์งํžˆ ์ €๋Š” Dune ์ „์„ค์— ๋Œ€ํ•ด ์ž˜ ๋ชจ๋ฆ…๋‹ˆ๋‹ค. ์ปค๋ฎค๋‹ˆํ‹ฐ ๋ฉค๋ฒ„๊ฐ€ Melange๋ผ๋Š” ๋‹จ์–ด๋ฅผ ์ƒ๊ฐํ•ด ๋ƒˆ๋Š”๋ฐ, ์ €๋Š” ๋งค์šฐ ์ž˜ ์–ด์šธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค. Melange๋Š” ํ”„๋ž‘์Šค์–ด๋กœ ํ˜ผํ•ฉ๋ฌผ์„ ์˜๋ฏธํ•˜๋ฉฐ, Melange๋Š” OCaml์—์„œ JavaScript๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์—ฌ๋Ÿฌ ๊ฐ€์ง€ ๋„๊ตฌ๊ฐ€ ํ˜ผํ•ฉ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์™„๋ฒฝํ•˜๊ฒŒ ์–ด์šธ๋ฆฐ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ณ , ๊ทธ๋Œ€๋กœ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. Melange๋Š” OCaml ๋นŒ๋“œ ๋„๊ตฌ์ธ Dune์„ ์‚ฌ์šฉํ•˜์—ฌ ํ”„๋กœ์ ํŠธ๋ฅผ ๋นŒ๋“œํ•ฉ๋‹ˆ๋‹ค. OCaml ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ธ opam์—์„œ ํŒจํ‚ค์ง€์™€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ๊ฐ€์ ธ์˜ค๊ณ , OCaml LSP, OCaml ์–ธ์–ด ์„œ๋ฒ„ ํ”„๋กœํ† ์ฝœ, ํƒ€์ž… ์™„์„ฑ, ์ •๋ณด, ์ง„๋‹จ ๊ธฐ๋Šฅ์„ ์ œ๊ณตํ•˜๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์ธ Merlin์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. odoc์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฌธ์„œ๋ฅผ ์ƒ์„ฑํ•˜๊ณ , dune-release๋ผ๋Š” ๋„๊ตฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Melange ํ”„๋กœ์ ํŠธ๋ฅผ ํŒจํ‚ค์ง•ํ•˜๊ณ  OCaml ํŒจํ‚ค์ง€ ๊ด€๋ฆฌ์ž์ธ opam์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. 9์›”์— ๋ฒ ๋ฅผ๋ฆฐ์—์„œ ์—ด๋ฆฌ๋Š” Fun OCaml์ด๋ผ๋Š” ์ƒˆ๋กœ์šด ์ปจํผ๋Ÿฐ์Šค์—์„œ Melange ๋„๊ตฌ์— ๋Œ€ํ•ด ๋ฐœํ‘œํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ์ •๋ง ๊ธฐ๋Œ€๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์šฐ๋ฆฌ๊ฐ€ ์ด์•ผ๊ธฐํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๊ฐ•์กฐํ•˜๊ณ  Melange๋ฅผ ๋ชจ๋“  ๋„๊ตฌ๊ฐ€ ํ•˜๋‚˜๋กœ ๋ชจ์ด๋Š” ํ†ตํ•ฉ๋œ ๋ฐฉ์‹์œผ๋กœ ์†Œ๊ฐœํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์—์„œ ์ฝ”๋“œ๋ฅผ ๊ณต์œ ํ•˜๋Š” ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๋งŒ๋“ค ๋•Œ ์ •๋ง ์ข‹์€ ๊ฒฝํ—˜์„ ํ•  ์ˆ˜ ์žˆ๋Š” ์–ธ์–ด๊ฐ€ ๋‘ ๊ฐœ, ์•„๋‹ˆ ์ด์ œ ์„ธ ๊ฐœ๊ฐ€ ๋– ์˜ค๋ฆ…๋‹ˆ๋‹ค. ํ‹ˆ์ƒˆ์‹œ์žฅ์ด์ง€๋งŒ ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” PureScript, ์ƒˆ๋กญ์ง€๋งŒ ์ „์ฒด ์—์ฝ”์‹œ์Šคํ…œ์ด ๋งค์šฐ ํ›Œ๋ฅญํ•œ Gleam์ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด์ œ OCaml๋„ ์ด ๋ชฉ๋ก์— ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ๋‚˜์š”? ์ง„์ •ํ•œ ๋ธŒ๋ผ์šฐ์ €-์„œ๋ฒ„ ์–ธ์–ด์ธ๊ฐ€์š”?

Antonio Monteiro: ๋„ค, ๊ทธ๊ฒŒ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ํ™•์‹คํžˆ ๋ชฉํ‘œ์ž…๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ๋ชฉ๋ก์— Closure์™€ ClosureScript๋„ ์ถ”๊ฐ€ํ•  ๊ฒ๋‹ˆ๋‹ค. Closure์™€ ClosureScript๋„ ๊ทธ๋Ÿฐ ๋ชฉํ‘œ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉฐ, ์ €๋Š” Closure์™€ ClosureScript๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด ๋ณด์•˜์Šต๋‹ˆ๋‹ค. ์ด์ „ ์ง์žฅ์—์„œ ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ์ •๋ง ์ž˜ ์ž‘๋™ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ฃผ์ œ๋กœ ๋Œ์•„๊ฐ€์„œ PureScript๋Š” Haskell๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜์‹œ๋‚˜์š”?

Chris Jenkins: ์•„๋‹ˆ์š”. PureScript๋Š” ๋ชจ๋‘ Node๋กœ ์ปดํŒŒ์ผ๋˜๋ฏ€๋กœ ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ๋Š” JavaScript, ๋ฐฑ์—”๋“œ์—์„œ๋Š” Node๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ํ‘œ๋ฉด ๊ตฌ๋ฌธ์€ ๋ชจ๋‘ Haskell์ด์ง€๋งŒ AST ๊ตฌํ˜„์€ ๊ธฐ๋ณธ์ ์œผ๋กœ JavaScript ์—”์ง„์ž…๋‹ˆ๋‹ค. Gleam๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ธ๊ฐ€์š”?

Antonio Monteiro: Gleam์—๋Š” ๋‹ค๋ฅธ ๋ฐฑ์—”๋“œ๋„ ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. JavaScript๋กœ ์ปดํŒŒ์ผํ•˜๊ฑฐ๋‚˜ Erlang ๊ฐ€์ƒ ๋จธ์‹ ์ธ BEAM์œผ๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: JavaScript-ํˆฌ-JavaScript๋Š” ์‰ฌ์šด ๋ชจ๋“œ์ด๊ธฐ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿฐ ์งˆ๋ฌธ์„ ๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ JavaScript๋‚˜ TypeScript๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ๋ฅผ ๋ชจ๋‘ TypeScript๋‚˜ JavaScript๋กœ ๋งŒ๋“ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. PureScript๋ฅผ Node์™€ ํ”„๋ŸฐํŠธ์—”๋“œ์˜ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ๋ง์”€ํ•˜์‹  ๊ฒƒ์ฒ˜๋Ÿผ์š”. ์ œ๊ฐ€ ์ƒ์ƒํ–ˆ๋˜ ๊ฒƒ์€ ์™„์ „ํžˆ ๋‹ค๋ฅธ ๋Ÿฐํƒ€์ž„์—์„œ ๋™์ผํ•œ ์–ธ์–ด๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์„œ๋กœ ํ†ต์‹ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ClosureScript๋Š” JavaScript๋กœ ์ปดํŒŒ์ผ๋˜๊ณ  Closure๋Š” JVM์—์„œ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: OCaml๋„ ๋งˆ์ฐฌ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ๋ชฉํ‘œ๋ผ๊ณ  ๋งํ•œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. OCaml์„ Melange๋ฅผ ํ†ตํ•ด JavaScript๋กœ ์ปดํŒŒ์ผํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ, ์‰ฌ์šด ๋ชจ๋“œ๋Š” ์„œ๋ฒ„์—์„œ Node.js๋กœ Melange๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ๋„ ์ž‘๋™ํ•˜์ง€๋งŒ, ์šฐ๋ฆฌ๊ฐ€ ์ •๋ง๋กœ ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ๊ณ  ๊ธฐ๋Œ€ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ ๊ณต์œ ๋˜๋Š” ๋ถ€๋ถ„์€์š”. ํƒ€์ž…์€ ๋ฐฑ์—”๋“œ์™€ ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ๋Œ€๋ถ€๋ถ„ ๊ณต์œ ๋˜์–ด์•ผ ์ง๋ ฌํ™”์™€ ์—ญ์ง๋ ฌํ™”๋ฅผ ์‰ฝ๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ถ€๋Š” Melange๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ JavaScript๋กœ ์ปดํŒŒ์ผ๋˜๊ณ , ๋ฐฑ์—”๋“œ๋Š” OCaml์„ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผ๋˜๋ฉฐ, ๋™์ผํ•œ ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์‹คํ–‰ํ•˜๊ณ  ์„œ๋กœ ํ†ต์‹ ํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”? ์ฝ”๋“œ์˜ ์ผ๋ถ€๋ฅผ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ๊ฒฝ์šฐ ์ด๋ ‡๊ฒŒ ํ•˜๋ผ๊ณ  ํ‘œ์‹œํ•˜๋‚˜์š”?

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์–ธ์–ด ์ง€์‹œ๋ฌธ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค. ์•„์ง ๊ทธ๋Ÿฐ ์ง€์‹œ๋ฌธ์€ ์—†๊ณ , ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ์ „์ฒ˜๋ฆฌ๊ธฐ ํ™•์žฅ(PPX)์„ ์‚ฌ์šฉํ•˜๋ฉด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์–ธ์–ด์— ๋Œ€ํ•œ ํ™•์žฅ์ด๋ฏ€๋กœ ์ง€์‹œ๋ฌธ์„ ์ถ”๊ฐ€ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ ์‹œ์Šคํ…œ์˜ ์ง€์›๋„ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์•„์ง ์ง„ํ–‰ ์ค‘์ธ ์ž‘์—…์ด์ง€๋งŒ, ahrefs์—์„œ ํ•˜๊ณ  ์žˆ๋Š” ํฅ๋ฏธ๋กœ์šด ์ž‘์—… ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ahrefs๋Š” ์ฒ˜์Œ๋ถ€ํ„ฐ Melange์˜ ์ฃผ์š” ํ›„์›์‚ฌ์˜€์œผ๋ฉฐ ์ง€๊ธˆ๋„ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์˜ค๋Š˜ ํ•จ๊ป˜ ์–ธ๊ธ‰ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค. ahrefs๋Š” ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” ๋ถ„์•ผ์˜ ๋Œ€๊ธฐ์—…์ด๋ฉฐ, ๋ชจ๋“  ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ OCaml๋กœ ๊ฐœ๋ฐœํ•ฉ๋‹ˆ๋‹ค. ํ”„๋ŸฐํŠธ์—”๋“œ๋Š” Melange๋กœ ์ปดํŒŒ์ผ๋ฉ๋‹ˆ๋‹ค. ์ตœ๊ทผ์— ahrefs์—์„œ ํ•˜๊ณ  ์žˆ๋Š” ์ผ์€ ๊ธฐ๋ณธ์ ์œผ๋กœ reactjs ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง์„ OCaml๋กœ ๋‹ค์‹œ ๊ตฌํ˜„ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ƒˆ๋กœ์šด React ์„œ๋ฒ„ ๊ตฌ์„ฑ ์š”์†Œ๋ฅผ ๊ตฌํ˜„ํ•˜๊ณ  ์žˆ๋Š”๋ฐ, ํšจ๊ณผ์ ์œผ๋กœ OCaml์˜ RPC ํ”„๋กœํ† ์ฝœ์ž…๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋ชฉํ‘œ์ผ ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ์ด๋ฏธ ํ˜„์‹ค์ด ๋œ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ahrefs ์›น ํŽ˜์ด์ง€์™€ ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ค‘ ์ผ๋ถ€๋Š” Melange๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผ๋œ reactjs๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์ž‘๋™ํ•˜๊ธฐ ์ „์— ์„œ๋ฒ„ ์ธก ๋ Œ๋”๋ง ํ”„๋กœ์„ธ์Šค๋ฅผ ๊ฑฐ์นฉ๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์„ธ์Šค๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ ๋ Œ๋”๋ง๋˜๋Š” ๊ฒƒ๊ณผ ๋™์ผํ•œ ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ๋˜ ๋‹ค๋ฅธ ์ธํ„ฐํ”„๋ฆฌํ„ฐ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. HTML๋กœ ์ปดํŒŒ์ผํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ฝ”๋“œ๊ฐ€ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜์–ด HTML์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, JavaScript๋ฅผ ์ „์†กํ•˜์—ฌ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰๋˜์–ด HTML์„ ์ƒ์„ฑํ•˜๊ฑฐ๋‚˜, ์„œ๋ฒ„์—์„œ ๋กœ์ปฌ๋กœ ์‹คํ–‰ํ•˜์—ฌ HTML ๋ถ€๋ถ„๋งŒ ์ „์†กํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์”€์ด์ฃ .

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. HTML ๋ถ€๋ถ„์„ ์ „์†กํ•˜๊ณ  JavaScript๋„ ์ „์†กํ•˜์ง€๋งŒ, reactjs๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์ด๋ฏธ ํŽ˜์ด์ง€์— ์žˆ๋Š” JavaScript์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์„ ํ•˜์ด๋“œ๋ ˆ์ด์…˜์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์™œ ์ข‹์€ ๊ฑด๊ฐ€์š”?

Antonio Monteiro: ์ข‹์€ ์ด์œ ๋Š” ์—ญ์‚ฌ์ ์œผ๋กœ ํฌ๋กค๋ง ์—”์ง„์ด ์›น ํŽ˜์ด์ง€์˜ JavaScript๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜๋‚ ์€ ์–ด๋–ค์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์ง€๋งŒ, ์—ฌ์ „ํžˆ ๊ทธ๋ ‡๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ๋ชจ๋“  ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด reactjs๋กœ ์ž‘์„ฑ๋œ ์„ธ์ƒ์—์„œ๋Š” ์›น์‚ฌ์ดํŠธ์˜ HTML์„ ๋กœ๋“œํ•  ๋•Œ ๊ฐ€์žฅ ๋จผ์ € ํ‘œ์‹œ๋˜๋Š” ๊ฒƒ์€ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋กœ๋“œํ•˜๋Š” ์ปจํ…Œ์ด๋„ˆ div์ž…๋‹ˆ๋‹ค. ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ด์ฃ . ๋ฐ˜๋ฉด์— ์ด ์„ธ์ƒ์—์„œ๋Š” ๊ฐ€์žฅ ๋จผ์ € ์ „์ฒด HTML ํŽ˜์ด์ง€๊ฐ€ ํ‘œ์‹œ๋˜๊ณ , ๊ทธ ๋‹ค์Œ์— ์ด๋ฒคํŠธ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์„ค์น˜ํ•˜๋Š” ์Šคํฌ๋ฆฝํŠธ ํƒœ๊ทธ๊ฐ€ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ๊ฒ€์ƒ‰ ์—”์ง„ ์ตœ์ ํ™” ํšŒ์‚ฌ์—๊ฒŒ ์ด๊ฒƒ์ด ์–ผ๋งˆ๋‚˜ ์ค‘์š”ํ•œ ์ฃผ์ œ์ธ์ง€ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค, ์˜›๋‚ ์— ํฌ๋กค๋Ÿฌ๊ฐ€ ๋นˆ ํŽ˜์ด์ง€๋กœ ํ‘œ์‹œํ•˜์ง€ ์•Š๋„๋ก ์ •์  HTML ๋ฒ„์ „์˜ ํŽ˜์ด์ง€๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ–ˆ๋˜ ํ”„๋กœ์ ํŠธ์— ์ฐธ์—ฌํ•œ ์ ์ด ์žˆ์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๊ทธ ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๊ฐœ๋ฐœ์ž๋Š” ๊ทธ๋Ÿฐ ๊ฒƒ์— ๋Œ€ํ•ด ์ƒ๊ฐํ•˜์ง€ ์•Š๊ณ  react๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์ „์ฒด ์ž‘์—…์„ ํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

Antonio Monteiro: ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ํ•ด๊ฒฐ๋˜๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ๋Š” ๋กœ๋”ฉ ์ง€ํ‘œ์ž…๋‹ˆ๋‹ค. FCP(First Contentful Paint)์˜€๋˜๊ฐ€์š”? HTML์„ ๋ธŒ๋ผ์šฐ์ €์— ์ „์†กํ•˜๋ฉด ํŽ˜์ด์ง€๊ฐ€ ์˜์›ํžˆ ๋กœ๋”ฉ๋˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ณด์ด์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด๋ฏธ ๊ตฌ์กฐ๊ฐ€ ์žˆ๊ณ , JavaScript๊ฐ€ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์žˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ฐ˜๋ฉด์— ๋‹ค๋ฅธ ๊ฒฝ์šฐ์—๋Š” JavaScript๋ฅผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ , ์—”์ง„์ด JavaScript๋ฅผ ํŒŒ์‹ฑํ•˜๊ณ , reactjs๋ฅผ ์‹คํ–‰ํ•˜๊ณ , ํ”„๋ŸฐํŠธ์—”๋“œ์—์„œ HTML(DOM)์„ ์ƒ์„ฑํ•˜๋Š” ๋ฐ ์‹œ๊ฐ„์ด ๊ฑธ๋ฆฝ๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ ์ผ์ข…์˜ ํ•ดํ‚น์ฒ˜๋Ÿผ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ๊ฑด๋„ˆ๋›ฐ๊ณ , ์—ฌ์ „ํžˆ ๋ชจ๋“  ๋‹จ๊ณ„๋ฅผ ์ˆ˜ํ–‰ํ•˜์ง€๋งŒ ์‚ฌ์šฉ์ž๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ฝ˜ํ…์ธ ๊ฐ€ ์ด๋ฏธ ํŽ˜์ด์ง€์— ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์‚ฌ์šฉ์ž์—๊ฒŒ HTML์„ ๋จผ์ € ์ „์†กํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ๋ณด๋Š” ๋™์•ˆ ๋กœ๋”ฉ ์‹œ๊ฐ„์„ 1์ดˆ ๋” ๋ฒŒ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์ดํ•ด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ์ „์ฒด ์—์ฝ”์‹œ์Šคํ…œ์ด ์–ด๋–ป๊ฒŒ ๋งž๋ฌผ๋ฆฌ๋Š”์ง€ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. OCaml ๋‚ด๋ถ€ ํ‘œํ˜„์„ JavaScript ์‹คํ–‰ ์—”์ง„์œผ๋กœ ์ž‘์„ฑํ•˜๋Š” ์ž‘์—…์ด ์™œ ์–ด๋ ค์šธ๊นŒ์š”? ์–ผ๋งˆ๋‚˜ ๋‹ค๋ฅธ๊ฐ€์š”?

Antonio Monteiro: ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ตœ์ƒ์˜ ๊ฒฝ์šฐ์—๋Š” ๊ทธ๋ ‡๊ฒŒ ์–ด๋ ค์šด ๋ณ€ํ™˜์ด ์•„๋‹™๋‹ˆ๋‹ค. ํ•ต์‹ฌ OCaml ์–ธ์–ด๋งŒ ์‚ฌ์šฉํ•œ๋‹ค๋ฉด ๋žŒ๋‹ค๋Š” ์ด๋ฏธ ์ฝ”๋“œ ์ƒ์„ฑ์— ์ตœ์ ํ™”๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ค‘๋ณต ์ œ๊ฑฐ๊ฐ€ ์ด๋ฏธ ๋งŽ์ด ๋˜์–ด ์žˆ๊ณ , ์ฐธ์กฐ๊ฐ€ ์ด๋ฏธ ๋งŽ์ด ํ•ด๊ฒฐ๋˜์–ด ์žˆ์œผ๋ฉฐ, ๋žŒ๋‹ค์—์„œ ๋งŽ์€ ์ •๋ณด๋ฅผ ์–ป์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์–ป์„ ์ˆ˜ ์—†๋Š” ์ •๋ณด๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” OCaml ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์ด JavaScript ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ์Šต๊ณผ ์กฐ๊ธˆ ๋‹ค๋ฅด๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š” ๊ฒฝ์šฐ, ๋ ˆ์ฝ”๋“œ๋Š” ํ‚ค๊ฐ€ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์ •์ ์ด๋ผ๋Š” ๊ฒƒ์„ ์ œ์™ธํ•˜๋ฉด ๋”•์…”๋„ˆ๋ฆฌ์™€ ๊ฐ™์€ ๊ฒƒ์ž…๋‹ˆ๋‹ค. OCaml์˜ ๋ ˆ์ฝ”๋“œ์—์„œ JavaScript ๊ฐ์ฒด๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์‹ถ์„ ๊ฒ๋‹ˆ๋‹ค.

Chris Jenkins: ๋‹น์—ฐํ•˜์ฃ . ํ‚ค-๊ฐ’ ์Œ์ด๋‹ˆ๊นŒ์š”.

Antonio Monteiro: OCaml ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ํƒ€์ž… ๊ฒ€์‚ฌ์™€ ๋žŒ๋‹ค ์ƒ์„ฑ ์‚ฌ์ด์—์„œ ์ƒ๋žตํ•˜๊ธฐ ๋•Œ๋ฌธ์— ์šฐ๋ฆฌ๊ฐ€ ๋ณ€๊ฒฝํ•ด์•ผ ํ–ˆ๋˜ ๊ฒƒ์€ ํ‚ค ์ด๋ฆ„์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ๋ณด์กดํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. OCaml ๋ฉ”๋ชจ๋ฆฌ ๋ชจ๋ธ์—์„œ ๋ ˆ์ฝ”๋“œ๊ฐ€ ์žˆ๊ณ  ํƒ€์ž…์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ(์˜ˆ: a, b, c ์†์„ฑ์ด ์žˆ๋Š” ๊ฒฝ์šฐ) ๋ฉ”๋ชจ๋ฆฌ์— ์ˆœ์„œ๋Œ€๋กœ ๋ฐฐ์น˜๋ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ฒซ ๋ฒˆ์งธ ๋ธ”๋ก์€ a, ๋‘ ๋ฒˆ์งธ ๋ธ”๋ก์€ b, ์„ธ ๋ฒˆ์งธ ๋ธ”๋ก์€ c๋ผ๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์ด๋ฆ„์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ํ‚ค ์ด๋ฆ„์„ ์œ ์ง€ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๋งž์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ์ด์ œ๋Š” ์†Œ์Šค-๋จธ์‹  ๋ณ€ํ™˜์„ ํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ ์†Œ์Šค-์†Œ์Šค ๋ณ€ํ™˜์„ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์†Œ์Šค-์†Œ์Šค ๋ณ€ํ™˜์„ ํ•  ๋•Œ๋Š” ์†Œ์Šค-๋จธ์‹  ๋ณ€ํ™˜์„ ํ•  ๋•Œ๋Š” ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๋งŽ์€ ์ •๋ณด๋ฅผ ๋ณด์กดํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์šฐ๋ฆฌ๊ฐ€ ์ฒ˜์Œ์— ์ง๋ฉดํ–ˆ๋˜ ์žฅ๋ฒฝ ์ค‘ ํ•˜๋‚˜์ž…๋‹ˆ๋‹ค. ํ•ต์‹ฌ ์–ธ์–ด๋Š” ์ปดํŒŒ์ผํ•˜๊ธฐ ์‰ฝ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์ง€๋งŒ, ์•”์‹œ์ ์œผ๋กœ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์€ OCaml ์–ธ์–ด์—๋Š” ํ™•์žฅ ๊ธฐ๋Šฅ์ด ๋งŽ๊ณ  ์ด๋Ÿฌํ•œ ํ™•์žฅ ๊ธฐ๋Šฅ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๋ช…ํ™•ํ•˜์ง€ ์•Š๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์˜ ๊ฒฝ์šฐ, OCaml์˜ ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ ์ •๋ง ํฅ๋ฏธ๋กญ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ํŒŒ์ผ์ด ๋ชจ๋“ˆ์ด๊ณ , ๋ชจ๋“ˆ์€ ๊ฐ’์˜ ์ง‘ํ•ฉ์ด๋ผ๊ณ  ์ƒ๊ฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์™€ ๋งˆ์ฐฌ๊ฐ€์ง€๋กœ ๋ชจ๋“  ํŒŒ์ผ์€ ๊ฐ’ ์„ธํŠธ๋ฅผ ๋‚ด๋ณด๋ƒ…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋Œ€๋ถ€๋ถ„์˜ ๊ฐ’์ด ํ•จ์ˆ˜ ๋˜๋Š” ๊ฐ’์„ ๊ฐ€๋ฆฌํ‚ค๋Š” ์ด๋ฆ„์ด๋ผ๋Š” ์ ์„ ๊ฐ์•ˆํ•  ๋•Œ ์ปดํŒŒ์ผํ•˜๊ธฐ๊ฐ€ ๊ฝค ๊ฐ„๋‹จํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๋ชจ๋“ˆ์—๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ a.ml์ด๋ผ๋Š” ํŒŒ์ผ์—๋Š” b๋ผ๋Š” ๋ชจ๋“ˆ์ด ์žˆ์„ ์ˆ˜ ์žˆ๊ณ , b๋Š” ์ด๋Ÿฌํ•œ ๊ฐ’์˜ ๋˜ ๋‹ค๋ฅธ ์ง‘ํ•ฉ์ด๋ฉฐ, ํ•˜๋‚˜๋Š” ํŒŒ์ผ์ด์ง€๋งŒ ๋ชจ๋“ˆ๋กœ ์ทจ๊ธ‰ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์—์„œ ์„œ๋กœ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OCaml ์–ธ์–ด์—์„œ ์ผ๊ธ‰ ์‹œ๋ฏผ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์€ OCaml์˜ ๊ฐ’ ์–ธ์–ด์™€ ๋‹ค๋ฅด์ง€๋งŒ, ์„œ๋กœ ๋ณ€ํ™˜ํ•  ์ˆ˜ ์žˆ๊ณ  ๋ชจ๋“ˆ์„ ํ•จ์ˆ˜์˜ ์ธ์ˆ˜๋กœ ์ „๋‹ฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ๋ชจ๋“ˆ์„ ๋ฆฌํ”„ํŒ…ํ•˜๊ณ  ์–ธ๋ฆฌํ”„ํŒ…ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๋ชจ๋“ˆ์—์„œ ์‹คํ–‰ํ•  ํ•จ์ˆ˜์˜ ์˜ˆ๋ฅผ ๋“ค์–ด ์ฃผ์‹œ๊ฒ ์–ด์š”?

Antonio Monteiro: ์˜ˆ๋ฅผ ๋“ค์–ด ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„์ด ์žˆ๋‹ค๊ณ  ๊ฐ€์ •ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋™์ผํ•œ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ๊ฐ–์ง€๋งŒ ๊ตฌํ˜„์ด ๋‹ค๋ฅธ ๋น„๋™๊ธฐ ๋Ÿฐํƒ€์ž„์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋ฐฑ์—”๋“œ๋ฅผ ๋‹ค๋ฅด๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. OCaml ์šฉ์–ด๋กœ๋Š” ์ „๋žต ํŒจํ„ด์ด๋ผ๊ณ  ํ•ฉ๋‹ˆ๋‹ค. Gang of Four๋ฅผ ์–ธ๊ธ‰ํ•˜๋ ค๋Š” ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ๋จผ์ € ๋ชจ๋“ˆ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ •์˜ํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์‹œ์ž‘ํ•ฉ๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ์—๋Š” ์ด ๋Ÿฐํƒ€์ž„์—์„œ Future์˜ ํƒ€์ž…์€ ๋ฌด์—‡์ด๋ฉฐ, ๋ชจ๋‚˜๋“œ ์šฉ์–ด๋กœ ํ•œ๋‹ค๋ฉด bind ํ•จ์ˆ˜์˜ ํƒ€์ž…์€ ๋ฌด์—‡์ผ๊นŒ์š”? ํƒ€์ž…์€ ์ต๋ช…์œผ๋กœ ์œ ์ง€ํ•  ์ˆ˜ ์žˆ๋Š” ํƒ€์ž… T์ด๊ณ , bind๋Š” T์—์„œ a๋ฅผ ๋ฐ›์•„ b์˜ t ๋˜๋Š” t์˜ b๋ฅผ ์ƒ์„ฑํ•˜๋Š” ํ•จ์ˆ˜๋กœ์˜ ์ผ๋ฐ˜์ ์ธ ํƒ€์ž…์ผ ๊ฒ๋‹ˆ๋‹ค. ๊ฒฐ๊ณผ๋„ t์˜ b์ž…๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ์ผ๋ จ์˜ Future๋ฅผ ์—ฐ๊ฒฐํ•  ์ˆ˜ ์žˆ๊ฒŒ ํ•ด์ฃผ๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ๋ชจ๋‚˜๋“œ bind์ด์ฃ .

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

Chris Jenkins: ๊ทธ๋Ÿฌ๋ฉด ํ•จ์ˆ˜ ๋‚ด์—์„œ ์ „๋‹ฌ๋ฐ›์€ ๋ชจ๋“ˆ์˜ bind ํ•จ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค๋Š” ๋ง์”€์ธ๊ฐ€์š”?

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์ด ํ•จ์ˆ˜ ์ง‘ํ•ฉ์„ ๊ตฌํ˜„ํ•˜๋Š” ๋ชจ๋“ˆ์„ ์ œ๊ณตํ•˜๋ฉด ๋ชจ๋“ˆ์˜ ๊ณ„์•ฝ์„ ์ค€์ˆ˜ํ•˜๋Š” ํ•œ ๋ˆ„๊ฐ€ ๊ตฌํ˜„ํ–ˆ๋Š”์ง€๋Š” ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š๊ณ  ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐํŽ˜์ด์Šค์™€ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

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

Chris Jenkins: ํด๋ฆฌ๋ชจํ”ผ์ฆ˜์— ๋”ฐ๋ผ ๋‹ค๋ฅด๊ฒ ์ฃ ? ์—ฌ๊ธฐ์„œ๋Š” ๋‹ค๋ฃจ์ง€ ์•Š๊ฒ ์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ JavaScript๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ ์–ด๋ ค์šด ๊ณผ์ œ์ž…๋‹ˆ๋‹ค. OCaml ๋ชจ๋“ˆ ์‹œ์Šคํ…œ์— ๋Œ€ํ•œ ๊ธด ์ด์•ผ๊ธฐ๋Š” ์ œ์ณ๋‘๊ณ , ๋ชจ๋‘๊ฐ€ ํ•œ๋ฒˆ ์‹œ๋„ํ•ด ๋ณด์‹œ๊ธธ ๊ถŒํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์–ธ์–ด ํ™•์žฅ ๊ธฐ๋Šฅ ์ค‘ ์ผ๋ถ€๋Š” ์ปดํŒŒ์ผํ•˜๊ธฐ๊ฐ€ ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ๋” ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ํ•œ ๊ฐ€์ง€ ์˜ˆ๋Š” ๋ชจ๋“ˆ์ด์ง€๋งŒ, ์†”์งํžˆ JavaScript์—์„œ๋Š” ๋ชจ๋“ˆ์„ ์ปดํŒŒ์ผํ•˜๊ธฐ๊ฐ€ ๋งค์šฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์–ต์ง€๋กœ ๋ณด๋ฉด JavaScript ๋ชจ๋“ˆ๊ณผ OCaml ๋ชจ๋“ˆ์˜ ํ‘œํ˜„์ด ๋น„์Šทํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์ ์–ด๋„ CommonJS ํŒจ๋Ÿฌ๋‹ค์ž„์—์„œ๋Š” JavaScript ๋ชจ๋“ˆ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๊ฐ’์˜ ์ง‘ํ•ฉ์ธ ๊ฐ์ฒด๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํ‚ค-๊ฐ’ ์Œ์ด ์žˆ๋Š” ๊ฐ์ฒด์ด๊ณ , ํ‚ค๋Š” ์ด๋ฆ„์ด๊ณ  ๊ฐ’์€ ๊ฐ’์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค.

Antonio Monteiro: ๊ทธ๋ž˜์„œ ํŒŒ์ผ ๋‚ด์— ์žˆ๋Š” ํ•˜์œ„ ๋ชจ๋“ˆ์„ ๋™์ผํ•œ ํ˜•ํƒœ์˜ JavaScript ๊ฐ์ฒด๋กœ ์ปดํŒŒ์ผํ•˜๋ฉด ์„œ๋กœ ๋ฐ”๊ฟ” ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์ด๋Ÿฐ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” OCaml์˜ ๊ฒƒ์ด JavaScript์—์„œ ๋ฌด์—‡๊ณผ ๊ฐ™์€์ง€ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํฐ ๊ณผ์ œ์ด๊ณ  ํฐ ๋ถ€๋ถ„์„ ์ฐจ์ง€ํ•ฉ๋‹ˆ๋‹ค. ์ด ์–ธ์–ด์—์„œ ๊ฐ’์˜ ํ‘œํ˜„์ด ๋‹ค๋ฅธ ์–ธ์–ด์˜ ํ‘œํ˜„์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  JavaScript์—์„œ ์ต์ˆ™ํ•˜๊ณ  ์„ฑ๋Šฅ์ด ์ข‹๊ณ  ์ฝ”๋“œ ์ƒ์„ฑ์„ ํ†ตํ•ด ์‰ฝ๊ฒŒ ์กฐ์ž‘ํ•  ์ˆ˜ ์žˆ๋Š” ๊ตฌ์กฐ์˜ ์ธ์ฒด ๊ณตํ•™์  ๋ฒ„์ „์— ์–ด๋–ป๊ฒŒ ๋งคํ•‘๋˜๋Š”์ง€ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ€๋Šฅํ–ˆ๋‚˜์š”? ์•„๋‹ˆ๋ฉด OCaml ๊ธฐ๋Šฅ์„ ์ง€์›ํ•˜์ง€ ์•Š๊ฑฐ๋‚˜ ํŠนํžˆ ๊ด€์šฉ์ ์ธ ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜์ง€ ์•Š๊ธฐ๋กœ ๊ฒฐ์ •ํ•ด์•ผ ํ–ˆ๋˜ ์ ์ด ์žˆ๋‚˜์š”?

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

Chris Jenkins: ํฐ ์ œ์•ฝ์ด๊ตฐ์š”.

Antonio Monteiro: ๋˜ ๋‹ค๋ฅธ ํ•˜๋‚˜๋Š” ํšจ๊ณผ ํ•ธ๋“ค๋Ÿฌ์ธ๋ฐ, ํ˜„์žฌ ์—ฐ๊ตฌ ์ค‘์ธ ๊ธฐ๋Šฅ์ด๊ณ  ์ง€์›ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์ง€๋งŒ ์•„์ง์€ ์ง€์›ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํžˆ ์„ค๋ช…ํ•˜์ž๋ฉด, ํšจ๊ณผ ํ•ธ๋“ค๋Ÿฌ๋Š” ํšจ๊ณผ์ ์œผ๋กœ ํ˜ธ์ถœ ์Šคํƒ์„ ๋˜๊ฐ๊ณ , OCaml ๋ฐฑ์—”๋“œ์—์„œ ๊ตฌํ˜„ํ•˜๋Š” ๋ฐฉ์‹์€ Go๊ฐ€ ๋Ÿฐํƒ€์ž„์—์„œ ํ•˜๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ์Šคํƒ ์ „ํ™˜์„ ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์˜ˆ์™ธ๋ฅผ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”.

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

Chris Jenkins: ์ด๊ฒƒ์€ Melange๊ฐ€ JavaScript๋กœ ์ฝ”๋“œ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ์‹์— ๋Œ€ํ•œ ๋งค์šฐ ํฐ ๊ฐ€์ •, ๋งค์šฐ ํฐ ์ฐจ์ด๋ฅผ ๊นจ๋œจ๋ฆฝ๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” OCaml๊ณผ JavaScript ์‚ฌ์ด์˜ ํ˜ธ์ถœ ๊ทœ์น™์ด ๋™์ผํ•˜๋ฏ€๋กœ b์™€ c๋ผ๋Š” ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜ let a๋ฅผ ๊ตฌ๋ฌธ์ ์œผ๋กœ ๋ณผ ์ˆ˜ ์žˆ๊ณ  JavaScript์—์„œ b์™€ c๋ผ๋Š” ์ธ์ˆ˜๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ a๋ฅผ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ๋ณด์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๊ทธ๋ž˜์„œ ์ถœ๋ ฅ ์ฝ”๋“œ๊ฐ€ ์ฝ๊ธฐ ์‰ฝ๊ฒŒ ๋ณด์ด๊ธฐ๋ฅผ ์›ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ ๋‹ค๋ฅธ ๊ฒƒ์ฒ˜๋Ÿผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•ฉ๋‹ˆ๋‹ค. OCaml ์ฝ”๋“œ์—์„œ JavaScript๋กœ ์ง๊ด€์„ ๊ทธ๋Œ€๋กœ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ๊ธฐ๋ฅผ ์›ํ•˜๋ฉฐ, ์šฐ๋ฆฌ๋Š” ์ด๋ฅผ ์ตœ๋Œ€ํ•œ ๋ณด์กดํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ๊ฒƒ์„ ์—ฐ์† ์ „๋‹ฌ๋กœ ์ „ํ™˜ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ์žฅ์ ์ด ์™„์ „ํžˆ ์‚ฌ๋ผ์ง‘๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ OCaml์—์„œ JavaScript๋กœ ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ ๊ตฌํ˜„ํ•˜๋Š” ๋˜ ๋‹ค๋ฅธ ๊ณผ์ œ๋กœ ์ด์–ด์ง‘๋‹ˆ๋‹ค. ๋ฐ”๋กœ ๊ฒฝ๊ณ„๋ฅผ ์–ด๋–ป๊ฒŒ ์ฒ˜๋ฆฌํ•  ๊ฒƒ์ธ๊ฐ€์ž…๋‹ˆ๋‹ค. ๊ฒฝ๊ณ„๋Š” ํ•ญ์ƒ ๊ฐ€์žฅ ํฅ๋ฏธ๋กœ์šด ๋ถ€๋ถ„์ž…๋‹ˆ๋‹ค. OCaml์€ ์–ด๋””์—์„œ ๋๋‚˜๊ณ  JavaScript๋Š” ์–ด๋””์—์„œ ์‹œ์ž‘๋ ๊นŒ์š”? npm ์—์ฝ”์‹œ์Šคํ…œ์— ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ(JavaScript๋กœ๋งŒ ์ž‘์„ฑ๋œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋ฅผ OCaml ํ”„๋กœ๊ทธ๋žจ์—์„œ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋ฐ˜๋Œ€๋กœ Melange๋กœ ์ปดํŒŒ์ผํ•œ ๊ฒƒ์„ JavaScript์—์„œ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๋„ค์ดํ‹ฐ๋ธŒ์˜ ๊ฒฝ์šฐ Melange๊ฐ€ ๋™์  ๋˜๋Š” ์ •์  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ๋‹ค๋ฅธ ์•„ํ‹ฐํŒฉํŠธ์— ์—ฐ๊ฒฐํ•œ๋‹ค๊ณ  ์ƒ๊ฐํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค. JavaScript ๊ฐœ๋ฐœ์ž๋ฅผ ์œ„ํ•ด npm์— ํŒจํ‚ค์ง€๋ฅผ ๊ฒŒ์‹œํ•˜๊ณ  ์‹ถ์ง€๋งŒ, JavaScript๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: OCaml๋กœ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ๊ณ , Melange๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜๊ณ , npm์— ๊ฒŒ์‹œํ•˜๊ณ  ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ "JavaScript์—์„œ ์ด ํŒจํ‚ค์ง€๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค."๋ผ๊ณ  ๋งํ•˜๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ข‹์•„ํ•˜๋Š” ์–ธ์–ด๋กœ ์ž‘์„ฑํ–ˆ๋‹ค๋Š” ๊ฒƒ์„ ๊ตณ์ด ๋ฐํžˆ๊ณ  ์‹ถ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.

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

Chris Jenkins: ์ž ๊น๋งŒ์š”. OCaml์—๋Š” ๋„ค์ดํ‹ฐ๋ธŒ ์ปค๋ง์ด ์žˆ๊ณ  JavaScript์—์„œ ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๊ฐ€ ๋Ÿฐํƒ€์ž„์„ ๋งŒ๋“ค์–ด์•ผ ํ•œ๋‹ค๋Š” ๋ง์”€์ธ๊ฐ€์š”?

Antonio Monteiro: ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฆฌ์ŠคํŠธ์˜ ๋ชจ๋“  ์š”์†Œ์— ๋Œ€ํ•ด ๋งคํ•‘ํ•˜๋Š” list.map์„ ์ƒ๊ฐํ•ด ๋ณด์„ธ์š”. OCaml์—์„œ list.map์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๋Š” ํ•จ์ˆ˜, ๋ฆฌ์ŠคํŠธ, ๊ฒฐ๊ณผ์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค.

Antonio Monteiro: ํ•˜์ง€๋งŒ ํ•จ์ˆ˜ํ˜• ํ”„๋กœ๊ทธ๋žจ์—์„œ ๋งค์šฐ ์ผ๋ฐ˜์ ์ธ ๊ฒƒ์ฒ˜๋Ÿผ list.map ํ•จ์ˆ˜๋ฅผ ๋ถ€๋ถ„์ ์œผ๋กœ ์ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ธ์ˆ˜์ธ ์ฝœ๋ฐฑ๋งŒ ์ „๋‹ฌํ•˜๋ฉด ๋ชจ๋“  ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ›์•„ ํ•ด๋‹น ๋ณ€ํ™˜์„ ์ ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•œ ํ•จ์ˆ˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค.

Antonio Monteiro: JavaScript์—์„œ๋Š” ์ด๋ฅผ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? JavaScript์—์„œ list.map์€ ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜(์ฝœ๋ฐฑ๊ณผ ๋ฆฌ์ŠคํŠธ)๋ฅผ ๋ฐ›์•„ ์ƒˆ๋กœ์šด ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜์ž…๋‹ˆ๋‹ค. ์ธ์ˆ˜๋ฅผ ํ•˜๋‚˜๋งŒ ์ „๋‹ฌํ•˜๋ฉด ํ•จ์ˆ˜๊ฐ€ ์™„์ „ํžˆ ์ ์šฉ๋˜๊ณ  ๋‘ ๋ฒˆ์งธ ์ธ์ˆ˜๋Š” undefined๊ฐ€ ๋ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋ž˜์„œ JavaScript์—์„œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ ค๋ฉด ๋‘ ๊ฐœ์˜ ์ธ์ˆ˜๋ฅผ ๋ฐ›๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•˜๊ณ , ์•„๋‹ˆ, ์ธ์ˆ˜๋ฅผ ํ•˜๋‚˜ ๋ฐ›์•„์„œ ๋‹ค์Œ ์ธ์ˆ˜๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ์ƒˆ ํ•จ์ˆ˜๋ฅผ ๋ฐ˜ํ™˜ํ•˜๋Š” ํ•จ์ˆ˜๋ฅผ ์ž‘์„ฑํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ปค๋ง์„ ๋‹ค์‹œ ๋ฐœ๋ช…ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ ๊ฐ€๋Šฅํ•œ ํ•œ ์ „์ฒด ์ ์šฉ์„ ํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ปดํŒŒ์ผ ํƒ€์ž„์— ์•Œ์•„๋‚ผ ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ธ์ˆ˜๋ฅผ ํ•˜๋‚˜ ์ ์šฉํ•˜๊ณ  ํ•จ์ˆ˜๋ฅผ ๊ฐ€์ ธ์™€์„œ ๋‹ค์‹œ ์ ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์„ฑ๋Šฅ์ด ์ข‹๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋ชจ๋“  ๊ฒฝ์šฐ์— ๊ทธ๋Ÿด ์ˆ˜๋Š” ์—†๊ธฐ ๋•Œ๋ฌธ์— ๋Ÿฐํƒ€์ž„๋„ ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฑ์ •ํ•  ํ•„์š”๋Š” ์—†์ง€๋งŒ, ๊ฒฝ์šฐ์— ๋”ฐ๋ผ Melange๋Š” ์ด๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” Curry ๋Ÿฐํƒ€์ž„์„ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์ผ๋ฐ˜์ ์ธ ๊ฒฝ์šฐ์—๋Š” ์›๋ณธ ์†Œ์Šค ์ฝ”๋“œ์—์„œ ์ปค๋ง๋˜์ง€ ์•Š์€ ํ•จ์ˆ˜๊ฐ€ ๋ฌด์—‡์ด์—ˆ๋Š”์ง€ ๋‹ค์‹œ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์ด ๊ฑฐ์˜ ๋ถˆ๊ฐ€๋Šฅํ•˜๋‹ค๊ณ  ์ƒ๊ฐํ–ˆ๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: ๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

Chris Jenkins: ์ด ํŒŸ์บ์ŠคํŠธ์˜ ๋น„๊ณต์‹ ๋ชจํ† ๋Š” "๊ฒฝ์šฐ์— ๋”ฐ๋ผ ๋‹ค๋ฆ…๋‹ˆ๋‹ค"์ž…๋‹ˆ๋‹ค. ํฅ๋ฏธ๋กœ์šด ์งˆ๋ฌธ์€ ํ•ญ์ƒ ๊ทธ๋ ‡์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ์ด๋Ÿฌํ•œ ์–ด๋ ค์›€์—๋„ ๋ถˆ๊ตฌํ•˜๊ณ , ์ €๋Š” ์ด ์งˆ๋ฌธ์„ ํ•ด์•ผ ํ•  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๊ธธ์„ ๊ฐˆ ์ˆ˜๋„ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. OCaml์„ OCaml ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. OVM์ด๋ผ๊ณ  ํ•˜๋‚˜์š”?

Chris Jenkins: ๊ทธ๋ƒฅ ์ถ”์ธกํ•ด์„œ OVM์ด๋ผ๊ณ  ํ–ˆ์Šต๋‹ˆ๋‹ค. JVM๊ณผ ๊ฐ™์€ ๊ฑด๊ฐ€์š”? OCaml์šฉ์œผ๋กœ์š”? OVM์ด๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๋“ค์–ด๋ณธ ์ ์ด ์—†์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋งŒ๋“ค์–ด ๋‚ธ ๋ง์ž…๋‹ˆ๋‹ค. ๋ฐ”์ด๋„ˆ๋ฆฌ ์ด๋ฆ„์€ ocamlrun์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค, ocamlrun์ž…๋‹ˆ๋‹ค. VM์ด ๋ญ๋ผ๊ณ  ๋ถˆ๋ฆฌ๋Š”์ง€๋Š” ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ง€์ ์—์„œ ๊ฐœ์ž…ํ•˜์—ฌ OCaml ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋Œ€์‹  WASM์„ ์ƒ์„ฑํ•œ๋‹ค๊ณ  ํ•˜๋ฉด ์ด๋Ÿฌํ•œ ๊ฐ€๋…์„ฑ ๋ฌธ์ œ๊ฐ€ ์ค„์–ด๋“ค์ง€ ์•Š์„๊นŒ์š”?

Chris Jenkins: ํฅ๋ฏธ๋กญ๋„ค์š”. ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ OCaml์šฉ์œผ๋กœ WASM์„ ์ƒ์„ฑํ•˜๋Š” ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ ๋ฐฑ์—”๋“œ๋ฅผ ๋งŒ๋“ ๋‹ค๋Š” ๋ง์”€์ด์ฃ ? ๊ทธ๋Ÿฌ๋ฉด ๊ฐ€๋…์„ฑ์— ๋Œ€ํ•ด ๊ฑฑ์ •ํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ์•„๋ฌด๋„ ์‹ ๊ฒฝ ์“ฐ์ง€ ์•Š์œผ๋‹ˆ๊นŒ์š”.

Antonio Monteiro: ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค. ํ›Œ๋ฅญํ•œ ์งˆ๋ฌธ์ด๊ณ  ์ข‹์€ ์ง€์ ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ํ”„๋กœ์ ํŠธ๊ฐ€ ์ง„ํ–‰ ์ค‘์ธ ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์—์ฝ”์‹œ์Šคํ…œ์ด๋‚˜ ํ”Œ๋ ˆ์ด์–ด์— ๋Œ€ํ•ด์„œ๋Š” ์ž˜ ๋ชจ๋ฅด์ง€๋งŒ, ํ˜„์žฌ OCaml์—์„œ WASM์„ ์ƒ์„ฑํ•˜๋Š” ํ”„๋กœ์ ํŠธ๊ฐ€ ์ ์–ด๋„ ๋‘์„ธ ๊ฐœ๋Š” ๊ฒฝ์Ÿํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์œผ๋กœ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๋ฆ„์€ ๋ง์”€๋“œ๋ฆด ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. ์ตœ์‹  ์ •๋ณด๋ฅผ ํŒŒ์•…ํ•˜์ง€ ๋ชปํ–ˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ดœ์ฐฎ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๊ทธ๋Ÿฐ ํ”„๋กœ์ ํŠธ๊ฐ€ ์žˆ๋‹ค๋Š” ๊ฒƒ์€ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ์งˆ๋ฌธ์— ๋‹ตํ•˜์ž๋ฉด, ์•„์ง์€ ๋ชจ๋“  ์‚ฌ๋žŒ์—๊ฒŒ WASM์ด ๋ฐ”๋žŒ์งํ•œ ์„ธ์ƒ์€ ์•„๋‹ˆ๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. WASM์—๋Š” GC๊ฐ€ ์—†๊ณ  OCaml์€ GC ์–ธ์–ด๋ผ๋Š” ๊ธฐ์ˆ ์  ์ œ์•ฝ์€ ๋ฌด์‹œํ•˜๋”๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค. ์ตœ๊ทผ์— WASM์— GC๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์ œ์•ˆ์ด ๋‚˜์™”๊ฑฐ๋‚˜ ๋‚˜์˜ค๋ ค๊ณ  ํ•˜๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋ ‡์ง€ ์•Š์œผ๋ฉด WASM์—์„œ ๋จผ์ € ๊ฐ€๋น„์ง€ ์ˆ˜์ง‘๊ธฐ๋ฅผ ๊ตฌํ˜„ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฐฉํ–ฅ์œผ๋กœ ๋‚˜์•„๊ฐ„ ํ”„๋กœ์ ํŠธ๊ฐ€ ๋ช‡ ๊ฐœ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋‹ค๋ฅธ ์ด์œ , ์ ์–ด๋„ ์ œ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๋” ๊ฐ•๋ ฅํ•œ ์ด์œ ๋Š” ์‚ฌ๋žŒ๋“ค์ด WASM์„ ์ง์ ‘ ์‚ฌ์šฉํ•˜์ง€ ์•Š๋Š”๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ดํ•ดํ•˜๊ธฐ๋กœ๋Š” ๋งŽ์€ ์ฝ”๋“œ๊ฐ€ ์—ฌ์ „ํžˆ... ์•„๋‹ˆ, ์ด๋ ‡๊ฒŒ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. WASM์€ ์ผ์ข…์˜ ๋ธ”๋ž™๋ฐ•์Šค๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ์›๋ž˜๋Š” ๋ Œ๋”๋ง ์—”์ง„์ด๋‚˜ ๊ฒŒ์ž„๊ณผ ๊ฐ™์ด ๊ณ ์„ฑ๋Šฅ ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•˜๊ณ  ์ตœ์†Œํ•œ์˜ ์ˆ˜์ •์œผ๋กœ ๋ธŒ๋ผ์šฐ์ €์—์„œ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๊ธฐ ์œ„ํ•œ ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. WASM์˜ FFI(์™ธ๋ถ€ ํ•จ์ˆ˜ ์ธํ„ฐํŽ˜์ด์Šค)๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€, ์ฆ‰ WASM์—์„œ JavaScript ํ•จ์ˆ˜๋ฅผ ์–ด๋–ป๊ฒŒ ํ˜ธ์ถœํ•˜๋Š”์ง€, WASM์—์„œ JavaScript๋กœ ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์–ด๋–ป๊ฒŒ ๋…ธ์ถœํ•˜๋Š”์ง€ ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ œ๊ฐ€ ๋ฌด์ง€ํ•ด์„œ ๊ทธ๋Ÿด ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ ์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋Š” ๋ชจ๋‘ ํ•ด๊ฒฐ๋˜์—ˆ์„ ํ…๋ฐ ์ œ๊ฐ€ ๋ชจ๋ฅด๋Š” ๊ฒƒ์ผ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋‹ˆ๋ฉด ์•„์ง ์™„์ „ํžˆ ํ•ด๊ฒฐ๋˜์ง€ ์•Š์•˜์„ ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž˜ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ œ ์ƒ๊ฐ์—๋Š” WASM์€ ๊ทผ์ฒ˜์— ์žˆ๋Š” ๋ณ„๋„์˜ ์‹œ๋ฏผ์—๊ฒŒ RPC๋ฅผ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค. ์ƒŒ๋“œ๋ฐ•์‹ฑ ์š”๊ตฌ ์‚ฌํ•ญ ๋•Œ๋ฌธ์— ๊ทธ๋Ÿด๋“ฏํ•ฉ๋‹ˆ๋‹ค. Melange์™€ ๋ชจ๋“  ์ปดํŒŒ์ผ-ํˆฌ-JS๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด npm์— ์žˆ๋Š” ๋ชจ๋“  ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๊ณ  ๋™์ผํ•œ ํ”„๋กœ์„ธ์Šค, ๋™์ผํ•œ ์Šค๋ ˆ๋“œ์—์„œ ์‹คํ–‰๋˜๋Š” ์ฝ”๋“œ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋„ค์ดํ‹ฐ๋ธŒ ๋ฐฉ์‹์œผ๋กœ ์ƒํ˜ธ ์ž‘์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์ œ๊ฐ€ ์ดํ•ดํ•˜๋Š” ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ์‹ค์ œ JavaScript ์ถœ๋ ฅ์— ๋Œ€ํ•œ ์‹œ์žฅ์€ ์—ฌ์ „ํžˆ ๋งค์šฐ ํฌ๊ณ  ์˜ค๋žซ๋™์•ˆ ์œ ์ง€๋  ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ์ €๋„ ๊ทธ๋ ‡๊ฒŒ ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. WASM์—์„œ reactjs ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์ด ๊ถ๊ธˆํ•ฉ๋‹ˆ๋‹ค. ๋ณธ ์ ์ด ์—†๊ณ , ํ•  ์ˆ˜ ์žˆ์„์ง€๋„ ๋ชจ๋ฅด๊ฒ ์Šต๋‹ˆ๋‹ค. ahrefs์™€ ๊ฐ™์ด OCaml์—์„œ reactjs ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ฐœ๋ฐœํ•˜๊ณ  reactjs, reason-react๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ํŠน์ • ์‚ฌ์šฉ ์‚ฌ๋ก€์˜ ๊ฒฝ์šฐ, ์ด๋Ÿฌํ•œ ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ ์–ด๋–ป๊ฒŒ ์ง€์›๋˜๋Š”์ง€ ๋ณด๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๋‹ค์‹œ ํ˜„์‹ค๋กœ ๋Œ์•„์™€์„œ, react๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์–ดํ•˜๋Š” OCaml ๊ฐœ๋ฐœ์ž๋ผ๋ฉด ์˜ค๋Š˜ ๋ฌด์—‡์„ ํ•ด์•ผ ํ•˜๋‚˜์š”? react์™€ ๋น„์Šทํ•œ OCaml ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋‚˜์š”? ์•„๋‹ˆ๋ฉด ์‹ค์ œ react์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์ด ์žˆ๋‚˜์š”? ์–ด๋–ค ๋ชจ์Šต์ธ๊ฐ€์š”?

Antonio Monteiro: ์ด๊ฒƒ์€ ๊ฒฝ๊ณ„์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ•  ๋•Œ ์กฐ๊ธˆ ์–ธ๊ธ‰ํ–ˆ๋˜ ๋‚ด์šฉ์ž…๋‹ˆ๋‹ค. ํ•œ์ชฝ์—์„œ ๋‹ค๋ฅธ ์ชฝ์„ ํ˜ธ์ถœํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์–ด๋–ป๊ฒŒ ๋˜๋Š”์ง€ ๋ง์ž…๋‹ˆ๋‹ค. ์—ํ”ผ์†Œ๋“œ ์ดˆ๋ฐ˜์— OCaml ์ž์ฒด๊ฐ€ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ปดํŒŒ์ผํ•  ๋•Œ C์— ๋Œ€ํ•œ ํฅ๋ฏธ๋กœ์šด ์ธํ„ฐ๋ŸฝํŠธ ์Šคํ† ๋ฆฌ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์—์ฝ”์‹œ์Šคํ…œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์—†๋‹ค๋ฉด C ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ์ž‘์„ฑํ•˜๊ณ  ํ˜ธ์ถœํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. Melange์—์„œ๋Š” ์‹ค์ œ๋กœ ๋™์ผํ•œ ๋ฉ”์ปค๋‹ˆ์ฆ˜์„ ์‚ฌ์šฉํ•˜์ง€๋งŒ C ๋Œ€์‹  JavaScript๋ฅผ ํ˜ธ์ถœํ•ฉ๋‹ˆ๋‹ค. ์ž‘๋™ ๋ฐฉ์‹์€ ํ˜ธ์ถœํ•˜๋ ค๋Š” ํ•จ์ˆ˜์˜ ์ด๋ฆ„์„ ์ •์˜ํ•˜๊ณ  OCaml ์šฉ์–ด๋กœ ํ•จ์ˆ˜์˜ ์‹œ๊ทธ๋‹ˆ์ฒ˜๊ฐ€ ์–ด๋–ค ๋ชจ์Šต์ธ์ง€ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ถ€๋ถ„์€ ์•ˆ์ „ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. JavaScript๋Š” ๋งค์šฐ ๋™์ ์ด๊ธฐ ๋•Œ๋ฌธ์— ์ถ”์ธกํ•ด์•ผ ํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค, JavaScript ํ•จ์ˆ˜์˜ ํƒ€์ž… ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํŒŒ์•…ํ•˜๋Š” ๊ฒƒ์€ ์‚ฌ์šฉ์ž์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: ์‚ฌ์šฉ์ž์˜ ์ฑ…์ž„์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ ๋ช‡ ๊ฐ€์ง€ ์†์„ฑ์„ ํ•ด์„ํ•˜๋Š” PPX๋ฅผ ์ถ”๊ฐ€ํ•˜์—ฌ JavaScript์˜ ๋ชจ๋“  ๊ตฌ๋ฌธ ๊ตฌ์กฐ(์ƒˆ ๊ฐ์ฒด๋ฅผ ํ˜ธ์ถœํ•˜๋Š” ๋ฐฉ๋ฒ•, ํ”„๋กœํ† ํƒ€์ž…์— ๋ฌด์–ธ๊ฐ€๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ•, ํด๋ž˜์Šค๋ฅผ ์ •์˜ํ•˜๋Š” ๋ฐฉ๋ฒ• ๋“ฑ)๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋„๋ก ํ–ˆ์Šต๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด reactjs์— ๋Œ€ํ•ด ์šฐ๋ฆฌ๊ฐ€ ์ทจํ•œ ์ ‘๊ทผ ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ReasonReact๋ผ๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๊ฐ€ ์žˆ๋Š”๋ฐ, ์ด ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” Melange๋ณด๋‹ค ๋จผ์ € ๋‚˜์™”์Šต๋‹ˆ๋‹ค. ReasonML ํ”„๋กœ์ ํŠธ๊ฐ€ ์‹œ์ž‘๋˜์—ˆ์„ ๋•Œ, ์•„์ง BuckleScript๋ฅผ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์„ ๋•Œ ์ž‘์„ฑ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ReasonReact๋ฅผ ๊ฐ€์ ธ์™€์„œ ์‚ฌ์šฉํ–ˆ์Šต๋‹ˆ๋‹ค. ReasonReact์—๋Š” ReasonML JSX(์–ธ์–ด์— ๋‚ด์žฅ๋˜์–ด ์žˆ์Œ)๋ฅผ ํ•ด์„ํ•˜๊ณ  react JSX ๋˜๋Š” createElement ํ˜ธ์ถœ์„ ์ƒ์„ฑํ•˜๋Š” ๋งค์šฐ ํ›Œ๋ฅญํ•œ PPX(์ „์ฒ˜๋ฆฌ๊ธฐ ํ™•์žฅ)๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ OCaml์„ ์ž‘์„ฑํ•˜๊ณ  JSX๋ฅผ ํ†ตํ•ด HTML ํƒœ๊ทธ๋ฅผ ํฌํ•จํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์”€์ธ๊ฐ€์š”?

Antonio Monteiro: ReasonML์„ ์ž‘์„ฑํ•˜๋Š” ๊ฒฝ์šฐ์—๋งŒ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ReasonML์€ JSX๋ฅผ ์ง€์›ํ•ฉ๋‹ˆ๋‹ค. OCaml์˜ ๋Œ€์ฒด ๊ตฌ๋ฌธ์ด์ฃ .

Chris Jenkins: ๋งž์Šต๋‹ˆ๋‹ค. Facebook์—์„œ reactjs ํ”„๋กœ๊ทธ๋žจ์„ ์ž‘์„ฑํ•  ๋ชฉ์ ์œผ๋กœ ๊ฐœ๋ฐœ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์— ์ฒ˜์Œ๋ถ€ํ„ฐ JSX๊ฐ€ ํฌํ•จ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ํฐ ์žฅ์ ์ด์ฃ .

Chris Jenkins: OCaml์„ ์ž‘์„ฑํ•˜๊ณ  ์žˆ์ง€๋งŒ JavaScript์™€ JSX์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ด๊ณ  JavaScript๋กœ ์ถœ๋ ฅ๋ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ReasonML์˜ JSX๋Š” ์žฌ์‚ฌ์šฉ ๊ฐ€๋Šฅํ•ฉ๋‹ˆ๋‹ค. ์ฆ‰, ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์‚ฌ๋žŒ๋“ค์€ JSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ reactjs ์š”์†Œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์ด๊ฒƒ์ด ReasonML JSX์˜ ์œ ์ผํ•œ ์‚ฌ์šฉ ์‚ฌ๋ก€๋Š” ์•„๋‹™๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด JSX๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํƒœ๊ทธ๋ฅผ ์ง€์ •ํ•˜๋Š” ๊ณ ์œ ํ•œ pretty printer ์ •์˜๋ฅผ ์ƒ์ƒํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. JSX๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๋ชจ๋“  ๋‚ด๋ถ€ DSL(๋„๋ฉ”์ธ ํŠน์ • ์–ธ์–ด)์€ ReasonML๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„๊ณผ ๋ณ€ํ™˜๋„ ์ž‘์„ฑํ•ด์•ผ ํ•˜์ง€๋งŒ์š”.

Chris Jenkins: ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ์ผ๋ฐ˜ํ™”ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๋ง์”€์ด๊ตฐ์š”. OCaml์ด ์–ด๋””์— ์žˆ๋Š”์ง€ ๊ถ๊ธˆํ•  ์ •๋„์ž…๋‹ˆ๋‹ค. ์ด ์Šคํƒ์—์„œ๋Š” ํ‘œ๋ฉด ์•„๋ž˜์— ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค, ํ‘œ๋ฉด ์•„๋ž˜์— ์žˆ์Šต๋‹ˆ๋‹ค. ์•„๋งˆ๋„ AST ์ˆ˜์ค€์—๋งŒ ์žˆ์„ ๊ฒ๋‹ˆ๋‹ค. ๊ทธ ๋Œ€๊ฐ€๋กœ ๊ณ ๊ธ‰ ์ปดํŒŒ์ผ๋Ÿฌ์ธ OCaml ์ปดํŒŒ์ผ๋Ÿฌ์™€ ์„œ๋ฒ„ ์ธก์—์„œ Reason์„ ์‚ฌ์šฉํ•˜๊ณ  ์‹ถ์„ ๋•Œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ์ „์ฒด ๋ฐฑ์—”๋“œ ์—์ฝ”์‹œ์Šคํ…œ์„ ์–ป๊ฒŒ ๋ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๋ฐฑ์—”๋“œ์˜ ๊ฒฝ์šฐ, ๋ฐฑ์—”๋“œ์—์„œ OCaml๋กœ ์ž‘์„ฑํ•œ๋‹ค๋ฉด ์šฐ๋ฆฌ๊ฐ€ ๊ทธ๋ฆฌ๊ณ  ์žˆ๋Š” ์‹œ๋‚˜๋ฆฌ์˜ค์—์„œ๋Š” OCaml์ด ์–ด๋””์—๋‚˜ ์žˆ์Šต๋‹ˆ๋‹ค. Melange์˜ ๊ฒฝ์šฐ, ์‹œ๋‚˜๋ฆฌ์˜ค์˜ Melange ๋ถ€๋ถ„์—์„œ๋Š” OCaml์ด ์ฃผ๋กœ ๋„๊ตฌ์—๋งŒ ์žˆ๋‹ค๊ณ  ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ํ‘œ๋ฉด์€ JavaScript์™€ ๋งค์šฐ ์œ ์‚ฌํ•˜๊ฒŒ ๋ณด์ด๊ณ  ์‹คํ–‰๋˜๋Š” ๊ฒƒ์€ JavaScript์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋Ÿฌ๋‹ˆ๊นŒ ๋ธŒ๋ผ์šฐ์ €๋ฅผ ์›ํ•˜๋Š” OCaml ๊ฐœ๋ฐœ์ž์™€ OCaml์„ ์›ํ•˜๋Š” JavaScript ๊ฐœ๋ฐœ์ž ์‚ฌ์ด์˜ ๊ฒฝ๊ณ„๋ฅผ ์—ฌ์ „ํžˆ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ๊ฒฝ๊ณ„๋ฅผ ๋ชจํ˜ธํ•˜๊ฒŒ ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ์ €๋Š” ๋‘ ๊ฐ€์ง€ ๋ชจ๋‘์— ํ•ด๋‹นํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋•Œ๋กœ๋Š” ํ•œ์ชฝ์—์„œ ์˜ค๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•„์š”ํ•˜๊ณ  ๋•Œ๋กœ๋Š” ๋‹ค๋ฅธ ์ชฝ์—์„œ ์˜ค๋Š” ์‚ฌ์šฉ ์‚ฌ๋ก€๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค, ์ดํ•ดํ•ฉ๋‹ˆ๋‹ค. ์ œ ์ƒ๊ฐ์—๋Š” ์ข‹์€ ์ผ์ž…๋‹ˆ๋‹ค. ๋‹ค์‹œ ํ•œ ๊ฑธ์Œ ๋ฌผ๋Ÿฌ์„œ์„œ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. Antonio๋‹˜์€ ์ด ๋ชจ๋“  ์ž‘์—…์„ ํ•˜๊ณ  ์žˆ์ง€๋งŒ, ์ž‘์—…์„ ํ•˜์ง€ ์•Š์„ ๋•Œ๋Š” ์ด๊ฒƒ์ด Antonio๋‹˜์—๊ฒŒ ๋ฌด์—‡์„ ํ•ด์ค„๊นŒ์š”? ์–ด๋–ป๊ฒŒ ํ™œ์šฉํ•˜๊ณ  ์žˆ๋‚˜์š”?

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

Chris Jenkins: ์ต์ˆ™ํ•œ ์ด์•ผ๊ธฐ์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค, ์—ฌ๊ธฐ์ €๊ธฐ ๋ช‡ ๊ฐ€์ง€๋ฅผ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ๋˜์ง€ ์•Š์€ ๊ฐœ์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์ด ๋ช‡ ๊ฐœ ์žˆ๊ณ , Melange๋กœ ์ž‘์—… ์ค‘์ธ ๊ฒƒ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ ํ…Œ์ŠคํŠธ ๋˜๋Š” ์ƒˆ๋กœ์šด ์ปดํŒŒ์ผ๋Ÿฌ ๋„๊ตฌ๋ฅผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ ์œ„ํ•ด Melange ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ์ž์ฃผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ Melange ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ ์™ธ์—๋Š” ๊ณต๊ฐœ๋œ ๊ฒƒ์ด ์—†์Šต๋‹ˆ๋‹ค. Melange ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ๋Š” melange.playground๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์˜จ๋ผ์ธ ํ”Œ๋ ˆ์ด๊ทธ๋ผ์šด๋“œ์—์„œ ์™ผ์ชฝ ์ฐฝ์— OCaml์„ ์ž‘์„ฑํ•˜๊ณ  ์˜ค๋ฅธ์ชฝ ์ฐฝ์— ์ƒ์„ฑ๋œ JavaScript๋ฅผ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์†Œ์Šค ์ฝ”๋“œ๋ฅผ ์„œ๋ฒ„๋กœ ์ „์†กํ•˜์—ฌ ์ปดํŒŒ์ผํ•˜๋‚˜์š”? ์•„๋‹ˆ๋ฉด ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋˜๋‚˜์š”?

Antonio Monteiro: ๋ธŒ๋ผ์šฐ์ €์—์„œ ๋ชจ๋‘ ์ฒ˜๋ฆฌ๋ฉ๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์„œ ์ œ๊ฐ€ ํ”„๋ž‘์ผ„์Šˆํƒ€์ธ ๋ฐ•์‚ฌ๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ดด๋ฌผ์„ ๋งŒ๋“ค์—ˆ์ฃ . ์‹ค์ œ๋กœ ํ•˜๋Š” ์ผ์€ ๋ถˆํ–‰ํžˆ๋„ Melange๋Š” ์•„์ง ์ž์ฒด ํ˜ธ์ŠคํŒ…๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์— JS of OCaml(OCaml ์—์ฝ”์‹œ์Šคํ…œ์˜ ๋˜ ๋‹ค๋ฅธ ํ”Œ๋ ˆ์ด์–ด)์„ ์‚ฌ์šฉํ•˜์—ฌ Melange๋ฅผ JavaScript๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด Melange ์ปดํŒŒ์ผ๋Ÿฌ๋ผ๋Š” ํฐ ์ฝ”๋“œ ๋ฌถ์Œ์ด ์ƒ๊ธฐ๊ณ , ์ด๋ฅผ ์ผ์ข…์˜ ๋ธ”๋ž™๋ฐ•์Šค๋กœ ์ทจ๊ธ‰ํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ธ”๋ž™๋ฐ•์Šค์—๋Š” OCaml ๋˜๋Š” ReasonML์„ ์ž…๋ ฅํ•˜๊ณ  Melange๋กœ ์ปดํŒŒ์ผ๋œ JavaScript๋ฅผ ์ถœ๋ ฅํ•  ์ˆ˜ ์žˆ๋Š” ์ธํ„ฐํŽ˜์ด์Šค๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๋‹ค์Œ Melange ์›น ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜์„ ๊ทธ ์ฃผ์œ„์— ๋†“์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์˜ค๋ฅด๊ฐ„๊ณผ ๊ฐ™๊ตฐ์š”.

Antonio Monteiro: [์›ƒ์Œ]

Chris Jenkins: ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ง์”€ํ•ด ์ฃผ์„ธ์š”. JS of OCaml์„ ์‚ฌ์šฉํ•˜์—ฌ Melange ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ JavaScript๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ์ด์œ ๊ฐ€ ๋ฌด์—‡์ธ๊ฐ€์š”? ์ด ์งˆ๋ฌธ์„ ์ •ํ™•ํ•˜๊ฒŒ ํ‘œํ˜„ํ•˜๊ธฐ๊ฐ€ ์–ด๋ ต์Šต๋‹ˆ๋‹ค. ๋„ˆ๋ฌด ๋ฉ”ํƒ€์ ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. JS of OCaml์„ ์‚ฌ์šฉํ•˜์—ฌ Melange ์ปดํŒŒ์ผ๋Ÿฌ๋ฅผ JavaScript๋กœ ์ปดํŒŒ์ผํ•ฉ๋‹ˆ๋‹ค. ๋งž๋‚˜์š”?

Antonio Monteiro: ๋„ค, ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์™œ ๊ทธ๋ ‡๊ฒŒ ํ•˜๋‚˜์š”? JS of OCaml ์ปดํŒŒ์ผ๋Ÿฌ์˜ ๋‹จ์ ์ด ๋ฌด์—‡์ด๊ธฐ์— Melange๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์–ด์ง€๋‚˜์š”?

Antonio Monteiro: ์ข‹์€ ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. Melange๊ฐ€ ์กด์žฌํ•˜๋Š” ์ด์œ  ์ค‘ ํ•˜๋‚˜๋Š” JS of OCaml์ด ์šฐ๋ฆฌ์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋ช‡ ๊ฐ€์ง€ ์ด์œ ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฒซ ๋ฒˆ์งธ ์ด์œ ๋Š” ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ Melange๋Š” ๋žŒ๋‹ค ๊ณ„์ธต(๋žŒ๋‹ค ์ค‘๊ฐ„ ํ‘œํ˜„)์— ์—ฐ๊ฒฐ๋˜์ง€๋งŒ, JS of OCaml์€ OCaml ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€์„œ ์ปดํŒŒ์ผ ํƒ€์ž„์— ํ•ด์„ํ•˜์—ฌ JavaScript๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค. ๋žŒ๋‹ค ํ‘œํ˜„์— ์žˆ๋Š” ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ๋ช‡ ๊ฐ€์ง€ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋ฐ”์ดํŠธ์ฝ”๋“œ์™€ ๋žŒ๋‹ค ํ‘œํ˜„ ์‚ฌ์ด์— ์ •๋ณด๊ฐ€ ์†์‹ค๋ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์ •๋ณด๊ฐ€ ๋ฒ„๋ ค์ง‘๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. Melange๋ฅผ ํ†ตํ•ด ์ปดํŒŒ์ผํ•  ๋•Œ OCaml ๊ตฌ์กฐ๋ฅผ JavaScript์—์„œ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”์ง€, ์ƒ์„ฑ๋œ ์ฝ”๋“œ์˜ ๊ฐ€๋…์„ฑ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€, JavaScript๋ฅผ ์ƒ์„ฑํ•˜๊ธฐ ์œ„ํ•ด ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋Š” ๋‹ค๋ฅธ ๊ตฌ์กฐ์— ๋Œ€ํ•ด ๋งŽ์ด ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ์ค‘ ํ•˜๋‚˜๋Š” ๋ ˆ์ฝ”๋“œ ์˜ˆ์ œ์ž…๋‹ˆ๋‹ค. ํ‚ค ์ด๋ฆ„์— ๋Œ€ํ•œ ์ •๋ณด๋Š” ๋ณด์กด๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด JS of OCaml์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ ˆ์ฝ”๋“œ๋ฅผ JavaScript ๊ฐ์ฒด๋กœ ํ‘œํ˜„ํ•  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. JS of OCaml์„ ์‚ฌ์šฉํ•  ๋•Œ๋Š” ์ฃผ๋กœ OCaml ๊ตฌ์กฐ๋ฅผ JavaScript์—์„œ ์–ด๋–ป๊ฒŒ ํ‘œํ˜„ํ•˜๋Š”์ง€, ๊ทธ๋ฆฌ๊ณ  ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์—†๋Š” ๊ฒฝ์šฐ ์„ฑ๋Šฅ์— ์–ด๋–ค ์˜ํ–ฅ์„ ๋ฏธ์น˜๋Š”์ง€์— ๋Œ€ํ•œ ํŠน์ˆ˜์„ฑ์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋“  ์ •๋ณด๊ฐ€ ์—†์œผ๋ฉด ๊ฐ„์ ‘ ์ฐธ์กฐ๋ฅผ ๋” ๋งŽ์ด ์ถ”๊ฐ€ํ•˜๊ณ  ๋Ÿฐํƒ€์ž„์„ ๋” ๋งŽ์ด ์ถ”๊ฐ€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค. ํ•˜์ง€๋งŒ JS of OCaml์€ Melange์— ๋น„ํ•ด ์žฅ์ ์ด ๋งŽ์Šต๋‹ˆ๋‹ค. ์—”์ง€๋‹ˆ์–ด๋ง์—์„œ๋Š” ๋ชจ๋“  ๊ฒƒ์ด ํ•ญ์ƒ ํŠธ๋ ˆ์ด๋“œ์˜คํ”„์ด๊ธฐ ๋•Œ๋ฌธ์— ๋‹ค๋ฅธ ๊ฒƒ๋ณด๋‹ค ์—„๊ฒฉํ•˜๊ฒŒ ๋” ๋‚˜์€ ์†”๋ฃจ์…˜์„ ๊ฐ€์งˆ ์ˆ˜๋Š” ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊ฒฝ์šฐ๋Š” ๋งค์šฐ ๋“œ๋ญ…๋‹ˆ๋‹ค. JS of OCaml์˜ ๊ฐ€์žฅ ํฐ ์žฅ์ ์€ ๊ฑฐ์˜ ๋ชจ๋“  OCaml ์–ธ์–ด๋ฅผ ์ง€์›ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์•ž์„œ ๋ช‡ ๊ฐ€์ง€ ๋ชจ๋“ˆ, ๋ช‡ ๊ฐ€์ง€ ํ‘œ์ค€ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ชจ๋“ˆ, ๋ช‡ ๊ฐ€์ง€ ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ๋ช‡ ๊ฐ€์ง€ ๊ตฌ์กฐ๋ฅผ Melange์—์„œ ์ง€์›ํ•  ์ˆ˜ ์—†๋‹ค๊ณ  ๋ง์”€๋“œ๋ ธ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ํšจ๊ณผ ํ•ธ๋“ค๋Ÿฌ์— ๋Œ€ํ•ด ์ด์•ผ๊ธฐํ–ˆ๋Š”๋ฐ, ์ด๊ฒƒ์€ JS of OCaml์ด ์ง€์›ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. JS of OCaml์—์„œ ์ทจํ•œ ๋ฐฉ๋ฒ•์€ ํšจ๊ณผ ํ•ธ๋“ค๋Ÿฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒฝ์šฐ ๋ชจ๋“  ํ•จ์ˆ˜์˜ ๋์— ์—ฐ์† ์ธ์ˆ˜๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ฆ‰, ํ”„๋กœ๊ทธ๋žจ์˜ ๋ชจ๋“  ํ•จ์ˆ˜์— ์ด ๋งˆ์ง€๋ง‰ ์ธ์ˆ˜๊ฐ€ ์žˆ์–ด์•ผ ํ•˜๊ณ , JavaScript์—์„œ ํ•ด๋‹น ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜๋ ค๋ฉด ์–ด๋Œ‘ํ„ฐ๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์‹œ ๋ง์”€๋“œ๋ฆฌ์ง€๋งŒ, ๋Ÿฐํƒ€์ž„์ด ๋ฐœ์ƒํ•˜๊ณ  ํ‘œํ˜„์ด ๊ทธ๋ ‡๊ฒŒ ๊ฐ„๋‹จํ•˜๊ฑฐ๋‚˜ ๋ฌธ์„œํ™”ํ•˜๊ธฐ ์‰ฝ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ํฐ ์žฅ์ ์€ ํ›จ์”ฌ ๋” ๋งŽ์€ ๊ฒƒ์„ ์ง€์›ํ•œ๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ์–ด๋–ค ์˜๋ฏธ์—์„œ๋Š” ์ƒ๋‹นํžˆ ๊ณ ์ˆ˜์ค€ ์–ธ์–ด๋ฅผ ๋‹ค๋ฅธ ๊ณ ์ˆ˜์ค€ ์–ธ์–ด๋กœ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๊ณผ ๋น„์Šทํ•˜์ง€๋งŒ, JS of OCaml์—์„œ๋Š” ๊ธฐ๋ณธ์ ์œผ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋ฅผ ๋‹ค๋ฅธ ๋ฐ”์ดํŠธ์ฝ”๋“œ๋กœ ๋ณ€ํ™˜ํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ์ข‹์€ ๋น„์œ ์ž…๋‹ˆ๋‹ค. ๋งž์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ํŠธ๋ ˆ์ด๋“œ์˜คํ”„๋ฅผ ์•Œ๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋ฉด ๋‹ค๋ฅธ ์‚ฌ๋žŒ์ด Melange๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ์‹ค์ œ์ ์ธ ์ธก๋ฉด์„ ์‚ดํŽด๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค. ์ €๋Š” JavaScript๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. TypeScript๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ๊ดœ์ฐฎ์ง€๋งŒ, TypeScript์— ๋Œ€ํ•œ ์ƒ๊ฐ์€ JavaScript์™€ ๋งค์šฐ ๋‹ค๋ฆ…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ PureScript๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๊ฒƒ์€ ์ข‹์•„ํ•ฉ๋‹ˆ๋‹ค. ReasonML์„ ์‹œํ—˜ํ•ด ๋ณด๊ณ  ์–ด๋–ค ๋А๋‚Œ์ธ์ง€ ์•Œ์•„๋ณด๊ณ  ์‹ถ๋‹ค๋ฉด ์–ด๋–ป๊ฒŒ ์‹œ์ž‘ํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์ข‹์„๊นŒ์š”?

Antonio Monteiro: ์‹œ์ž‘ํ•˜๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์€ mlre.org์— ๋ฐฉ๋ฌธํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์‹œ์ž‘ํ•˜๊ธฐ ์ง€์นจ๊ณผ ๋ชจ๋“  ๋ฌธ์„œ๊ฐ€ ์žˆ๋Š” ์›น์‚ฌ์ดํŠธ์ž…๋‹ˆ๋‹ค. JavaScript๋ฅผ ์ž‘์„ฑํ•˜๊ณ  ์‹ถ์ง€๋Š” ์•Š์ง€๋งŒ JavaScript ํ”Œ๋žซํผ์— ๋ฐฐํฌํ•˜๋Š” ๊ฒฝ์šฐ ์—ฌ์ „ํžˆ JavaScript๋ฅผ ๋งŽ์ด ์‚ฌ์šฉํ•ด์•ผ ํ•  ๊ฒ๋‹ˆ๋‹ค. ํ”Œ๋žซํผ API๋ผ๋„ ๋ง์ž…๋‹ˆ๋‹ค. ์–ด๋А ์‹œ์ ์—๋Š” ํ”Œ๋žซํผ API๋ฅผ ํ˜ธ์ถœํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ mlre.org์—๋Š” ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๋ฐฉ๋ฒ•, ์ฆ‰ ๊ฒฝ๊ณ„์—์„œ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๋ฐฉ๋ฒ•, ๋นŒ๋“œ๋ฅผ ์กฐ์ •ํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•œ ๊ธด ๋ฌธ์„œ ์„น์…˜์ด ์žˆ์Šต๋‹ˆ๋‹ค. OCaml Discord ๋˜๋Š” ReasonML Discord์— ๊ฐ€์ž…ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ Discord์— ์žˆ๊ณ  ์ตœ๋Œ€ํ•œ ๋„์›€์„ ๋“œ๋ฆฌ๋ ค๊ณ  ๋…ธ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์ด ์‹œ์ž‘ํ•˜๊ธฐ ๊ฐ€์žฅ ์ข‹์€ ๋ฐฉ๋ฒ•์ด๋ผ๊ณ  ์ƒ๊ฐํ•ฉ๋‹ˆ๋‹ค.

Chris Jenkins: ์ข‹์Šต๋‹ˆ๋‹ค. ๊ตฌ์ฒด์ ์ธ ๋‹ต์„ ํ•˜๊ธฐ๋Š” ์–ด๋ ต์ง€๋งŒ ์ฃผ๊ด€์ ์ธ ์˜๊ฒฌ์„ ๋ง์”€ํ•ด ์ฃผ์„ธ์š”. ์ด ์Šคํƒ์€ ์–ผ๋งˆ๋‚˜ ์„ฑ์ˆ™ํ–ˆ๋‚˜์š”?

Antonio Monteiro: ์–ด๋ ค์šด ์งˆ๋ฌธ์ž…๋‹ˆ๋‹ค. 23๋…„ ์ „์—๋Š” ์กฐ๊ฐ๋‚œ ๋„๊ตฌ ์„ธํŠธ๋งŒ ์žˆ์—ˆ์Šต๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋„๊ตฌ๋ฅผ ์กฐํ•ฉํ•  ์ˆ˜๋Š” ์žˆ์—ˆ์ง€๋งŒ ๋ชจ๋“  ๊ฒƒ์„ ์ˆ˜๋™์œผ๋กœ ํ•ด์•ผ ํ–ˆ์Šต๋‹ˆ๋‹ค. 23๋…„ ์ „๋ถ€ํ„ฐ ์ง€๊ธˆ๊นŒ์ง€ ์šฐ๋ฆฌ ์ž‘์—…์˜ ํฐ ๋ถ€๋ถ„์€ ์ด๋Ÿฌํ•œ ๋ชจ๋“  ๊ฒƒ์„ ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ฒ˜๋ฆฌํ•˜์—ฌ ์‚ฌ์šฉ์ž๊ฐ€ ๊ฑฑ์ •ํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ด์—ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋ž˜์„œ OCaml ๋นŒ๋“œ ์‹œ์Šคํ…œ์— Melange์— ๋Œ€ํ•œ ์ง€์›์„ ์ถ”๊ฐ€ํ•˜๊ณ  OCaml ํ”Œ๋žซํผ๊ณผ ์›ํ™œํ•˜๊ฒŒ ์ž‘๋™ํ•˜๋„๋ก ํ–ˆ์œผ๋ฉฐ ๊ทธ ๊ณผ์ •์—์„œ ๋งŽ์€ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ˜„์žฌ๋Š” Melange์˜ ์ฃผ์š” ๋ฒ„์ „์„ ๋„ค ๊ฐœ ์ถœ์‹œํ–ˆ๊ณ , ์š”์ฆ˜์—๋Š” ๋งŽ์€ ์‚ฌ์šฉ์ž๊ฐ€ Melange๋ฅผ ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์—์„œ ์‚ฌ์šฉํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๊ฐ€์žฅ ํฐ ์‚ฌ์šฉ์ž๋Š” ahrefs์ž…๋‹ˆ๋‹ค. ์•ž์„œ ๋ง์”€๋“œ๋ฆฐ ๊ฒƒ์ฒ˜๋Ÿผ์š”. ๊ทธ๋ž˜์„œ Melange๋Š” ์•ˆ์ •์ ์ด๋ผ๊ณ  ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ”„๋กœ๋•์…˜ ํ™˜๊ฒฝ์— ๋ฐฐํฌํ•ด๋„ ๋„๊ตฌ ์„ ํƒ์œผ๋กœ ์ธํ•ด ํฐ ๋†€๋ผ์›€์ด ๋ฐœ์ƒํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค. ์ค‘์š”ํ•œ ์ธํ”„๋ผ์— ์˜์กดํ•˜๋Š” ๋ชจ๋“  ๊ฒƒ์— ๋Œ€ํ•ด ์›ํ•˜๋Š” ์ƒํƒœ์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: ํ•˜์ง€๋งŒ ์—์ฝ”์‹œ์Šคํ…œ์€ ์•„์ง ๋งค์šฐ ์–ด๋ฆฝ๋‹ˆ๋‹ค. Melange๋ฅผ ๋ฐฐํฌํ•˜๋ฉด ์•„์ง ์ดˆ๊ธฐ ๋‹จ๊ณ„์— ์žˆ๋‹ค๋Š” ๊ฒƒ์„ ์•Œ ์ˆ˜ ์žˆ์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์—์ฝ”์‹œ์Šคํ…œ์ด ์™„์ „ํžˆ ๊ฐ–์ถฐ์ง€์ง€ ์•Š์•˜๊ณ , npm์— ์žˆ๋Š” JavaScript ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ์— ๋Œ€ํ•œ ๋ฐ”์ธ๋”ฉ์„ ๋งŽ์ด ์ž‘์„ฑํ•ด์•ผ ํ•˜๊ณ , ์›ํ•˜๋Š” ๊ฒƒ์„ ํ•˜๊ธฐ ์œ„ํ•ด ํ•œ๋‘ ๊ฐœ์˜ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์ง์ ‘ ์ž‘์„ฑํ•ด์•ผ ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋นŒ๋“œ๋ฅผ ๊ตฌ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•, Dune๊ณผ OCaml์ด ์–ด๋””์— ์žˆ๋Š”์ง€, ๋ฒˆ๋“ค๋Ÿฌ๊ฐ€ ์–ด๋””์—์„œ ์‹œ์ž‘๋˜๋Š”์ง€ ๋“ฑ์„ ์•Œ์•„๋‚ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ๋ชจ๋“  ์„ ํƒ์€ ์‚ฌ์šฉ์ž๊ฐ€ ์ง์ ‘ ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๋Š” ๊ถŒ์žฅ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋งŽ์€ ๊ฒƒ์„ ์•Œ์•„๋‚ด์•ผ ํ•˜๊ณ  ๋งŽ์€ ๊ฒƒ์„ ๋งŒ์ ธ๋ด์•ผ ํ•˜์ง€๋งŒ, ์ „๋ฐ˜์ ์œผ๋กœ ํ•ต์‹ฌ์€... ์ด๋ ‡๊ฒŒ ๋ง์”€๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. OCaml์— ์ต์ˆ™ํ•˜๋‹ค๋ฉด Melange ๋„๊ตฌ์— ์ต์ˆ™ํ•ด์งˆ ๊ฒƒ์ž…๋‹ˆ๋‹ค. OCaml์„ ์ฒ˜์Œ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ์—๋Š” ๋ฐฐ์šธ ๊ฒƒ์ด ๋งŽ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๋„ค, ๋‹น์—ฐํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค.

Chris Jenkins: ๊ทธ๋Ÿฌ๋ฉด ๋งˆ์ง€๋ง‰ ์งˆ๋ฌธ์ด ๋  ์ˆ˜๋„ ์žˆ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด์ œ ๋„ค์ดํ‹ฐ๋ธŒ react-ml ๋‚ ์งœ ์„ ํƒ๊ธฐ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜์ง€ ์•Š์„ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค. ๊ทธ ์—์ฝ”์‹œ์Šคํ…œ์„ ์ฑ„์šฐ๋Š” ์ผ์€ ํ•˜์ง€ ์•Š์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ์ด ํ”„๋กœ์ ํŠธ์˜ ๋ฏธ๋ž˜๋Š” ๋ฌด์—‡์ธ๊ฐ€์š”? ์•ž์œผ๋กœ 6๊ฐœ์›”, 1๋…„ ๋™์•ˆ ๋ฌด์—‡์„ ์ž‘์—…ํ•  ๊ณ„ํš์ธ๊ฐ€์š”?

Antonio Monteiro: ๋ช‡ ๊ฐ€์ง€ ๋ชฉํ‘œ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํ•ญ์ƒ ๊ฐ€์žฅ ์ค‘์š”ํ•œ ๊ฒƒ์€ ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์ž…๋‹ˆ๋‹ค. ahrefs ๋‚ด๋ถ€์— Melange์™€ ReasonML์„ ์‚ฌ์šฉํ•˜๋Š” ํ”„๋ŸฐํŠธ์—”๋“œ ํŒ€์ด ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋“ค์€ ๋งค์ผ ์–ด๋ ค์›€์„ ๊ฒช๊ณ  ์žˆ์œผ๋ฉฐ, ๊ทธ ์–ด๋ ค์›€์€ ์ €์—๊ฒŒ ๋ณด๊ณ ๋ฉ๋‹ˆ๋‹ค. ์ด๊ฒƒ์€ ํ•ญ์ƒ ์—ผ๋‘์— ๋‘์–ด์•ผ ํ•  ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. ๋ฒ„๊ทธ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ReasonML ์–ธ์–ด ์ž์ฒด์˜ ์‚ฌ์šฉ์„ฑ์„ ๊ฐœ์„ ํ•  ๋ฟ๋งŒ ์•„๋‹ˆ๋ผ Melange๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ๋ฒ„๊ทธ๋„ ์ˆ˜์ •ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์š”์ฆ˜์—๋Š” ์ฝ”๋“œ ์ƒ์„ฑ ๋ฒ„๊ทธ๊ฐ€ ๊ฑฐ์˜ ์—†์ง€๋งŒ, ์ฃผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์—์„œ ์˜ค๋ฅ˜ ๋ฉ”์‹œ์ง€๋ฅผ ํ‘œ์‹œํ•˜๊ณ  ์‚ฌ์šฉ์ž๊ฐ€ ์–ด๋–ป๊ฒŒ ํ•ด์•ผ ํ• ์ง€ ๋ชจ๋ฅด๋Š” ๊ฒฝ์šฐ ๋ˆ„๊ตฌ์˜ ์ž˜๋ชป์ธ์ง€์— ๋Œ€ํ•œ ๋ฌธ์ œ์ž…๋‹ˆ๋‹ค. ์ผ๋ฐ˜์ ์œผ๋กœ ์ปดํŒŒ์ผ๋Ÿฌ์˜ ์ž˜๋ชป์ž…๋‹ˆ๋‹ค. ๋ฉ”์‹œ์ง€๊ฐ€ ๋„์›€์ด ๋˜์ง€ ์•Š๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ์šฐ๋ฆฌ๋Š” ๊ฐœ๋ฐœ์ž ๊ฒฝํ—˜์— ๋งŽ์€ ๋…ธ๋ ฅ์„ ๊ธฐ์šธ์ด๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜ํ•œ ํ”„๋ŸฐํŠธ์—”๋“œ์™€ ๋ฐฑ์—”๋“œ์—์„œ ์ฝ”๋“œ๋ฅผ ์‰ฝ๊ฒŒ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•˜๋Š” ํ”„๋กœ์ ํŠธ๋ฅผ ์ง„ํ–‰ํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. Melange๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ์™€ ๋„ค์ดํ‹ฐ๋ธŒ๋กœ ์ปดํŒŒ์ผ๋œ ์ฝ”๋“œ ์‚ฌ์ด์—์„œ์š”. ์•ž์„œ ์–ธ๊ธ‰ํ–ˆ๋˜ ์–ธ์–ด๋ณ„ ๊ตฌ๋ฌธ(Closure์—์„œ๋Š” reader conditional์ด๋ผ๊ณ  ๋ถ€๋ฆ…๋‹ˆ๋‹ค. ์ €๋Š” ๊ทธ ํ‘œํ˜„์ด ๋งˆ์Œ์— ๋“ญ๋‹ˆ๋‹ค)์„ ์–ด๋–ป๊ฒŒ ์ •์˜ํ•  ์ˆ˜ ์žˆ์„๊นŒ์š”? ๊ธฐ๋ณธ์ ์œผ๋กœ ์ปดํŒŒ์ผํ•  ๋ฐฑ์—”๋“œ๋ฅผ ์กฐ๊ฑด๋ถ€๋กœ ์ง€์ •ํ•˜๋Š” ์ปดํŒŒ์ผ๋Ÿฌ ์ง€์‹œ๋ฌธ์ž…๋‹ˆ๋‹ค. ๊ทธ ์™ธ์—๋„ ์ ์  ๋” ๋งŽ์€ JavaScript ๊ตฌ๋ฌธ์„ Melange ์ธก์—์„œ ์ง€์›ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ํŠนํžˆ ์ƒ๊ฐํ•˜๊ณ  ์žˆ๋Š” ๊ฒƒ์€ ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ์ž…๋‹ˆ๋‹ค. JavaScript์—์„œ๋Š” ๊ฐ€์ ธ์˜ค๊ธฐ ์œ ํ˜•์ด ๋‘ ๊ฐ€์ง€์ž…๋‹ˆ๋‹ค. ํ•˜๋‚˜๋Š” ๋™๊ธฐ์‹์ด๊ณ  ํŒŒ์ผ์˜ ์ตœ์ƒ์œ„ ์ˆ˜์ค€์— ์„ ์–ธ์œผ๋กœ ๋ฐฐ์น˜ํ•ฉ๋‹ˆ๋‹ค. "๋‹ค๋ฅธ ๋ชจ๋“ˆ์—์„œ ์ด๋Ÿฌํ•œ ๊ฐ’์„ ๊ฐ€์ ธ์˜ค๊ณ  ์‹ถ์Šต๋‹ˆ๋‹ค."๋ผ๋Š” ์„ ์–ธ์ž…๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ๋™์  ๋˜๋Š” ๋น„๋™๊ธฐ ๊ฐ€์ ธ์˜ค๊ธฐ๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ๋Ÿฐํƒ€์ž„์— ๋‹ค๋ฅธ ๋ชจ๋“ˆ์ด๋‚˜ ๋‹ค๋ฅธ ๋ฒˆ๋“ค์„ ๊ฐ€์ ธ์˜ฌ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ฒˆ๋“ค๋Ÿฌ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ด ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฒˆ๋“ค ๋ถ„ํ• ์„ ์ •์˜ํ•ฉ๋‹ˆ๋‹ค. "๋ฉ”์ธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ์ฒญํฌ๋ฅผ ์ œ๊ณตํ•˜๊ณ , ๋Ÿฐํƒ€์ž„์— ๋™์ ์œผ๋กœ ๋‹ค๋ฅธ ๊ฒƒ์„ ๊ฐ€์ ธ์˜ค๋ฉด ๋ฉ”์ธ ๋ฒˆ๋“ค์— ํฌํ•จ๋  ํ•„์š”๊ฐ€ ์—†๋Š” ๋‹ค๋ฅธ ๋…ผ๋ฆฌ์  ์ฒญํฌ์— ๋„ฃ๊ฒ ์Šต๋‹ˆ๋‹ค."๋ผ๋Š” ์‹์ž…๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด ์ด๊ฒƒ์€ Melange ๋กœ๋“œ๋งต์— ์žˆ๋Š” ๊ธฐ๋Šฅ์ด๊ณ  ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ์œผ๋ฉฐ, OCaml์—์„œ ๊ด€์šฉ์ ์ด๋ฉด์„œ๋„ JavaScript์—์„œ ๋ฒˆ๋“ค ๋ถ„ํ• ์˜ ์ด์ ์„ ์ œ๊ณตํ•˜๋Š” ์†”๋ฃจ์…˜์„ ์ œ๊ณตํ•˜๋ ค๊ณ  ๋…ธ๋ ฅํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ์ด ํŠน์ • ์ง€์ ์€ Melange์˜ ์„ฑ์ˆ™๋„ ๊ณก์„ ์—์„œ ์–ด๋””์— ์žˆ๋Š”์ง€ ์ž˜ ๋ณด์—ฌ์ค๋‹ˆ๋‹ค. ์ปดํŒŒ์ผ๋Ÿฌ๊ฐ€ ์‹ค์ œ๋กœ ์•ˆ์ •๋˜๊ณ  ์‚ฌ๋žŒ๋“ค์ด ๋ฌด์–ธ๊ฐ€๋ฅผ ๋งŒ๋“ค๊ณ  ์ถฉ๋ถ„ํžˆ ํฐ ํ”„๋กœ์ ํŠธ๋ฅผ ๋ฐฐํฌํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋ฉด ๊ฑฑ์ •ํ•˜๊ธฐ ์‹œ์ž‘ํ•˜๋Š” ๋ฌธ์ œ์ด๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค.

Antonio Monteiro: ๋งž์Šต๋‹ˆ๋‹ค. ์š”์ฆ˜์€ ๊ทธ๋ ‡๊ฒŒ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์šฐ๋ฆฌ๊ฐ€ ํ•˜๋ ค๋Š” ์ผ์€ ์ด๋ฅผ ๊ด€์šฉ์ ์œผ๋กœ ๋งŒ๋“œ๋Š” ๋ฐฉ๋ฒ•์ž…๋‹ˆ๋‹ค. Melange์—๋Š” ํšจ๊ณผ์ ์œผ๋กœ JavaScript ์ฝ”๋“œ๋ฅผ OCaml ํŒŒ์ผ ๋‚ด์— ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ํƒˆ์ถœ ํ•ด์น˜๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํƒˆ์ถœ ํ•ด์น˜๋‚˜ FFI ์–ธ์–ด(Interop ์–ธ์–ด)๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ๋™์  ๊ฐ€์ ธ์˜ค๊ธฐ๋ฅผ ์ž‘๋™์‹œํ‚ฌ ์ˆ˜ ์žˆ์œผ๋ฉฐ, Melange๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž‘๋™์‹œํ‚ค๋Š” ์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ์•Œ๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋งŒ ์•ˆ์ „์„ฑ์ด ๋งŽ์ด ๋–จ์–ด์ง‘๋‹ˆ๋‹ค. OCaml ๋ชจ๋“ˆ์€ ํƒ€์ž…์ด ์ž˜ ์ง€์ •๋˜์–ด ์žˆ๊ณ  ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ •์˜ํ•  ์ˆ˜ ์žˆ๋‹ค๋Š” ์ ์— ๋Œ€ํ•ด ์กฐ๊ธˆ ์ด์•ผ๊ธฐํ–ˆ์Šต๋‹ˆ๋‹ค. ์•ž์œผ๋กœ ๋‚˜์˜ฌ ๋‚ด์šฉ๊ณผ ์šฐ๋ฆฌ๊ฐ€ ์ž‘์—…ํ•˜๊ณ  ์žˆ๋Š” ๋‚ด์šฉ์„ ๋ฏธ๋ฆฌ ๋ณด์—ฌ๋“œ๋ฆฌ์ž๋ฉด, ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ค๋Š” ์‹œ๊ทธ๋‹ˆ์ฒ˜๋ฅผ ์ •์˜ํ•˜๊ฑฐ๋‚˜ ์ถ”๋ก ํ•˜๋Š” ๊ธฐ๋Šฅ์ž…๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ OCaml ๋ชจ๋“ˆ์„ ๋™์ ์œผ๋กœ ๊ฐ€์ ธ์˜ฌ ๋•Œ ๋ชจ๋“  ๊ฒƒ์ด ์—ฌ์ „ํžˆ ํƒ€์ž… ์•ˆ์ „ํ•˜๊ณ  OCaml ์ฝ”๋“œ๋ฒ ์ด์Šค ๋‚ด์— ์žˆ๋Š” ๋‹ค๋ฅธ ๋ชจ๋“ˆ์„ ์ฐธ์กฐํ•˜๋Š” ๊ฒƒ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

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

Antonio Monteiro: ๋„ค, ์–ธ์–ด์˜ ๋ณด์žฅ์„ ์žƒ๊ณ  ์‹ถ์ง€ ์•Š๊ณ  ๊ฐœ๋ฐœ์ž์—๊ฒŒ ์–ด๋ ค์šด ์ผ์„ ๋งŒ๋“ค๊ณ  ์‹ถ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๋งž์Šต๋‹ˆ๋‹ค. ๋งค์šฐ ์žฌ๋ฏธ์žˆ๋Š” ์ž‘์—…์ฒ˜๋Ÿผ ๋“ค๋ฆฝ๋‹ˆ๋‹ค.

Antonio Monteiro: ๋„ค, ๋งค์šฐ ์žฌ๋ฏธ์žˆ์Šต๋‹ˆ๋‹ค. ์—ฐ๊ตฌ๋„ ๋งŽ์ด ํ•˜๊ณ  ํ”„๋กœํ† ํƒ€์ž…๋„ ๋งŽ์ด ๋งŒ๋“ค์ง€๋งŒ, ๋ช‡ ๊ฐ€์ง€๋Š” ํ•ด๊ฒฐ์ฑ…์„ ์ฐพ์€ ๊ฒƒ ๊ฐ™์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ทธ๋Ÿผ ๊ณ„์† ์ž‘์—…ํ•˜์‹œ๋„๋ก ํ•˜๊ฒ ์Šต๋‹ˆ๋‹ค. ์‹œ๊ฐ„ ๋‚ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ์ดˆ๋Œ€ํ•ด ์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ์ •๋ง ์ฆ๊ฑฐ์› ์Šต๋‹ˆ๋‹ค.

Chris Jenkins: ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค, Antonio. ๋งˆ๋ฌด๋ฆฌํ•˜๊ธฐ ์ „์— Antonio์˜ ์ž‘์—…์„ ์ง€์›ํ•˜๊ณ  ์‹ถ๋‹ค๋ฉด GitHub์—์„œ ํ›„์›ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์‡ผ ๋…ธํŠธ ์•„๋ž˜์— ํŽ˜์ด์ง€ ๋งํฌ๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค. ํšŒ์‚ฌ์—์„œ ํ›„์›ํ•˜๋„๋ก ์„ค๋“ํ•˜๋Š” ๊ฒƒ๋„ ๊ณ ๋ คํ•ด ๋ณด์„ธ์š”. ๋…๋ฆฝ ์˜คํ”ˆ ์†Œ์Šค ๊ฐœ๋ฐœ์ž์—๊ฒŒ ํฐ ๊ธˆ์•ก์ด๋ผ๋„ ์ผ๋ฐ˜ ํšŒ์‚ฌ์˜ IT ์˜ˆ์‚ฐ์—๋Š” ๋ฐ˜์˜ฌ๋ฆผ ์˜ค์ฐจ์— ๋ถˆ๊ณผํ•˜๊ธฐ ๋•Œ๋ฌธ์ž…๋‹ˆ๋‹ค. ์„ค๋“ํ•  ์ˆ˜ ์žˆ๋Š” ์‚ฌ๋žŒ์ด ์žˆ๋‹ค๋ฉด ๊ทธ๋ ‡๊ฒŒ ํ•˜์„ธ์š”. ๋ชจ๋‘์—๊ฒŒ ์ข‹์„ ๊ฒƒ์ž…๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ ๊น€์— Developer Voices Patreon ๊ณ„์ • ๋งํฌ๋„ ์•Œ๋ ค๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค. ์ด ํŒŸ์บ์ŠคํŠธ์˜ ํ–ฅํ›„ ์—ํ”ผ์†Œ๋“œ๋ฅผ ํ›„์›ํ•˜๊ณ  ์‡ผ๊ฐ€ ๊ณ„์† ์ง„ํ–‰๋  ์ˆ˜ ์žˆ๋„๋ก ๋„์™€์ฃผ์„ธ์š”. ๋ฌผ๋ก  ์‡ผ ๋…ธํŠธ๋Š” ์ด๋Ÿฌํ•œ ๋งํฌ์™€ ์ด ์—ํ”ผ์†Œ๋“œ์—์„œ ๋…ผ์˜ํ•œ ํ”„๋กœ์ ํŠธ์— ๋Œ€ํ•œ ๋งํฌ๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ๊ฐ€์žฅ ์ข‹์€ ๊ณณ์ž…๋‹ˆ๋‹ค. ๋‹ค์Œ ์ฃผ์—๋Š” ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ์„ธ๊ณ„์˜ ๋˜ ๋‹ค๋ฅธ ๋›ฐ์–ด๋‚œ ์ธ๋ฌผ๊ณผ ํ•จ๊ป˜ ๋Œ์•„์˜ค๊ฒ ์Šต๋‹ˆ๋‹ค. ๊ตฌ๋…ํ•˜์‹œ๊ณ , ์ด๋ฒˆ ํ† ๋ก ์ด ์ฆ๊ฑฐ์› ๋‹ค๋ฉด ์ข‹์•„์š”๋ฅผ ๋ˆŒ๋Ÿฌ์ฃผ์‹œ๊ณ  ์นœ๊ตฌ์™€ ๊ณต์œ ํ•ด ์ฃผ์„ธ์š”.

Chris Jenkins: ๋˜ ํ•  ๋ง์ด ์žˆ๋‚˜์š”?

Antonio Monteiro: ๋„ค, ํ–ฅํ›„ ๊ฒŒ์ŠคํŠธ์— ๋Œ€ํ•œ ์ œ์•ˆ์ด ์žˆ๋‹ค๋ฉด ์—ฐ๋ฝ์ฒ˜๋ฅผ ํ†ตํ•ด ์•Œ๋ ค์ฃผ์„ธ์š”. ๋ฐฑ๋กœ๊ทธ๋ฅผ ์ฒ˜๋ฆฌํ•˜๊ณ  ์žˆ์ง€๋งŒ ํ•ญ์ƒ ๋” ๋งŽ์€ ์ œ์•ˆ์„ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. ์—ฐ๋ฝ ์ฃผ์„ธ์š”.

Chris Jenkins: ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค. ๊ทธ๋Ÿผ ์ €๋Š” ํ˜ธ์ŠคํŠธ Chris Jenkins์˜€๊ณ , ์ด๊ฒƒ์€ Antonio Monteiro์™€ ํ•จ๊ป˜ํ•œ Developer Voices์˜€์Šต๋‹ˆ๋‹ค. ๋“ค์–ด์ฃผ์…”์„œ ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Antonio Monteiro: ๊ฐ์‚ฌํ•ฉ๋‹ˆ๋‹ค.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment