Files
tinycc/.monkeycode/specs/2026-05-20-tinycc-improvements/requirements.md
2026-05-30 07:59:28 +08:00

6.7 KiB
Raw Blame History

Requirements Document

Introduction

本改进计划涵盖 TinyCC 编译器的 9 个核心改进方向包括端到端测试、错误报告增强、代码清理、语义分析完善、预处理器集成、代码生成优化、调试信息支持、PE 格式支持及性能基准测试。

Glossary

  • TinyCC: 本项目实现的轻量级 C 编译器
  • E2E 测试: 端到端测试,验证完整编译流程
  • ELF: Executable and Linkable FormatLinux 可执行文件格式
  • PE: Portable ExecutableWindows 可执行文件格式
  • DWARF: 调试信息格式,支持源码级调试
  • ABI: Application Binary Interface应用二进制接口

Requirements

Requirement 1: 端到端编译测试

User Story: AS 一个编译器开发者I WANT 验证完整编译流程生成的可执行文件能够正确运行SO THAT 确保编译器各组件协同工作正常

Acceptance Criteria

  1. WHEN 提供包含 main 函数的 C 源代码,编译器 SHALL 生成可在 Linux 上执行的 ELF 文件
  2. WHEN 运行生成的 ELF 文件,程序 SHALL 返回正确的退出码
  3. WHEN 编译包含算术运算的 C 程序,执行程序 SHALL 输出正确的计算结果
  4. WHEN 编译包含函数调用的 C 程序,执行程序 SHALL 正确调用函数并返回结果
  5. WHEN 编译包含控制流语句if/while/for的 C 程序,执行程序 SHALL 正确执行控制流

Requirement 2: 增强错误报告

User Story: AS 一个 C 程序员I WANT 编译器提供包含代码上下文和位置提示的错误信息SO THAT 能够快速定位和修复代码问题

Acceptance Criteria

  1. WHEN 报告编译错误,错误信息 SHALL 包含文件名、行号和列号
  2. WHEN 报告语法错误,错误信息 SHALL 显示出错代码行及错误位置标记
  3. WHEN 报告类型错误,错误信息 SHALL 说明期望的类型和实际提供的类型
  4. WHEN 报告多个错误,编译器 SHALL 汇总所有错误并一次性输出
  5. IF 错误信息包含建议,建议 SHALL 提供可能的修复方向

Requirement 3: 清理误提交文件

User Story: AS 一个仓库维护者I WANT 从版本控制中移除构建产物和临时文件SO THAT 保持仓库整洁并减小仓库体积

Acceptance Criteria

  1. WHEN 提交代码,构建目录 bin/obj/ SHALL 被 .gitignore 排除
  2. WHEN 提交代码,临时测试文件 test_output SHALL 从版本控制中移除
  3. WHEN 提交代码,本地测试文件 test.c SHALL 从版本控制中移除

Requirement 4: 语义分析器完整实现

User Story: AS 一个 C 编译器开发者I WANT 语义分析器能够验证程序的语义正确性SO THAT 拒绝语义错误的 C 程序

Acceptance Criteria

  1. WHEN 遇到未声明的变量,语义分析器 SHALL 报告"未声明的标识符"错误
  2. WHEN 遇到类型不匹配的赋值操作,语义分析器 SHALL 报告类型不匹配错误
  3. WHEN 遇到函数调用参数数量不匹配,语义分析器 SHALL 报告参数数量错误
  4. WHEN 遇到函数调用参数类型不匹配,语义分析器 SHALL 报告参数类型错误
  5. WHILE 处理嵌套作用域,语义分析器 SHALL 正确解析变量的词法作用域
  6. WHEN 遇到重复的函数声明,语义分析器 SHALL 报告重复定义错误

Requirement 5: 预处理器集成到编译流程

User Story: AS 一个 C 编译器用户I WANT 编译器正确处理预处理指令SO THAT 可以编译包含宏和头文件的 C 程序

Acceptance Criteria

  1. WHEN 遇到 #include 指令,预处理器 SHALL 展开并包含指定头文件的内容
  2. WHEN 遇到 #define 宏定义,预处理器 SHALL 在后续代码中展开宏
  3. WHEN 遇到 #ifdef/#ifndef 条件编译,预处理器 SHALL 根据宏定义情况选择编译分支
  4. WHEN 预处理完成后,编译器驱动 SHALL 将预处理后的源代码传递给词法分析器
  5. IF 头文件不存在,预处理器 SHALL 报告错误并提供搜索路径信息

Requirement 6: 代码生成优化验证

User Story: AS 一个编译器开发者I WANT 验证优化后的代码生成器能够正确分配寄存器并生成高效代码SO THAT 提升生成程序的执行性能

Acceptance Criteria

  1. WHEN 使用优化代码生成器编译函数,寄存器分配算法 SHALL 为活跃变量分配物理寄存器
  2. WHEN 寄存器数量不足,寄存器分配算法 SHALL 正确地将变量溢出到栈
  3. WHEN 生成优化后的机器码,程序执行结果 SHALL 与未优化版本一致
  4. WHILE 分配寄存器,寄存器分配算法 SHALL 遵循调用约定保留被调用者保存的寄存器
  5. IF 代码生成器生成溢出代码,溢出区域 SHALL 正确管理栈帧布局

Requirement 7: DWARF 调试信息生成

User Story: AS 一个 C 程序员I WANT 编译器生成 DWARF 调试信息SO THAT 可以使用 gdb 对生成的可执行文件进行源码级调试

Acceptance Criteria

  1. WHEN 启用调试信息选项,编译器 SHALL 在 ELF 文件中生成 .debug_info
  2. WHEN 生成调试信息,调试信息 SHALL 包含源文件路径和行号映射
  3. WHEN 生成调试信息,调试信息 SHALL 包含变量名称、类型和作用域信息
  4. WHEN 使用 gdb 加载生成的可执行文件gdb SHALL 能够显示源代码并设置断点
  5. IF 未启用调试信息选项,编译器 SHALL 不生成调试信息以减小文件体积

Requirement 8: PE 格式可执行文件支持

User Story: AS 一个 Windows 用户I WANT 编译器生成 Windows PE 格式的可执行文件SO THAT 可以在 Windows 系统上运行编译后的程序

Acceptance Criteria

  1. WHEN 指定目标平台为 Windows x64编译器 SHALL 生成 PE32+ 格式的可执行文件
  2. WHEN 生成 PE 文件PE 文件 SHALL 包含正确的 DOS 头和 PE 签名
  3. WHEN 生成 PE 文件PE 文件 SHALL 包含有效的节表(.text.data
  4. WHEN 运行生成的 PE 文件Windows 操作系统 SHALL 能够加载并执行程序
  5. WHEN 生成 PE 文件PE 文件 SHALL 设置正确的入口点Entry Point

Requirement 9: 编译性能基准测试

User Story: AS 一个编译器开发者I WANT 建立编译性能基准SO THAT 可以量化编译器性能变化并识别性能瓶颈

Acceptance Criteria

  1. WHEN 运行性能基准测试,测试 SHALL 测量编译器处理标准 C 文件的编译时间
  2. WHEN 运行性能基准测试,测试 SHALL 测量生成代码的执行时间
  3. WHEN 运行性能基准测试,测试 SHALL 输出编译时间和执行时间的统计报告
  4. WHILE 进行性能优化,开发者 SHALL 能够对比优化前后的基准测试结果
  5. IF 性能基准测试发现回归,测试结果 SHALL 标记性能下降的模块