所属项目:Bit HCI - 统一人机交互基础设施
版本:v0.0.1
定位:BitUI 框架的 LLVM 前端编译器
本编译器是 Bit HCI 项目的核心组成部分:
- Bit HCI:整体人机交互基础设施框架(基于 C++ + Vulkan)
- Bit:未来规划的系统级编程语言(类似 Swift 的定位)
- BitUI:声明式 UI 框架,专注于界面开发(类似 SwiftUI 的定位)
- 本编译器:作为 LLVM 前端,将 BitUI 源代码编译为 LLVM IR
BitUI 源代码
↓
[BitUI Compiler] ← 本项目(LLVM 前端)
↓
LLVM IR(中间表示)
↓
LLVM 优化与代码生成
↓
运行时代码
↓
[Vulkan 渲染引擎] ← Bit HCI 框架的渲染后端
↓
多端输出(GUI/CLI/Web)
核心理念:就像 Swift 和 SwiftUI 的关系,Bit 是通用系统语言,BitUI 是专注于声明式 UI 开发的框架。
基于 C++ 和 LLVM 的 BitUI 编译器实现,作为 LLVM 前端将 BitUI 源代码编译为 LLVM IR。
✅ 已完成模块:
- 词法分析器 (Lexer) - 支持BitUI语法和信号引用
- 语法分析器 (Parser) - 递归下降解析器,构建AST
- AST系统 - 完整的抽象语法树节点定义
- LLVM代码生成器 - 基础LLVM IR生成
- 错误处理系统 - 统一的错误报告和诊断
- 构建系统 - 完整的CMake配置和Windows构建脚本
🔄 开发中:
- 完整的BitUI语法支持
- 高级LLVM IR优化
- 目标代码生成
- 模块化架构: 清晰的编译器链路分离,便于扩展和维护
- 词法分析器: 支持BitUI语法的词法分析,包括信号引用(
$identifier) - 语法分析器: 递归下降解析器,支持组件、信号、属性解析
- AST系统: 完整的抽象语法树节点定义和访问者模式
- LLVM集成: 生成优化的LLVM IR,支持多目标架构
- 信号系统: 支持响应式信号和状态管理
- 组件系统: 支持声明式UI组件定义
- 错误处理: 统一的错误报告和诊断系统
- 构建系统: 跨平台CMake配置,支持Windows/Linux构建
- CMake 3.16+
- LLVM 12.0+
- Visual Studio 2019+ (Windows) 或 GCC 7+ (Linux)
- C++17 支持
# 使用提供的构建脚本
build.bat
# 或手动构建
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Releasemkdir build
cd build
cmake .. -DCMAKE_BUILD_TYPE=Release
make -j$(nproc)# 编译为LLVM IR
bitui -o output.ll -f ir input.bitui
# 编译为目标文件
bitui -o output.o -f obj input.bitui
# 编译为可执行文件
bitui -o output.exe -f exe input.bitui-o <file>: 指定输出文件-O<level>: 优化级别 (0-3)-f <format>: 输出格式 (ir, obj, exe)ir: LLVM IR 文本格式(默认输出,用于查看和调试)obj: 目标文件(.o/.obj)exe: 可执行文件
-t <triple>: 目标三元组-g: 启用调试信息-h: 显示帮助
注意:本编译器作为 LLVM 前端,主要输出是 LLVM IR。生成的 IR 将被 LLVM 后端优化并最终转换为机器码,然后与 Bit HCI 的 Vulkan 渲染引擎集成运行。
# 编译Hello World示例
bitui -o hello.ll -f ir examples/hello.bitui
# 编译信号定义示例
bitui -o signal_only.ll -f ir examples/signal_only.bitui
# 编译测试示例
bitui -o test.ll -f ir examples/test.bitui输入 (examples/hello.bitui):
// Hello World 示例
signal greeting = "Hello"
component Hello {
props: {
message: $greeting
}
}
输出 (hello.ll):
; ModuleID = 'bitui_module'
source_filename = "bitui_module"
@str = private unnamed_addr constant [6 x i8] c"Hello\00", align 1
declare void @print(ptr)
define i32 @main() {
entry:
ret i32 0
}| 示例文件 | 编译状态 | 生成产物 | 说明 |
|---|---|---|---|
hello.bitui |
✅ 成功 | hello.ll |
信号和组件定义 |
signal_only.bitui |
✅ 成功 | signal_only.ll |
仅信号定义 |
test.bitui |
✅ 成功 | test.ll |
信号和组件属性 |
simple.bitui |
❌ 失败 | - | 复杂字符串解析问题 |
counter.bitui |
❌ 失败 | - | 复杂组件结构 |
signal count = 0
signal message = "Hello, World!"
component MyComponent {
props: {
title: "My Title"
value: $count
}
children: {
component Text {
props: {
content: $message
}
}
}
}
if ($count > 0) {
component Text {
props: {
content: "Count is positive"
}
}
}
for (item in $items) {
component ListItem {
props: {
content: item
}
}
}
BitUI源码 → [词法分析] → [语法分析] → [AST构建] → [代码生成] → [优化] → [输出]
↓ ↓ ↓ ↓ ↓ ↓ ↓
.bitui Token流 AST节点 LLVM IR 优化IR 目标代码
- 文件:
include/lexer.h,src/lexer.cpp - 功能: 将BitUI源码分解为Token流
- 支持: 关键字、标识符、字符串、数字、信号引用(
$identifier) - 状态: ✅ 完成
- 文件:
include/parser.h,src/parser.cpp - 功能: 递归下降解析器,构建AST
- 支持: 组件定义、信号定义、属性解析、子组件解析
- 状态: ✅ 基础完成,🔄 扩展中
- 文件:
include/ast.h,src/ast.cpp - 功能: 抽象语法树节点定义和访问者模式
- 节点类型: 表达式、语句、组件、信号、程序
- 状态: ✅ 完成
- 文件:
include/llvm_codegen.h,src/llvm_codegen_simple.cpp - 功能: 将AST转换为LLVM IR
- 支持: 基础IR生成、运行时函数、主函数框架
- 状态: ✅ 基础完成,🔄 扩展中
- 文件:
include/errors.h,src/errors.cpp - 功能: 统一的错误报告和诊断
- 支持: 语法错误、语义错误、代码生成错误
- 状态: ✅ 完成
- 文件:
include/compiler.h,src/compiler.cpp - 功能: 编译流程编排和LLVM集成
- 支持: 命令行接口、编译选项、输出格式
- 状态: ✅ 完成
- 词法分析 (Lexer): 将源代码分解为token
- 语法分析 (Parser): 构建抽象语法树(AST)
- AST遍历 (ASTVisitor): 访问AST节点
- 代码生成 (LLVMCodeGen): 生成LLVM IR
- 优化 (LLVM Passes): 应用LLVM优化pass
- 输出 (Emitter): 生成目标代码
每个模块只负责编译流程中的一个特定阶段:
- Lexer: 只负责词法分析
- Parser: 只负责语法分析
- AST: 只负责数据结构定义
- CodeGen: 只负责代码生成
每个模块都有清晰的接口定义:
// 词法分析器接口
class Lexer {
public:
std::vector<Token> tokenize();
bool hasError() const;
std::string getErrorMessage() const;
};
// 语法分析器接口
class Parser {
public:
std::unique_ptr<Program> parse();
bool hasError() const;
std::string getErrorMessage() const;
};
// AST访问者接口
class ASTVisitor {
public:
virtual void visit(Program& program) = 0;
virtual void visit(ComponentDef& component) = 0;
virtual void visit(SignalDef& signal) = 0;
// ... 其他visit方法
};高层模块不依赖低层模块,都依赖于抽象:
- Compiler 依赖 Parser 接口,不依赖具体实现
- CodeGen 依赖 AST 接口,不依赖具体节点类型
- Parser 依赖 Lexer 接口,不依赖具体词法分析实现
对扩展开放,对修改封闭:
- 添加新语法:扩展Parser,不修改现有代码
- 添加新AST节点:继承基类,不修改访问者接口
- 添加新优化:扩展CodeGen,不修改现有生成逻辑
- Bit HCI 技术架构文档 - 整体架构设计与技术选型
- 通用编译器架构参考指南 - 编译器设计理论与实践
- BitUI 编译器开发文档 - 本编译器的详细开发指南
- 开发进度追踪 - 项目进度与里程碑
- 文档中心 - 所有文档导航
compiler/
├── include/ # 头文件
│ ├── ast.h # AST节点定义
│ ├── lexer.h # 词法分析器接口
│ ├── parser.h # 语法分析器接口
│ ├── llvm_codegen.h # LLVM代码生成器接口
│ ├── compiler.h # 编译器主类接口
│ └── errors.h # 错误处理接口
├── src/ # 源文件
│ ├── ast.cpp # AST节点实现
│ ├── lexer.cpp # 词法分析器实现
│ ├── parser.cpp # 语法分析器实现
│ ├── llvm_codegen_simple.cpp # 简化LLVM代码生成器
│ ├── compiler.cpp # 编译器主类实现
│ ├── errors.cpp # 错误处理实现
│ └── main.cpp # 主程序入口
├── examples/ # 示例文件
│ ├── simple.bitui # 简单示例
│ ├── counter.bitui # 计数器示例
│ └── hello.bitui # Hello World示例
├── build/ # 构建输出
│ └── Release/ # 发布版本
│ ├── bitui.exe # 编译器可执行文件
│ └── bitui_compiler.lib # 编译器库
├── CMakeLists.txt # CMake配置
├── build.bat # Windows构建脚本
└── README.md # 本文档
-
词法分析扩展:
- 在
lexer.h中添加新的TokenType - 在
lexer.cpp的readIdentifier()中添加关键字识别 - 在
nextToken()中添加新的token处理逻辑
- 在
-
语法分析扩展:
- 在
parser.h中添加新的解析方法声明 - 在
parser.cpp中实现解析逻辑 - 在
parseStatement()中添加新的语句类型处理
- 在
-
AST扩展:
- 在
ast.h中定义新的AST节点类 - 在
ast.cpp中实现accept()和toString()方法 - 继承相应的基类(
Expr、Stmt等)
- 在
-
代码生成扩展:
- 在
llvm_codegen_simple.cpp中添加新的访问者方法 - 实现对应的LLVM IR生成逻辑
- 处理新的AST节点类型
- 在
-
LLVM Pass集成:
- 在
compiler.cpp的optimizeIR()方法中添加新的优化pass - 使用LLVM的PassManager管理优化流程
- 根据优化级别选择不同的pass组合
- 在
-
自定义优化:
- 创建自定义的LLVM Pass
- 在CMakeLists.txt中添加新的源文件
- 在代码生成器中集成自定义优化
# 测试简单示例
./build/Release/bitui.exe -o test.ll -f ir examples/hello.bitui
# 查看生成的LLVM IR
cat test.ll- 词法分析调试: 在
lexer.cpp中添加token输出 - 语法分析调试: 在
parser.cpp中添加AST节点输出 - 代码生成调试: 使用LLVM的
verifyModule()检查IR有效性
- 使用CMake的并行构建:
cmake --build . --parallel - 优化LLVM库链接,只链接必要的组件
- 使用预编译头文件加速编译
- 启用LLVM优化pass (
-O1,-O2,-O3) - 使用LLVM的链接时优化(LTO)
- 针对目标架构优化代码生成
-
完善语法支持
- 修复复杂字符串字面量解析
- 支持更复杂的组件结构
- 添加条件渲染和循环渲染语法
-
增强代码生成
- 实现完整的LLVM IR生成
- 添加运行时函数实现
- 支持信号更新和响应式系统
-
优化和调试
- 集成LLVM优化pass
- 添加调试信息支持
- 改进错误报告和诊断
-
语言特性扩展
- 类型系统设计
- 模块化支持
- 标准库实现
-
工具链完善
- 语言服务器协议(LSP)支持
- 调试器集成
- 性能分析工具
-
生态系统建设
- 包管理器
- 文档生成工具
- 测试框架
-
生产就绪
- 完整的语言规范
- 性能基准测试
- 生产环境验证
-
社区建设
- 开源社区管理
- 贡献者指南
- 代码审查流程
- 编译器架构: 完整的模块化设计
- 基础功能: 词法分析、语法分析、AST构建
- LLVM集成: 基础IR生成和优化
- 构建系统: 跨平台CMake配置
- 测试验证: 3/5示例成功编译
- 代码行数: ~2000行C++代码
- 模块数量: 6个核心模块
- 测试覆盖率: 60% (3/5示例)
- 构建时间: ~30秒
- 编译器大小: 24MB (包含LLVM)
- 解析器完善: 支持完整的BitUI语法
- 代码生成增强: 实现完整的LLVM IR生成
- 语言设计: 确定最终的语言形态和特性
- 工具链建设: 开发配套的开发工具
欢迎提交Issue和Pull Request来改进编译器。
- Fork项目仓库
- 创建特性分支
- 提交代码更改
- 创建Pull Request
- 参与代码审查
# 克隆仓库
git clone <repository-url>
cd BitUI/compiler
# 构建项目
./build.bat # Windows
# 或
mkdir build && cd build
cmake .. && make # Linux
# 运行测试
./build/Release/bitui.exe -o test.ll -f ir examples/hello.bituiMIT License