奇语(Qi)编译器,支持 100% 中文关键字,基于 LLVM 编译为原生可执行文件。
🌐 官网:https://qilang-project.github.io/
🚧 正在开发中 — 核心编译器、运行时、标准库可用;编译器单元测试 348 个全绿。
- ✅ 100% 中文关键字支持 - 完全使用中文编程
- ✅ LLVM 代码生成 - 基于 LLVM 15 编译为原生可执行文件
- ✅ M:N 协程调度 - 类似 Go 的轻量级并发模型
- ✅ 通道通信 - 支持带缓冲和无缓冲通道
- ✅ Select 多路复用 - 协程间通信的选择语句
- ✅ 异步编程 -
未来<T>/等待异步运行时 - ✅ 标准库 - 25+ 模块(加密、HTTP、JSON、网络、正则、数据库、大模型…)
- ✅ 友好错误信息 - rustc 风格行列号 + 源码片段 + caret + 修复提示
- 🔧 现代语言特性 - 结构体、枚举、Go 风格方法
curl -fsSL https://raw.githubusercontent.com/qilang-project/qi/main/scripts/install.sh | bash- 📖 语言完整指南 - 完整参考文档
- 📐 基础语法规范 - 当前推荐写法与兼容边界
- 📚 示例程序 - 运行示例统一从这里进入
- 🔧 开发指南 - 技术栈和开发指导
- 🐧 Linux 使用指南 - Linux 平台特定说明和故障排除
一键脚本(macOS / Linux x64,从最新 GitHub Release 拉预编译二进制):
curl -fsSL https://raw.githubusercontent.com/qilang-project/qi/main/scripts/install.sh | bash装到自定义目录:
curl -fsSL .../install.sh | INSTALL_DIR=$HOME/bin bash从源码构建(需要 LLVM 15):
git clone https://github.com/qilang-project/qi.git
cd qi
cargo build --release
# 二进制在 ./target/release/qiLinux 装 LLVM 15:wget https://apt.llvm.org/llvm.sh && chmod +x llvm.sh && sudo ./llvm.sh 15
macOS:brew install llvm@15 && export LLVM_SYS_150_PREFIX=$(brew --prefix llvm@15)
创建 你好世界.qi 文件:
// 你好世界程序
包 主程序;
函数 入口() {
打印("你好,Qi!");
}
运行程序:
# 运行 Qi 程序
cargo run -- run 你好世界.qi
# 或使用 release 版本(更快)
cargo run --release -- run 你好世界.qi包 主程序;
函数 入口() {
// 变量声明(类型推断)
变量 年龄 = 25;
变量 圆周率 = 3.14159;
变量 是否成年 = 真;
变量 姓名 = "张三";
打印(年龄);
打印(姓名);
}
包 主程序;
函数 入口() {
变量 年龄 = 20;
// 条件语句
如果 年龄 >= 18 {
打印行("成年人");
} 否则 {
打印行("未成年");
}
// 循环
变量 计数 = 0;
当 计数 < 5 {
打印(计数);
计数 = 计数 + 1;
}
}
包 主程序;
// 带参数和返回值的函数
函数 加法(a: 整数, b: 整数): 整数 {
返回 a + b;
}
函数 入口() {
变量 结果 = 加法(5, 3);
打印行(结果); // 输出: 8
}
包 主程序;
函数 协程任务() {
打印行("协程: 开始执行");
设置超时(100);
打印行("协程: 执行完成");
}
函数 入口() {
打印行("主程序: 启动协程");
// 启动协程(类似 Go 的 go 关键字)
启动 协程任务();
启动 协程任务();
打印行("主程序: 继续执行");
设置超时(200); // 等待协程完成
打印行("主程序: 结束");
}
包 主程序;
函数 发送者(通道: 通道<整数>) {
打印行("发送: 42");
通道 <- 42;
}
函数 入口() {
// 创建无缓冲通道
变量 通道1 = 通道<整数>();
启动 发送者(通道1);
变量 值 = <-通道1;
打印("接收:", 值);
}
包 主程序;
函数 入口() {
变量 通道1 = 通道<整数>();
变量 通道2 = 通道<字符串>();
启动 {
通道1 <- 42;
};
选择 {
情况 值 = <-通道1: {
打印("从通道1收到:", 值);
}
情况 文本 = <-通道2: {
打印("从通道2收到:", 文本);
}
默认: {
打印("没有准备好的通道");
}
}
}
包 主程序;
// 导入标准库模块
导入 标准库.加密;
导入 标准库.输入输出;
函数 入口() {
// 使用加密模块
变量 哈希值 = MD5哈希("hello");
打印行(哈希值);
// 使用文件操作
写入文件("test.txt", "你好,世界!");
变量 内容 = 读取文件("test.txt");
打印行(内容);
}
优先看这些最小示例:
示例/基础/你好世界/你好世界.qi示例/基础/函数/函数.qi示例/基础/分支/分支.qi示例/基础/循环/循环.qi示例/基础/数组/数组基础/数组基础.qi示例/基础/新功能演示.qi示例/高级/大模型/流式对话示例/流式对话示例.qi示例/高级/大模型/工具调用示例/工具调用示例.qi
当前整理原则:
示例/基础/:语言基础与最小可运行写法示例/高级/:并发、包、命令行、算法、大模型等进阶主题示例/标准库/:按标准库模块组织的示例- 明显重复的旧示例会逐步删除
- 你好世界 - 最简单的 Qi 程序
- 函数 - 函数定义和调用
- 计算 - 数学运算
- 分支 - 条件语句
- 循环 - 循环结构
- 流程控制 - 综合控制流示例
- 协程 - 协程创建和执行
- 通道 - 通道创建、发送、接收
- 选择 - Select 多路复用
- 同步 - 互斥锁、等待组
- 超时 - 超时控制机制
- 多文件 - 多文件项目组织
- 多包 - 包导入和使用
- 第三方包 - 外部包引用
- 加密 - MD5、SHA256、SHA512、HMAC、Base64
- 输入输出 - 文件读写操作
- 并发 - 协程、通道、选择、同步、超时
- 包 - 多文件、多包、第三方包
- 命令行 - 命令行参数与子命令
- 算法 - 排序、搜索、递归、矩阵
- 大模型 - 异步对话、流式对话、工具调用
- HTTP客户端示例 - HTTP 请求
- HTTP服务器示例 - HTTP 服务端
- TCP/UDP 示例 - 网络编程基础
运行示例:
# 运行基础示例
cargo run -- run 示例/基础/你好世界/你好世界.qi
# 运行协程示例
cargo run -- run 示例/高级/并发/协程/协程创建.qi
# 运行通道示例
cargo run -- run 示例/高级/并发/通道/通道通信.qi
# 运行加密示例
cargo run -- run 示例/标准库/加密/加密.qi
# 运行所有示例(使用脚本)
./scripts/run_examples.sh- Rust 1.75+
- LLVM 15.0+
- C 编译器 (GCC 或 Clang)
# 构建开发版本
cargo build
# 运行测试
cargo test
# 代码格式化
cargo fmt
# Lint 检查
cargo clippy
# 运行示例
cargo run -- run 示例/基础/你好世界/你好世界.qiqi/
├── src/ # Rust 编译器源码
│ ├── lexer/ # 词法分析器(支持中文关键字)
│ ├── parser/ # 语法分析器(LALRPOP)
│ │ ├── ast.rs # 抽象语法树定义(中文节点名)
│ │ └── grammar.lalrpop # LALRPOP 语法规则
│ ├── codegen/ # LLVM 代码生成器
│ │ ├── builder.rs # IR 构建器
│ │ └── mod.rs # 代码生成主逻辑
│ ├── runtime/ # Rust 运行时
│ │ ├── io/ # I/O 模块(文件、网络、HTTP)
│ │ └── stdlib/ # 标准库(加密等)
│ ├── lib.rs # 库入口
│ └── main.rs # CLI 入口
├── 示例/ # 中文示例程序
│ ├── 基础/ # 基础语法
│ ├── 并发/ # 并发编程
│ ├── 包/ # 模块系统
│ ├── 标准库/ # 标准库使用
│ └── 网络/ # 网络编程
├── docs/ # 文档
├── scripts/ # 构建和运行脚本
│ ├── run_examples.sh # Bash 脚本
│ └── run_examples.ps1 # PowerShell 脚本
├── Cargo.toml # Rust 项目配置
└── build.rs # 构建脚本(LALRPOP)
Qi 语言使用 100% 中文关键字。核心关键字包括:
| 分类 | 关键字 |
|---|---|
| 程序结构 | 包、导入、函数、异步 |
| 变量 | 变量、常量 |
| 数据类型 | 整数、浮点数、字符串、布尔、结构体、枚举 |
| 控制流 | 如果、否则、当、对于、循环、返回、跳出、继续 |
| 布尔值 | 真、假 |
| 并发 | 启动、通道、选择、情况、默认、等待 |
| 操作 | 打印、打印行、设置超时 |
# 运行 Qi 程序
cargo run -- run <文件.qi>
# 检查语法(计划中)
cargo run -- check <文件.qi>
# 编译到 LLVM IR(计划中)
cargo run -- compile <文件.qi> -o output.ll
# 显示帮助
cargo run -- --help- 中文词法分析器
- 中文语法解析器(LALRPOP)
- 基础 AST 构建
- LLVM IR 代码生成
- 协程支持(启动关键字)
- 通道通信(创建、发送、接收)
- Select 多路复用
- 异步函数支持
- 标准库(加密、IO、HTTP)
- 文件操作
- 网络支持
- 完善类型系统
- 结构体和方法
- 错误处理
- 泛型支持
- 模式匹配
- LSP 语言服务器
- VSCode 插件
- 调试器支持
- 包管理器
- 标准库扩展
欢迎贡献!请遵循以下步骤:
- Fork 本仓库
- 创建特性分支 (
git checkout -b feature/新特性) - 提交更改 (
git commit -m '添加新特性') - 推送到分支 (
git push origin feature/新特性) - 创建 Pull Request
请确保:
- 代码通过所有测试 (
cargo test) - 代码符合格式规范 (
cargo fmt) - 代码通过 linter 检查 (
cargo clippy) - 添加必要的文档和注释
# 运行单个示例
cargo run -- run 示例/基础/你好世界/你好世界.qi
# 运行所有示例
./scripts/run_examples.shQi 同时支持中英文标点:
- 分号:
;和; - 大括号:
{}和【】 - 冒号:
:和:
# 启用详细日志
RUST_LOG=debug cargo run -- run 你的文件.qi
# 查看生成的 LLVM IR
cargo run -- compile 你的文件.qi -o output.ll
cat output.ll本项目采用 MIT 许可证 - 查看 LICENSE 文件了解详情。
感谢所有为 Qi 语言做出贡献的开发者和用户!
特别感谢:
- Rust 社区提供的优秀工具和库
- LLVM 项目提供的编译器基础设施
- LALRPOP 解析器生成器
注意: 这是一个正在积极开发的项目。欢迎试用并提供反馈!
版权所有 © 2025 Qi 语言项目