豫言 / 技术规范

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

网页汇编接口

网一:三目标

LLVM 原生、LLVM/WASI、WasmGC 不共一裸指针约。WASI 尚用逻辑 i128 与豫言帧;GC 直生用引擎引用及调用栈。原生对象不直入 GC 模块。

网二:LLVM/WASI

目标 wasm32-wasip1,clang 加 --target=wasm32-wasip1 -mtail-call。槽仍十六字节,低地址为三十二位线性偏移;i128 参数与返回须交工具链降,不臆作四 i64 宿主导出。

普通豫言栈初四 MiB,单堆上限六十四 MiB;编译宿主模式另放宽。写新帧、尾参、续延局部前验空间;C 栈与豫言栈非同块。

根注册外调易为 豫言_网页汇编登记垃圾回收根,报错易为 豫言_网页汇编报错并中止,包装合签名。系统桥传数与字节,客址惟线性偏移,宿主先验界而复制,不作本机裸址。

操作码自一起:启动、等待、结果信息、读输出、释放、核数、存上下文、多路等待、真实路径。标准流零至三:捕获、弃流、继承输出、继承全部。此非 GC 引用桥;核心实现不伪许宿主全能。

网三:GC 值

表达式皆返 (ref null eq),实际如下。

表示
单位、擦除类 ref.null eq
-2^30…2^30-1 整 有符号 ref.i31
其余 i64 $big=struct(field i64)
i31 0/1
小数 $float=struct(field f64)
元组、引用、闭包、数组 $tuple=array(mut (ref null eq))
串、字节 $bytes=array(mut i8),无原生隐藏末零
构造实例 $variant=struct(field i32,field (ref $tuple)),号及载荷
代码 i31 函数表索引

闭包首代码,余捕获;普通源函数保擦后逐参链,内部多参数型不由源箭头数臆定。代码 ref.cast i31、i31.get_u 后按参数数目 call_indirect,不填原生址。

网四:调用、模块、异常

本基线生 t0 至 t16,参数皆 eqref,结果亦然,self 入参数数。逾限不可称已实现。尾调用 return_call_indirect,普通合流用结果块与 br,不设原生帧。

函数索引依闭包树组之序,全局键 路径#定义名,不含原生序号;输出合并一模块,非可任意拼 .o 之约。替单函数须保表号、类型、全局,或桥接。

导出 _start,先 data 生串全局,再依序调模块并弃果,后行启动文本。字面按 \hh,不假有效文本而改字节。

提前返用 escape 标签,载标识与值两个 eqref。标识递增,至 1073741823 不再绕回,超则 trap;捕获比标,不同重抛,越动态范围不支持。exception 可变全局存处理器;算术、索引、cast trap 非自动可捕字符串异常。

网五:GC 宿主桥

导入 yuyan:gc-host/v1call,型 (eqref,eqref)→eqref,首为原语名 bytes,次为 C 次序参数 tuple。未内联系统术循此。

须供 yy_bytesyy_tupleyy_bigyy_float 类型原型全局;宿主取实际引擎类型造返回值,不能另造同形而不兼容之型。宿主 API 与引擎同配置,跨版本另验。

桥容单位、i31/i64、f64、bytes、普通 tuple;i31 转原生为整数,原生爻返 i31。深限 512,不通传任意构造器、闭包、指针。每调用设独立临时原生分配区,造完返回引用即尽释,不留址于下次。复制不保任意环与共享,引用变更和闭包必须留 guest,不经此复制桥。

guest 已含引用及数组、异常处理器、不安全恒等、整数加减乘除及相等、串字节拼接与比较、长度取字节及若干 UTF-8/JSON 操作。形参次序仍须守,不把可变对象尽交宿主而失身份。

网六:所验之界

本篇依网页后端源码述其约。全网页实现尚须数界、尾递归、异常范围、嵌零、宿主失败及 GC 压力。原生既过,不谓网页皆过。