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 调用。检查未通过的修改不能作为已就绪定义使用;版本选择、提交接口和协作冲突处理仍需独立规则。
上一章:程序结构与导入 · 下一章:词法结构 · 目录