老赵写字的地方

Nop Platform 如何实现可逆计算

前文可逆计算:下一代软件构造理论介绍了可逆计算的理论公式 App = Delta x-extends Generator⟨DSL⟩。本文主要探讨可逆计算是如何在Java中落地的。简而言之,

将不同来源与格式的文件(XML、JSON、Excel、Java AST 等)归一化为内存中的统一树状结构 XNode,再通过对这棵语法树执行差量合并(Delta)与宏变换,最终生成强类型模型或驱动引擎动态执行的过程

架构核心推导逻辑

在探讨 Nop 平台的生命周期之前,我们可以先还原其底层的架构设计推导闭环:

【最终目标】 实现真正高可扩展的模型驱动(Model-Driven Development)
    │
    ├── 1. 客观现实:模型与代码的来源及表达形态是广泛且异构的(Excel, XML, JSON, Java AST)
    │      └──► 必须归一化:构建格式统一的内存节点 ───►【设计抽象语法树节点 XNode】
    │
    └── 2. 核心难题:模型驱动必须解决“非侵入式定制与扩展”,不能强行篡改原始模型
           └──► 必须差量计算:对模型的扩展,本质上是对抽象语法树(AST)进行“增删改查”
                (F_final = F_base + Δ)

Nop 平台将所有不同来源与形态的领域模型文件以及代码,统一归一化为内存中的抽象语法树节点 XNode;随后通过对这棵语法树执行结构化的“增、删、改、查”(差量叠加与宏变换),最终得到终态模型以驱动引擎动态执行,或批量生成磁盘源码。

核心流程

一个业务需求在 Nop 平台中,从磁盘上的原始文件到最终驱动业务运行,完整经历以下 4 个阶段:

【1. 多源归一化】           【2. 差量计算与编译】            【3. 强类型映射】          【4. 引擎解释 / 代码生成】
 各种格式模型文件        ──>  对 XNode 树执行 x:extends ──>  映射为内存 Model 对象 ──>  GraphQL/ORM 直接驱动
 (Excel/XML/JSON/Java)       合并、宏展开与 XDef 校验         (如 XMetaModel)           或生成磁盘 Java/Vue 源码

阶段一:多源归一化(Normalize to XNode)

要实现真正的模型驱动,首先必须打破各种模型文件与编程语言之间的格式壁垒。

在 Nop 中,无论是描述数据库关系的 .orm.xml、定义领域对象与校验规则的 .xmeta、Excel 表格里的数据字典,还是 Java 源代码的抽象语法树(AST),在加载阶段都会被解析器归一化为统一的内存结构——XNode。

阶段二:差量计算与语法树变换(Delta & Transform)

模型驱动面临的最大挑战是“如何在不修改底层原始模型的前提下进行业务定制”。Nop 给出的解法是:把对模型的定制,抽象为对 XNode 语法树的“增删改查”。

阶段三:强类型语义映射

经由差量合并与宏变换后得到的是一棵完整且包含所有默认属性的“终态 XNode 语法树”。但 XNode 依然是弱类型的树节点,无法直接提供编译期类型安全与极速读取。因此,Nop 会调用 DslModelParser,将这棵终态 XNode 树映射转换为内存中具有明确业务语义的强类型 Java Model 对象(例如 XMetaModel、OrmModel 或 WorkflowModel),并存入二级缓存。此时,系统完成了从“通用的树形语法结构”到“强类型领域模型”的编译演变。

阶段四:终态产出(模型驱动运行 vs. 代码生成)

得到强类型 Model 后,生命周期根据应用场景走向两个终点:

  • 模式 A:动态模型驱动(解释执行,消除胶水代码)系统在运行时,Nop 的通用引擎直接读取内存中的强类型 Model,全自动化地响应业务请求:
    • GraphQL 引擎:直接根据 XMetaModel 校验入参、拦截列级权限、执行 autoExpr 字段计算
    • ORM 引擎:根据 OrmModel 自动构建 SQL/HQL,实现持久化与级联查询。
    • 流程引擎:根据流程模型直接驱动状态机流转。
  • 模式 B:静态代码生成(生成磁盘源码)在开发编译期,也可以将终态 XNode 树作为数据源送入 XCodeGenerator 模板引擎,批量生成磁盘上的 Java Entity、DAO 接口或前端 Vue/TS 页面源码。
zh/nop/reversible_computing_implementation/overview.txt · 最后更改: 由 tom