Cute, but not just cute.
一个轻量级编程语言,支持编译为 x86 汇编代码。包含词法分析、语法分析、类型检查、代码生成和递归优化等完整编译器实现。
- 完整的编译流程:词法分析 → 语法分析 → 类型检查 → 代码生成
- x86 目标架构:生成 NASM 兼容的 x86 汇编代码
- 递归优化:自动检测并优化递归函数,转换为迭代版本
- 类型系统:支持多种基本数据类型(i8, i16, i32, i64, u8, u16, u32, u64, f32, f64, bool, byte, string)
- 控制流:支持 if/else、for 循环、函数调用和返回
- 寄存器管理:智能寄存器分配和栈空间管理
tiny/
├── compile/ # 编译器后端
│ ├── arch/ # 目标架构相关代码
│ │ └── x86/ # x86 架构实现(cdecl/stdcall 调用约定)
│ ├── context/ # 编译器上下文
│ └── regmgr/ # 寄存器管理器
├── error/ # 错误处理模块
├── lexer/ # 词法分析器
├── optimizer/ # 优化器
│ └── recursion/ # 递归优化模块
├── parser/ # 语法分析器
├── type/ # 类型系统
├── utils/ # 工具函数
├── test/ # 测试用例
└── main.go # 主程序入口
- Go 1.25+
- NASM(汇编器)
- GCC 或 LD(链接器)
git clone <repository-url>
cd tiny
go build -o tiny编译 .cute 源文件:
# 使用默认 test 目录
./tiny
# 编译指定文件或目录
./tiny ./test/a.cute
# 编译并生成可执行文件
./tiny ./test/a.cute
nasm -f elf32 _main.asm
ld -m elf_i386 _main.o -o output
./output或者使用提供的脚本:
# Linux/macOS
./run.sh
# Windows
run.batfn fib(i:i32) i32 {
if (i<=2) {
ret 1
}
ret fib(i-1) + fib(i-2)
}
fn main() {
x := 10
y:i32 = 20
z = x + y
}
fn sum(n:i32) i32 {
result := 0
for (i:=1; i<=n;) {
result = result + i
i = i + 1
}
ret result
}
支持以下类型:
- 整数类型:
i8,i16,i32,i64,u8,u16,u32,u64,int,uint - 浮点类型:
f32,f64 - 其他:
bool,byte,string
- 词法分析(lexer/):将源代码转换为 Token 流
- 语法分析(parser/):构建抽象语法树(AST)
- 类型检查:验证类型兼容性和变量使用
- 优化(optimizer/):递归函数检测与转换
- 代码生成(compile/):生成 x86 汇编代码
编译器会自动检测以下递归模式并进行优化:
- 简单线性递归:转换为简单循环
- 双重递归:转换为动态规划版本
- 尾递归:转换为循环
- 复杂递归:使用栈模拟
优化器会在编译过程中自动分析和转换递归函数,提高程序执行效率。
负责将源代码文本转换为 Token 序列,处理关键字、标识符、运算符、字符串等。
基于 Token 流构建 AST,支持函数定义、控制流、表达式等语法结构。
提供类型定义、类型检查和类型推断功能。
主要功能:
- 检测递归函数模式
- 将递归转换为迭代版本
- 消除递归带来的栈开销
arch/:目标架构接口定义和实现regmgr/:寄存器分配和管理context/:编译器上下文维护
通过环境变量设置目标架构:
# 默认 x86
./tiny
# 指定架构(未来扩展)
CUTE_ARCH=arm ./tiny运行测试用例:
go test -v测试文件位于 test/ 目录,包含各种语法和功能测试。
- 在
compile/arch/下创建新架构目录 - 实现
Arch接口 - 在
compile/arch/arch.go中注册新架构
在 optimizer/recursion/ 目录下添加新的检测和转换逻辑。
本项目仅供学习和研究使用。
欢迎提交 Issue 和 Pull Request!