nova - mysangle/twentyhours GitHub Wiki
- ์คํ์ ์ํ ๋ฐ์ดํธ ์ฝ๋๋ฅผ ์์๋๋ก ๋ฉ๋ชจ๋ฆฌ์ ์ ์ฅํ๋ค.
- ์์๋ฅผ ์ํด ๋ณ๋์ 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 ์์น์ ์ ์ฅํ๋ค.