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

Will-Big·2025년 9월 25일

Interpreter

목록 보기
1/8

Crafting Interpreters 라는 웹 교재를 활용하여 C 언어를 기반으로 동작하는 Lox 언어의 인터프리터를 만들고 있습니다.

코드에 대한 설명과 전체 구조는 웹 교재를 통해 확인할 수 있으므로 이 페이지에서는 다루지 않습니다. 주로 교재를 따라 만들어보며 생겼던 의문이나 다시 정리하고 싶은 내용들을 위주로 작성할 계획입니다.

이번 정리는 인터프리터의 이해를 위한 VM(가상 머신)과 Chunk에 대한 기초를 다룹니다.

VM과 Chunk의 관계

Lox 인터프리터의 최종 목표는 사용자가 작성한 Lox 코드를 실행하는 것입니다. 이 과정은 크게 두 단계로 나뉩니다.

컴파일: 사람이 이해하는 Lox 코드(var a = 1;)를 기계(VM)가 이해하는 저수준 명령어, 즉 바이트코드(Bytecode)로 번역합니다.

실행: 가상 머신(VM)이라는 엔진이 이 바이트코드를 한 줄씩 읽어 실행합니다.

여기서 Chunk는 바로 그 바이트코드가 담기는 '명령서 뭉치' 역할을 합니다. 컴파일러가 Lox 코드를 번역하여 Chunk라는 명령서 뭉치를 만들면, VM이 그걸 가져다가 실행하는 구조입니다.

Chunk 구조체 파헤치기

사용자가 얼마나 긴 코드를 짤지 미리 알 수 없으므로, 이 명령서 뭉치는 필요에 따라 자동으로 길어지는 기능이 있어야 합니다. 그래서 Chunk 구조체는 다음과 같은 세 가지 핵심 멤버로 구성됩니다.

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

int count: 현재 사용 중인 바이트의 개수입니다.
int capacity: 현재 할당된 메모리의 총 용량입니다.
uint8_t* code: 실제 명령어 바이트들이 저장되는 메모리 공간입니다.

새로운 명령어를 추가할 때마다 공간이 부족하면(count == capacity) 메모리를 재할당(realloc)합니다. 이와 관련된 함수는 웹 교재를 참고하거나 글 하단의 Github - memory 소스 코드를 통해 확인할 수 있습니다.

마치며

현재는 기본 명령어 단위인 Chunk만 의 구조만 설계한 상태입니다. 각 명령어를 분해하기 위한 disassemble 관련 함수도 존재합니다. 앞으로 교재를 진행하며 VM, 가비지 컬렉터, 상수와 변수에 대한 처리를 구현하며 정리할 예정입니다.

Github : Will-Big/clox

profile
개발자가 되고싶어요

0개의 댓글