====== XDef 元模型体系:DSL 的定义语言 ======
可逆计算要求所有业务结构以 DSL 形式存在(([[why_dsl|为什么可逆计算要求以 DSL 形式存在]]))。但问题来了:谁来定义 DSL 本身的结构?这就是 XDef 的角色。
XDef(XML Definition)是 Nop 平台中**用来定义 DSL 语法的元模型语言**。它描述了一个 DSL 文件可以有哪些节点、属性、子元素、数据类型等。基于 XDef,平台可以自动推导出解析器、验证器、IDE 插件、差量合并规则。
===== 为什么需要元模型 =====
传统的 DSL 实现方式是为每个语言手写解析器:
* SQL → 手写 SQL 解析器(antlr/yacc)
* JSON → 手写 JSON 解析器
* XML Schema → 手写 XSD 解析器
每个 DSL 都要重复"写解析器 → 写验证器 → 写编辑器插件"这个流程,成本很高。
Nop 的解决思路:**所有 DSL 共享同一种元模型描述**。只要写好 XDef,配套工具自动生成。
===== XDef 示例 =====
下面是一个 .xdef 文件片段,它定义了 ORM 实体模型(orm.xml)的语法:
这个 XDef 描述的意思是:
* 根节点叫 entity,有两个必需属性 name(字符串)和 table(字符串)
* entity 包含一个 columns 子节点
* columns 包含若干个 column 子节点
* column 有 name、code、primary、mandatory 等属性
* column 可以包含 comment 子节点
基于这几十行定义,平台自动获得:
* **解析器**:验证输入 XML 是否符合结构要求
* **验证器**:检查类型、必填、枚举值约束
* **IDE 支持**:语法提示、自动补全、文件跳转
* **差量合并规则**:哪些元素可以覆盖、哪些可以删除
===== 内置类型系统 =====
XDef 内置了一套完整的数据类型:
^ 类型 ^ 说明 ^
| string | 字符串 |
| boolean | 布尔值 |
| integer | 整数 |
| double | 浮点数 |
| decimal | 高精度小数(BigDecimal) |
| date | 日期 |
| datetime | 日期时间 |
| enum | 枚举值(配合 option 使用) |
| xml | 内嵌 XML 片段 |
| csv | 逗号分隔列表 |
还可以通过 xdef:check 扩展自定义验证逻辑。
===== 继承与复用 =====
XDef 支持元模型级别的复用机制:
* **xdef:base** — 继承另一个 XDef 定义
* **xdef:ref** — 引用已定义的结构
* **xdef:name** — 为节点命名,便于其他 XDef 引用
这意味着可以定义基础 XDef,然后在具体 DSL 中扩展。例如,所有业务模型的 XDef 都继承自一个公共的基础 XDef,统一了 id、name、label 等公共属性的定义。
===== 从 XDef 到 DSL 的工作流 =====
定义一个 Nop 平台 DSL 的完整流程:
- 编写 .xdef 文件(一人工作量,几小时到数天)
- 平台自动生成解析器、验证器、合并规则(自动)
- 编写 .xdsl 文件(具体的 DSL 实例,如 orm.xml)
- 平台加载 xdsl 时通过 x-extends 合并所有 Delta 层(自动)
- Generator 读取合并后的模型,生成 Java 代码、SQL、前端页面(自动)
.xdef(元模型)→ 解析器 + 验证器 + IDE 插件(自动生成)
↓
.xdsl(具体模型文件)→ 经过 x-extends 合并
↓
Generator → Java / SQL / GraphQL / 前端
整个过程,手写部分只有 .xdef 和 .xdsl 文件。
===== XDef 与 XSD/JSON Schema 的对比 =====
^ 对比维度 ^ XSD ^ JSON Schema ^ XDef ^
| 语法复杂度 | 繁琐 | 中等 | 简洁 |
| 差量合并 | 不支持 | 不支持 | 内置 |
| IDE 生成 | 需要额外工具 | 需要额外工具 | 自动 |
| 已定义 DSL 数量 | 少数 | 少数 | 数百个 |
| 与生成器集成 | 无 | 无 | 原生 |
XDef 的设计目标并非替代 XSD/JSON Schema,而是为**可逆计算中的 DSL 体系提供统一的元模型基础**。差量合并和代码生成才是它的核心价值。
===== 进一步阅读 =====
* [[..|reversible_computing_implementation 目录]]
* [[../reversible_computing|可逆计算:下一代软件构造理论]]
* [[https://github.com/entropy-cloud/nop-entropy|Nop Platform 2.0 开源项目]]