KITE:专为Termux打造的C语言手写编程语言
一位开发者用纯C语言实现了KITE编程语言,并将其编译为可在Android的Termux上运行。该解释器采用经典架构:词法分析器、解析器和树遍历解释器。总代码量约3200行,通过引用计数而非垃圾回收来优化性能。
语法设计注重可读性:无需分号,代码块使用冒号和end。变量用set声明,条件结构为when/orwhen/else,返回语句是give。
基础代码示例:
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。
解释器
树遍历解释器(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:
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、lerprand:rand()、rand_choice()string:str_pad_left、str_countlist:list_sum、list_zipio:file_read、file_linesos:os_env、os_shell
在Termux中编译与运行
安装步骤:
pkg install clang maketar -xzf kite-lang.tar.gzcd kite-langmake CC=clangcp kite $PREFIX/bin/kitekite --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
暂无评论。