豫言 / 技术规范

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

执行语义与编译实现

行一:求值之态

ρ 记局部值,σ 记可变位置,⟨e,ρ,σ⟩⇓⟨v,σ′⟩ 记求值;异常、退出、不终别列。静态验类不行一般用户术。

常量直得,名取词法绑定或已初始化全局。成函数则得代码与所捕之境,不行体。实参按值,引用传位置身份而非复制内容。

调用先函数,求首参而施之,得中间函数,乃求次参而施;源虽足参,不可先尽求实参而后行中间体;隐式类参已静定,不执行、不占槽。普通且等函数不因名为逻辑而自动短路,延迟与否依其参数契约。

虑先定义后尾;顺序存前作用而弃前值;元组依次求值;条件惟行所中;模式对象只求一次,不反算任意用户函数,惟选支行。附虽右结合,作用仍先左后右。

顶层裸式执行;类型、透明别名、擦除占位无用户运行作用。依赖先初始化,不重复同模块;模块入口自身非任意重入幂等术。

行二:递归与状态

通用递归之法:分配一槽,初单位;自引用改读槽;求定义成闭包;写回槽;返闭包。捕获递归单元,不在未填时拷单位为自身。其余捕获依词法,引用保身份。

一般递归值若填前读自身,得占位或后误,不作惰性无限结构。无普遍终止检查,通过验类不谓必终。

引用新、读、写位置,写返单位,别名同观;迁堆保身份而可改裸址,故不作跨安全点稳定地址。数组与不安全原语边界非类型系统尽证。

行三:内建与异常

下名须在「」中,∀为承。原始尝试运行受一二元组,库可另包两参。有为单位类,元为其值,非顶类。

类型
《《内建函数:整数:相等》》 整数→整数→爻
《《内建函数:整数:大于》》 整数→整数→爻
《《内建函数:整数:减》》 整数→整数→整数
《《内建函数:抛出异常字符串》》 ∀a.字符串→a
《《内建函数:尝试运行字符串》》 ∀a.((有→a)合(字符串→a))→a
《《内建函数:以当前续延调用》》 ∀a.((∀b.a→b)→a)→a

抛则取当前处理器闭包而授串。尝试 (操作,处理):立退出续延 K,存旧处理器 H;设新 λs.设H;K(处理(s));正常 操作(元) 得 r,亦先设 H 后 K(r)。处理自身再抛,归外层;异常不复行原操作后续。

当前续延包装为可传之提前返回术,调用先复所存处理器,再向动态点送值。原生以号至帧址表,WasmGC 以异常标签。皆不保证已毁栈可长存、反复恢复之多次续延。

模式缺支走运行时报错,非悉为可捕字符串异常;C exit/abort 不经语言处理器。

编一:阶段与不变量

阶段 所变 所必守
词法语法 字节至树 定界、唯一解析、糖与作用域
名称 树至确定引用 静态投影、重诵存来源
检查 确定类及补后物 隐参全解,非法不延至运行
模式展开 模式至测试与投影 单求分析物,支与失败轨迹不变
擦除 有类型至无类型 去标注与隐参,不乱显参
参数规范化 明确参数组 不改足数与入口约
递归 递归至单槽 捕单元,容环
闭包 函数至代码与元组 间接调用传 self
全局与提升 定义至槽与代码 公开身份稳定,根及时登记
ANF 复杂式至临值 求值次序不变,不先行分支
续延与帧 非尾调至返回块 活值入栈、归后重载、尾调复帧
生成 显式操作至平台 守 ABI,无未解投影与自由名

阶段可合,不得赖优化器使非法树可运行。跨模块优化可省;旧对象已引用直接公开入口,则必供之或桥接。

编二:ANF 之法

正规化取式与继续;直接值授继续,复杂式递归其子而以新鲜名绑定。先将显参脊左折为一参应用树,再逐节点正规函数、实参,令 r 为调用果而继续;惟已明分组之内部 IR 可一次授诸参。条件令继续为合流点,各生分支,毋先算两支。

非尾调用之后续成块,自由值皆有帧槽;新帧在活槽之后。恢复取槽三及所存局部。可保守存诸有效值,然扫描槽悉须初始化,类型十二游标不可存。

尾位含函数末、条件支末及令 x=调用而返 x。ANF 临绑定不可失其尾位。原生 musttail,WasmGC return_call_indirect;普通 C call 后 return 未必恒栈。

编三:闭包与直调桥

函数自由值 v1…vk 依固定私序,分配 [代码,v1,…,vk];代码受 self 与显参,vi 改 self[i],i 自一始。间接调用只求闭包一次,读零项而传 self。捕获序属自身,不窥他方。

源码嵌套 λ 保逐参链,不可擅合而替旧全局闭包。直接入口依明示内部参组,不受 self;作函数值则包闭包,包装丢 self 而施直入。反向桥读所存闭包、插 self 而施。值全局与直接函数两类符号皆须可用。

优化可删废值、合包装、直调;混链须保被验入口。已内联而无跨界调用,不作 ABI 成功证。

编四:数与平台

整数取低六十四位;内建减为无 nsw 的 sub i64,零扩而附类二;比较 eq/sgt,结果附爻类。C 普通加减乘除为 int64_t,溢出、除零、最小整除负一无统一稳定约,不悉称环绕。

小数 binary64,常量 bitcast 为 i64 再升附标签。普通 %lf 与精确 %.17g 不同,不以六位打印往返生常量。串依 UTF-8 原字节加末零;源长度、码点数、字节数各别。

编五:中间文件

ABI 兼容不须同缓存。若读旧阶段,则另守 ["豫言中间单元一",阶段名,有序定义数组],项为 [名,公开性,表达式],依阶段释索引、形状、身份、版本。文本为数据,不执行任意术。

对象互通依其符号与值约。语言服务、排版、网站、缓存命中、调试注释及私有临名不入 ABI;异之不否已验互调,同之亦不足代互调。