-
-
Notifications
You must be signed in to change notification settings - Fork 3
Home
Cavvy (Cay) 是一个静态类型的面向对象编程语言,编译为原生机器码,无运行时依赖,无 VM,无 GC。
- 🚀 原生性能:编译为 Windows EXE / Linux ELF,零开销抽象
- 🛡️ 内存安全:显式内存管理,RAII 模式支持
- ☕ Java 风格语法:熟悉的面向对象编程体验
- 🔧 完整工具链:从源码到可执行文件的一站式编译
- 🌉 FFI 支持:无缝调用 C 函数和系统库
- 📦 字节码系统:支持
.caybc格式和代码混淆
- 前端:Rust 实现的词法分析、语法分析、语义分析
- 中端:LLVM IR 代码生成
- 后端:MinGW-w64 / GCC 工具链
- 字节码:自定义 CayBC 格式(基于栈的虚拟机)
cavvy/
├── src/ # 源代码
│ ├── bin/ # 可执行文件
│ │ ├── cayc.rs # 一站式编译器
│ │ ├── cay-ir.rs # Cavvy → IR 编译器
│ │ ├── ir2exe.rs # IR → EXE 编译器
│ │ ├── cay-check.rs # 语法检查工具
│ │ ├── cay-run.rs # 直接运行工具
│ │ ├── cay-bcgen.rs # 字节码生成器
│ │ ├── cay-lsp.rs # LSP 语言服务器
│ │ └── cay-idle.rs # 图形化 IDE
│ ├── lexer/ # 词法分析器
│ ├── parser/ # 语法分析器
│ ├── semantic/ # 语义分析器
│ ├── codegen/ # 代码生成器
│ ├── bytecode/ # 字节码系统
│ ├── preprocessor/ # 预处理器
│ ├── rcpl/ # 资源编译
│ ├── idle/ # GUI IDE
│ ├── ast.rs # AST 定义
│ ├── types.rs # 类型系统
│ └── error.rs # 错误处理
├── examples/ # 示例程序
├── caylibs/ # 标准库
├── docs/ # 文档
├── tests/ # 测试套件
└── Cargo.toml # Rust 项目配置
-
预处理:处理
#define、#include等预处理器指令 - 词法分析:将源代码转换为令牌流
- 语法分析:构建抽象语法树 (AST)
- 语义分析:类型检查、符号解析、继承关系验证
- 代码生成:生成 LLVM IR 中间代码
- 优化:应用 LLVM 优化
- 链接:生成最终可执行文件
flowchart TD
A[源代码 .cay] --> B[预处理器]
B --> C[词法分析器]
C --> D[语法分析器]
D --> E[语义分析器]
E --> F[代码生成器]
F --> G[LLVM IR]
G --> H[LLVM 优化]
H --> I[目标代码生成]
I --> J[链接器]
J --> K[可执行文件]
词法分析器负责将源代码文本转换为令牌流。
主要功能:
- 识别关键字、标识符、字面量、运算符等
- 处理注释(单行和多行)
- 跟踪源代码位置信息
- 错误诊断和修复建议
关键文件:
- src/lexer/mod.rs
核心类/函数:
-
Token:定义所有可能的令牌类型 -
Lexer:词法分析器实现 -
lex():主词法分析函数
语法分析器将令牌流转换为抽象语法树 (AST)。
主要功能:
- 解析类、接口、方法、语句、表达式
- 构建层次化的 AST 结构
- 语法错误检测和详细的错误信息
关键文件:
- src/parser/mod.rs
- src/parser/classes.rs
- src/parser/statements.rs
- src/parser/expressions.rs
核心类/函数:
-
Parser:语法分析器实现 -
parse():主语法分析函数 -
parse_class():解析类定义 -
parse_method():解析方法定义 -
parse_expression():解析表达式
语义分析器负责类型检查和语义验证。
主要功能:
- 类型检查和类型推断
- 符号表管理
- 继承关系验证
-
@Override注解验证 - 方法重载解析
关键文件:
- src/semantic/analyzer.rs
- src/semantic/class_analysis.rs
- src/semantic/type_check.rs
核心类/函数:
-
SemanticAnalyzer:语义分析器实现 -
analyze():主语义分析函数 -
type_check_program():程序类型检查 -
check_inheritance():继承关系检查
代码生成器将 AST 转换为 LLVM IR 中间代码。
主要功能:
- 生成 LLVM IR 代码
- 处理类布局和内存管理
- 生成方法和构造函数
- 处理静态初始化
- 平台特定代码生成
关键文件:
- src/codegen/generator.rs
- src/codegen/context.rs
- src/codegen/expressions/
- src/codegen/statements/
核心类/函数:
-
IRGenerator:代码生成器实现 -
generate():主代码生成函数 -
generate_method():生成方法代码 -
generate_constructor():生成构造函数代码 -
type_to_llvm():类型转换
字节码系统实现了 Cavvy 字节码的生成和执行。
主要功能:
- 字节码序列化和反序列化
- 字节码混淆
- JIT 执行
- 常量池管理
关键文件:
- src/bytecode/mod.rs
- src/bytecode/instructions.rs
- src/bytecode/serializer.rs
预处理器处理源代码中的预处理指令。
主要功能:
- 处理
#define和#undef - 处理
#include指令 - 处理条件编译(
#ifdef,#ifndef,#if,#else,#endif)
关键文件:
- src/preprocessor/mod.rs
LSP 服务器为 IDE 提供语言服务。
主要功能:
- 语法高亮
- 代码补全
- 错误诊断
- 跳转到定义
- 代码格式化
关键文件:
- src/bin/cay-lsp.rs
Cay-Idle 是 Cavvy 的图形化集成开发环境。
主要功能:
- 代码编辑器
- 项目管理
- 语法检查
- 直接运行
- 文件浏览器
关键文件:
- src/idle/mod.rs
- src/idle/editor.rs
- src/bin/cay-idle.rs
功能:将 Cavvy 源代码直接编译为可执行文件
用法:
cayc source.cay output.exe关键文件:
- src/bin/cayc.rs
功能:将 Cavvy 源代码编译为 LLVM IR
用法:
cay-ir source.cay output.ll关键文件:
- src/bin/cay-ir.rs
功能:将 LLVM IR 编译为可执行文件
用法:
ir2exe input.ll output.exe关键文件:
- src/bin/ir2exe.rs
功能:检查 Cavvy 源代码的语法
用法:
cay-check source.cay关键文件:
- src/bin/cay-check.rs
功能:直接运行 Cavvy 源代码(不生成可执行文件)
用法:
cay-run source.cay关键文件:
- src/bin/cay-run.rs
功能:生成 Cavvy 字节码文件
用法:
cay-bcgen source.cay output.caybc关键文件:
- src/bin/cay-bcgen.rs
Compiler 类
- 功能:编译器主类,协调编译过程
-
方法:
-
compile():编译源代码为 LLVM IR -
compile_file():从文件编译 -
compile_with_source_map():带源映射的编译
-
关键文件:
- src/lib.rs
Type 枚举
- 功能:表示所有可能的类型
-
成员:
-
Void:空类型 -
Int32:32位整数 -
Int64:64位整数 -
Float32:32位浮点数 -
Float64:64位浮点数 -
Bool:布尔型 -
Char:字符型 -
String:字符串 -
Array:数组 -
Class:类类型 -
Interface:接口类型
-
关键文件:
- src/types.rs
Program 结构体
- 功能:表示完整的程序
-
成员:
-
classes:类声明列表 -
interfaces:接口声明列表 -
top_level_functions:顶层函数列表 -
extern_declarations:外部函数声明列表
-
关键文件:
- src/ast.rs
SemanticSymbolTable 类
- 功能:管理符号表
-
方法:
-
enter_scope():进入作用域 -
exit_scope():退出作用域 -
declare():声明符号 -
resolve():解析符号
-
关键文件:
- src/semantic/symbol_table.rs
Cavvy 采用显式内存管理,通过 RAII 模式确保资源正确释放。
- 栈分配:局部变量和基本类型
-
堆分配:对象和数组(使用
new关键字) - 析构函数:自动调用以释放资源
Cavvy 具有静态类型系统,支持:
- 基本类型:int, long, float, double, boolean, char, String
- 复合类型:类、接口、数组
-
类型推断:使用
auto关键字 - 类型转换:显式和隐式转换
Cavvy 支持完整的面向对象编程特性:
- 类和继承:单继承模型
- 接口:多接口实现
- 访问控制:public, private, protected
- 抽象类和方法:使用 abstract 关键字
- Final 类和方法:防止继承和重写
- 构造函数和析构函数:对象初始化和清理
Cavvy 提供 FFI(外部函数接口)以调用 C 函数:
extern {
int abs(int x);
double sqrt(double x);
}
支持多种调用约定:
- cdecl
- stdcall
- fastcall
- sysv64
- win64
Cavvy 实现了自定义的字节码格式(CayBC):
- 基于栈的虚拟机
- 常量池:存储字符串和常量
- 指令集:包含所有必要的操作
- 混淆支持:防止逆向工程
- Windows:Windows 10/11 x64
- Linux:x86_64 Linux 发行版
- Windows:使用 MinGW-w64 工具链
- Linux:使用 GCC 工具链
-
跨平台差异:通过
PlatformAbstraction处理
# 克隆仓库
git clone https://github.com/Ethernos-Studio/Cavvy.git
cd Cavvy
# 构建编译器(Release 模式)
cargo build --release
# 运行测试
cargo test --release- Windows:Windows 10/11 x64
- Linux:x86_64 Linux 发行版
- 依赖:LLVM 17.0+, MinGW-w64 13.2+ (Windows)
# 基础编译
cayc hello.cay hello.exe
# 优化级别
cayc -O3 hello.cay hello.exe # 最高优化
cayc -O0 hello.cay hello.exe # 无优化(调试)
# 字节码混淆
cayc --obfuscate --obfuscate-level deep hello.cay hello.exe
# 链接库
cayc -lm hello.cay hello.exe # 链接数学库
# 跨平台目标
cay-ir --target x86_64-linux-gnu hello.cay hello.llpublic class Hello {
public static void main() {
println("Hello, World!");
}
}
public class Animal {
protected String name;
public Animal(String name) {
this.name = name;
}
public void speak() {
println("Some sound");
}
}
public class Dog extends Animal {
public Dog(String name) {
super(name);
}
@Override
public void speak() {
println(name + " says: Woof!");
}
}
extern {
int abs(int x);
double sqrt(double x);
}
public class MathExample {
public static void main() {
int result = abs(-42);
double root = sqrt(2.0);
println("Abs: " + result);
println("Sqrt: " + root);
}
}
版本 0.4.8
- 基础类型系统
- 变量声明和赋值
- 算术、比较、逻辑、位运算符
- 控制流语句(if-else, switch, loops)
- 数组(一维和多维)
- 字符串操作
- 类型转换
- 方法重载和可变参数
- Lambda 表达式和方法引用
- 类和单继承
- 抽象类和接口
- 访问控制
- 构造函数和析构函数
- Final 类和方法
- 静态成员和初始化
- @Override 注解
- 顶层 main 函数
- FFI 外部函数接口
- 自动链接器
- 字节码系统 (CayBC)
- 代码混淆
- LSP 语言服务器
- Windows / Linux 跨平台支持
即将推出 (0.5.x):
- 分配器接口和 Arena 分配器
- 泛型集合 (ArrayList, HashMap)
- 智能指针 (UniquePtr, ScopedPtr)
- Result<T, E> 错误处理
- 操作系统线程封装
| 错误类型 | 可能原因 | 解决方案 |
|---|---|---|
| 语法错误 | 代码语法不正确 | 检查语法,参考语法规则 |
| 类型错误 | 类型不匹配 | 检查变量类型和函数参数类型 |
| 链接错误 | 缺少库或符号 | 确保正确链接必要的库 |
| 内存错误 | 内存管理问题 | 检查对象生命周期和资源释放 |
- 使用
cay-check进行语法检查 - 使用
-O0编译选项进行调试 - 检查编译器输出的错误信息
- 使用
print/println语句进行调试
- Bug 报告:使用 GitHub Issues
- 功能建议:查看 ROADMAP.md 后提交 PR
- 文档改进:直接编辑文档并提交
- 遵循 Rust 代码风格
- 使用 4 空格缩进
- 变量和函数命名使用蛇形命名法
- 类型和模块命名使用驼峰命名法
本项目采用 GPL3 许可证。详见 LICENSE 文件。
Cavvy - 编译未来