返回首页

KITE:Termux 和 Android 的 C 语言

KITE — Termux 的极简解释型语言,用 C 实现。架构包括 lexer、recursive AST parser 和 tree-walking interpreter,支持 reference counting。支持 OOP、closures、错误处理和标准库。

创建了 KITE — 移动端的快速 C 语言
Advertisement 728x90

KITE:专为Termux打造的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_SETTK_IDENTTK_NUMTK_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

错误类型:ZeroDivisionErrorNameErrorIndexErrorTypeErrorIOErrorAccessError

标准模块:

  • mathtanlog2clamplerp
  • randrand()rand_choice()
  • stringstr_pad_leftstr_count
  • listlist_sumlist_zip
  • iofile_readfile_lines
  • osos_envos_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的极简语法,提升可读性并预防错误。
  • 引用计数而非垃圾回收,确保性能可预测。
  • 完整面向对象功能,支持继承、闭包和封装。
  • 在Android/Termux上编译,无需额外依赖。
  • 开源(MIT协议),欢迎分支和PR。

— Editorial Team

Advertisement 728x90

继续阅读