第 8 章 演进路线

本章交代 Fayger 第一阶段的边界,并按已知方向给出后续阶段的演进规划。每条演进项都注明它对当前架构的影响范围,以便后续设计时定向收敛。

8.1 第一阶段范围

第一阶段交付的 Fayger 至少满足:

  • 三层结构(Loader / Runtime / Adapter)的稳定契约。
  • BuF 制品的五段式格式与 CBOR 确定性 Manifest / Section_Index。
  • 加载链:Read(Header/Manifest/Index) → Parse → Verify(Structural) → Verify(Digest of Header/Manifest/Index) → Verify(Signature) → Negotiate Version → Select(Sections by LoadProfile) → Resolve → Read(Selected Section Bodies)? → HandOff。
  • BuF_Source 抽象,支持任意存储后端(本地、网络、对象存储、用户自定义)。
  • 部分加载(profile 驱动 Section 选择)与延迟加载(Eager / Lazy 两种 LoadStrategy),覆盖性能受限终端(无人机、摄像头)的体积与运行时取数需求。
  • 解释执行路径,BuF_Instance 生命周期状态机与故障隔离。
  • Universal_Instruction 8 类指令集与四类内置 Platform_Adapter(桌面 / 服务器 / 浏览器 / In-App)。
  • 统一错误模型与可观测性事件总线,加载层错误带 phase 标注。
  • 签名校验、强制签名模式、可信根更新可见性。

8.2 第一阶段非目标

为控制第一阶段复杂度,下列方向显式不交付:

  • 跨 BuF_Instance 的共享内存与 IPC 协议。
  • JIT 编译与机器码生成。
  • 分布式调度与多节点 Fayger 协同。
  • BuF 的差量分发与跨制品分层缓存(部分加载已涵盖单制品内的按段取舍,但跨制品的差量复用与 Distribution 协议留待后续)。
  • 内置远程仓库 / Distribution 协议。

非目标不代表"未来不需要",而是当前不在契约面上。后续阶段补齐时不应破坏已有契约。

8.3 后续阶段一:执行性能

主线方向:在不破坏 Runtime_Interface 的前提下加入更高效的执行路径。

8.3.1 ExecutionStrategy 抽象

把"如何执行 BuF 内的语义"抽出为策略:

interface ExecutionStrategy {
  prepare(obj: BuFObject) -> PreparedExecutable
  step(exec: PreparedExecutable, ctx: ExecutionContext) -> StepResult
}

第一阶段提供的 Interpreter 是一个具体策略;后续可以并存:

  • JIT:把 BuF code section 中的中间表示编译为机器码。
  • AOT:在加载阶段就完成机器码生成(适合发布场景)。
  • HybridTier:解释 → 探针 → 编译。

策略切换由 Runtime_Implementation 内部决定,不影响 Runtime_Interface 的对外契约。

8.3.2 性能可观测性

新增事件类别:

  • ExecutionMetric:解释 / 编译 / GC 等指标采样。
  • TierTransition:分层执行从一个层级切到另一层级。

对外不暴露具体策略实现,但允许调用方观察其影响。

8.4 后续阶段二:分发与缓存

8.4.1 BuF 跨制品分层与分块

第一阶段已支持 BuF 内部的 Section 粒度按需读取(Lazy)。后续在跨制品维度引入分层共享:

  • 不同 BuF 之间共享的资源(如标准库、模型权重)抽出为独立分层。
  • Manifest 增加可选的 layer_refs 声明,引用其他制品中的 Section。
  • 分发协议负责把分层资源以共享方式取回,本地缓存命中时跨 BuF 复用。

这要求 Manifest 增加一组可选字段,schema_version 据此抬一格小版本。已有 BuF 不受影响(兼容路径见 8.7)。

8.4.2 Distribution 协议

