执行语义与编译实现
行一:求值之态
ρ 记局部值,σ 记可变位置,⟨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;异之不否已验互调,同之亦不足代互调。