Skip to content

Commit

Permalink
docs: synced via GitHub Actions
Browse files Browse the repository at this point in the history
  • Loading branch information
nop-cao committed Jan 12, 2025
1 parent e7e4f84 commit 5f7e2e4
Showing 1 changed file with 51 additions and 13 deletions.
64 changes: 51 additions & 13 deletions src/theory/why-xlang-is-innovative.md
Original file line number Diff line number Diff line change
Expand Up @@ -10,10 +10,9 @@ XLang语言是Nop平台底层的关键性支撑技术,在形式上它包含了

这里我想提出一个对程序语言的本质的理解:**一门程序语言定义了一种程序结构空间,程序语言是程序结构空间的构造规则**。也就是说,一门程序语言所能够创造的所有结构以及这些结构之间的所有可行演化路径构成了一个特定的程序结构空间,所有可行的计算都在这个结构空间中发生。

基于以上理解,**XLang语言之所以是一门创新的程序语言,是因为它创造了一个新的程序结构空间,在这个结构空间中可以很方便的实现可逆计算理论所提出的`Y = F(X) + Delta`的计算范式**。虽然XLang可以认为是包含XDef, XPL, XScript等多个子语言,但是它们作为一个整体才是实现可逆计算的关键所在。
**XLang是世界上第一个在语言中明确定义领域结构坐标并内置通用的差量计算规则的程序语言**

基于以上理解,**XLang语言之所以是一门创新的程序语言,是因为它创造了一个新的程序结构空间,在这个结构空间中可以很方便的实现可逆计算理论所提出的`Y = F(X) + Delta`的计算范式**。虽然XLang可以认为是包含XDef, XPL, XScript等多个子语言,但是它们作为一个整体才是实现可逆计算的关键所在。**XLang是世界上第一个在语言中明确定义领域结构坐标并内置通用的差量计算规则的程序语言**

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

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

