运行时架构
从源码、Token 和 AST 到语义解析、解释器、模块加载器与 REPL。
当前流水线
源码 → 词法器 → Token → 递归下降解析器 → AST → 语义解析器 → 树遍历解释器
↓
环境 / 类型约束 / 模块加载器lexer负责 Unicode 文本、关键字、字面量和源码位置。parser只负责构造 AST,不执行用户代码。ast是语言前端与所有执行后端之间的稳定边界。resolver在执行前验证作用域上下文、声明冲突和关键字合法位置。interpreter管理词法环境、值、函数调用、对象和模块。repl只判断输入边界,执行仍复用正式解析器与解释器。lib提供字符串与文件两类嵌入 API;CLI 不复制语言逻辑。
0.2 运行时约束
类型
类型标注属于绑定,不属于值。令 甲:数 为 1;创建一个带数约束的绑定,后续置仍会验证。函数参数在创建调用环境时验证,返回值在离开调用帧时验证。
内置类型为数、文、理、空、法、类、对象、模块、列、典、误和任意。类名本身也是实例类型名。
对象
类保存方法表,实例保存类引用与字段表。访问实例成员时先查字段,再查方法;取出方法会创建绑定了此的新函数。调用类会先创建实例,再调用名为初始化的方法。
模块
每个模块在独立词法环境中执行,并以该环境的本地绑定形成命名空间。命名空间保留活绑定:模块函数改写顶层变量后,外部读取会看到新值。模块路径相对于包含导入语句的文件解析;函数记录其定义模块目录,因此延迟调用仍能正确解析内部相对导入。
加载器以规范化绝对路径缓存模块,并维护正在加载集合以拒绝循环导入。当前暂时导出所有模块顶层绑定,0.5 将迁移到显式公导出。
0.3 数据与错误
列使用共享可变序列,典使用共享且保持插入顺序的键值序列。典键限定为数、文、理、空,避免可变对象破坏键的相等关系。定约束绑定本身,不递归冻结绑定所指的列或典。
迭代器目前由运行时统一展开:列产生元素、文字产生单字符文字、典产生键。后续字节码阶段会把这套行为抽象为正式遍协议。
运行错误携带消息和调用踪迹。试把错误转换为误值,提供消息与踪迹成员;抛可重新抛出该错误并保留踪迹,也可把普通值转换为新错误。
演进边界
静态检查器应消费 AST 并产生类型化中间结果,但不得改变运行语义。字节码编译器应与树遍历解释器共享值相等、类型关系、模块身份和错误规范测试。标准库能力应优先由言序实现,只有系统调用和性能关键路径使用 Rust 原生函数。