Baboon:数据建模与自动演进及无标签二进制编解码器
发布: (2025年11月30日 GMT+8 04:12)
6 min read
原文: Hacker News
Source: Hacker News
Baboon:具备自动演进和无标签二进制编解码器的数据建模
Baboon 是一种极简的数据建模语言和编译器,提供符合人体工学的声明式模式并强制可靠的模式演进。编译器以快速的不可变多阶段 DAG 转换方式运行,易于理解和维护。
本质上,你定义数据结构,Baboon 为你生成实现。随后你定义新版本,Baboon 生成新结构、从旧结构版本到新结构的转换,并强制你提供无法自动推导的转换。它还附带一种针对所有结构的极高效的无标签二进制编码。
当前支持生成 C# 和 Scala;更多后端正在路上。
亮点
- 自动推导 JSON 和 UEBA(Ultra‑Efficient Binary Aggregate,定制的无标签二进制格式)的编解码器
- 演进感知代码生成:在可能的情况下推导迁移,在需要手动处理时生成存根
- 使用
+、-、^运算符的基于集合的结构继承 - 代数数据类型(
adt)、DTO(data)和枚举 - 基本的名义继承(
contract) - 命名空间、包含和导入
- 集合(
opt、lst、set、map)以及时间戳/UID 原语 - 去重的 C# 输出(尽可能复用代码以降低二进制体积)
示例模型(v1.0.0)
model acme.billing
version "1.0.0"
root adt PaymentMethod {
data Card {
pan: str
holder: str
}
data Wallet {
provider: str
token: str
}
}
重构模型(v2.0.0)
model acme.billing
version "2.0.0"
data Token {
token: str
}
root adt PaymentMethod {
data Card {
pan: str
holder: str
}
// refactored, but same structure as before
data Wallet {
provider: str
+ Token
}
// new ADT member
data BankTransfer { iban: str }
}
Baboon 会生成从 1.0.0 到 2.0.0 的转换(迁移)。在本例中,所有迁移均可自动生成。
仓库中的 docs/language-features.md 提供了带有复制‑粘贴示例的详细语言演练。
编辑器支持
- IntelliJ IDEA 插件 – 源码:
baboon-intellij - VS Code 扩展 – 源码:
baboon-vscode - VSCodium 扩展 – 与 VS Code 相同
限制
- 没有模板
- 仅支持枚举、DTO 和 ADT
- 名义继承仅限于 trait 模型
- 泛型/类型构造器仅限于内置集合
- 这是一种 DML,而非 IDL;对服务/接口定义的支持极其有限
- 注释不会保留在转译器输出中
- 结构继承信息不会保留在转译器输出中
- 枚举成员只能关联整数常量
- 不支持新类型/类型别名
- 不支持基于继承的镜头/投影/转换
标有星号的点可能在未来得到改进。
CLI
请参阅 .mdl/defs/actions.md 中的构建配置以及 .mdl/defs/tests.md 中的测试配置。
备注
- 所有未被
root类型传递引用的类型都会从编译器输出中剔除。 - 结构继承中的使用不算作引用,因此未直接作为字段引用且未标记为
root的结构父类会被剔除。
外部类型
使用外部类型时需小心;正确接线编解码器是你的责任。
针对每个外部类型:
- 创建自定义编解码器。
- 使用
BaboonCodecs#Register覆盖生成的占位编解码器。 - 使用
${Foreign_Type_Name}_UEBACodec#Instance的 setter 覆盖生成的占位编解码器。 - 使用
${Foreign_Type_Name}_JsonCodec#Instance的 setter 覆盖生成的占位编解码器。
确保你的外部类型 不是 原始类型或其他生成的类型。外部类型可以出现在任何泛型中,但你必须保证其正确性。
开发
构建命令
本项目使用 mudyla 进行构建编排。
# 格式化代码
direnv exec . mdl :fmt
# 构建编译器
direnv exec . mdl :build
# 运行完整测试套件
direnv exec . mdl :build :test
# 运行完整构建流水线(格式化、构建、测试)
direnv exec . mdl :full-build
# 运行特定测试套件
direnv exec . mdl :build :test-gen-regular-adt :test-cs-regular :test-scala-regular
direnv exec . mdl :build :test-gen-wrapped-adt :test-cs-wrapped :test-scala-wrapped
direnv exec . mdl :build :test-gen-manual :test-gen-compat-scala :test-gen-compat-cs :test-manual-cs :test-manual-scala
# 创建发行包
direnv exec . mdl :build :mkdist
# 使用自定义发行路径构建
direnv exec . mdl --mkdist-source=./custom/path --mkdist-target=./output :build :mkdist
环境设置
# 进入 Nix 开发 shell
nix develop
# 或使用 direnv 自动激活 shell
direnv allow