diff --git a/README.md b/README.md index f5e1b47..4bb3bcf 100644 --- a/README.md +++ b/README.md @@ -2,13 +2,16 @@ Rust 编写的 Endor 虚拟机实现。当前具备 EndorObject、稳定对象分配、代际句柄、引用计数、显式循环回收,以及可执行语言函数的小型 wordcode VM。数字统一为无损表示优先的 Number。 -独立 frontend 已提供 Endor 阅读器、手写 lexer、peg parser、基础函数/表达式 AST 与 cli parse 文件/stdin 入口。VM 从空堆启动;尚无 AST 到字节码编译器、Python type/元类体系、数值算术或完整异常传播。数据库连接仅为需要数据库的特殊类保留;普通宿主不连接数据库;基础信息改用 host 包的 UTF-8 JSON 文件,不保存 VM 堆。当前边界见 [系统架构](docs/architecture/README.md)。 +Endor 采用平台解释执行模型;AST 到字节码的生成属于解释器内部准备步骤,使用者无需先构建独立程序。资源修订与依赖锁用于选择用户代码,解释器由平台统一升级;相关设计方向见 [解释执行与平台资源版本](docs/architecture/execution-and-versions.md),资源版本管理尚未实现。 + +独立 frontend 已提供 Endor 阅读器、手写 lexer、peg parser、基础函数/表达式 AST 与 cli parse 文件/stdin 入口。VM 从空堆启动;AST 到字节码生成、Python type/元类体系、数值算术和完整异常传播均未实现。数据库连接仅为需要数据库的特殊类保留;普通宿主不连接数据库;基础信息改用 host 包的 UTF-8 JSON 文件,不保存 VM 堆。当前边界见 [系统架构](docs/architecture/README.md)。 ## 从哪里读 | 要做的事 | 入口 | | --- | --- | | 查一个功能、设计或代码位置 | [文档总索引](docs/README.md) | +| 看解释执行、资源修订、依赖锁和平台升级的关系 | [执行与版本模型](docs/architecture/execution-and-versions.md) | | 看源码目录与 crate 边界 | [crates](crates/README.md) | | 看字符串、流、文件与平台 URI 如何进入 lexer | [Endor 阅读器](docs/runtime/reader.md) | | 看源码词法、语法、AST 和解析命令 | [源码前端](docs/runtime/frontend.md) | diff --git a/crates/README.md b/crates/README.md index 6296dc6..9efe1d8 100644 --- a/crates/README.md +++ b/crates/README.md @@ -13,4 +13,6 @@ CLI 依赖 Core、Frontend 与 Host,Server 依赖 Core 与 Host,二者不依赖 Storage;Frontend 依赖 peg,不依赖 Core;Core 与 Storage 也互不依赖。未来特殊类的宿主实现按需依赖 Storage,见 [数据库对象](../docs/runtime/database-objects.md)。 +Endor 的解释执行流程与平台资源版本方向见 [执行与版本模型](../docs/architecture/execution-and-versions.md)。Frontend 到 AST 与 Core 执行字节码目前仍是两段独立能力,后续需要连接内部字节码生成;版本锁、平台资源后端和持久化字节码缓存均未实现。 + core 的 Rust 库名为 endor_core,避免与标准库 core 重名,见 [Cargo 目标说明](https://doc.rust-lang.org/cargo/reference/cargo-targets.html#the-name-field)。网络、数据库、进程配置和信号不进入 Core。全局说明见 [架构](../docs/architecture/README.md),返回 [项目入口](../README.md)。 diff --git a/crates/core/README.md b/crates/core/README.md index e84ea81..cd2a819 100644 --- a/crates/core/README.md +++ b/crates/core/README.md @@ -8,6 +8,6 @@ Endor VM 内核,保持零外部依赖。负责 EndorObject、堆、代际句 | [src](src/README.md) | 文件职责、公开接口和常见修改位置 | | [tests](tests/README.md) | 对象、基本载荷、执行语义与生命周期检查 | -内核通过 Vm::new 从空堆启动;代码对象和全局字典由宿主显式创建,再 execute/call。内核没有环境变量探测、数据库、HTTP、Python type 系统或源码解析;源码 lexer/parser 在独立 [frontend](../frontend/README.md) 包中,尚未接入字节码编译。 +内核通过 Vm::new 从空堆启动;代码对象和全局字典由宿主显式创建,再 execute/call。内核没有环境变量探测、数据库、HTTP、Python type 系统或源码解析;源码阅读器与 lexer/parser 在独立 [frontend](../frontend/README.md) 包中,AST 到字节码生成尚未实现。解释执行与平台版本方向见 [执行与版本模型](../../docs/architecture/execution-and-versions.md)。 对象结果所有权见 [生命周期](../../docs/runtime/lifecycle.md),对象/字节码设计见 [运行时](../../docs/runtime/README.md),限额与 UTF-8 边界见 [配置](../../docs/operations/configuration.md)。本地不构建或运行测试,验证入口见 [验证](../../docs/operations/validation.md)。返回 [工作区](../README.md)。 diff --git a/crates/frontend/README.md b/crates/frontend/README.md index d417508..830f162 100644 --- a/crates/frontend/README.md +++ b/crates/frontend/README.md @@ -9,4 +9,4 @@ | [tests](tests/README.md) | Unicode、优先级、函数、完整输入与错误位置验证 | | [examples](examples/README.md) | 可交给 cli parse 的源码样例 | -宿主通过 EndorReader 读取字符串、流、文件或注入的 URI provider,取得 SourceUnit 后调用 lex_source、parse_source、parse_source_expression;低层 lex、parse、parse_expression 仍保留。读取契约见 [Endor 阅读器](../../docs/runtime/reader.md)。Core 仍为零外部依赖;未来编译器将 AST 转成已有字节码,不改为 AST 直接解释。返回 [工作区](../README.md)。 +宿主通过 EndorReader 读取字符串、流、文件或注入的 URI provider,取得 SourceUnit 后调用 lex_source、parse_source、parse_source_expression;低层 lex、parse、parse_expression 仍保留。读取契约见 [Endor 阅读器](../../docs/runtime/reader.md)。Core 仍为零外部依赖;后续把 AST 转成已有字节码并交给 VM 解释执行;这是平台内部准备步骤,尚未接通。资源修订、依赖锁和解释器统一升级的设计方向见 [执行与版本模型](../../docs/architecture/execution-and-versions.md)。返回 [工作区](../README.md)。 diff --git a/docs/README.md b/docs/README.md index b93d5ad..9da5ed0 100644 --- a/docs/README.md +++ b/docs/README.md @@ -7,6 +7,7 @@ | 想知道什么 | 权威说明 | 代码入口 | | --- | --- | --- | | 各个 crate 如何分层,哪些能力已实现 | [架构](architecture/README.md) | [crates](../crates/README.md) | +| 解释型为何生成字节码,资源修订与平台升级如何区分 | [执行与版本模型(设计方向)](architecture/execution-and-versions.md) | [frontend](../crates/frontend/README.md)、[core](../crates/core/README.md);源码执行与版本管理尚未接入 | | EndorObject、对象头、句柄、默认操作 | [对象模型](runtime/objects.md) | [core/src](../crates/core/src/README.md) | | Number、String、Dict、Cell、Function、异常数据 | [基本对象](runtime/builtins.md) | [core/src](../crates/core/src/README.md) | | 字符串、文件、流与 endor URI 如何进入 lexer | [Endor 阅读器](runtime/reader.md) | [reader.rs](../crates/frontend/src/reader.rs)、[source.rs](../crates/frontend/src/source.rs) | @@ -26,7 +27,7 @@ | 目录 | 负责的内容 | | --- | --- | -| [architecture](architecture/README.md) | 系统边界、依赖方向和跨组件约束 | +| [architecture](architecture/README.md) | 系统边界、依赖方向、解释执行与平台资源版本方向 | | [runtime](runtime/README.md) | 源码前端、对象、基本载荷、字节码和生命周期 | | [operations](operations/README.md) | 运行、配置、部署和验证 | | [contributing](contributing/README.md) | 开发定位方法与随代码更新文档的规则 | diff --git a/docs/architecture/README.md b/docs/architecture/README.md index d5e132a..50808d7 100644 --- a/docs/architecture/README.md +++ b/docs/architecture/README.md @@ -1,6 +1,13 @@ # 系统架构 -Endor 的目标是云原生语言;本仓库当前实现运行时、基础语法前端和宿主演示,尚无源码编译器、云调度器或多租户执行沙箱。当前侧重核心语义独立于进程环境,以及数据库能力按对象需求显式提供。 +Endor 的目标是云原生语言;本仓库当前实现运行时、基础语法前端和宿主演示,尚未实现 AST 到字节码生成,也没有云调度器或多租户执行沙箱。当前侧重核心语义独立于进程环境,以及数据库能力按对象需求显式提供。 + +## 本目录 + +| 文件 | 职责 | +| --- | --- | +| README.md | 当前组件边界、依赖方向和跨组件约束 | +| [execution-and-versions.md](execution-and-versions.md) | 解释执行流程、资源修订/依赖锁与平台升级的设计方向,区分已实现与计划 | ## 组件与依赖方向 @@ -40,6 +47,10 @@ HTTP 宿主通过 Arc 共享只读 Vm。GET /bootstrap 只读对象模型和数 部署保留既有 PostgreSQL 服务与数据目录,应用启动不依赖数据库连接。基础信息从数据库改为 Host 文件层;发布脚本一次性只读导入旧 PostgreSQL 记录,不删除原表或卷。脚本结果未主动跟踪,不能据此认定远端已经完成迁移。 +## 执行与版本方向 + +Endor 的目标流程是源码经阅读器、lexer、parser 和内部字节码生成后,由 VM 解释执行。源码资源与依赖版本由平台管理,不要求真实代码文件或项目级 Git 作为语言执行单位;使用者无需单独构建程序。解释器由平台统一升级,升级实现不改写用户源码修订。资源身份、修订与依赖锁尚未实现,持久化字节码缓存暂不作为首版要求;完整说明见 [解释执行与平台资源版本](execution-and-versions.md)。 + ## 后续边界 特殊类接口与异步数据库调用、AST 到字节码的编译与名称/类型分析、更多指令、异常传播、自动 GC、内存配额、取消和能力隔离等均需按实际需求设计。当前帧/指令限额不等于完整沙箱。返回 [文档索引](../README.md)。 diff --git a/docs/architecture/execution-and-versions.md b/docs/architecture/execution-and-versions.md new file mode 100644 index 0000000..8d6deec --- /dev/null +++ b/docs/architecture/execution-and-versions.md @@ -0,0 +1,53 @@ +# 解释执行与平台资源版本 + +本页记录 Endor 的执行模型与平台资源管理方向。阅读器、基础 AST 和字节码 VM 已分别实现;AST 到字节码生成、平台资源存储、发布和依赖锁尚未实现。下述版本模型是后续设计方向,不是现有 API 或已定稿的 URI 协议。 + +## 解释型语言的执行过程 + +Endor 由平台解释执行,目标流程为: + +```text +源码 → EndorReader → lexer → PEG parser → AST + → 名称/局部槽与闭包分析 → 生成字节码 → VM 解释执行 +``` + +生成字节码是解释器内部的执行准备,可以称为内部编译。使用者提交或调用源码资源,由平台完成这些步骤,无需先构建独立程序。现有 VM 解释 wordcode;后续接入源码时沿用该执行器。 + +当前 frontend 到 AST 为止,core 可执行由 Rust API 构造的代码对象,两者还未连接。`cli parse` 仅输出 AST,尚无源码执行命令或 REPL。仓库中的 Cargo/Docker 构建用于构建 Rust 实现和宿主,不是 Endor 使用者的程序构建步骤。 + +## 名称、资源与修订 + +平台目标是将代码存为可发布到 workspace/namespace 的资源,通过 Endor URI 寻找。语言运行不应要求资源对应真实源码文件或一个 Git 项目。本仓库自身仍用 Git 管理 Rust 实现与文档;文件和流也继续作为宿主输入适配。 + +后续资源模型应区分以下概念,具体持久化结构尚未设计: + +| 概念 | 作用 | 变化方式 | +| --- | --- | --- | +| workspace/namespace 名称与 URI | 供使用者查找和组织资源 | 名称可以重命名,入口可以指向新的修订 | +| 资源身份 | 连接同一资源的修订历史 | 应独立于可变名称和实际存储位置 | +| 资源修订 | 标识一次不可变的源码及其相关元数据 | 编辑后产生新修订,保留旧修订供明确选择 | +| 源码内容 hash | 校验或寻址原始文本内容 | 可作为设计选项;算法、字节范围和修订格式未定 | +| 依赖锁 | 固定所选择的依赖资源与修订 | 更新依赖时显式形成新的选择记录 | +| 发布快照 | 把多份资源及依赖选择作为一次一致发布 | 按实际原子发布需求增加,不强制所有资源归为一个项目 | + +相同源码可以处在不同的依赖上下文,因此源码 hash 本身不足以确定完整执行输入。原文内容身份、包含依赖的修订身份是否使用同一种 hash,需要另行决定。Reader 会原样保留文本,但当前不计算或验证任何 hash。 + +重命名或移动存储位置不应迫使已锁定引用改选内容;修改源码则产生新修订。可变 URI 的重新解析可以选到新修订,已有依赖锁应继续指向原资源与修订。实现时还需解决资源保留、权限和删除策略;固定版本不等于永久可访问。 + +版本选择属于平台资源及依赖元数据,不要求在每个业务语句中写 hash,也没有新增 workspace/namespace/版本锁的语言语法。URI 将来可以提供修订选择方式,具体形式未定。并发编辑时防止覆盖的写入锁或条件更新,与选择执行版本的依赖锁是两项独立机制,当前均未实现。 + +## 平台解释器升级 + +解释器及内部字节码生成器按平台统一发布管理,首版方向不要求每份资源自行选择编译器版本。同一份源码修订 R1,可以由旧解释器生成字节码 A,也可以在平台升级后由新解释器重新处理为字节码 B;升级实现不会因此把源码 R1 改成 R2。 + +源码与依赖锁回答“选了哪份用户代码”,平台版本回答“由哪套运行语义处理”。锁定源码不保证跨解释器版本、外部数据和宿主能力变化后的结果完全相同。语言语义迁移、升级中正在执行的帧如何处理、是否需要历史运行环境,留待实际兼容性需求设计;当前不承诺热切换执行帧。 + +现有 `host.version`、`deployment.release`、镜像 SHA 和部署目录记录的是 Rust 实现/宿主发布,不能用作 Endor 用户资源的修订或依赖锁。资源版本也不复用 VM 的代际对象句柄。 + +## 字节码复用与首版范围 + +首版源码执行可先不持久化字节码缓存,平台升级后按需重新准备源码,不提前引入编译产物仓库或用户侧产物版本管理。同一进程内可以复用已准备的不可变代码对象;core 当前已有函数共享代码对象的能力,不要求每次函数调用都重新生成字节码。 + +只有引入跨进程或跨升级的持久化字节码缓存后,才需要明确失效策略。缓存有效性至少取决于相关源码/依赖输入与解释器、字节码格式兼容性;可在平台升级时统一失效,也可使用内部兼容标识。无需把实现版本强塞进每个资源 URI;具体缓存方案尚未选择。 + +近期先完成源码到现有 VM 的连接,再按平台接口需求设计资源存储、修订与依赖锁。Reader 已提供宿主 provider 扩展点,当前只接收不透明 revision 标签,实际契约见 [Endor 阅读器](../runtime/reader.md)。返回 [系统架构](README.md) 或 [文档索引](../README.md)。 diff --git a/docs/contributing/README.md b/docs/contributing/README.md index 6f9d3c5..90ff5d8 100644 --- a/docs/contributing/README.md +++ b/docs/contributing/README.md @@ -1,6 +1,6 @@ # 开发定位与文档维护 -文档与代码使用同一 Git 版本,不按日期复制成多个相互竞争的说明。新增行为时更新其权威主题;删除或替换行为时直接改写/删除失效说明。当前文档只描述当前契约,历史背景需要时查 Git 历史。 +文档与代码使用同一 Git 版本,不按日期复制成多个相互竞争的说明。新增行为时更新其权威主题;删除或替换行为时直接改写/删除失效说明。文档中的当前契约须以实现为准;设计方向单独标明,历史背景需要时查 Git 历史。 ## 开始修改前 @@ -12,6 +12,7 @@ | --- | --- | --- | | 目录职责、直接子文件/子目录、常见修改位置 | 该目录 README.md | 父目录 README | | 各 crate 的依赖方向和系统边界 | [architecture/README](../architecture/README.md) | 根 README、docs 索引摘要 | +| 解释执行、资源修订/依赖锁、解释器升级与缓存方向 | [execution-and-versions.md](../architecture/execution-and-versions.md) | 根 README、架构、reader/frontend/bytecode、运行与交接 | | 对象头、句柄、引用协议与 GC 算法 | [objects.md](../runtime/objects.md) | core/src 文件表 | | Number、String、Dict、Cell、函数环境和异常数据 | [builtins.md](../runtime/builtins.md) | core/src 与 tests 文件表 | | lexer 前的输入适配、SourceUnit 与来源诊断 | [reader.md](../runtime/reader.md) | frontend 的 reader/source、CLI 与读取检查 | @@ -45,7 +46,9 @@ Core 保持零外部依赖、不引入 Python type/元类、源码前端或宿 Rust 实现依赖模块可见性、trait 和 rustfmt,不照搬 CPython C 符号命名规范。Core 公开导出集中在 core/src/lib.rs,Frontend 导出集中在 frontend/src/lib.rs,内部协作用 pub(crate) 或私有方法区分。当前基础源码解析契约在 frontend.md,尚无完整 Endor 源码风格规范或通用配置框架。 -独立 Frontend 已提供 lexer/parser 和 AST;后续按实际需求接入名称/闭包分析和字节码编译、扩充迭代器等指令、宿主回调、错误传播和资源边界。语法可继续调整,AST 到字节码和云服务机制尚未实现,不写成既有功能。 +Endor 是由平台解释执行的语言,字节码生成是内部准备步骤。资源版本属于平台元数据,具体 URI 与持久化协议尚未定稿,不提前写进业务语法;首版暂不要求持久化字节码缓存,详见 [执行与版本模型](../architecture/execution-and-versions.md)。 + +独立 Frontend 已提供阅读器、lexer/parser 和 AST;后续按实际需求接入名称/闭包分析和字节码编译、扩充迭代器等指令、宿主回调、错误传播和资源边界。语法可继续调整,AST 到字节码和云服务机制尚未实现,不写成既有功能。 ## 导出与迁移 diff --git a/docs/contributing/handoff.md b/docs/contributing/handoff.md index 90ba33a..988e375 100644 --- a/docs/contributing/handoff.md +++ b/docs/contributing/handoff.md @@ -23,7 +23,7 @@ ## 尚未实现 -AST 到字节码编译器、名称/闭包与类型分析、源码闭包声明、导入/类/Agent 语法、迭代器等扩展指令、数值算术/相等/哈希、完整异常传播、可变 VM/异步数据库回调、生成器、自动 GC、堆快照、内存配额、取消及不可信代码沙箱。宿主回调 panic 后的执行根恢复也未完成。不能把未来设计写成已有能力。 +AST 到字节码生成、平台资源存储/修订与依赖锁、名称/闭包与类型分析、源码闭包声明、导入/类/Agent 语法、迭代器等扩展指令、数值算术/相等/哈希、完整异常传播、可变 VM/异步数据库回调、生成器、自动 GC、堆快照、内存配额、取消及不可信代码沙箱。宿主回调 panic 后的执行根恢复也未完成。不能把未来设计写成已有能力。 ## 工作约定 @@ -33,6 +33,10 @@ AST 到字节码编译器、名称/闭包与类型分析、源码闭包声明 所有本项目对话标题包含 Aster VM。文档与代码同版本维护,不重新建立 outputs 或重复正文目录。开始下一项任务前先看 git status/最新提交,读取本地 AGENTS.md;本页不代替实时状态。 +## 已确认的设计方向 + +Endor 由平台解释执行;AST 到字节码是解释器内部准备步骤,使用者无需先构建程序。代码未来以 workspace/namespace 下的资源提供,通过 Endor URI 查找,不要求真实源码文件或项目级 Git。资源修订与依赖锁选择用户代码,平台统一升级解释器;升级实现不自动改写源码修订。版本信息主要属于资源与依赖元数据,URI 具体格式、hash 方案和发布快照仍待设计。首版源码执行暂不要求持久化字节码缓存,VM 内代码对象共享继续保留。完整方向与尚未实现的边界见 [执行与版本模型](../architecture/execution-and-versions.md)。 + ## 下一步 -前端已完成到 AST 的首版实现;下一步接 AST → 名称/局部槽与闭包分析 → 字节码 → 现有 VM,不改成 AST 直接解释。可以先连接字符串、名称、let、位置参数函数和调用,再补算术指令与数值语义。参数与返回类型目前只保存为语法节点,不引入 Python type/元类或借此实现整个语言类型系统。语法不必等外部设计稿全部定稿,按用户要求先实现可用子集、以后再调整;当前尚无源码执行命令。 +前端已完成到 AST 的首版实现;下一步连接解释器内部的字节码生成:AST → 名称/局部槽与闭包分析 → 字节码 → 现有 VM,不改成 AST 直接解释。可以先连接字符串、名称、let、位置参数函数和调用,再补算术指令与数值语义。参数与返回类型目前只保存为语法节点,不引入 Python type/元类或借此实现整个语言类型系统。语法不必等外部设计稿全部定稿,按用户要求先实现可用子集、以后再调整;当前尚无源码执行命令。 diff --git a/docs/operations/README.md b/docs/operations/README.md index fa686a9..4f0fc8b 100644 --- a/docs/operations/README.md +++ b/docs/operations/README.md @@ -4,6 +4,8 @@ CLI 提供 VM 引导、源码解析及文件基础信息,Server 提供状态 ## CLI +下列 Cargo 构建针对 Rust 实现与宿主;Endor 的设计是由平台自动准备字节码并解释执行,无需使用者自行构建程序。当前尚无源码执行命令,见 [执行与版本模型](../architecture/execution-and-versions.md)。 + 工作区要求 Rust 1.91 或兼容更高版本,镜像固定 rust:1.91.1-bookworm,依赖由 Cargo.lock 锁定。 ```sh diff --git a/docs/operations/deployment.md b/docs/operations/deployment.md index 2159f09..f2a5404 100644 --- a/docs/operations/deployment.md +++ b/docs/operations/deployment.md @@ -38,7 +38,7 @@ docker compose -f docker-compose.postgres.yml exec aster cli bootstrap ## 生产目录与数据 -Cargo 包名为 core/storage/host/cli/server,core 的 Rust 库名为 endor_core,可执行文件为 cli/server。Compose 应用服务名 aster、数据库名、卷和生产路径是已有部署资源标识,运行命令为该服务中的 cli。应用不接收 DATABASE_URL、不依赖数据库健康才能启动;Compose 的整体 --wait 仍检查所预置 PostgreSQL 的就绪状态。 +Cargo 包名为 core/frontend/storage/host/cli/server,core 的 Rust 库名为 endor_core,可执行文件为 cli/server。Compose 应用服务名 aster、数据库名、卷和生产路径是已有部署资源标识,运行命令为该服务中的 cli。应用不接收 DATABASE_URL、不依赖数据库健康才能启动;Compose 的整体 --wait 仍检查所预置 PostgreSQL 的就绪状态。 | 路径 | 用途 | | --- | --- | @@ -53,6 +53,8 @@ Cargo 包名为 core/storage/host/cli/server,core 的 Rust 库名为 e 部署脚本只接受已构建镜像。容器就绪、HTTP status=ok 和 CLI 对象引导/释放检查都成功后才切换 current;发布记录改写到 deployment.release.json;首次发布一次性只读导入旧基础信息,再保留完成标记,不删除数据库原记录。详情见 [宿主信息](host-information.md)。镜像 SHA、release.env 与 current 链接负责标识版本。失败时保留数据并尝试恢复上一个健康版本;首次部署没有旧版本可恢复。脚本内容导航见 [scripts](../../scripts/README.md)。 +这里的镜像 SHA、host.version 与 deployment.release 标识 Rust 实现/宿主发布,不是 Endor 用户资源的源码修订。平台方向是统一升级解释器,保留用户源码修订及明确的依赖选择;当前没有资源存储、依赖锁、持久化字节码缓存或执行帧热切换机制。两类版本的边界见 [执行与版本模型](../architecture/execution-and-versions.md)。 + ## 查看、停止与恢复 以下命令在服务器上使用已有生产配置,不重新生成密码: diff --git a/docs/runtime/README.md b/docs/runtime/README.md index 3a8d946..9fbbb50 100644 --- a/docs/runtime/README.md +++ b/docs/runtime/README.md @@ -1,6 +1,6 @@ # 运行时设计 -本目录解释跨越 core 多个模块的运行时契约。文件与函数定位见 [core/src README](../../crates/core/src/README.md),测试定位见 [core/tests README](../../crates/core/tests/README.md)。 +本目录解释源码输入、前端及跨越 core 多个模块的运行时契约。文件与函数定位见 [core/src README](../../crates/core/src/README.md),测试定位见 [core/tests README](../../crates/core/tests/README.md)。 | 主题 | 内容 | | --- | --- | @@ -13,4 +13,4 @@ | [数据库特殊类](database-objects.md) | 显式连接、调用方数据模型、未来类接入与资源生命周期 | | [生命周期](lifecycle.md) | 宿主持有 Vm、帧执行根、结果所有权、错误退出和整体销毁 | -文本/环境约束和执行限额集中在 [配置](../operations/configuration.md);组件之间的关系见 [系统架构](../architecture/README.md)。返回 [文档索引](../README.md)。 +文本/环境约束和执行限额集中在 [配置](../operations/configuration.md);组件之间的关系见 [系统架构](../architecture/README.md),解释执行与源码/平台版本的设计方向见 [执行与版本模型](../architecture/execution-and-versions.md)。返回 [文档索引](../README.md)。 diff --git a/docs/runtime/builtins.md b/docs/runtime/builtins.md index 67e366c..ed6cfd8 100644 --- a/docs/runtime/builtins.md +++ b/docs/runtime/builtins.md @@ -119,7 +119,7 @@ fn main() -> Result<(), endor_core::VmError> { } ``` -当前已能通过字节码读取、写入和删除共享 Cell,并创建捕获参数的 Cell。LoadClosure 与 MakeFunction 可以在外围函数运行时创建共享这些 Cell 的嵌套函数,外围帧返回后 Cell 仍由闭包保活。上面的 Python 代码说明闭包语义;独立 frontend 已能解析基础函数,但尚无源码闭包语法或字节码编译器,代码对象仍由宿主准备。 +当前已能通过字节码读取、写入和删除共享 Cell,并创建捕获参数的 Cell。LoadClosure 与 MakeFunction 可以在外围函数运行时创建共享这些 Cell 的嵌套函数,外围帧返回后 Cell 仍由闭包保活。上面的 Python 代码说明闭包语义;独立 frontend 已能解析基础函数,但尚无源码闭包语法或 AST 到字节码生成,代码对象仍由宿主准备。 ## 字符串与异常的准确含义 diff --git a/docs/runtime/bytecode.md b/docs/runtime/bytecode.md index 9da8fd4..34e5bc6 100644 --- a/docs/runtime/bytecode.md +++ b/docs/runtime/bytecode.md @@ -1,6 +1,8 @@ # 小型字节码 VM -当前提供指令与代码对象、内部执行帧、取指执行循环,语言函数已接入执行器。参考 CPython 3.14 的职责划分和栈式执行设计;源码 lexer/parser 由独立 [frontend](frontend.md) 提供,尚无 AST 到字节码编译器;执行器不读取 Python `.pyc`,不承诺 CPython 操作码编号、ABI 或完整语言兼容性。 +当前提供指令与代码对象、内部执行帧、取指执行循环,语言函数已接入执行器。参考 CPython 3.14 的职责划分和栈式执行设计;源码 lexer/parser 由独立 [frontend](frontend.md) 提供,尚未接入 AST 到字节码生成;执行器不读取 Python `.pyc`,不承诺 CPython 操作码编号、ABI 或完整语言兼容性。 + +Endor 是解释型语言,字节码是内部执行表示;从 AST 生成字节码属于自动执行准备,不要求使用者发布编译产物。当前没有字节码持久化缓存或跨版本装载协议;现有不可变代码对象仍可在 VM 内共享复用。平台升级与源码修订的区别见 [执行与版本模型](../architecture/execution-and-versions.md)。 ## 与 CPython 的对应 @@ -156,7 +158,7 @@ fn main() -> Result<(), endor_core::VmError> { 运行错误仍返回 `VmError`。`last_traceback()` 另提供从外到内的函数名、文件、代码首行和出错指令偏移;它保存独立元数据,不保活已经清理的帧。首行是代码声明的 first_line,不是由行号表推导出的实际错误源码行。成功的新一次调用会清空旧记录。尚无语言异常对象传播、raise/try/except 或完整源码行号表。 -暂未实现:源码编译器、关键字/可变参数、生成器/协程、迭代器专用指令、数值算术、自动方法绑定、指令特化和 JIT。 +暂未实现:AST 到字节码生成、关键字/可变参数、生成器/协程、迭代器专用指令、数值算术、自动方法绑定、指令特化和 JIT。 ## 验证 diff --git a/docs/runtime/frontend.md b/docs/runtime/frontend.md index 7313c0a..7aa19c2 100644 --- a/docs/runtime/frontend.md +++ b/docs/runtime/frontend.md @@ -1,6 +1,6 @@ # 源码词法与 PEG 语法前端 -frontend 包提供 [Endor 阅读器](reader.md)、手写 Rust lexer 和 rust-peg 生成的 token parser。宿主通过 SourceUnit 调用带来源的词法/语法入口,原有 lex、parse、parse_expression 保留;CLI 提供 parse 文件/stdin 命令;结果是 AST,还没有 AST 到字节码的编译器、类型检查、名称解析或源码执行。Core 不依赖 frontend 或 peg,仍保持零外部依赖。 +frontend 包提供 [Endor 阅读器](reader.md)、手写 Rust lexer 和 rust-peg 生成的 token parser。宿主通过 SourceUnit 调用带来源的词法/语法入口,原有 lex、parse、parse_expression 保留;CLI 提供 parse 文件/stdin 命令;结果是 AST,尚未实现 AST 到字节码生成、类型检查、名称解析或源码执行。Core 不依赖 frontend 或 peg,仍保持零外部依赖。 首版以 Endorphin-Language 设计稿的基础词法、表达式与函数章节为起点,语法可以继续修改;设计稿中的未完成部分不作为阻塞前端实现的前置条件,也不被整体视作已经实现的语言能力。这里维护当前解析契约;源码位置见 [frontend](../../crates/frontend/README.md)。 @@ -64,4 +64,4 @@ use、namespace、class、agent、完整类型语法、条件/循环、比较 `cli parse ` 与 `cli parse -` 成功时输出 Rust Debug 格式的 AST,失败时在 stderr 输出来源/行/列和诊断并返回非零退出码;`-` 表示从 stdin 读到 EOF,不是 REPL。阅读与来源包装规则见 [阅读器](reader.md)。AST Debug 文本不是稳定的序列化协议。命令不执行源码、不初始化 VM、不连接数据库;具体运行与本地禁测约定见 [运行](../operations/README.md) 和 [验证](../operations/validation.md)。 -后续编译器应将 AST 经名称/闭包分析转换为现有字节码,不另设 AST 求值器;解析成功不表示表达式已有运行语义。VM 虽已支持 MakeFunction,但从源码创建函数仍需要编译器接入。解析器也不是不可信代码沙箱,当前没有通用输入大小或解析递归深度限额。 +后续需要将 AST 经名称/闭包分析转换为现有字节码,再交给 VM 解释执行。这是解释器内部的编译/执行准备步骤,不要求使用者先构建程序,见 [执行与版本模型](../architecture/execution-and-versions.md)。这条连接尚未实现;解析成功不表示表达式已有运行语义。VM 虽已支持 MakeFunction,但从源码创建函数仍需要字节码生成接入。解析器也不是不可信代码沙箱,当前没有通用输入大小或解析递归深度限额。 diff --git a/docs/runtime/objects.md b/docs/runtime/objects.md index 483f3a6..adf9df9 100644 --- a/docs/runtime/objects.md +++ b/docs/runtime/objects.md @@ -100,6 +100,6 @@ compare 的反向规则是 Lt 对应 Gt、Le 对应 Ge,Eq/Ne 保持不变。 已实现:统一对象结构、稳定地址、代际句柄、身份、显式引用计数、托管属性、原生操作覆盖、比较与哈希、原生调用、资源清理和显式循环回收。 -尚未实现:Python type 系统、语言根类、继承和描述符、源码解析与编译器、可变 VM 调用上下文、自动/分代/增量 GC、语言终结器/复活、完整资源限额和 VM 快照;执行器已有帧数和指令数限额。数据库仅为未来特殊类提供按需连接,普通对象或宿主基础信息不自动持久化,详见 [数据库特殊类](database-objects.md)。 +尚未实现:Python type 系统、语言根类、继承和描述符、AST 到字节码生成、可变 VM 调用上下文、自动/分代/增量 GC、语言终结器/复活、完整资源限额和 VM 快照;独立 frontend 已提供阅读器、lexer/parser 与 AST,尚未接入源码执行,见 [源码前端](frontend.md);执行器已有帧数和指令数限额。数据库仅为未来特殊类提供按需连接,普通对象或宿主基础信息不自动持久化,详见 [数据库特殊类](database-objects.md)。 验证范围与执行约定见 [验证](../operations/validation.md)。 diff --git a/docs/runtime/reader.md b/docs/runtime/reader.md index 675cf2d..3d606d3 100644 --- a/docs/runtime/reader.md +++ b/docs/runtime/reader.md @@ -34,11 +34,11 @@ Read 阶段的 SourceReadError 与词法/语法 Diagnostic 分开:Io 保留 ## 平台 URI 边界 -EndorSourceProvider::load(&str) 返回 io::Result。ResolvedEndorSource 包含 bytes 和非空 revision;宿主负责名称解析、权限检查、版本选择与实际存储访问,失败直接返回相应错误。例如权限不足可使用 PermissionDenied,不存在可使用 NotFound。 +EndorSourceProvider::load(&str) 返回 io::Result。ResolvedEndorSource 包含 bytes 和非空 revision;宿主负责名称解析、权限检查、版本选择与实际存储访问,失败直接返回相应错误。接口要求 bytes 与 revision 对应同一次选定的读取结果,Reader 无法自行验证这种对应关系。例如权限不足可使用 PermissionDenied,不存在可使用 NotFound。 Reader 只校验 scheme 为不区分大小写的 endor、冒号后非空,且 URI 不含原始空白/控制字符。它不固定 workspace/namespace 的 URI 路径形式,不解码百分号、不实现相对 URI,也不规定修订选择器或 hash 算法。scheme 以外的协议校验由宿主执行,原 URI 不重写。每次读取只调用一次 provider,之后词法和语法处理不再解析 URI。 -revision 是宿主返回的原样标签;Reader 只拒绝全空白标签,不验证标签是否为内容 hash、不验证内容与 hash 的对应关系,也不实现资源历史、依赖锁、发布快照或签名。当前没有内置平台 provider、网络客户端、数据库存储或 CLI URI 执行入口。具体版本模型仍需另行设计。 +revision 是宿主返回的原样标签;Reader 只拒绝全空白标签,不验证标签是否为内容 hash、不验证内容与 hash 的对应关系,也不实现资源历史、依赖锁、发布快照或签名。当前没有内置平台 provider、网络客户端、数据库存储或 CLI URI 执行入口。资源身份、源码内容 hash、依赖锁与发布快照的区别,以及平台统一升级的方向,见 [解释执行与平台资源版本](../architecture/execution-and-versions.md)。这些机制不由当前标签或 SourceUnit 自动实现;URI 具体形式和持久化模型仍待设计。 ## CLI 与交互输入