豫言独立实现技术规范
本规范供未参与豫言开发的实现者从零编写编译器,产出可与既有豫言模块互操作的 WasmGC 模块。它固定描述仓库提交 4cdeca11600fed16338793a494b6eecaae94485a,称为“本基线”;不是对未来版本的推测。阅读顺序如下,两种语言版本以相同章节和规则编号对应。
- 词法与语法:字符扫描、语法、结合与语法糖。
- 类型与模块:名称、类型判断、隐参求解、构造器及文件身份。
- 执行与编译:求值、异常、擦除、闭包、递归、控制流及代码生成。
- 网页汇编接口:WasmGC 的值、调用、模块、异常与宿主引用桥契约。
- 基线与实现依据:固定基线、源码索引、ABI 阅读示例与文档审阅准则。
- 规约关系表:完整数据附表。
- 着色语言:用豫言标准语法写 GPU 着色程序,经类型检查后译成 WGSL;着色源的文件后缀、模块查找、着色内建、翻译规则与构建集成。
- 文件后缀:源文件、文档、测试数据与构建产物的全部后缀,各附仓库里的例子;导入时按导入方种类查找文件的次序。
- 子语言设计:各子语言共同遵守的设计原则,以及它们在一个程序里怎样配合。
- 雅言文体:豫言源码的写法(提案 00027 关键词换字):各构造的写法、解析约束、打印规则与核对。
总〇:兼容的含义
当前语言的新增规则见标签函数类型。该篇规定参数标签的语法、类型规则、擦除及实现范围,并记录当前编译器删除 循□以〇。
整数定义域的类型构造器参数与闭合整数索引比较见整数类型索引。依值箭头、隐式值参数、含变量的整数索引相等、索引细化与依值模式匹配见依值类型。
爻定义域的类型构造器参数、字面运算规约与闭合索引比较见爻类型索引,该篇同时记录运算身份、预算及验收状态。
字符串定义域的类型构造器参数、拼接规范形与闭合索引比较见字符串类型索引,该篇同时记录来源检查与当前接入范围。
列表定义域的合法性检查、闭合元素规范值与附加比较见列表类型索引,该篇同时记录隐式元素类型、声明身份与投影规则。
ABI 兼容指:同一目标、同一模块身份和定义序号下,新实现产生的函数、值与模块可供旧实现使用,旧实现产物也可供新实现使用;跨边界调用、返回、异常和回收后仍然正确。只打印相同结果或只通过自举,不足以证明这一点。
本规范划定三种检验,不能混为一谈:
| 层次 | 必须相同 | 不要求相同 |
|---|---|---|
| 源语言兼容 | 接受/拒绝边界、求值轨迹、结果、可观察失败类别 | 内部 AST 名称、诊断堆栈全文、编译速度 |
| 模块接口兼容 | 值表示、调用协议、导入与导出、定义身份、回收约定 | 本地临时名、优化算法 |
| 逐字节产物复现 | 相同工具链、编译选项、路径、编号、优化及调试信息下的整个产物 | 不能由 ABI 兼容自动推出 |
本文件集的交付物是技术文档,目标是让陌生实现者不依赖原作者解释,即可理解语言算法及模块接口。实现者可以采用不同前端、不同 IR 和不同优化器,但不可自行“修正”本基线的可观察兼容怪异处。
总一:约束用语
“必须”表示本基线兼容所需;“可”表示实现策略自由;“禁止”表示不能将其当作可互操作输入。“兼容缺陷”表示实现存在冲突或危险边界,需保留其事实并限定适用范围,不表示推荐语言设计。
没有稳定定义的行为,不以猜测填补。特别是整数溢出、越界、不安全转换、失效续延以及 ABI 不匹配调用,不在可承诺的稳定行为集合内。试图对这些行为实现“所有机器均完全相同”没有可实现的契约。
总二:实现边界
一个独立编译器至少具备:UTF-8 源文输入;模块解析与有序定义表;语法分析;静态检查;运行时值生成;程序及模块入口;带类型宿主导入;闭包与递归;异常/提前返回;生成 WasmGC 模块。
标准库是豫言源码库,可由新编译器编译;系统原语经宿主引用桥(网页汇编接口网五)由宿主提供。此模式无需重写文件系统、套接字等整个操作系统封装,也不依赖原编译器参与代码生成。
源码入口、模块接口与编译产物不是同一种输入:只拿到一个旧的 Wasm 模块,不足以恢复类型别名、隐参和构造器身份。独立前端必须同时获得依赖源码,或从本规范规定的接口记录重建等价的检查后接口。运行时标签不能替代编译期类型。
总三:最小数据模型
实现可以使用下列概念记录,字段顺序仅在明确写为 ABI 时才有二进制约束。
- 类型:内建;刚性类型变量;名义构造器;构造器应用;连续显式箭头;连续隐式全称类型;元组类型。
- 表达式:常量;局部引用;文件定义引用;显/隐函数;调用头及有序实参;局部绑定;递归;条件;顺序;元组及投影;模式匹配;类型标注。
- 文件接口项:原始文件身份、定义名、有序索引、类别、已检查类型、透明类型体或名义构造器身份。
- 无类型中间值:单位、整数、小数、字节串、闭包、元组、构造器实例、引用;静态类型与隐参不占调用槽位。
- 控制状态:调用栈上进行中的尝试运行(Wasm 原生异常的捕获范围)、动态退出标识与顶层未捕获处理器。
局部绑定可用唯一 ID 或一基 de Bruijn 索引。所有替换须避免捕获;不能按名称做无作用域的文本替换。稳定名由模块身份和定义索引决定,私有局部 ID 不得泄入公共接口。
总四:基线纪律
改变源路径、声明列表、构造器次序或目标,都可能改变 ABI。交付时附源提交、编译器 SHA-256、目标及所需引擎特性、优化选项、依赖解析结果及输出摘要。
文档维护时逐项核对源码与双语条件。已明确的实现事实写成具体规则;实现自相矛盾或尚无稳定语义的边界,明确标出其适用范围,不替语言作未经依据的承诺。