홈으로 돌아가기

KITE: Termux와 Android를 위한 C 언어

KITE — Termux용 C로 구현된 미니멀리스틱 인터프리터 언어. 아키텍처에는 lexer, 재귀 AST parser 및 reference counting tree-walking 인터프리터 포함. OOP, closures, 오류 처리 및 표준 라이브러리 지원.

모바일용 빠른 C 언어 KITE 제작
Advertisement 728x90

KITE: C로 구현된 터미널용 수제 프로그래밍 언어

한 개발자가 순수 C로 KITE 프로그래밍 언어를 구현하여 Android의 Termux에서 실행되도록 컴파일했습니다. 이 인터프리터는 고전적인 아키텍처를 사용합니다: 렉서, 파서, 트리 워킹 인터프리터. 전체 코드베이스는 약 3200줄이며, 가비지 컬렉션 대신 참조 카운팅을 통해 성능에 중점을 둡니다.

문법은 가독성을 위해 설계되었습니다: 세미콜론 없음, 블록은 콜론과 end 사용. 변수는 set으로 선언, 조건문은 when/orwhen/else, 반환은 give입니다.

기본 코드 예시:

Google AdInline article slot
set name = "world"
say("Hello, ${name}!")

def factorial(n):
    when n <= 1: give 1 end
    give n * factorial(n - 1)
end

loop for i in range(10):
    say("${i}! = ${factorial(i)}")
end

인터프리터 아키텍처

렉서

렉서(lexer.c, ~200줄)는 소스 코드를 토큰화합니다. 문자열 보간 ${}을 지원합니다: "Hello, ${name}!"은 하위 표현식이 있는 TK_FMTSTR이 됩니다. 토큰: TK_SET, TK_IDENT, TK_NUM, TK_PLUS 등.

파서

재귀 하강 파서(parser.c, ~700줄)가 AST를 구축합니다. 노드는 열거형 NKind입니다:

typedef enum {
    ND_NUM, ND_STR, ND_FMTSTR, ND_BOOL, ND_NIL,
    ND_SET, ND_ASSIGN, ND_BINOP, ND_UNOP,
    ND_CALL, ND_INDEX, ND_PROP,
    ND_DEF, ND_WHEN, ND_LOOP_WHILE, ND_LOOP_FOR,
    ND_DO, ND_OBJ, ND_GIVE, ND_BREAK, ND_NEXT,
    /* ... */
} NKind;

표현식 우선순위: assign → or → and → not → cmp → add → mul → pow → unary → postfix → primary.

Google AdInline article slot

인터프리터

트리 워킹 인터프리터(interp.c, ~1600줄)는 AST를 재귀적으로 순회합니다:

Value *eval(Interp *ip, Node *n, Env *env) {
    switch (n->kind) {
        case ND_NUM:  return val_num(n->num);
        case ND_SET: {
            Value *v = eval(ip, n->set.val, env);
            env_def(env, n->set.name, v);
            return val_nil();
        }
        /* ... */
    }
}

메모리 관리와 클로저

Value 구조체의 참조 카운팅:

struct Value {
    VType type;
    int   refs;
    union { double num; char *str; KiteList *list; /* ... */ };
};

val_ref() / val_unref()가 할당 해제를 관리합니다. 클로저는 Env를 캡처합니다:

Google AdInline article slot
typedef struct KiteFn {
    char  *name;
    char **params;
    int    nparams;
    Node  *body;
    Env   *closure;
    int    refs;
} KiteFn;

예시:

def make_counter(start):
    set count = start
    def inc():
        count += 1
        give count
    end
    give inc
end

set c = make_counter(0)
say(c())   # 1
say(c())   # 2

객체 지향 프로그래밍

obj를 통한 OOP: 클래스는 메서드가 있는 KiteClass, 인스턴스는 필드가 있는 KiteInstance. 상속, super, _를 사용한 비공개 필드.

obj Animal:
    set name = nil

    def init(self, name):
        self.name = name
    end

    def speak(self):
        say("${self.name} makes a sound")
    end
end

obj Dog extends Animal:
    set _tricks = 0

    def learn(self):
        self._tricks += 1
    end

    def speak(self):
        super.speak(self)
        say("${self.name}: Woof!")
    end
end

set d = Dog.new("Buddy")
d.learn()
d.speak()
say(d is Dog)       # true

오류 처리와 표준 라이브러리

do/err 블록:

do:
    set data = file_read("config.txt")
err IOError:
    say("File not found, creating...")
    file_create("config.txt")
err:
    say("Unexpected error: ${err_msg}")
end

오류 유형: ZeroDivisionError, NameError, IndexError, TypeError, IOError, AccessError.

표준 모듈:

  • math: tan, log2, clamp, lerp
  • rand: rand(), rand_choice()
  • string: str_pad_left, str_count
  • list: list_sum, list_zip
  • io: file_read, file_lines
  • os: os_env, os_shell

Termux에서 컴파일 및 실행

설치 방법:

  • pkg install clang make
  • tar -xzf kite-lang.tar.gz
  • cd kite-lang
  • make CC=clang
  • cp kite $PREFIX/bin/kite
  • kite --version

REPL 지원, vim/micro와 구문 강조.

파일 통계:

| 파일 | 줄 수 | 역할 |

|-----------|--------|--------------------------|

| kite.h | ~250 | 타입, AST |

| lexer.c | ~200 | 토크나이저 |

| parser.c | ~700 | 파서 |

| value.c | ~300 | 값, 참조 카운트 |

| interp.c | ~1600 | 인터프리터 |

| main.c | ~120 | REPL, 진입점 |

총계: ~3200줄.

핵심 요약

  • 가독성과 오류 방지를 위한 set/when/give 미니멀리스트 문법.
  • GC 없이 참조 카운팅으로 예측 가능한 성능 보장.
  • 상속, 클로저, 캡슐화를 갖춘 완전한 OOP 기능.
  • Android/Termux에서 의존성 없이 컴파일 가능.
  • 오픈 소스(MIT), 포크 및 PR 준비 완료.

— Editorial Team

Advertisement 728x90

다음 읽기