MoonSmith 项目申报书¶
基本信息¶
- 项目名称:MoonSmith:MoonBit 编译器语义测试与失败用例归约工具
- 参赛者:詹荣瑞(个人参赛)
- 联系方式:me@zrr.dev
- GitHub 仓库链接:https://github.com/zrr1999/moonsmith
- 项目方向:开发者工具 / 编译器测试基础设施
- 是否为移植项目:否
项目简介¶
MoonSmith 计划使用 MoonBit 实现编译器测试工具,提供随机程序生成、多后端结果比较、失败用例归约和回归测试能力。项目面向三类使用场景:
- 编译器开发者修改优化或代码生成逻辑后,批量生成程序并比较各后端结果,排查编译崩溃与计算差异。
- 生态维护者升级工具链前,重跑固定案例检查已知问题是否再次出现。
- 开发者报告工具发现的异常时,自动缩减失败程序并生成可重放的源码与环境记录。
MoonSmith 拟根据类型、作用域和终止约束构造程序,再利用 MoonBit 的多后端及受限子集的参考解释器检查计算结果,减少人工编写测试和缩减用例的工作。首版限定为确定性语言子集,归约对象限于工具自身生成的程序。架构上拟将通用 Engine与 MoonBit 语言适配器解耦,后续还能接入 Rust、Swift 适配器。本文维护产品范围和验收目标,概念定义见术语索引,当前实现范围见CLI 实现说明。
核心功能范围¶
- 提供带类型的程序表示和源码生成,至少支持布尔值、受约束整数、局部绑定、分支、非递归函数、元组和非递归枚举。
- 支持固定随机种子及生成规模、嵌套深度和执行超时配置,重复运行可生成相同源码。
- 支持 wasm、wasm-gc、js、native 后端,覆盖 native debug 与 release,比较编译状态和程序输出。
- 提供小型参考解释器及有限的语义保持变换,辅助识别运行结果差异,分别记录编译错误、崩溃、无效产物及超时。
- 提供类型感知归约,在程序合法且仍触发同一异常的条件下删除或简化代码,输出更小的复现程序。
- 保存源码、种子、编译器版本、执行命令和原始输出,提供案例重放及 Markdown、JSON 报告。
十月交付以无需参考值的生成、差分、归约和源码重放闭环为范围。完整程序参考解释器的 实现与接入属于后续工作,当前结构路径只以工具链观察进行差分判定。等价变换程序的正常输出不一致归入 差分不一致。新检查与构建异常归约先保留本地执行和关联记录,独立版本化归档及迁移协议后置。
预期验收产物¶
- 可安装的
moonsmith命令行工具和可复用 MoonBit 库,附源码、API 文档、必要测试及生成、比较、归约、重放示例。 - 固定种子测试集与实验报告:计划生成 10,000 个样本,内部及基线工具链检查通过比例至少 99%,至少 1,000 个样本完成四后端、五配置验证。
- 历史回归案例集:收录至少 3 个公开问题候选,完成至少 1 个的实测复现,记录编译器版本、运行环境和复现步骤。
- 归约演示及检测流程测试:展示缩减前后程序、同一异常的重复验证、缩减率和耗时,故障注入结果与真实编译器异常分开报告。
移植或参考说明¶
本项目为原创实现,参考以下项目的方法:
- Csmith:有效程序生成与编译器差分测试。许可证为 BSD-2-Clause。
- RustSmith:按语言约束生成随机程序。主项目许可证为 BSD-3-Clause。
- Perses:通过测试判据保留失败行为的程序归约。许可证为 GPL-3.0。
MoonSmith 将针对 MoonBit 设计类型规则、程序表示和归约操作,将语言适配与通用执行流程分离。上述项目用于方法参考,不作源码移植。本项目许可证为 GPL-3.0-only。