言序文档

运行时架构

从源码、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 原生函数。

本页目录