引入轻量分发协议(参考 OCI Distribution Spec):

  • discover / pull / verify 三段式。
  • 分发协议本身不在 Fayger 进程内,由独立组件实现,Fayger 只消费它产出的 chunk。

8.4.3 本地缓存

对已加载并签名校验通过的 BuF,缓存 Manifest 与 Section 的解析结果,跨进程命中。命中时仍重新执行签名校验(避免缓存毒化)。

8.5 后续阶段三:跨实例协同

8.5.1 共享内存(受控)

允许同一 Fayger 内多个 BuF_Instance 共享内存区域:

  • 在 Manifest 中显式声明 shared_memory 能力。
  • 由运行层统一分配区域,按能力授权暴露给请求方。
  • 共享区域受配额监测,违规即触发暂停。

8.5.2 IPC 协议

跨实例消息传递(同进程或同 Fayger 内):

  • 以 Universal_Instruction 的新类别 ipc 表达。
  • 默认拒绝;需在 Manifest 中声明对端 ID 集合或主题。

8.5.3 单 Fayger 内的依赖装配

允许一个 BuF 引用其他 BuF 作为依赖:

  • 加载链的 Resolve 阶段支持递归解析。
  • 依赖图由 Manifest 中 dependencies 字段表达。
  • 循环依赖在 Resolve 阶段拒绝。

8.6 后续阶段四:分布式

主线方向:多节点 Fayger 协同。第一阶段不涉及,但需要在以下方向预留空间:

  • BuF_Instance 的 ID 必须在跨节点视角下也唯一可寻址。
  • Lifecycle 事件的时间戳必须能与外部追踪系统对齐。
  • Universal_Instruction 的 TLV 编码已经具备跨网络传输能力,未来"远端指令派发"可作为单独的 Adapter 实现。

8.7 兼容性策略

每次演进必须遵循以下兼容规则,否则视为破坏性变更:

  1. Runtime_Interface 版本号:在新增方法或修改语义时按 SemVer 递增。BuF_Manifest 通过 runtime_interface_min 表达自己依赖的最低版本。
  2. BuF schema 版本:新增可选字段时小版本递增;新增必填字段或修改既有字段语义时主版本递增。
  3. 错误码稳定性:已发布的错误码不得复用、不得变更语义;可新增。
  4. Universal_Instruction 类别:现有 8 类不复用编号;新增类别使用预留位。
  5. 弃用流程:先标记 deprecation_notice,加载时给出提示但仍允许;至少跨一个主版本后再移除。

8.8 工具链建议

为支撑长期演化,建议配套以下工具:

  • 依赖方向静态检查:禁止运行层 import 任何 Platform_Adapter 类型,禁止运行层反向引用加载层内部类型。可用 ArchUnit / dep-cruiser / 自定义 lint 实现。
  • 属性测试基线套件:把蓝图中所有正确性属性(往返一致性、状态机迁移、错误链、能力裁剪集合代数等)固化为跨语言 Conformance Suite,供任意 Runtime_Implementation 自我检验。
  • Manifest CBOR 验证器:检查 Manifest 是否使用了确定性 CBOR;非确定性编码视为不合规。
  • Adapter 描述符体检:在适配器注册时立即对 supported_capabilitiessupported_instructions 进行一致性体检(如能力位与指令所需能力的最小闭包)。

8.9 后续阶段路线图(汇总)

阶段关键方向主要影响层兼容性影响
阶段一(当前)三层契约、解释执行、内置四适配器、签名、Section 部分加载、Eager/Lazy、BuF_Source 抽象三层 + 横切
阶段二ExecutionStrategy / JIT / AOTRuntime兼容(新增)
阶段三跨制品分层 / Distribution / 本地缓存Loader兼容(小版本)
阶段四共享内存 / IPC / 依赖图Runtime + Loader兼容(新增)
阶段五多节点协同Adapter(远端指令派发)兼容(新增)

后续阶段的设计文档将以独立蓝图形式发布,与本蓝图共用同一套术语与契约。