nova - mysangle/twentyhours GitHub Wiki

Nova

Crafting Interpreters

  • ์‹คํ–‰์„ ์œ„ํ•œ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ๋ฉ”๋ชจ๋ฆฌ์— ์ €์žฅํ•œ๋‹ค.
  • ์ƒ์ˆ˜๋ฅผ ์œ„ํ•ด ๋ณ„๋„์˜ constant pool์„ ๋‘”๋‹ค.
    • bytecode ๋’ค์— ์ƒ์ˆ˜์˜ ์ธ๋ฑ์Šค๋ฅผ ๋‘”๋‹ค.
    • ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ•ด์„์‹œ ์ธ๋ฑ์Šค๋ฅผ ํ†ตํ•ด ์ƒ์ˆ˜์˜ ๊ฐ’์„ ์ฐพ๋Š”๋‹ค.
    • ์˜ˆ๋ฅผ ๋“ค์–ด ๋ฐ”์ดํŠธ ์ฝ”๋“œ๊ฐ€ 'OP_CONSTANT 0' ์ด๋ผ๋ฉด ์ƒ์ˆ˜ ํ’€์˜ ์ธ๋ฑ์Šค 0์ธ ๊ณณ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์˜จ๋‹ค.
  • line number ์ €์žฅ
    • ๋ฐ”์ดํŠธ ์ฝ”๋“œ์™€ ๊ฐ™์€ ํฌ๊ธฐ์˜ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹น
    • ๋ฐ”์ดํŠธ ์ฝ”๋“œ์™€ ๊ฐ™์€ ์œ„์น˜์— line number๋ฅผ ์ €์žฅ
    • ์—๋Ÿฌ๊ฐ€ ๋‚˜๊ฑฐ๋‚˜ ๋””๋ฒ„๊ทธ์šฉ์œผ๋กœ ์‚ฌ์šฉ
  • VM์€ ๋ฐ”์ดํŠธ ์ฝ”๋“œ๋ฅผ ์ˆœ์„œ๋Œ€๋กœ ํ•˜๋‚˜ํ•˜๋‚˜์”ฉ ์‹คํ–‰ํ•œ๋‹ค.
  • stack ๊ธฐ๋ฐ˜์œผ๋กœ ๋ฐ”์ดํŠธ์ฝ”๋“œ ํ•ด์„
    • ์˜ˆ๋ฅผ ๋“ค์–ด 3 + 2 ๊ฐ€ ์žˆ์œผ๋ฉด 3์„ ์Šคํƒ์— ๋„ฃ๊ณ , ๋‹ค์Œ์— 2๋ฅผ ์Šคํƒ์— ๋„ฃ๊ณ , ๋‹ค์Œ์— +๋ฅผ ๊ณ„์‚ฐํ•˜๊ธฐ ์œ„ํ•ด ์Šคํƒ์—์„œ ๊ฐ’ 2๊ฐœ๋ฅผ pop ํ•œ ํ›„์— +๋ฅผ ํ•œ ํ›„ ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์‹œ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    • ๋ฐ”์ดํŠธ์ฝ”๋“œ๋Š” [OP_CONSTANT(3), OP_CONSTANT(2), OP_ADD(+)]์˜ ์ˆœ์„œ๋กœ ์‹คํ–‰๋œ๋‹ค.
  • scanner
    • ์ฐธ๊ณ ํ•  ํ•จ์ˆ˜: advance, match, peek, peekNext
    • peek, peekNext๋Š” no consume ํ•จ์ˆ˜์ด๋‹ค.
    • match๋Š” ๋งค์น˜๊ฐ€ ๋  ๋•Œ๋งŒ consumeํ•œ๋‹ค.
    • ์˜ˆ์•ฝ์–ด์ธ์ง€ ํ™•์ธ์„ ์œ„ํ•ด trie๋ฅผ ์‚ฌ์šฉํ•œ๋‹ค.
      • ํ‚ค์›Œ๋“œ์— ๋”ฐ๋ผ ์–ด๋–ค ํ‚ค์›Œ๋“œ๋Š” ์ฒซ character๋ฅผ ๋ณด๊ณ , ๋‚˜๋จธ์ง€๋ฅผ ํ•œ๋ฒˆ์— ๋น„๊ตํ•˜๊ธฐ๋„ ํ•˜๊ณ ,
      • ์–ด๋–ค ํ‚ค์›Œ๋“œ๋Š” ์ฒซ character๋ฅผ ๋ณด๊ณ , ๋‘๋ฒˆ์งธ character๋ฅผ ๋ณด๊ณ , ๊ทธ๋ฆฌ๊ณ  ๋‚˜๋จธ์ง€๋ฅผ ํ•œ๋ฒˆ์— ๋น„๊ตํ•˜๊ธฐ๋„ ํ•œ๋‹ค.
      • ์ฒซ๋ฒˆ์งธ ๋˜๋Š” ๋‘๋ฒˆ์งธ character๋ฅผ ๋ณด๋Š” ๊ฒƒ๋งŒ์œผ๋กœ ๋น ๋ฅด๊ฒŒ ์˜ˆ์•ฝ์–ด์ธ์ง€ ์•„๋‹Œ์ง€๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋‹ค.
  • panic mode
    • ํŒŒ์‹ฑ์ค‘์— ์—๋Ÿฌ ๋ฐœ์ƒํ•˜๋ฉด panicMode๋ฅผ true๋กœ ์„ค์ •
    • panicMode๊ฐ€ true์ด๋ฉด ์—๋Ÿฌ๋ฅผ ํ™”๋ฉด์— ํ”„๋ฆฐํŠธ ํ•˜์ง€ ์•Š๋Š”๋‹ค.
    • synchronization point(statement boundaries)์— ์ด๋ฅด๋ฉด panic mode๋ฅผ false๋กœ ์„ค์ •ํ•œ๋‹ค.
  • Value
    • ๊ฐ’์˜ ํƒ€์ž…์„ ์„ค๋ช…ํ•˜๋Š” ValueType๊ณผ ์‹ค์ œ ๊ฐ’์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ๋‹ค.
    • ์‹ค์ œ ๊ฐ’์€ ํƒ€์ž…์— ๋”ฐ๋ผ ํฌ๊ธฐ๊ฐ€ ๋‹ค๋ฅด๋ฏ€๋กœ union์œผ๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.
    • string, instance, function ๊ฐ™์€ ๊ฐ’๋“ค์€ union ์•ˆ์— ์ง์ ‘ ๋“ค์–ด๊ฐ€์ง€ ์•Š๊ณ  ํž™ ๋ฉ”๋ชจ๋ฆฌ์— ๋Œ€ํ•œ ํฌ์ธํ„ฐ(Obj)๋กœ ๊ตฌ์„ฑํ•œ๋‹ค.
      • Obj๋Š” ํƒ€์ž…์„ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
      • String์˜ ๊ฒฝ์šฐ๋Š” ObjString์ด ๋˜๊ณ , ์ด์˜ ์•ž๋ถ€๋ถ„์ด Obj์ด๋‹ค.
      • ์˜ˆ: Obj์˜ ํƒ€์ž…์„ ๋ณด๊ณ  String์ด๋ฉด ObjString์œผ๋กœ ๋ณ€ํ™˜
  • OP_FALSE, OP_TRUE, OP_NIL์ด ๋ณ„๋„๋กœ ์žˆ๋Š” ์ด์œ 
    • ํŠน์ • ๊ฐ’์— ๋Œ€ํ•œ ์ „์šฉ ์—ฐ์‚ฐ์„ ๋‘๋ฉด ๋” ๋น ๋ฅด๊ฒŒ ๋™์ž‘ํ•  ์ˆ˜ ์žˆ๋‹ค.
  • Obj๋Š” object list๋ฅผ ์—ฐ๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ next ํฌ์ธํ„ฐ๋ฅผ ํฌํ•จํ•˜๊ณ  ์žˆ๋‹ค.
    • ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๋Š” ์ด object list์˜ head๋กœ๋ถ€ํ„ฐ ์ถœ๋ฐœํ•˜์—ฌ ๋๊นŒ์ง€ ์ˆœํšŒํ•ด์„œ ์–ด๋–ค ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์ ‘๊ทผ ๊ฐ€๋Šฅํ•œ์ง€๋ฅผ ์•Œ ์ˆ˜ ์žˆ๋‹ค.
    • vm์— ์ด object list์˜ head๋ฅผ ํฌํ•จํ•˜์—ฌ ๊ฐ€๋น„์ง€ ์ฝœ๋ ‰ํ„ฐ๊ฐ€ root๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•œ๋‹ค.
  • ObjString์€ string์˜ hash๋ฅผ ๋‚ด๋ถ€์— ์ €์žฅํ•˜๊ณ  ์žˆ๋Š”๋‹ค.
    • ์ŠคํŠธ๋ง์„ ์ƒ์„ฑํ•  ๋•Œ๋งˆ๋‹ค ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์ŠคํŠธ๋ง์„ ์ €์žฅ
    • ์ค‘๋ณต๋œ ์ŠคํŠธ๋ง์„ ๋งŒ๋‚˜๋ฉด ์ƒˆ๋กœ ๋ฉ”๋ชจ๋ฆฌ๋ฅผ ํ• ๋‹นํ•˜์ง€ ์•Š๊ณ  ํ•ด์‹œ ํ…Œ์ด๋ธ”์— ์žˆ๋Š” ์ŠคํŠธ๋ง์„ ์‚ฌ์šฉํ•œ๋‹ค.(String Interning)
  • Global Variables
    • ์ „์—ญ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”
    • OP_DEFINE_GLOBAL
      • ์ „์—ญ ๋ณ€์ˆ˜ ์ด๋ฆ„: ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ constant table์˜ index
      • ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’์€ ์Šคํƒ์— ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
      • ์ด ๋‘๊ฐœ๋ฅผ ๊ฐ€์ง€๊ณ  ๋ณ€์ˆ˜์˜ ์ด๋ฆ„๊ณผ ๊ฐ’์„ ์ „์—ญ ๋ณ€์ˆ˜๋ฅผ ์ €์žฅํ•˜๋Š” ํ…Œ์ด๋ธ”์— ๋„ฃ๋Š”๋‹ค.
    • OP_GET_GLOBAL
      • ์ „์—ญ ๋ณ€์ˆ˜ ์ด๋ฆ„: ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ constant table์˜ index
      • ์ด๋ฆ„์œผ๋กœ๋ถ€ํ„ฐ ํ…Œ์ด๋ธ”์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ์Šคํƒ์— ๋„ฃ๋Š”๋‹ค.
    • OP_SET_GLOBAL
      • ๋ณ€์ˆ˜ ๋’ค์— = ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋Š” OP_GET_GLOBAL์ด ์•„๋‹Œ ๊ฐ’์„ ํ• ๋‹นํ•˜๋Š” ๊ฒƒ์œผ๋กœ ์ฒ˜๋ฆฌํ•œ๋‹ค.
      • ์ „์—ญ ๋ณ€์ˆ˜ ์ด๋ฆ„: ํŒŒ๋ผ๋ฉ”ํ„ฐ๋กœ constant table์˜ index
      • ์ „์—ญ ๋ณ€์ˆ˜์˜ ๊ฐ’: ์Šคํƒ์— ์ €์žฅ
      • ์ƒ์ˆ˜ ์ธ๋ฑ์Šค๋กœ๋ถ€ํ„ฐ ์ด๋ฆ„์„, ์Šคํƒ์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ ํ…Œ์ด๋ธ”์— ์ €์žฅํ•œ๋‹ค.
  • Local Variables
    • ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ์ „์—ญ ๋ณ€์ˆ˜์ฒ˜๋Ÿผ ์ด๋ฆ„์œผ๋กœ ์ฐธ์กฐ๋˜์ง€ ์•Š๊ณ , stack์˜ index๋กœ ์ฐธ์กฐ๋œ๋‹ค.
    • stack์˜ index ์œ„์น˜์— ๊ฐ’์ด ์ €์žฅ๋˜์–ด ์žˆ๋‹ค.
    • ํ˜„์žฌ Compiler์˜ locals ์— ๋ณ€์ˆ˜ ์ด๋ฆ„ ์ €์žฅ
    • ๋กœ์ปฌ ๋ณ€์ˆ˜๋Š” ์Šคํƒ์— ์žˆ์œผ๋ฏ€๋กœ block์„ ๋‚˜๊ฐˆ ๋•Œ block scope์˜ ๋ณ€์ˆ˜๋“ค์„ ์Šคํƒ์—์„œ ์ œ๊ฑฐ(pop)ํ•ด์ค˜์•ผ ํ•œ๋‹ค.
    • OP_GET_LOCAL: ๋ณ€์ˆ˜๊ฐ€ ์ €์žฅ๋˜์–ด ์žˆ๋Š” ์Šคํƒ์˜ index๋ฅผ param์œผ๋กœ ๊ฐ–๋Š”๋‹ค.
    • OP_SET_LOCAL: ์Šคํƒ์˜ top์—์„œ ๊ฐ’์„ ๊ฐ€์ ธ์™€์„œ stack์˜ index ์œ„์น˜์— ์ €์žฅํ•œ๋‹ค.