C 언어로 Lox 인터프리터 만들기 2

Will-Big·2025년 9월 26일

Interpreter

목록 보기
2/8

우리가 만드는 VM은 123 같은 숫자나 "hello world" 같은 문자열, 즉 '값'을 다룰 수 있어야 합니다. 사용자가 생성 가능한 모든 코드는 바이트 코드로 저장되기 때문에 상수 값 또한 이와 같은 형식으로 저장되어야 합니다.

바이트 코드로 저장하기 위해서, 이전에 만들었던 Chunk 구조체를 활용합니다.

typedef struct
{
    int count;
    int capacity;
    uint8_t* code;
} Chunk;

print 10;과 같은 코드가 있다면 아래 그림과 같이 저장되는 형식입니다. code 배열에 명령어와 인자들이 바이트 코드로 변환되어 순차적으로 저장됩니다.

하지만 모든 데이터에 대해 위 그림같이 명령어 뒤에 상수를 놓는 것은 불가능한 작업입니다. print "hello, world";의 경우, 상수에 해당하는 문자열의 크기가 가변적이기 때문에 바이트의 할당량을 예측할 수 없습니다.

그래서 다음 바이트 코드의 인덱스를 VM에서 알 수 없게 됩니다. 이 문제는 상수 전용 풀을 생성하고 바이트 코드안에 상수가 존재하는 인덱스를 작성하여 해결 할 수 있습니다.

마치며

명령어와 인자는 청크의 code에 저장되며 크기는 바이트 단위입니다. 명령어에 필요한 인자 크기가 항상 단일 바이트일 이유는 없지만 VM에서 크기를 예측할 수 있어야 정상적인 실행이 가능합니다. 따라서 가변적인 값을 고려하여 상수 풀을 만들고 이를 참조하는 방식으로 바이트 코드를 생성할 수 있습니다.

참고자료 : Crafting Interpreters - constants
Github : Will-Big/clox

profile
개발자가 되고싶어요

0개의 댓글