Baboon:数据建模与自动演进及无标签二进制编解码器

发布: (2025年11月30日 GMT+8 04:12)
6 min read

Source: Hacker News

Baboon:具备自动演进和无标签二进制编解码器的数据建模

Baboon 是一种极简的数据建模语言和编译器,提供符合人体工学的声明式模式并强制可靠的模式演进。编译器以快速的不可变多阶段 DAG 转换方式运行,易于理解和维护。

本质上,你定义数据结构,Baboon 为你生成实现。随后你定义新版本,Baboon 生成新结构、从旧结构版本到新结构的转换,并强制你提供无法自动推导的转换。它还附带一种针对所有结构的极高效的无标签二进制编码。

当前支持生成 C#Scala;更多后端正在路上。

亮点

  • 自动推导 JSON 和 UEBA(Ultra‑Efficient Binary Aggregate,定制的无标签二进制格式)的编解码器
  • 演进感知代码生成:在可能的情况下推导迁移,在需要手动处理时生成存根
  • 使用 +-^ 运算符的基于集合的结构继承
  • 代数数据类型(adt)、DTO(data)和枚举
  • 基本的名义继承(contract
  • 命名空间、包含和导入
  • 集合(optlstsetmap)以及时间戳/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.02.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 的结构父类会被剔除。

外部类型

使用外部类型时需小心;正确接线编解码器是你的责任。

针对每个外部类型:

  1. 创建自定义编解码器。
  2. 使用 BaboonCodecs#Register 覆盖生成的占位编解码器。
  3. 使用 ${Foreign_Type_Name}_UEBACodec#Instance 的 setter 覆盖生成的占位编解码器。
  4. 使用 ${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
Back to Blog

相关文章

阅读更多 »

Scala的起源 (2009)

请提供您希望翻译的具体摘录或摘要文本,我才能为您进行简体中文翻译。