⚙️ 编译器
TLL 编译器采用经典的多阶段流水线设计。当前处于 Bootstrap 阶段,由 TypeScript 实现,最终目标是 Self-hosting(自举)——TLL 编译器由 TLL 自己编写。
1. 编译流水线
Source (.tll)
│
▼
Lexer ──► Token Stream
│
▼
Parser ──► AST
│
▼
Name Resolution ──► Scoped AST
│
▼
Type Checker ──► Typed AST
│
▼
IR Generation ──► TLL IR (三地址码)
│
▼
Optimization ──► Optimized IR
│
▼
Code Generation ──► TLL Bytecode
│
▼
TLL Runtime (VM / JIT)
2. 各阶段说明
Lexer(词法分析器)
- 将源代码转换为 Token 流
- 支持全部关键字、运算符、字面量(整数/浮点数/字符串/原始字符串)
- 支持十六进制/八进制/二进制整数字面量
- 支持数字分隔符
1_000_000 - 支持行注释
//和文档注释///
Parser(语法分析器)
- 递归下降解析器 + Pratt 运算符优先级解析
- 支持全部语句和表达式
- 支持模式匹配、lambda、管道、范围表达式
- 生成完整的 AST(30+ 节点类型)
Type Checker(类型检查器)
- 作用域解析(Name Resolution)
- 局部类型推断
- 类型兼容性检查
- 穷尽性检查(match 表达式)
- 空安全检查
Code Generation(代码生成)
- 生成 TLL 字节码(基于寄存器的 VM)
- 35+ 操作码
- 支持函数调用、条件跳转、循环、异常处理
3. TLL 字节码规范
TLL Runtime 执行基于寄存器的字节码。核心指令:
| 指令 | 说明 |
|---|---|
LOAD r, const | 加载常量到寄存器 |
LOAD_VAR r, idx | 加载局部变量 |
STORE_VAR idx, r | 存储局部变量 |
ADD/SUB/MUL/DIV r1, r2, r3 | 算术运算 |
EQ/NEQ/LT/GT/LE/GE r1, r2, r3 | 比较运算 |
AND/OR/NOT r1, r2, r3 | 逻辑运算 |
CALL r, func, argc | 函数调用 |
RET r | 函数返回 |
JMP label | 无条件跳转 |
JMP_IF_FALSE r, label | 条件跳转 |
PRINT/PRINTLN r | 输出 |
MAKE_ARRAY/MAP/STRUCT r, count | 创建复合类型 |
INDEX_GET/SET r1, r2, r3 | 索引访问 |
MEMBER_GET/SET r1, r2, name | 成员访问 |
HALT | 停机 |
4. Runtime(运行时)
- 基于寄存器的栈式虚拟机
- 支持函数调用栈帧
- 支持局部变量存储
- 内置字符串、数组、Map 等复合类型
- 未来计划:JIT 编译、GC(可选)、并发调度器
5. 自举路线图
阶段 0: Bootstrap Compiler (TypeScript) ← 当前
│
▼
阶段 1: TLL 可以编译真实项目
│ 完善标准库、类型系统、错误处理
▼
阶段 2: 用 TLL 重写 Compiler
│ TLL Compiler v2.0 由 TLL 编写
▼
阶段 3: Self-hosting(自举)
│ TLL Compiler 可以编译自己
▼
阶段 4: TLL OS 1.0
完整的 AI-Native 操作系统层
6. 贡献指南
欢迎贡献 TLL 编译器!
# 1. Fork 仓库
# 2. 克隆
git clone https://github.com/aliquanhou/tll.git
cd tll/tll-compiler
# 3. 安装依赖
npm install
# 4. 编译
npx tsc
# 5. 运行测试
node --test dist/tests/
# 6. 创建分支
git checkout -b feature/my-feature
# 7. 提交 PR
git push origin feature/my-feature
7. 调试工具
# 查看 Token 流
tll lex program.tll
# 查看 AST(JSON)
tll parse program.tll
# 仅类型检查
tll check program.tll
# 编译为字节码
tll build program.tll
# 生成 program.tllbc
# 运行
tll run program.tll