基线与实现依据
本篇记录技术规范与现有实现的对应关系,供文档审阅与后续维护。正文须足以说明算法和接口;源码链接用于追溯,不代替正文中的规则。
据一:固定基线
本规范对应提交 4cdeca11600fed16338793a494b6eecaae94485a。语言语义、静态检查边界和平台 ABI 应分别理解:同一语言可以有不同后端表示,但两个原生对象要互操作,就必须遵守同一目标的值、调用和根管理契约。
ABI 兼容不要求同一优化器、同一临时变量名或逐字节相同的机器码。它要求消费者无需识别生产者,就能按约定读取其值、调用其函数、接收返回结果,并在异常与垃圾回收后继续运行。
据二:实现依据
| 文档主题 | 本基线源码 | 应核对的内容 |
|---|---|---|
| 词法 | 词法解析 | 扫描状态、空白、嵌套注释、字符串转义 |
| 数字 | 整数小数解析 | 逐位数字、分隔符、原始小数文本 |
| 结合关系 | 文言符集 | 68 条显式关系及顺序后备规则 |
| 声明 | 抽象语法分析 | 签名配对、自动递归、自由名称识别 |
| 名称 | 名称解析 | 局部与顶层次序、打开优先级、重导出身份 |
| 类型形成 | 类型类型检查 | 合法类型结构、类型应用限制 |
| 双向检查 | 类型检查工具、对象类型检查 | 合成与检查的不同入口和错误条件 |
| 隐参 | 函数应用隐式参数合成 | 实参预读、期望类型、饱和限制 |
| 名义相等 | 模式合一结构比较 | 文件与名称决定身份,编号不是静态身份 |
| 调用降级 | 隐式参数擦除 | 源码足参检查与机器逐参调用的区别 |
| 闭包 | 正则前闭包转换 | self、代码项、捕获环境 |
| 递归 | 递归节点闭包前变换 | 单槽自引用的建立及填充次序 |
| 栈与返回 | 代码生成准备 | 帧头、槽三返回、续延分派、安全点 |
| 机器代码 | 直接代码生成 | 两个 i128、原始布尔值、外调同步、musttail |
| 符号 | 编译过程工具 | 源身份转义、全局与函数名 |
| 值布局 | 值编解码 | 类型位、长度位、负数编码、字节串布局 |
| GC | 垃圾回收器 | 根地址、转发、扫描和搬迁 |
| 运行入口 | 运行时栈、异常 | 根帧、异常处理器、续延表及配置 |
| WasmGC | 网页汇编直生、GC 运行时 | 引用类型、逐参函数、表索引、动态退出 |
据三:ABI 阅读示例
以文档约定描述,不另提供实现程序。设 C 是一个二参数源函数的闭包,S 是调用者帧:
- 源码的
C 于 a 于 b先通过足参检查。 - 机器首先调用
C[0],新帧槽五放 C、槽六放 a;得到中间闭包 D。 - 返回代码把 D 放在调用者槽三,并设置槽四为恢复编号。
- 恢复后调用
D[0],槽五放 D、槽六放 b;这次返回最终结果。
源语言拒绝部分应用,与机器使用中间闭包没有矛盾;前者是接受规则,后者是 ABI。若重实现将 C 改成一次读取两个实参的闭包,却仍保留同一公共符号,旧调用者就不能正确使用它。
整数负一也有类似区别:低 64 位同为 ffffffffffffffff;C 构值的高 64 位为 ffffffffffffff02,LLVM 内建减法零扩构值的高 64 位为 0000000000000002。二者是同一语言整数,却不应按完整 i128 相等来比较。
据四:文档完整性准则
每个语法形式应有树构造和拒绝条件,每种核心表达式应有类型与求值规则,每个跨对象接口应有字段位置、宽度、实参次序、生命周期及调用者/被调用者责任。涉及兼容缺陷时,同时写明当前事实和可保证的范围。
审阅重点是陌生实现者是否仍需猜测:类型检查与运行时参数分组是否混淆,源路径与符号身份是否遗漏,GC 是否会移动局部持有地址,外调是否使用实际 C 签名。双语正文应表达相同条件,不能省略限制而产生两套规范。