豫言 / 技术规范

此篇据 4cdeca1 之实现。所据及适用之界,见基线之篇

豫言独立实现技术规范

此书授未与豫言之作者,使自造编译器,而能与既有对象及运行时相施。所定为仓库 4cdeca11600fed16338793a494b6eecaae94485a,下称“本基线”,非拟未来之制。诸篇同号相应,依次读之:

  1. 词法与语法:扫描、成句、结合及化简。
  2. 类型与模块:名、验类、隐参、构造器与文件身份。
  3. 执行与编译:求值、异常、擦除、闭包、递归与生成。
  4. 原生二进制接口:值、堆、栈、调用、符号、GC 与 C。
  5. 网页汇编接口:WASI 与 WasmGC 异约。
  6. 基线与实现依据:基线、源码所据、ABI 文例与审阅之则。
  7. 规约关系表运行时接口表:全表。

总〇:何谓兼容

同目标、同模块身份、同定义序,新器之值与代码可为旧器所用,旧者亦可为新器所用;调用、返回、异常及迁堆而后皆无失,乃谓 ABI 兼容。仅同所印、仅能自举,皆未足证之。

所必同 所可异
源语言 接受与拒绝之界、运行轨迹、结果、可观失败类别 内树名、诊断全栈、编译之速
对象接口 布局、调用、公开符号、身份、根与存储 临名、寄存器分配、优化术、私有续延号
逐字节复现 同工具链、路径、编号、选项、优化、调试之全部产物 非 ABI 同而必得

此集惟交技术文档,使陌生作者不待原作者口授,即明语言算法与二进制之约。内树与优化可自择,不得暗改可观之怪异而仍称尽同。

总一:用语

“必须”为兼容之需,“可”为术之自由,“禁止”为不可作互通输入。“兼容缺陷”记实而限其域,非推崇其设计。未有稳定之义,不以猜测补之。C 有符号溢出、越界、不安全转换、失效续延、签名错配,皆不入稳定行为集;欲使此等于万机尽同,无可行之约。

总二:实现之界

独立编译器须能读 UTF-8,析模块及有序定义,成语法、验类、生运行值、设入口、行外调、闭包、递归、异常、提前返回、GC 安全点及平台链接。

标准库以豫言写,可由新器编译;系统原语可链旧 C 运行时,不必重造文件与网络封装,亦不借旧编译器生成代码。若并易运行时,则须实现接口表之实签名与义,并验旧编译产物调用新运行时。

单得旧 .o,不足知类型别名、隐参与构造器身份;尚须依赖源码或等价接口记录。运行标签不可代静态类型。

总三:最小记录

类型录内建、刚性变量、名义构造器、应用、连续箭头、隐式全称及元组。表达式录常量、局部与文件引用、显隐函数、调用脊、绑定、递归、条件、顺序、元组、投影、模式、标注及外调。

文件接口项录原文件身份、名、序、类别、已检类型、透明体或名义身份,重诵存来源。无类型值录单位、整数、小数、字节串、闭包、元组、构造器与引用;类型及隐参不占运行槽。原生控制录当前帧、分配游标、返回函数与续延号、存活值及异常处理器。

局部可用唯一 ID 或一基 de Bruijn 索引;替换必避捕获,不可无域而换文。公共符号依模块与定义序,私有 ID 不可泄入其约。

总四:守基线

改源路、定义列、构造次序或目标,皆可能改 ABI。交付须附源提交、编译器与运行时 SHA-256、目标三元组、工具链、选项、依赖解析及结果。

维护则核源码、双语条件及接口表。已明者详立其则,矛盾或无稳定义者明限其域,不无据而许之。