Skip to content

qilang-project/qi

Repository files navigation

奇语 Qi — 编程语言编译器

奇语(Qi)编译器,支持 100% 中文关键字,基于 LLVM 编译为原生可执行文件。

🌐 官网:https://qilang-project.github.io/

项目状态

🚧 正在开发中 — 核心编译器、运行时、标准库可用;编译器单元测试 348 个全绿。

特性

  • 100% 中文关键字支持 - 完全使用中文编程
  • LLVM 代码生成 - 基于 LLVM 15 编译为原生可执行文件
  • M:N 协程调度 - 类似 Go 的轻量级并发模型
  • 通道通信 - 支持带缓冲和无缓冲通道
  • Select 多路复用 - 协程间通信的选择语句
  • 异步编程 - 未来<T> / 等待 异步运行时
  • 标准库 - 25+ 模块(加密、HTTP、JSON、网络、正则、数据库、大模型…)
  • 友好错误信息 - rustc 风格行列号 + 源码片段 + caret + 修复提示
  • 🔧 现代语言特性 - 结构体、枚举、Go 风格方法

一键安装(macOS / Linux)

curl -fsSL https://raw.githubusercontent.com/qilang-project/qi/main/scripts/install.sh | bash

文档

快速开始

安装

一键脚本(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/qi

Linux 装 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;
    打印("接收:", 值);
}

Select 多路复用

包 主程序;

函数 入口() {
    变量 通道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服务器示例 - 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 示例/基础/你好世界/你好世界.qi

项目结构

qi/
├── 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 插件
  • 调试器支持
  • 包管理器
  • 标准库扩展

贡献

欢迎贡献!请遵循以下步骤:

  1. Fork 本仓库
  2. 创建特性分支 (git checkout -b feature/新特性)
  3. 提交更改 (git commit -m '添加新特性')
  4. 推送到分支 (git push origin feature/新特性)
  5. 创建 Pull Request

请确保:

  • 代码通过所有测试 (cargo test)
  • 代码符合格式规范 (cargo fmt)
  • 代码通过 linter 检查 (cargo clippy)
  • 添加必要的文档和注释

常见问题

如何运行示例程序?

# 运行单个示例
cargo run -- run 示例/基础/你好世界/你好世界.qi

# 运行所有示例
./scripts/run_examples.sh

支持哪些中文标点符号?

Qi 同时支持中英文标点:

  • 分号: ;
  • 大括号: {}【】
  • 冒号: :

如何调试编译问题?

# 启用详细日志
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 语言项目

About

中文编程语言

Resources

Stars

Watchers

Forks

Packages

 
 
 

Contributors

Languages