Skip to content

Commit

Permalink
add doc
Browse files Browse the repository at this point in the history
  • Loading branch information
entropy-cloud committed Jan 12, 2025
1 parent d15a2c7 commit ce21ce5
Showing 1 changed file with 50 additions and 16 deletions.
66 changes: 50 additions & 16 deletions docs/theory/why-xlang-is-innovative.md
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ XLang语言是Nop平台底层的关键性支撑技术,在形式上它包含了

**目前大部分人对于软件结构构造的基本理解都是基于还原论的,总是不断向下分解,寻找原子化的成分,然后使用原子进行组装**。原本虚拟化的组件概念在潜意识中实际上是被看作是真实存在的离散个体,类似于物质世界中的粒子,通过嵌套组合来构造世界。但是物理世界中存在着另一种构造方式,那就是波。波是连续存在的模式,通过干涉叠加来构造世界。**XLang语言的特异性就在于它通过差量运算支持连续的叠加构造**

### 从结构的观点看程序语言
### 1.1 从结构的观点看程序语言

通用的高级程序语言从FORTRAN开始,经历了几十年的长期发展,目前已经发展到某种瓶颈。新语言所带来的本质上新颖的特性越来越少,各个高级语言都发展到了所谓的多范式编程阶段,它们的语法特性逐渐开始融合、趋同,比如大部分语言现在都同时支持面向对象式的结构声明,支持函数式的Lambda表达式,支持元编程所需要的自定义注解,支持异步编程所需的Async相关语法和支持库等。

