- x86-16 어셈블리로 작성된 SectorC는 x86 머신의 부트 섹터(512바이트) 안에 들어가는 초소형 C 컴파일러로, 실제 동작 가능한 프로그램을 작성할 수 있을 만큼의 C 언어 부분집합을 지원함
-
전역 변수, 함수, if/while 문, 연산자, 포인터 역참조, 주석, 인라인 어셈블리 등을 포함해, 최소한의 구조로도 완전한 프로그램 실행이 가능함
- 토크나이저를 단순화하기 위해 공백 기반 토큰화와 atoi() 해시를 이용한 Barely C 언어를 설계, 기존 C 문법을 유지하면서도 극단적인 크기 절감을 달성함
- 코드 최적화 과정에서 점프 제거, 호출 병합, 8비트 오프셋 활용, stosw/lodsw 사용 등 다양한 어셈블리 수준의 압축 기법을 적용해 468바이트에서 303바이트로 축소함
- 결과적으로 512바이트 안에서 토크나이저, 파서, 코드 생성기, 런타임을 모두 포함한 완전한 C 컴파일러를 구현, 소프트웨어 최소화의 극단적 사례를 보여줌
SectorC 개요
- SectorC는 x86-16 어셈블리로 작성된 C 컴파일러로, 512바이트 부트 섹터 안에 완전히 들어감
- 지원 기능에는 전역 변수, 함수, 제어문(if/while), 다양한 연산자, 포인터 역참조, 인라인 어셈블리, 주석 등이 포함됨
- 예시 프로그램으로 VGA 모드에서 사인파 애니메이션을 그리는 코드가 제시됨
설계 배경과 접근 방식
- 기존 C 토크나이저는 512바이트로는 불가능할 정도로 크기 때문에, 언어 구조 자체를 단순화해야 했음
-
Big Insight #1: Forth 언어처럼 공백으로 구분된 토큰 구조를 도입해 “Barely C”라는 변형 언어를 설계
- 예: int(main)(){while(!done){ 같은 구문을 하나의 “메가 토큰”으로 처리
- 기존 C 컴파일러에서도 여전히 유효한 C 코드로 인식됨
-
Big Insight #2: atoi() 함수를 해시 함수처럼 사용해 토큰을 숫자로 변환
- 정수 리터럴, 키워드, 식별자를 모두 atoi() 결과값으로 처리
- 식별자는 64K 배열의 인덱스로 접근
Barely C 구현
- 첫 구현은 468바이트로, atoi 기반 토큰을 사용하는 재귀 하강 파서 구조
- 심볼 테이블 없이 64K 세그먼트를 해시값으로 직접 접근
- 코드 생성은 OTCC 스타일로 ax 레지스터를 결과 저장소로 사용
- 이후 바이트 스레드 코드(byte-threaded code) 실험을 통해 Forth식 구조를 시도했으나, 512바이트 내에서는 오히려 비효율적이어서 폐기됨
코드 최소화 기법
- 직선적 구조로 돌아가 468바이트 → 303바이트로 축소
-
점프 제거(fall-through) , tail-call, 호출 병합(call fusion) , stosw/lodsw 활용, 8비트 점프 오프셋 유지 등의 기법 사용
- 207바이트 여유 공간을 확보해 추가 기능을 구현
완전한 C 기능 확장
- 200바이트 추가로 완전한 C 문법 지원 달성
- 중첩된 if/while 블록, 다양한 *이항 연산자(+, -, , &, |, ^, <<, >>, ==, !=, <, >, <=, >=)
-
함수 정의 및 재귀 호출, 인라인 어셈블리(asm) , 한 줄/여러 줄 주석 지원
- 연산자 테이블(binary_oper_tbl)을 통해 각 연산자를 4바이트로 정의, 14개 연산자를 56바이트로 처리
문법 구조
- 전체 문법은 program, var_decl, func_decl, statement, expr 등으로 구성
-
// 및 /* */ 주석 모두 지원
- 문법 정의 텍스트 자체가 704바이트로, 실제 구현보다 큼
인라인 어셈블리와 런타임
-
asm 구문을 통해 x86-16 기계어를 직접 삽입 가능
- 런타임(rt/)은 C로 작성된 두 파일로 구성
-
rt/lib.c: 인라인 어셈블리 기반 라이브러리 루틴
-
rt/_start.c: 프로그램 진입점 _start()
예제 프로그램
-
examples/hello.c: 텍스트를 0xB8000 메모리에 직접 출력
-
examples/sinwave.c: VGA 모드 0x13에서 사인파 애니메이션 표시
-
examples/twinkle.c: PC 스피커로 “Twinkle Twinkle Little Star” 연주 (소리 경고 포함)
결론
- SectorC는 불가능해 보이는 목표를 실현한 초소형 C 컴파일러로,
소프트웨어 최소화와 창의적 언어 설계의 극단적 사례를 보여줌
- 글의 마지막은 유머러스한 “무엇을 배웠는가” 선택지로 마무리되며,
불가능에 도전하는 태도와 소프트웨어 단순화의 가치를 풍자적으로 강조함