Expand Down Expand Up @@ -160,6 +159,7 @@ int main() {
a.f();
}
```
输出
```
Expand Down Expand Up @@ -211,7 +211,7 @@ Tree = Tree x-extends Tree<Tree>
显然Map是Tree的一个特例,Tree结构的每一个节点都可以看作是一个Map, `Tree = Map + Nested`,因此上面的公式确实可以被看作是对`Map extends Map<Map>`构造模式的一种推广。
但是从另外一个角度去考虑,Tree结构可以通过嵌套组合多个Map构造出来,Map是一种更基本的、更细粒度的结构,那么有必要强调Tree结构吗?所有Tree结构上的运算最终不都能分解为每一级的Map结构上的运算吗?
XLang对这个问题的回答是:在更复杂的Tree结构上建立的软件结构空间(以及这个结构空间中的构造规律)并不能简单的划归到以Map为基础的软件结构空间。也就是说,这里出现了`整体 > 部分之和`的情况,Tree的构造规律所具有的整体性分解到Map结构的构造规律之后会丢失一些关键性信息。
XLang对这个问题的回答是:在更复杂的Tree结构上建立的软件结构空间(以及这个结构空间中的构造规律)并不能简单的划归到以Map为基础的软件结构空间。也就是说,这里出现了`整体 > 部分之和`的情况,**Tree的构造规律所具有的整体性分解到Map结构的构造规律之后会丢失一些关键性信息**
要真正的理解XLang语言的创新之处,必须要了解XLang语言设计背后的下一代软件构造理论:可逆计算理论。可逆计算明确提出逆元和差量的概念,指出全量是差量的一个特例(A=0+A),我们需要在(包含逆元的)差量概念的基础上重建所有对软件世界的理解。可逆计算提出了一个通用的图灵完备的软件构造公式:
Expand All @@ -222,6 +222,7 @@ XLang对这个问题的回答是:在更复杂的Tree结构上建立的软件
XLang语言是在程序语言级别实现这一技术战略的具体实现方案。
关于可逆计算理论的介绍,可以参见我的公众号文章:
1. [可逆计算:下一代软件构造理论](https://mp.weixin.qq.com/s/CwCQgYqQZxYmlZcfXEWlgA)
2. [写给程序员的可逆计算理论辨析](https://mp.weixin.qq.com/s/aT99VX6ecmZXdemBPnBcoQ)
3. [写给程序员的可逆计算理论辨析补遗](https://mp.weixin.qq.com/s/zGfo7pvKjOCa11PYLJHzzA)
Expand All @@ -235,25 +236,60 @@ XLang语言是在程序语言级别实现这一技术战略的具体实现方案
上述的xpath表示tasks节点下的名称为test的子节点的name属性。
首先我们来明确一下坐标系统的作用: 每一个业务上关心的值在坐标系统中都具有唯一的坐标,可以通过这个坐标来实现值的读取和修改。
```
value = get(path);
set(path,value);
```
通过严密的理论分析,可逆计算得出的一个必然推论是差量的独立性和可复合性要求存在稳定的领域坐标系,而正是无所不在的、整体性的领域坐标系导致了Tree结构空间和Map结构空间的本质性差异。
Map结构的问题在于它只提供两级坐标:第一级定位到Map,第二级在Map内定位到属性或者方法。但是这种简单的坐标系统无法实现业务层面上精确的区分。比如说
```java
class Dialog{
String title;
List<Button> actions;
List<Component> body;
}
```

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

```xml
<dialog>
<actions>
<button name="submit" label="确定" />
</actionss>
</dialog>
```

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

## 可扩展设计必然需要领域结构坐标系

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

```
Y = X + Delta
```

* X对应于我们已经编写完毕的基础代码,它不会随需求的变化而变化
* Delta对应于额外增加的配置信息或者差异化代码

在这个视角下,所谓的可扩展性方面的研究就等价于Delta差量的定义和运算关系方面的研究。

```
X = A + B + C
X' = (A + dA) + (B + dB) + (C + dC) // 差量无处不在
Y = (A + dA) + (B + dB) + (C + dC) // 差量无处不在
= (A + B + C) + (dA + dB + dC) // 差量可以聚合在一起,独立于基础代码存放
= X + Delta // 差量满足结合律,可以独立于Base实现合并运算
```

假设X由A、B、C等多个部分构成,`X'`是需求变更后对原系统进行改造后的结果。需求变更导致的差异性修改是遍布系统各处的,**如果要求所有零碎的修改都可以独立于原系统源码来管理和存放**(差量的独立性),并且小的差量还可以复合为一个更大粒度的差量(差量的可复合性),那么这就意味着软件结构空间中存在一个完善的坐标系统,每个差量
每个差量都需要关联一个稳定的坐标,
整个系统中必须存在一个完善的坐标系统,每个Delta都明确知道它应该作用到哪个坐标处。
则我们在完全不修改基础产品源码的情况下就可以实现深度的定制开发。
假设X由A、B、C等多个部分构成,需求变更导致的差异性修改是遍布系统各处的,**如果要求所有零碎的修改都可以独立于原系统源码来管理和存放**(差量的独立性),并且小的差量还可以复合为一个更大粒度的差量(差量的可复合性),那么必然需要一个坐标系统用于精确定位。具体来说,`dA``A`分离之后,存放到独立存在的Delta中,那么它必然保留了某种定位坐标,只有这样,当Delta与`X`结合的时候,才可以重新找到原始的结构`A`,然后与`A`相结合。

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

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

第二个需要强调的地方是,差量与传统编程领域中的扩展点和插件机制有着本质性差异。

Expand All @@ -265,6 +301,8 @@ Y = A + B + D
```

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

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


如果TypeScript被认为是JavaScript + JSX + Type扩展,那么XLang可以看作是 JavaScript + XPL + 差量计算 + 元模型+ 元编程扩展。
Expand Down

0 comments on commit 5f7e2e4

Please sign in to comment.