Expand Down Expand Up @@ -117,7 +117,7 @@ class MapY extends Map1 with Map3 {
MapX -> Map2 -> Map1
```

### 泛型作为Generator
### 1.2 泛型作为Generator

泛型(Generic Type)在Java语言中仅仅是用于类型检查,编译器并没有根据泛型参数来执行什么特殊动作。但是在`C++`语言中,情况则大为不同。`C++`的泛型编程是通过模板(Templates)实现的,编译器会根据模板参数的不同将同一个模板类实例化为针对特定类型的不同代码。

Expand Down Expand Up @@ -194,11 +194,13 @@ Map = Generator<Map> = Map<Map>
Map = Map extends Map<Map>
```
### 从Map结构到Tree结构
### 1.3 从Map结构到Tree结构
在编译器看来,所谓的类、模板类、模板参数都可以被看作是Map,而且实际情况也一般是按照Map结构来管理的。至于孤立的函数定义和变量定义,实际上也会属于某种Map,比如模块对象可以看作是一个Map,它包含一组模块内定义的变量、函数和类型等。即使不从属于任何模块,那些独立的函数也会属于某个隐式存在的全局命名空间。
> Lisp语言的内在结构是List,本质上是利用下标来管理元素(原始的Lisp甚至没有下标,只有car、cdr这种逐个遍历的处理机制),但是现在流行的Lisp变种早就引入了类似Map的Associated List结构,使用名称来定位子元素,而不是按照下标去定位。在概念层面上(不考虑冯诺依曼机器按照下标取值的性能优势),List可以看作是用下标来做key的一种特殊的Map。
>
> Lisp的核心创造S表达式可以看作是一种通用的Tree结构,而Lisp也提供了宏等操作这些Tree结构的内置机制,但是Lisp并没有建立Tree的差量的概念。XLang可以看作是对S表达式这一通用处理机制的进一步深化发展。
现有主流程序语言提供的各种语法可以看作是在以Map为基础的结构空间中不断构造新的Map的各种规则。XLang语言的创新点在于它选择将Map结构扩展为Tree结构,在Tree结构的基础上重新思考软件结构的构造问题。也就是将软件结构的构造公式推广为:
Expand Down Expand Up @@ -253,7 +255,7 @@ class Dialog{
}
```

Dialog对象具有一组操作按钮,如果我们想定位到其中的【提交】按钮,把它的label属性修改为【确定】,在现有的程序语言中是没有一种简便直观的定位手段的。如果我们只想定制在某个场景下使用的Dialog(比如为它增加一个属性),使用一般程序语言配套的AOP机制也无法实现:因为**AOP的定位系统是基于类型的**。而在XLang语言中,可以直接使用如下描述
Dialog对象具有一组操作按钮,如果我们想定位到其中的【提交】按钮,把它的label属性修改为【确定】,在现有的程序语言中是没有一种简便直观的定位手段的。如果我们只想定制在某个场景下使用的Dialog(比如为它增加一个属性),使用一般程序语言配套的AOP(Aspect Oriented Programming)机制也无法实现:因为**AOP的定位系统是基于类型的**。而在XLang语言中,可以直接使用如下描述

```xml
<dialog>
Expand All @@ -265,7 +267,11 @@ Dialog对象具有一组操作按钮,如果我们想定位到其中的【提

目前程序语言的研究一般集中在类型系统,但是研究类型的原因在于不同的对象可以具有相同的类型,从而研究类型比研究原本的对象结构要简单而且不会涉及到对象的生命周期问题。**这导致类型系统并不是一个合格的坐标系:类型相同的对象在类型系统坐标系中无法被区分开来,因而也就无法继续建立精细的差量构造**

## 可扩展设计必然需要领域结构坐标系
有些人可能对于Tree结构存在疑惑,为什么不是图结构呢?在图结构上,如果我们选定了一个主要的观察方向,同时选择某个固定的节点作为根节点,那么我们就可以很自然的将一个图结构转换为树结构。比如Linux操作系统中,一切都是文件,很多逻辑关系都被纳入到文件树的表达结构中,但借助于文件系统中的文件链接机制,本质上可以表达图结构。**所谓的树仅仅是因为我们在图上选择了一个观察方向而产生的**

Tree结构**实现了相对坐标与绝对坐标的统一**:从根节点开始到达任意节点只存在唯一的一条路径,它可以作为节点的绝对坐标,而另一方面,在某一个子树范围内,每一个节点都具有一个子树内的唯一路径,可以作为节点在子树内的相对坐标。根据节点的相对坐标和子树根节点的绝对坐标,我们可以很容易的计算得到节点的绝对坐标(直接拼接在一起就可以了)。

### 1.4 可扩展设计必然需要软件结构坐标系

在软件开发中,所谓的可扩展性指的是在不需要修改原始代码的情况下,通过添加额外的代码或差异信息,可以满足新的需求或实现新的功能。如果在完全抽象的数学层面去理解软件开发中的扩展机制,我们可以认为它对应于如下公式:

Expand All @@ -287,8 +293,8 @@ Y = (A + dA) + (B + dB) + (C + dC) // 差量无处不在

假设X由A、B、C等多个部分构成,需求变更导致的差异性修改是遍布系统各处的,**如果要求所有零碎的修改都可以独立于原系统源码来管理和存放**(差量的独立性),并且小的差量还可以复合为一个更大粒度的差量(差量的可复合性),那么必然需要一个坐标系统用于精确定位。具体来说,`dA``A`分离之后,存放到独立存在的Delta中,那么它必然保留了某种定位坐标,只有这样,当Delta与`X`结合的时候,才可以重新找到原始的结构`A`,然后与`A`相结合。

### Delta与Patch和插件机制的区别
### 1.5 Delta与Patch和插件机制的区别

首先需要指出的是,类似于Git的Patch和分支管理不满足Delta的独立性和可复合性。Patch总是和特定的Base代码版本绑定在一起,在不知道Base的情况下无法将多个Patch合并为一个更大的Patch。详细分析参见文章[写给程序员的差量概念辨析,以Git和Docker为例](https://mp.weixin.qq.com/s/D5bDNkMJ9gYrFb0uDj2EzQ)

第二个需要强调的地方是,差量与传统编程领域中的扩展点和插件机制有着本质性差异。
Expand All @@ -301,8 +307,40 @@ Y = A + B + D
```

Delta差量不仅仅是向系统中增加内容。如果我们要实现粗粒度的系统级别的复用,所对应的差量必然包含减少的语义(比如,我们需要去除基础产品中定义的一个Bean)。实际上一个粗粒度的差量一定是加和减的混合。

另外需要注意的是,**插件机制只支持少量事先确定的扩展点**,我们并不可能在原始设计之外通过插件来定制原有系统的功能。但是Delta的概念则不同,只要存在一个全局的结构坐标系,这个坐标系中的任何一点上都可以引入Delta差量。

另外需要注意的是,**插件机制只支持少量事先确定的扩展点**,我们并不可能在原始设计之外通过插件来定制原有系统的功能。但是Delta的概念则不同,只要存在一个全局的结构坐标系,这个坐标系中的任何一点上都可以引入Delta差量。k8s中引入的Kustomize机制就是利用Delta差量来实现全面定制,可以看作是可逆计算理论的一个具体应用,参见[从可逆计算看Kustomize](https://mp.weixin.qq.com/s/48LWMYjEoRr3dT_HSHP0jQ)

> 组件的黑箱模型类似于高中阶段牛顿力学的世界观,它是完全机械化的:刚体的运动完全由它的质心坐标和尺寸形状朝向等少数几个参数来描述,刚体的内部构造无法被观测也无关紧要,刚体之间通过直接接触发生相互作用, 刚体的形状必须精确匹配才能构成一个无缝的整体。即使是在古典力学中,稍微高级一点的观点也都会转换到拉格朗日表述或者哈密尔顿表述,它的精神实质是转向场论的世界观。 所谓的场(Field),其实就是建立一个无所不在的坐标系,然后在坐标系的每一点上都可以指定一个物理量。场的自由度是无限的,但是通过坐标系它是可描述的、可定义的、可研究的,在坐标系的每一点上我们都可以精确的度量局部的变化。在场的世界观中,我们面对的核心图像是对象总是浸泡在场(无所不在的坐标系)中,而不再是孤立对象之间的两两相互作用。

### 1.6 稳定的领域结构坐标系

主流的程序语言都是通用程序语言,并没有内置某个特定的业务领域中的领域知识。因此,这些语言中内置的结构坐标系只能是利用语言内置的类-方法这种两级结构,最多是引入注解机制,在两级结构基础上进行一定的面向领域的细化。对于方法级别以下的结构,目前一般缺乏合适的技术手段进行坐标定义。

业务需求变化的时候,一般情况下会影响到多处代码发生变化。本质上这是因为从问题空间到解空间的结构映射在一般性的业务环境中都是**非平凡的**,因此两种描述方式无法有效的对齐。套用人工智能领域的话语,我们可以说:**有用的特征都是分布式的(distributed)**

> 在物理学中,同一个物理事实可以使用无数多种坐标系去建立描述,但是其中可能会存在一个特别的、针对这个特定问题定制的坐标系,在物理学中我们称之为内禀坐标系。在这个坐标系中建立的描述可以突出最核心的物理意义,简化相关的描述。比如说,在一个球面上发生的物理现象当然可以在通用的三维直角坐标系中进行描述,但是如果我们使用球面坐标系往往可以实现简化。

可逆计算理论指出可以针对特定的业务领域建立一个专用的DSL语言(Domain Specific Language),利用这个DSL语言很自然的建立一个领域坐标系,然后再在这个领域坐标系所定义的差量结构空间中表达差量。因为这个领域坐标系是针对领域问题特制的,因此它往往可以实现差量表达的最小化。比如说,发生了一个业务层面的变化导致需要增加一个字段,如果采用通用语言去表达,则很多地方可能都需要做相应调整,前台、后台、数据库都要一起修改。而如果使用领域模型描述,这种变化可能就只体现为局部的一个字段级别变化,然后由底层引擎框架自动将领域描述翻译为实际执行的逻辑功能。

XLang语言的核心功能就在于如何快速定义多个DSL语言,然后以这些DSL语言作为领域结构坐标系,利用它们实现差量定义和差量结构生成和转换。

XLang与其他语言的本质区别在于,它是基于可逆计算理论、面向DSL开发的程序语言。一般语言都是直接面向应用开发的,我们直接使用这些语言来对业务建模,实现业务逻辑。但是使用XLang,我们会先建立一个或者多个DSL,然后再使用DSL来描述业务。**XLang使得开发一个DSL的成本非常低**,最基本的情况下只需要使用XDef语言定义XDef元模型文件,即可得到这个新的DSL的解析器、验证器、IDE插件、可视化编辑器等,自动实现语法提示、断点调试功能和可视化编辑等完善的编程工具支持。

> Jetbrains公司有一个产品MPS(Meta Programming System),它也是支持先开发DSL,然后再用DSL来描述业务。MPS底层是自己定义的一套底层语言机制。Nop平台是一个类似于MPS的低代码开发平台,它的底层就是XLang语言。只不过Nop平台的指导理论是可逆计算,与MPS的技术路线和指导思想有着本质差异。
> 但是技术发展目标是类似的。

## 二. XLang的具体语法设计



XLang语言是面向Tree结构的语言设计,它的语法组成可以和面向表结构的SQL语言做一个对比。

| SQL语言 | XLang语言 |
| ------------------ | --------------- |
| DDL数据定义语言 | XDef元模型定义语法 |
| 面向表结构的DDL/DML等操作语言 | 面向Tree差量的XDSL语法 |
| 引入过程逻辑的存储过程语法 | XScript/Xpl子语法 |



如果TypeScript被认为是JavaScript + JSX + Type扩展,那么XLang可以看作是 JavaScript + XPL + 差量计算 + 元模型+ 元编程扩展。
Expand All @@ -315,13 +353,9 @@ Delta差量不仅仅是向系统中增加内容。如果我们要实现粗粒度
4. 使用XDef定义的所有DSL统称为XDSL, 这些XDSL都自动具有`x:override`, `x:extends`, `x:gen-extends`等语法特性。这些语法特性是可逆计算理论所提出的,在此前的程序语言中没有建立这种通用的抽象。
也就是说,XLang是第一个内置通用差量计算语法的程序语言。
5. XLang可以认为是包含XDef, XPL, XScript等多个子语言,但是它们作为一个整体才能实现可逆计算理论所提出的Y = F(X) + Delta的计算范式。
6. XLang与其他语言的本质区别在于,它是基于可逆计算理论、面向DSL开发的程序语言。一般语言都是直接面向应用开发的,我们直接使用这些语言来对业务建模,实现业务逻辑。但是使用XLang,我们先建立一个DSL,
然后再使用DSL来描述业务。并且开发一个DSL的成本非常低,最基本的情况下只需要使用XDef语言定义XDef元模型文件,即可得到这个新的DSL的解析器、验证器、IDE插件、可视化编辑器等。
7. Jetbrains公司有一个产品MPS,它也是支持先开发DSL,然后再用DSL来描述业务。MPS底层是自己定义的一套底层语言机制。Nop平台是一个类似于MPS的低代码开发平台,它的底层就是XLang语言。只不过Nop平台的指导理论是可逆计算,与MPS的技术路线和指导思想有着本质差异。
但是技术发展目标是类似的。

支持泛型的面向对象程序语言 在结构层面的计算模式可以看作是 Map = Map extends Map<Map>,而可逆计算理论以及XLang语言是将这种计算范式从Map结构扩展到Tree结构,并且引入包含删除语义的x-extends差量合并运算
Tree = Tree x-extends Tree<Tree>
6. 支持泛型的面向对象程序语言 在结构层面的计算模式可以看作是 Map = Map extends Map<Map>,而可逆计算理论以及XLang语言是将这种计算范式从Map结构扩展到Tree结构,并且引入包含删除语义的x-extends差量合并运算
Tree = Tree x-extends Tree<Tree>

一般的通用程序语言,比如C#和Java,它们试图解决的问题和采用的解决方案本质上是类似的,语法和语义层面基本也是可以一一对应的。XLang与这些语言都不同,它试图基于Tree和Delta差量的概念重建程序结构空间。程序语言是程序结构空间的构造规则,而XLang就是这个新视角下的程序结构空间的构造规则

Expand All @@ -331,6 +365,6 @@ Tree = Tree x-extends Tree<Tree>

SQL语言是面向表结构的,具有一个内置的Schema定义语言,并且具有存储过程子语法。而XLang是面向Tree结构和DSL开发的,具有内置的XDef元模型语言和类似JavaScript的XScript子语法。

## 二. XLang的具体语法设计
##

## 三. 语言之外的世界

0 comments on commit ce21ce5

Please sign in to comment.