网页汇编接口
网一:三目标
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/v1 之 call,型 (eqref,eqref)→eqref,首为原语名 bytes,次为 C 次序参数 tuple。未内联系统术循此。
须供 yy_bytes、yy_tuple、yy_big、yy_float 类型原型全局;宿主取实际引擎类型造返回值,不能另造同形而不兼容之型。宿主 API 与引擎同配置,跨版本另验。
桥容单位、i31/i64、f64、bytes、普通 tuple;i31 转原生为整数,原生爻返 i31。深限 512,不通传任意构造器、闭包、指针。每调用设独立临时原生分配区,造完返回引用即尽释,不留址于下次。复制不保任意环与共享,引用变更和闭包必须留 guest,不经此复制桥。
guest 已含引用及数组、异常处理器、不安全恒等、整数加减乘除及相等、串字节拼接与比较、长度取字节及若干 UTF-8/JSON 操作。形参次序仍须守,不把可变对象尽交宿主而失身份。
网六:所验之界
本篇依网页后端源码述其约。全网页实现尚须数界、尾递归、异常范围、嵌零、宿主失败及 GC 压力。原生既过,不谓网页皆过。