Files
Endorphin-Document/guide/05-preflight-and-inflight.md

6.4 KiB

5. Preflight 与 inflight

Endorphin 将定义准备与检查阶段称为 Preflight,将实际运行阶段称为 inflight。这两个名称同时用于区分定义的生命周期和运行时活动、实例的生命周期,不是源码关键字。

代码由平台解释执行,不要求开发者先执行独立构建步骤,也不要求将源码转换成字节码或另一种语言。Preflight 的检查与索引准备不等同于生成编译产物。

5.1 Preflight

Preflight 读取代码视图及其归属上下文,理解声明和引用,并建立关联索引,为程序执行做好准备。索引用于查找相关声明与依赖,减少实际调用时重复的解析和查找工作。

其语言职责包括:

  • 按词法和语法规则理解类、函数、agent 与表达式。
  • 解析 use 指向的 namespace 及允许使用的声明。
  • 检查名称、字段、参数与返回类型。
  • 依据已定义的规则检查结果类型与组件用法。
  • 识别逻辑调用与结果使用之间的依赖。
  • 报告可以静态确定的错误。

声明函数不表示在 Preflight 中执行函数体,声明类也不表示读取业务数据;声明 agent 不启动模型循环或调用工具。导入 namespace 用于理解依赖,而不是执行其所有逻辑。

5.2 inflight

inflight 使用实际输入执行程序,产生程序可以观察到的结果。

其语言职责包括:

  • 按函数定义计算并返回结果。
  • 取得调用所请求的数据。
  • 向后续表达式提供成功结果。
  • 保持代码定义的数据依赖与业务效果。
  • 解释执行实际调用,并根据资源或结果类型产生界面等呈现效果。
  • 表达执行中出现的失败或其他结果状态。
  • 管理变量引用、对象和 agent 实例的存续,以及 agent 任务的状态迁移、暂停与恢复。

通信、缓存和执行组织方式可以由系统安排,但必须保持语言定义的值、类型、依赖和效果。

5.3 阶段边界

程序内容 Preflight inflight
class 声明 理解字段及类型 在数据使用中遵守该结构
function 声明 检查参数、函数体与返回类型 调用发生时执行逻辑
agent 声明 理解成员、工具关联及状态与路由约束 创建实例,驱动任务、工具调用和状态迁移
use 声明 理解依赖并解析可用声明 在调用中使用相应逻辑
调用表达式 检查目标与输入类型 使用实际输入并取得结果
界面结果 依据已定义的类型与组件规则检查用法 取得可渲染值后呈现内容和排列关系

实际业务调用属于 inflight。Preflight 的准备与检查不执行业务调用,也不改变调用发生时应有的语义。代码加载和检查的时机可以由平台安排;对无法提前确定的依赖和结果,执行时仍须遵守相应规则。

5.4 诊断与执行失败

语法错误、未定义名称和可静态判断的类型错误由 Preflight 报告。数据不存在、调用无法完成等执行情况由 inflight 表达。

静态检查通过不保证业务调用一定成功。诊断应能定位相关声明或表达式;错误处理、取消和持续结果的具体写法见规范状态。

5.5 阶段与执行角色

阶段、应用角色和代码归属是不同维度:

  • Preflight 与 inflight 表示处理阶段及相应的生命周期层次。
  • 前端、后端与 Agent 可表示应用角色;agent 同时具有独立的语言声明形式。
  • namespace key 表示代码归属与引用位置。

它们不要求一一对应,也不要求位于不同进程或机器。atelier:shop.ui 的名称不会自动将其中所有代码限定在某个阶段或某类设备。

5.6 定义与运行时生命周期

Preflight 生命周期描述一个定义从创建、检查、建立引用关系,到持续可引用、更新或退出可用范围的存续。一次检查是其中的动作;检查完成不表示定义的生命周期结束。已保存的定义可以长期存在,并供多次 inflight 执行使用。

inflight 生命周期描述实际输入参与计算后,调用、对象、agent 实例和任务从产生、使用,到完成、释放或删除的存续。暂停或被保存的运行时状态仍属于这个层次,不因暂时没有代码执行而变成定义。

资源 Preflight 生命周期中的定义 inflight 生命周期中的实体或活动
function 签名、函数体及引用关系的存续 每次调用的开始、执行、完成或失败
class 类型、字段及成员定义的存续 每个对象实例的创建、使用、释放或删除
agent 成员、工具、记忆和控制规则的定义存续 实例、上下文与任务的运行、等待、恢复和结束

函数调用结束不要求返回值同时消失。返回值可以继续被引用或保存;对象也不因创建它的调用结束而必然被回收。需要长期保留的实例、agent 记忆和任务检查点仍是 inflight 数据,其保留与删除规则需单独定义。

定义的退出、运行时实例的删除和底层内存回收是不同事件。删除定义是否影响已有调用或实例,以及不可达值何时回收,见规范状态。

传统 build time 常指构建发生的时段。这里的 Preflight 生命周期还覆盖准备后的定义存续,且不要求构建产物;不能把“定义长期存在”理解为平台一直在执行检查。

5.7 运行中产生新定义

两个生命周期可以交错。agent 可以在 inflight 中编写代码,将新定义提交到获准修改的 namespace;新定义经过 Preflight 的检查和引用准备后,才能用于后续执行。

agent 的 inflight 任务
    → 编写并提交代码
    → 新定义的 Preflight 检查与准备
    → 定义成为可引用资源
    → 后续 inflight 调用

提交修改的行为属于正在运行的任务,新定义的检查属于 Preflight,新函数的执行属于下一次 inflight 调用。检查未通过的修改不能作为已就绪定义使用;版本选择、提交接口和协作冲突处理仍需独立规则。

上一章:程序结构与导入 · 下一章:词法结构 · 目录