运行时架构
从源码、Token 和 AST 到语义解析、解释器、模块加载器与 REPL。
当前流水线
源码 → 词法器 → Token → 递归下降解析器 → AST → 语义解析器
├─→ 静态类型检查器
├─→ 树遍历解释器
└─→ 字节码编译器 → 栈式 VMlexer负责 Unicode 文本、关键字、字面量和共享源文件跨度。parser只负责构造 AST,不执行用户代码。ast是语言前端与所有执行后端之间的稳定边界。resolver在执行前验证作用域上下文、声明冲突和关键字合法位置。type_checker不执行用户代码,检查渐进式注解中可确定的冲突。interpreter管理词法环境、值、函数调用、对象和模块。bytecode和vm形成可选执行路径,指令与源码跨度一一对应。semantic为编辑器建立不执行代码的声明、作用域、引用、类型摘要与文档索引。repl通过终端行编辑器处理方向键、Tab 和多行输入,执行仍复用正式解析器与解释器。debugger从解释器只读快照提供 DAP 断点、单步、栈与变量。lib提供字符串与文件两类嵌入 API;CLI 不复制语言逻辑。- 独立
yanbao仓库的命令层完全由言序编写,负责包管理交互、事务回滚和工程工作流;清单解析、依赖选择、锁图和制品语义仍由核心yanxu-package通过版本化 JSON 工程协议唯一实现。
运行时约束
类型
类型标注属于绑定,不属于值。令 甲:数 为 1;创建一个带数约束的绑定,后续置仍会验证。函数参数在创建调用环境时验证,返回值在离开调用帧时验证。
内置类型为数、文、理、空、法、类、对象、模块、列、元、典、误和任意。类名本身也是实例类型名。
对象
类保存方法表与可选父类,实例保存类引用与字段表。访问实例成员时先查字段,再沿类链查方法;取出方法会创建绑定了此的新函数。
模块
每个模块在独立词法环境中执行,并以该环境的本地绑定形成命名空间。命名空间保留活绑定:模块函数改写顶层变量后,外部读取会看到新值。模块路径相对于包含导入语句的文件解析;函数记录其定义模块目录,因此延迟调用仍能正确解析内部相对导入。
加载器以规范化绝对路径缓存模块,并维护正在加载集合以拒绝循环引用。模块只暴露公声明,但环境本身仍保留活绑定。包解析器负责言序.toml及包:路径,标准模块使用标准:命名空间。
格式 2 包加载只沿完整锁图解析包:别名/导出。顶层项目不能穿透访问未声明的传递包,依赖也不能把文件、网络、监听、进程或原生扩展权限传给应用。YXB 编译器在构建期把可达模块编译为字节码并嵌入资源,运行时不读取原始.yx。
数据与错误
列使用共享可变序列,元组使用不可变序列,典使用共享且保持插入顺序的键值序列。典键限定为数、文、理、空,避免可变对象破坏键的相等关系。定约束绑定本身,不递归冻结绑定所指的列或典。
遍协议统一内建容器、范围和用户对象:遍始/遍次以惰性状态逐项取值,逐、映射/筛选与折叠共用同一耗尽模型。树解释器与 VM 分别实现这一协议,并由跨实现规格对照。
每个 Token、表达式和语句都携带共享源文件与起止跨度。词法、语法、语义和运行错误复用同一诊断渲染器;运行错误优先绑定最内层失败表达式,函数踪迹记录定义位置。
运行错误携带消息、原始位置和调用踪迹。试把错误转换为误值,提供消息、位置与踪迹成员;抛可重新抛出该错误并保留位置与踪迹,也可把普通值转换为新错误。
演进边界
1.0 VM 不保留 AST,也不静默切换引擎。函数原型、调用帧、递归闭包、类/协议、继承、任务、方法绑定、字段、异常、迭代与模块均由字节码运行时独立执行。标记清扫 GC 可观测分配/存活/回收统计;属性内联缓存和模块字节码缓存分别验证命中与源文件元数据失效。树解释器仍是参考实现,版本兼容语料和tests/vm_consistency.rs持续验证共享语义。