# MoonSmith 项目申报书

## 基本信息

- 项目名称：MoonSmith：MoonBit 编译器语义测试与失败用例归约工具
- 参赛者：詹荣瑞（个人参赛）
- 联系方式：[me@zrr.dev](<mailto:me@zrr.dev>)
- GitHub 仓库链接：https://github.com/zrr1999/moonsmith
- 项目方向：开发者工具 / 编译器测试基础设施
- 是否为移植项目：否

## 项目简介

MoonSmith 计划使用 MoonBit 实现编译器测试工具，提供随机程序生成、多后端结果比较、失败用例归约和回归测试能力。项目面向三类使用场景：

- 编译器开发者修改优化或代码生成逻辑后，批量生成程序并比较各后端结果，排查编译崩溃与计算差异。
- 生态维护者升级工具链前，重跑固定案例检查已知问题是否再次出现。
- 开发者报告工具发现的异常时，自动缩减失败程序并生成可重放的源码与环境记录。

MoonSmith 拟根据类型、作用域和终止约束构造程序，再利用 MoonBit 的多后端及受限子集的参考解释器检查计算结果，减少人工编写测试和缩减用例的工作。首版限定为确定性语言子集，归约对象限于工具自身生成的程序。架构上拟将通用 [Engine](<https://github.com/zrr1999/moonsmith/blob/main/fps/FP-0001-workspace-modules.md#term-engine>)与 MoonBit [语言适配器](<https://github.com/zrr1999/moonsmith/blob/main/fps/FP-0001-workspace-modules.md#term-language-adapter>)解耦，后续还能接入 Rust、Swift 适配器。本文维护产品范围和验收目标，概念定义见[术语索引](<https://docs.moonsmith.zrr.dev/glossary/index.md>)，当前实现范围见[CLI 实现说明](<https://github.com/zrr1999/moonsmith/blob/main/modules/cli/README.md#差分执行与存证>)。

## 核心功能范围

- 提供带类型的程序表示和源码生成，至少支持布尔值、受约束整数、局部绑定、分支、非递归函数、元组和非递归枚举。
- 支持固定随机种子及生成规模、嵌套深度和执行超时配置，重复运行可生成相同源码。
- 支持 wasm、wasm-gc、js、native 后端，覆盖 native debug 与 release，比较编译状态和程序输出。
- 提供小型参考解释器及有限的语义保持变换，辅助识别运行结果差异，分别记录编译错误、崩溃、无效产物及超时。
- 提供类型感知归约，在程序合法且仍触发同一异常的条件下删除或简化代码，输出更小的复现程序。
- 保存源码、种子、编译器版本、执行命令和原始输出，提供案例重放及 Markdown、JSON 报告。

十月交付以无需参考值的生成、差分、归约和源码重放闭环为范围。完整程序参考解释器的 实现与接入属于后续工作，当前结构路径只以工具链观察进行差分判定。等价变换程序的正常输出不一致归入 差分不一致。新检查与构建异常归约先保留本地执行和关联记录，独立版本化归档及迁移协议后置。

## 预期验收产物

- 可安装的 `moonsmith` 命令行工具和可复用 MoonBit 库，附源码、API 文档、必要测试及生成、比较、归约、重放示例。
- 固定种子测试集与实验报告：计划生成 10,000 个样本，内部及基线工具链检查通过比例至少 99%，至少 1,000 个样本完成四后端、五配置验证。
- 历史回归案例集：收录至少 3 个公开问题候选，完成至少 1 个的实测复现，记录编译器版本、运行环境和复现步骤。
- 归约演示及检测流程测试：展示缩减前后程序、同一异常的重复验证、缩减率和耗时，故障注入结果与真实编译器异常分开报告。

## 移植或参考说明

本项目为原创实现，参考以下项目的方法：

- [Csmith](<https://github.com/csmith-project/csmith>)：有效程序生成与编译器差分测试。许可证为 BSD-2-Clause。
- [RustSmith](<https://github.com/rustsmith/rustsmith>)：按语言约束生成随机程序。主项目许可证为 BSD-3-Clause。
- [Perses](<https://github.com/uw-pluverse/perses>)：通过测试判据保留失败行为的程序归约。许可证为 GPL-3.0。

MoonSmith 将针对 MoonBit 设计类型规则、程序表示和归约操作，将语言适配与通用执行流程分离。上述项目用于方法参考，不作源码移植。本项目许可证为 GPL-3.0-only。
