Norm 0.4
Norm 0.4 建立源码 authoring 与 content-addressed Core IR 组合的编译模型。本页定义 0.4 的实现契约;语言语法和类型语义继续由语言规范定义。
编译模型
.norm源码与module.norm是项目事实来源;ProjectLoader为 CLI、Language Server 和测试工具建立统一的不可变 source set;- 项目拓扑由
module()返回值、路径和 package 头确定;配置求值失败时,Language Server 仍以module.norm所在目录作为稳定项目根; CompilationScope保存源码归属和直接模块依赖,Analyzer 与语言服务据此执行相同的可见性规则;- 名称解析与类型检查完成后,Binder 的结果统一进入
CoreBuilder; - Language Server 使用纯 authoring snapshot,执行编译按需物化 Core;
TypedProgram、ExecutionBackend与 Truffle Lowerer 只使用CoreCompilation;ResolvedCall是调用目标、实例化签名、类型实参和实参映射的单一事实来源。
内容身份
DefinitionId由版本化 canonical bytes 与固定依赖决定;- callable、参数、局部变量和源码位置变化不改变等价 callable 的 identity;
- 局部变量和类型参数使用定义内索引;
- 互递归定义按强连通分量规范化并共享
DefinitionGroupId; - 调用、构造、enum、用户类型和字段 owner 固定为完整
DefinitionId或递归组成员索引; - 运行时类型 capture 按类型参数索引规范化;
- 模块坐标、名义类型 arity 与 enum 的可观察文本保持语言语义。
authoring 名字和导出信息由 CoreNamespace 管理;CoreAuthoringMap 保存每个来源 occurrence 的名字、位置和精确引用路由。同一内容定义可以关联多个源码来源,诊断和调用栈仍返回实际执行的来源。
存储与增量
- canonical definition group 使用 SHA-256 内容 identity;
- 内存与文件
DefinitionStore共享同一最小 API; - 文件存储执行只读校验、跨进程原子发布与并发清理,缺失内容与损坏内容使用不同结果,并由 CLI 跨进程复用;
- 存储准入结果使用强类型状态,根策略与维护锁保证多进程采用同一容量边界;
- 模块和独立文件分别使用稳定的
CompilationUnitId保持编译会话历史; CoreDependencyIndex提供直接依赖、反向依赖与传递 dependents;CoreCompilationDelta精确区分新增、复用和脱离当前命名空间的定义;- 依赖 identity 传播使变更闭包自动获得新 identity,不相关定义保持可复用。
执行与工具
- Truffle artifact 使用独立
ArtifactId; - artifact identity 包含 Core groups、入口 occurrence、namespace/interface、binding occurrence、源码内容、origin、引用路由和后端 ABI;
- 长时间运行的后端使用有界 artifact cache;
ExecutionContext作为隐藏根参数沿调用传递,可执行 artifact 可跨独立执行安全复用;- Polyglot 入口在执行时读取当前 context;
- 诊断与语言服务继续使用同一
SemanticModel和 authoring identity; - Core 在落盘前验证类型、调用、内建操作、namespace binding 和完整依赖闭包;
- 标准库源码进入同一 Core、存储和依赖链路。
可执行规格
测试覆盖 identity golden bytes、源码移动与重命名、模块版本、名义类型、声明重排、递归组规范化、类型与调用依赖传播、authoring occurrence、内容损坏与并发存储、Core-only backend、artifact 复用、Polyglot 多 context,以及单文件、模块和标准库程序执行。