Skip to content

Latest commit

 

History

History

Folders and files

NameName
Last commit message
Last commit date

parent directory

..
 
 
 
 
 
 
 
 
 
 
 
 
 
 

README.md

BitUI Compiler

所属项目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 支持

Windows构建

# 使用提供的构建脚本
build.bat

# 或手动构建
mkdir build
cd build
cmake .. -G "Visual Studio 17 2022" -A x64
cmake --build . --config Release

Linux构建

mkdir 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

生成的LLVM IR示例

输入 (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 ❌ 失败 - 复杂组件结构

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    目标代码

核心模块详解

1. 词法分析器 (Lexer)

  • 文件: include/lexer.h, src/lexer.cpp
  • 功能: 将BitUI源码分解为Token流
  • 支持: 关键字、标识符、字符串、数字、信号引用($identifier)
  • 状态: ✅ 完成

2. 语法分析器 (Parser)

  • 文件: include/parser.h, src/parser.cpp
  • 功能: 递归下降解析器,构建AST
  • 支持: 组件定义、信号定义、属性解析、子组件解析
  • 状态: ✅ 基础完成,🔄 扩展中

3. AST系统 (Abstract Syntax Tree)

  • 文件: include/ast.h, src/ast.cpp
  • 功能: 抽象语法树节点定义和访问者模式
  • 节点类型: 表达式、语句、组件、信号、程序
  • 状态: ✅ 完成

4. LLVM代码生成器 (CodeGen)

  • 文件: include/llvm_codegen.h, src/llvm_codegen_simple.cpp
  • 功能: 将AST转换为LLVM IR
  • 支持: 基础IR生成、运行时函数、主函数框架
  • 状态: ✅ 基础完成,🔄 扩展中

5. 错误处理系统 (ErrorReporter)

  • 文件: include/errors.h, src/errors.cpp
  • 功能: 统一的错误报告和诊断
  • 支持: 语法错误、语义错误、代码生成错误
  • 状态: ✅ 完成

6. 编译器主类 (Compiler)

  • 文件: include/compiler.h, src/compiler.cpp
  • 功能: 编译流程编排和LLVM集成
  • 支持: 命令行接口、编译选项、输出格式
  • 状态: ✅ 完成

编译流程

  1. 词法分析 (Lexer): 将源代码分解为token
  2. 语法分析 (Parser): 构建抽象语法树(AST)
  3. AST遍历 (ASTVisitor): 访问AST节点
  4. 代码生成 (LLVMCodeGen): 生成LLVM IR
  5. 优化 (LLVM Passes): 应用LLVM优化pass
  6. 输出 (Emitter): 生成目标代码

模块化设计原则

1. 单一职责原则

每个模块只负责编译流程中的一个特定阶段:

  • Lexer: 只负责词法分析
  • Parser: 只负责语法分析
  • AST: 只负责数据结构定义
  • CodeGen: 只负责代码生成

2. 接口隔离原则

每个模块都有清晰的接口定义:

// 词法分析器接口
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方法
};

3. 依赖倒置原则

高层模块不依赖低层模块,都依赖于抽象:

  • Compiler 依赖 Parser 接口,不依赖具体实现
  • CodeGen 依赖 AST 接口,不依赖具体节点类型
  • Parser 依赖 Lexer 接口,不依赖具体词法分析实现

4. 开闭原则

对扩展开放,对修改封闭:

  • 添加新语法:扩展Parser,不修改现有代码
  • 添加新AST节点:继承基类,不修改访问者接口
  • 添加新优化:扩展CodeGen,不修改现有生成逻辑

📚 相关文档

🛠️ 开发指南

项目结构

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                  # 本文档

模块扩展指南

