设计与贡献

运行时架构

从源码、Token 和 AST 到语义解析、解释器、模块加载器与 REPL。

当前流水线

源码 → 词法器 → Token → 递归下降解析器 → AST → 语义解析器
                                                   ├─→ 静态类型检查器
                                                   ├─→ 树遍历解释器
                                                   └─→ 字节码编译器 → 栈式 VM
  • lexer 负责 Unicode 文本、关键字、字面量和共享源文件跨度。
  • parser 只负责构造 AST,不执行用户代码。
  • ast 是语言前端与所有执行后端之间的稳定边界。
  • resolver 在执行前验证作用域上下文、声明冲突和关键字合法位置。
  • type_checker 不执行用户代码,检查渐进式注解中可确定的冲突。
  • interpreter 管理词法环境、值、函数调用、对象和模块。
  • bytecodevm 形成可选执行路径,指令与源码跨度一一对应。
  • 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持续验证共享语义。