第 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 兼容性策略
每次演进必须遵循以下兼容规则,否则视为破坏性变更:
- Runtime_Interface 版本号:在新增方法或修改语义时按 SemVer 递增。BuF_Manifest 通过
runtime_interface_min表达自己依赖的最低版本。 - BuF schema 版本:新增可选字段时小版本递增;新增必填字段或修改既有字段语义时主版本递增。
- 错误码稳定性:已发布的错误码不得复用、不得变更语义;可新增。
- Universal_Instruction 类别:现有 8 类不复用编号;新增类别使用预留位。
- 弃用流程:先标记
deprecation_notice,加载时给出提示但仍允许;至少跨一个主版本后再移除。
8.8 工具链建议
为支撑长期演化,建议配套以下工具:
- 依赖方向静态检查:禁止运行层 import 任何 Platform_Adapter 类型,禁止运行层反向引用加载层内部类型。可用 ArchUnit / dep-cruiser / 自定义 lint 实现。
- 属性测试基线套件:把蓝图中所有正确性属性(往返一致性、状态机迁移、错误链、能力裁剪集合代数等)固化为跨语言 Conformance Suite,供任意 Runtime_Implementation 自我检验。
- Manifest CBOR 验证器:检查 Manifest 是否使用了确定性 CBOR;非确定性编码视为不合规。
- Adapter 描述符体检:在适配器注册时立即对
supported_capabilities与supported_instructions进行一致性体检(如能力位与指令所需能力的最小闭包)。
8.9 后续阶段路线图(汇总)
| 阶段 | 关键方向 | 主要影响层 | 兼容性影响 |
|---|---|---|---|
| 阶段一(当前) | 三层契约、解释执行、内置四适配器、签名、Section 部分加载、Eager/Lazy、BuF_Source 抽象 | 三层 + 横切 | — |
| 阶段二 | ExecutionStrategy / JIT / AOT | Runtime | 兼容(新增) |
| 阶段三 | 跨制品分层 / Distribution / 本地缓存 | Loader | 兼容(小版本) |
| 阶段四 | 共享内存 / IPC / 依赖图 | Runtime + Loader | 兼容(新增) |
| 阶段五 | 多节点协同 | Adapter(远端指令派发) | 兼容(新增) |
后续阶段的设计文档将以独立蓝图形式发布,与本蓝图共用同一套术语与契约。