添加新语法支持

  1. 词法分析扩展:

    • lexer.h中添加新的TokenType
    • lexer.cppreadIdentifier()中添加关键字识别
    • nextToken()中添加新的token处理逻辑
  2. 语法分析扩展:

    • parser.h中添加新的解析方法声明
    • parser.cpp中实现解析逻辑
    • parseStatement()中添加新的语句类型处理
  3. AST扩展:

    • ast.h中定义新的AST节点类
    • ast.cpp中实现accept()toString()方法
    • 继承相应的基类(ExprStmt等)
  4. 代码生成扩展:

    • llvm_codegen_simple.cpp中添加新的访问者方法
    • 实现对应的LLVM IR生成逻辑
    • 处理新的AST节点类型

添加新优化Pass

  1. LLVM Pass集成:

    • compiler.cppoptimizeIR()方法中添加新的优化pass
    • 使用LLVM的PassManager管理优化流程
    • 根据优化级别选择不同的pass组合
  2. 自定义优化:

    • 创建自定义的LLVM Pass
    • 在CMakeLists.txt中添加新的源文件
    • 在代码生成器中集成自定义优化

测试和调试

编译测试

# 测试简单示例
./build/Release/bitui.exe -o test.ll -f ir examples/hello.bitui

# 查看生成的LLVM IR
cat test.ll

调试技巧

  1. 词法分析调试: 在lexer.cpp中添加token输出
  2. 语法分析调试: 在parser.cpp中添加AST节点输出
  3. 代码生成调试: 使用LLVM的verifyModule()检查IR有效性

性能优化

编译性能

  • 使用CMake的并行构建: cmake --build . --parallel
  • 优化LLVM库链接,只链接必要的组件
  • 使用预编译头文件加速编译

运行时性能

  • 启用LLVM优化pass (-O1, -O2, -O3)
  • 使用LLVM的链接时优化(LTO)
  • 针对目标架构优化代码生成

🚀 未来发展规划

短期目标 (1-2个月)

  1. 完善语法支持

    • 修复复杂字符串字面量解析
    • 支持更复杂的组件结构
    • 添加条件渲染和循环渲染语法
  2. 增强代码生成

    • 实现完整的LLVM IR生成
    • 添加运行时函数实现
    • 支持信号更新和响应式系统
  3. 优化和调试

    • 集成LLVM优化pass
    • 添加调试信息支持
    • 改进错误报告和诊断

中期目标 (3-6个月)

  1. 语言特性扩展

    • 类型系统设计
    • 模块化支持
    • 标准库实现
  2. 工具链完善

    • 语言服务器协议(LSP)支持
    • 调试器集成
    • 性能分析工具
  3. 生态系统建设

    • 包管理器
    • 文档生成工具
    • 测试框架

长期目标 (6-12个月)

  1. 生产就绪

    • 完整的语言规范
    • 性能基准测试
    • 生产环境验证
  2. 社区建设

    • 开源社区管理
    • 贡献者指南
    • 代码审查流程

📊 当前成就

✅ 已完成

  • 编译器架构: 完整的模块化设计
  • 基础功能: 词法分析、语法分析、AST构建
  • LLVM集成: 基础IR生成和优化
  • 构建系统: 跨平台CMake配置
  • 测试验证: 3/5示例成功编译

📈 关键指标

  • 代码行数: ~2000行C++代码
  • 模块数量: 6个核心模块
  • 测试覆盖率: 60% (3/5示例)
  • 构建时间: ~30秒
  • 编译器大小: 24MB (包含LLVM)

🎯 下一步重点

  1. 解析器完善: 支持完整的BitUI语法
  2. 代码生成增强: 实现完整的LLVM IR生成
  3. 语言设计: 确定最终的语言形态和特性
  4. 工具链建设: 开发配套的开发工具

贡献

欢迎提交Issue和Pull Request来改进编译器。

贡献指南

  1. Fork项目仓库
  2. 创建特性分支
  3. 提交代码更改
  4. 创建Pull Request
  5. 参与代码审查

开发环境设置

# 克隆仓库
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.bitui

许可证

MIT License