编程语言的层级(Kotlin or Java)

这里的层级是类似谓词逻辑意义上的,用谓词逻辑的术语代指。

  • 一阶:字面量、局部变量、纯函数(Pure Function,即输入输出一一映射)、控制流(if/for)、基本运算。
  • 二阶:操作对象是类型的定义(Type Definition),即“个体的集合”或“数据契约”。包含:类(Class)、接口(Interface)、泛型(Type Parameter)、型变(Variance)、注解的定义(Annotation Declaration)、以及编译时反射(如 Kotlin 的 KClass 或 Java 的 Class 字面量)。
  • 三阶:操作对象是抽象语法树(AST)和编译流水线.包含:注解处理器(APT/KSP)、编译器插件(Compiler Plugin)、AST 转换(如 Lombok)、Kotlin 的内联元编程(inline + reified 本质上是在编译期将高阶信息降维到一阶)。

在程序设计上,总是优先考虑使用最低阶的元素实现目标。一方面,高阶实现低阶是不必要且逻辑混乱的;另一方面,对高阶的修改总是破坏低阶的现有架构,且总是需要更困难,更复杂的技术实现。

从纯粹逻辑上来说,在逻辑世界中求值总是无时间性的,但编译的过程中却体现了时间性。这根本上是因为信息的传播具有时间性。

$$A \to B \to C \to A \tag1$$

这个陈述是一阶的,再给出一个二阶陈述:

$$replace:(C \to A)\to(C\to B) \tag2$$

三阶陈述:

$$replace: replace \to set \quad set:A\to (A\to B)\tag3$$

去掉他们的可求值情况如下:

  • 1:不可
  • 1,2:不可
  • 2:不可
  • 3:可
  • 2,3:可

实际上:

逻辑无时序,但编译有时序。时序并非源自物理时钟,而是源自逻辑基数的不可逆性(Irreversibility of Logical Cardinality)。

因为三阶的元规则集合(RR)决定了二阶的类型范畴(TT),而二阶的范畴决定了一阶项(EE)是否合法。这一蕴含链(R→T→ER→T→E)是一个偏序关系(Partial Order)。

图灵机(编译器)作为序列化设备,只能按照该偏序的一个线性拓展(Linear Extension)(即拓扑排序)去处理源代码。因此,我们看到的三阶(注解处理)先于二阶(泛型擦除/类型检查)先于一阶(代码生成),实质上是逻辑依赖关系在时间轴上的必然投影。

理解这一点,就能明白:所谓‘优先使用最低阶’,并不是歧视高阶,而是为了降低逻辑依赖的耦合度。低阶代码之所以‘稳定’,是因为它站在依赖链的末端(结论端),它的正确性可由高阶保证;而高阶代码之所以‘敏感’,是因为它站在依赖链的顶端(前提端),修改它等于修改了所有结论的公理基础。”

在关系代数中,关系的传递闭包 $R^+$ 定义为:若 $aRb$ 且 $bRc$,则 $aR^+c$。设$R$为依赖关系(1 $R$ 2,2 $R$ 3)属于偏序,且依赖关系必须是良基的(Well-founded),即传递闭包中不允许存在循环(∀x,¬(x R+ x))。。可以表示这个情况。