BLUEPRINT
第 1 章 引言
1.1 背景
Fay 生态需要一个能够屏蔽终端与宿主差异、让同一份 Fay 制品在桌面、服务器、浏览器与嵌入式宿主中一致运行的执行底座。这个底座就是 Fayger。
类比已有体系:
- 之于 Java 字节码,Fayger 之于 BuF,相当于 JVM。
- 之于容器镜像,Fayger 之于 BuF,相当于 Docker / OCI Runtime。
Fayger 不规定 Fay 本身的语义如何被作者写出,它只规定 Fay 制品如何被加载、校验、调度、执行,以及它与宿主之间如何互不污染。
1.2 定位
Fayger 是一个虚拟运行环境(Virtual Runtime Environment):
- 接收一种被称为 BuF(Built-up Fay) 的封装实体作为输入。
- 完成 BuF 的读取、结构校验、版本协商、签名校验、加载。
- 在多种语言实现的运行层中之一里把 BuF 解释执行起来。
- 通过适配层把执行过程中的"通用指令"翻译为目标终端的系统能力。
用户视角下的体验是:把 BuF 交给 Fayger,Fayger 让它跑起来。
1.3 设计原则
Fayger 第一阶段的设计按以下优先级排序:
- 可移植性优先。BuF 编译一次,在任何已适配宿主中都可以执行;运行层与适配层之间通过稳定的 Universal_Instruction 解耦。
- 多语言实现。运行层暴露语言中立的 Runtime_Interface,允许 Rust / Go / TypeScript 等多种实现共存与替换,不绑定单一语言生态。
- 可证明的正确性。BuF 解析与序列化必须满足往返一致性,生命周期状态机必须满足合法迁移性质,跨平台行为必须满足序列一致性。这些性质以可被属性测试(PBT)验证的形式表达。
- 安全可观测。默认安全(强制签名模式可开),默认静默(调试事件默认关闭),错误结构化(统一错误模型 + 来源层标注 + 错误链)。
1.4 三层结构概览
Fayger 在体系结构上划分为三层:
- 加载层(Loader Layer):BuF 与外部世界之间的边界,负责读、写、校验与版本协商。
- 运行层(Runtime Layer):BuF 语义的执行者,支持多种语言实现,通过统一接口契约互换。
- 适配层(Adapter Layer):宿主与 Fayger 之间的边界,负责通用指令与系统调用之间的双向翻译。
每一层都有清晰的对外契约与对内分工。详细职责见下一章。
1.5 与现有体系的对照
| 现有体系 | Fayger 对应物 |
|---|---|
| JVM ClassLoader → Verifier → ExecutionEngine | Loader Layer → Runtime Layer |
| JVM class file(magic / version / constant pool) | BuF 制品(Header / Manifest / Sections / Trailer) |
| OCI Image Manifest + Layers | BuF_Manifest + Sections |
| OCI Runtime Spec | Runtime_Interface |
| containerd vs runc | Runtime_Layer 编排 vs Runtime_Implementation 执行 |
| WASI capability-based security | Adapter_Layer 能力裁剪 |
| JNI / extism host functions | Universal_Instruction 中的 host 类别 |
1.6 术语表
- Fayger:本蓝图定义的虚拟运行环境。
- BuF(Built-up Fay):Fay 的可分发、可加载实体,是 Fayger 的输入单元。
- BuF_Manifest:BuF 内部的元数据清单(版本、入口、依赖、能力、配额、签名等)。
- Loader_Layer / Runtime_Layer / Adapter_Layer:Fayger 的三个分层。
- Runtime_Interface:运行层对外的稳定接口契约。
- Runtime_Implementation:运行层的某一具体语言实现。
- Platform_Adapter:适配层中针对某一终端 / 操作系统的具体适配器。
- Universal_Instruction:运行层与适配层之间的、与平台无关的指令。
- BuF_Instance:被加载到运行层中、可执行或执行中的 BuF 运行时实体。
- Lifecycle_State:BuF_Instance 的生命周期状态。
- Host_Environment:Fayger 实际运行所在的终端、操作系统或宿主应用进程。
- BuF_Source:BuF 的存储后端抽象(本地文件、网络、对象存储、用户自定义后端),最低要求暴露随机访问读能力。
- LoadProfile:加载时由调用方提供的运行环境画像,驱动 Section 选择,至少包含目标终端类别、能力集、体积上限与运行时特征位。
- SectionVisibility:Section 的可见性等级,取值
Required(缺失即失败)或Optional(缺失则降级)。 - LoadStrategy:加载层的取数策略,取值
Eager(一次性读完所有被选中 Section)或Lazy(仅读头部 + 索引,段体首次访问时再读)。
1.7 蓝图组织
后续章节按下列顺序展开:
- 第 2 章:总体架构
- 第 3 章:加载层
- 第 4 章:运行层
- 第 5 章:适配层
- 第 6 章:错误与可观测性
- 第 7 章:安全模型
- 第 8 章:演进路线
