프로그래밍 언어 만들기 1일차

init·2026년 10월 1일

lize lang

목록 보기
1/1
post-thumbnail

프로그래밍 언어를 직접 만들어 보겠습니다.
이름은 Lize로 정했습니다.

사용 툴은 x86_64 환경의 Ubuntu(macOS 환경에서 Docker를 이용), nasm, ld, Makefile 등입니다.

컴파일 언어를 만들기로 계획했고, 컴파일 명령어는 lzc filename 형식입니다.
프로젝트 구성은 다음과 같습니다.

|-- Makefile
|-- compiler
|   |-- main.asm
|-- examples
|   |-- test.lz
`-- lzc

일단 먼저 명령어를 입력하면 파일을 열고 컴파일을 해야합니다.
파일부터 열어보겠습니다.

x86_64 환경에서 명령어 실행은 rax 레지스터에 명령어 정보를 넣고, syscall을 쓰는 것입니다.
매개변수(정확히는 명령어에 사용될 정보들)는 rdi, rsi, rdx, rcx 등에 넣고, 추가로 더 필요할 경우 r10, r12 등 추가 레지스터에, 그 이후에는 스택에 넣습니다. 대부분의 경우 반환값(결과값)은 rax에 돌아갑니다.

rax에 257을 넣어 openat을 실행시키고, r12에 반환값을 저장해둡니다.
이 반환값은 file descriptor로, 파일이 성공적으로 열린다면 3 이상의 정수 값을 가질 것입니다.
r12에 저장해두는 이유는, 다음 명령어를 실행할 때 rax를 사용해야하기 때문에, 그 값을 보존하기 위해서입니다.

rdi, rsi, rdx, r10은 각각 AT_FDCWD, "examples/hello.lz", O_RDONLY, 0을 의미합니다.
openat 명령어에 필요한 요소들입니다.

직후 rax에 60을 넣어 exit를 실행시킵니다. rdi를 xor하여 0으로 만듭니다. 즉, 해당 코드는 exit(0)을 실행시킵니다.

nasm -f elf64 compiler/main.asm -o compiler/main.o
ld compiler/main.o -o lzc
./lzc

로 실행하면 출력값은 없습니다. 에러가 없으니 정상적으로 파일을 불러왔음을 알 수 있습니다.

컴파일과 실행을 Makefile로 만들어줬습니다.

이제 파일을 제대로 읽어봅시다.

명령어의 사용법에 따라 read, write, close를 추가했습니다. buffer를 bss 영역에 할당해주고, 버퍼를 사용해 read와 write를 실행시켰습니다.

examples/hello.lz에 적당한 내용을 쓰고 실행시키면 다음과 같은 결과가 나옵니다.

$ make
nasm -f elf64 compiler/main.asm -o compiler/main.o
ld compiler/main.o -o lzc
$ ./lzc
적당한 내용

파일 읽기에 성공했습니다.

다음에는 Tokenization을 위해 Lexer를 구현하고 Parsing해보겠습니다.
감사합니다.

profile
initialize() complete. Ready to build, optimize, and innovate.

0개의 댓글