Skip to content

寻址与数据结构

在深入 AmritaSense 的控制流之前,必须先理解它是如何组织和定位节点的。这不是一张扁平的图,而是一个有深度的、可精确寻址的地址空间。


3.2.1 地址空间:Bubble 与层级结构

在 AmritaSense 中,节点的排布与定位并非一层平面结构。相反,它是一个多层嵌套的地址空间

每一层都被称为一个 Bubble

一个 Bubble 拥有独立的 near 地址空间,本质上就是该层节点列表的线性索引。当我们使用括号 () 将一组节点包裹起来时,就创建了一个新的 Bubble——一个内层执行空间。括号内的节点在该 Bubble 内拥有独立的地址索引,不会被外部的线性计数直接干扰。

这种设计让逻辑分块变得极其自然:你不需要手动管理复杂的子图引用,只需要用括号划定作用域,该作用域内的跳转和调用就天然被限定在局部空间。


3.2.2 指针向量:可变维度的高维索引

既然地址空间是多层的,那么如何才能精准定位到任意一个节点?

这里引出了 AmritaSense 的核心数据结构——PointerVector(指针向量)

正如它的名字,指针向量是一个支持可变维度的高维向量。它的维度数量一一对应节点所处的层级深度:如果节点在顶层,指针就是一维的 [i];如果节点在两层 Bubble 之内,指针就是二维的 [i, j];以此类推。每个维度上的数值,对应该节点在其对应层级内的绝对偏移索引。

但需要注意: 向量仅仅是它的外在表现形式,而非底层本质。单纯的向量维度和模长本身,并没有实际的运行语义——它只是一个数据结构。

它真正的“指针”特性,体现在运行逻辑中:

在 WorkflowInterpreter 的主循环里,引擎始终以指针向量所指向的地址作为当前执行节点。每一次迭代,解释器执行完当前节点后,就推进指针到下一个位置。指针向量就是工作流的“程序计数器”(Program Counter),它决定了下一步执行谁

当需要嵌套执行时,解释器会在指针向量上追加一个新的维度(进入 Bubble);当 Bubble 内的节点执行完毕,解释器弹出该维度(退出 Bubble),回到上一层继续推进。


3.2.3 定位与跳转:ALIAS 符号别名系统

了解了地址空间和指针向量的排布规则后,下一步就是节点定位与流程跳转能力。

假设有如下基础执行流:

python
IF(...) >> node1 >> node2

如果想实现条件分支跳转——当 IF 条件判定为真时,跳转到 node2 执行,否则顺序向下——就需要引入 AmritaSense 的符号别名机制

ALIAS 的工作原理与 Linux 的符号链接类似,区别在于它不指向文件路径,而是直接绑定引擎内部的节点物理地址。通过给目标节点附加一个全局唯一的符号标签,工作流的其他位置就可以通过该标签直接跳转到目标节点,而不需要知道它的具体指针向量数值。

依托这一语法,我们可以完成精准跳转:

python
IF(condition, GOTO("tag")) >> node1 >> ALIAS(node2, "tag")

在这个示例中:

  • "tag" 是别名标记,在编译期被绑定到 node2 的物理地址
  • ALIAS 是专属标记原语,用来给目标节点附加符号别名
  • GOTO("tag") 在运行时通过别名查表,获取目标地址,直接跳转
  • 在编译预处理阶段,解释器会完成所有别名的注册和地址映射

这套寻址体系的核心优势在于:它将“数据排布”(结构体数组)和“执行路径”(指针跳转)彻底分离。 工作流在内存中是线性排列的节点序列,但解释器可以通过符号查表和指针改写,在这个线性空间里实现任意复杂的非线性跳转。这正是冯·诺依曼架构的核心思想在工作流引擎中的直接映射。

LGPL V2 许可证约束