第 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 第一阶段的设计按以下优先级排序:

  1. 可移植性优先。BuF 编译一次,在任何已适配宿主中都可以执行;运行层与适配层之间通过稳定的 Universal_Instruction 解耦。
  2. 多语言实现。运行层暴露语言中立的 Runtime_Interface,允许 Rust / Go / TypeScript 等多种实现共存与替换,不绑定单一语言生态。
  3. 可证明的正确性。BuF 解析与序列化必须满足往返一致性,生命周期状态机必须满足合法迁移性质,跨平台行为必须满足序列一致性。这些性质以可被属性测试(PBT)验证的形式表达。
  4. 安全可观测。默认安全(强制签名模式可开),默认静默(调试事件默认关闭),错误结构化(统一错误模型 + 来源层标注 + 错误链)。

1.4 三层结构概览

Fayger 在体系结构上划分为三层:

  • 加载层(Loader Layer):BuF 与外部世界之间的边界,负责读、写、校验与版本协商。
  • 运行层(Runtime Layer):BuF 语义的执行者,支持多种语言实现,通过统一接口契约互换。
  • 适配层(Adapter Layer):宿主与 Fayger 之间的边界,负责通用指令与系统调用之间的双向翻译。

每一层都有清晰的对外契约与对内分工。详细职责见下一章。

1.5 与现有体系的对照

现有体系Fayger 对应物
JVM ClassLoader → Verifier → ExecutionEngineLoader Layer → Runtime Layer
JVM class file(magic / version / constant pool)BuF 制品(Header / Manifest / Sections / Trailer)
OCI Image Manifest + LayersBuF_Manifest + Sections
OCI Runtime SpecRuntime_Interface
containerd vs runcRuntime_Layer 编排 vs Runtime_Implementation 执行
WASI capability-based securityAdapter_Layer 能力裁剪
JNI / extism host functionsUniversal_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 章:演进路线