diff --git a/runtime/src/kvcpu.c b/runtime/src/kvcpu.c index d6a42074..e5553027 100644 --- a/runtime/src/kvcpu.c +++ b/runtime/src/kvcpu.c @@ -635,17 +635,18 @@ int kvlangKvcpuExecuteMode(kvlangKv_t *kv, const char *pc, kvmode_t mode, char * char *cur = strdup(pc); char *cur_frame = NULL, *cur_funcdir = NULL; /* 帧不变时 funcdir 只读一次,供缓存键 */ int rc = 0; + /* status 跨轮携带:尾部 VthreadGet 已连 pc 一并取出,下轮直接复用,省掉背靠背重读 + * (vthread 记录在两次 get 之间不被改写;status 串由 ValueString 自持,跨 ReadReset 存活)。 */ + char *status = NULL; + { char *pcv = NULL; kvlangVthreadGet(kv, vtid, &pcv, &status); free(pcv); } for (;;) { /* 指令边界:回收上条指令执行期借出的读池(cache 指令的读参已 Materialize 自持,不受影响)。 * durable 惰性写不再清池,全靠此处回收;shm 常驻映射侧为 no-op。 */ kvlangKvReadReset(kv); - char *pcv = NULL, *status = NULL; - kvlangVthreadGet(kv, vtid, &pcv, &status); if (!status || (strcmp(status, "init") != 0 && strcmp(status, "running") != 0 && strcmp(status, "wait") != 0)) { - free(pcv); free(status); break; } - free(pcv); free(status); + free(status); status = NULL; int depth = kvlangKeytreeFrameNum(cur); if (depth > MAX_STACK_DEPTH) { @@ -716,7 +717,7 @@ int kvlangKvcpuExecuteMode(kvlangKv_t *kv, const char *pc, kvmode_t mode, char * * 本 vthread(主)pc 未推进,驱动派发子 rwir 并推进子 pc 后重入即续跑。 */ if (out_pc) *out_pc = yield; else free(yield); free(fr); if (tmp_owned) kvlangRwirInstFree(&tmp); - free(cur); free(cur_frame); free(cur_funcdir); kvlangStrbufFree(&vtid_b); + free(cur); free(cur_frame); free(cur_funcdir); free(status); kvlangStrbufFree(&vtid_b); return 1; } } else if (opmeta_get(kv, inst->opcode)->notinmyrwircaps) { @@ -726,7 +727,7 @@ int kvlangKvcpuExecuteMode(kvlangKv_t *kv, const char *pc, kvmode_t mode, char * if (exec_err == 0 && mode == KVMODE_RETURN) { if (out_pc) *out_pc = strdup(cur); free(fr); if (tmp_owned) kvlangRwirInstFree(&tmp); - free(cur); free(cur_frame); free(cur_funcdir); kvlangStrbufFree(&vtid_b); + free(cur); free(cur_frame); free(cur_funcdir); free(status); kvlangStrbufFree(&vtid_b); return 1; } if (exec_err == 0) exec_err = handoff_external_rwir(kv, vtid, cur, inst); @@ -749,9 +750,8 @@ int kvlangKvcpuExecuteMode(kvlangKv_t *kv, const char *pc, kvmode_t mode, char * if (exec_err != 0) { free(fr); if (tmp_owned) kvlangRwirInstFree(&tmp); rc = -1; break; } - char *newpc = NULL, *st = NULL; - kvlangVthreadGet(kv, vtid, &newpc, &st); - free(st); + char *newpc = NULL; + kvlangVthreadGet(kv, vtid, &newpc, &status); /* status 连 pc 一并取出,供下轮直接复用 */ free(fr); if (tmp_owned) kvlangRwirInstFree(&tmp); if (!newpc || !newpc[0]) { free(newpc); break; } @@ -759,7 +759,7 @@ int kvlangKvcpuExecuteMode(kvlangKv_t *kv, const char *pc, kvmode_t mode, char * cur = newpc; } - free(cur); free(cur_frame); free(cur_funcdir); + free(cur); free(cur_frame); free(cur_funcdir); free(status); kvlangStrbufFree(&vtid_b); return rc; } diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/01-\346\211\247\350\241\214\346\250\241\345\236\213.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/01-\346\211\247\350\241\214\346\250\241\345\236\213.kv" index c0aad673..d7fe907e 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/01-\346\211\247\350\241\214\346\250\241\345\236\213.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/01-\346\211\247\350\241\214\346\250\241\345\236\213.kv" @@ -4,7 +4,7 @@ lib kvlang/spec/runtime语义/执行模型 { runtime 是 kvlang 的**动态语义**阶段:对已由 layout 布进 kvspace 的指令做**纯解释执行**。runtime 不编译、不优化、不重排;它只按 PC 逐条取指、解码、执行。 -runtime 的核心**只有一套**:**C runtime(`kvlang/runtime/`,纯 C + `extern "C"`)是唯一的 runtime 核心与标准实现**——动态语义以它为准。其余 runtime 一律是**扩展运行时**:嵌入 C runtime 核心、套用其取指-解码-执行、native 派发与正典 codec,只在其上追加己方 opcode 的解释,绝不另起一套核心或编解码器(见 [[rwirext扩展]]、[[cruntime与后端abi]])。Rust runtime(`kvlang/runtime-rs/`,二进制名 `kvlang`)即这一架构的**参考实现**——它是 rwirext 宿主,而非第二套等价核心;未来的 **deepx-gpu-compute(GPU 算子融合计算引擎)与之同架构**:同样嵌入 C runtime 核心,只把 tensor 融合算子作为己方 rwir 追加。扩展运行时**必须**与 C runtime 核心表现相同的核心动态语义。 +runtime 的核心**只有一套**:**C runtime(`kvlang/runtime/`,纯 C + `extern "C"`)是唯一的 runtime 核心与标准实现**——动态语义以它为准。其余 runtime 一律是**扩展运行时**:嵌入 C runtime 核心、套用其取指-解码-执行、native 派发与正典 codec,只在其上追加己方 opcode 的解释,绝不另起一套核心或编解码器(见 [[runtime开发规范]]、[[cruntime与后端abi]])。Rust runtime(`kvlang/runtime-rs/`,二进制名 `kvlang`)即这一架构的**参考实现**——它是 rwirext 宿主,而非第二套等价核心;未来的 **deepx-gpu-compute(GPU 算子融合计算引擎)与之同架构**:同样嵌入 C runtime 核心,只把 tensor 融合算子作为己方 rwir 追加。扩展运行时**必须**与 C runtime 核心表现相同的核心动态语义。 ## 状态皆在 kvspace @@ -15,7 +15,7 @@ runtime **不得**在 kvspace 之外持有执行状态。PC、栈帧、局部变 ## 坐标系 -一条指令在其所属函数子树内由二元坐标 `[s0,s1]` 定位:`s0` 为指令行(行 0 为签名,指令从行 1 起),`s1` 为参数轴(0 为 opcode,负数为读参绑定 `[0,-k]`,正数为写参绑定 `[0,k]`)。签名槽 `[0,0]` 为 opcode/签名行锚点;其所属函数目录主槽的 langtype 为 `rwfunc`(用户函数)或 `def rwir`(rwir 路由头,见 [[rwirext扩展]];见 [[总体方案]])。 +一条指令在其所属函数子树内由二元坐标 `[s0,s1]` 定位:`s0` 为指令行(行 0 为签名,指令从行 1 起),`s1` 为参数轴(0 为 opcode,负数为读参绑定 `[0,-k]`,正数为写参绑定 `[0,k]`)。签名槽 `[0,0]` 为 opcode/签名行锚点;其所属函数目录主槽的 langtype 为 `rwfunc`(用户函数)或 `def rwir`(rwir 路由头,见 [[runtime开发规范]];见 [[总体方案]])。 ## 指令解释循环 @@ -34,7 +34,7 @@ runtime 对一个 vthread 的执行是如下循环(C 实现 `runtime/src/kvcpu 1. **myrwircaps 内的核心算子**(`op_id ≥ 0`,直查静态能力表,枚举见 [[函数调用与内建]])——本 runtime 就地兑现。 2. **控制指令**(`op_id ∈ {OPID_CALL/RETURN/BR/GOTO}`)——`call` / `return` / `br` / `goto`。 3. **`=` 拷贝**(`op_id == OPID_COPY`)——值拷贝语义。 -4. 以上皆否(`op_id == OPID_notinmyrwircaps`,即 `notinmycaps`)时查 `/lib`:**`notinmyrwircaps`**——`/lib/` 存在 def rwir 路由头(kind=`def rwir`)→ 路由到能兑现它的其它 runtime(见 [[rwirext扩展]])。 +4. 以上皆否(`op_id == OPID_notinmyrwircaps`,即 `notinmycaps`)时查 `/lib`:**`notinmyrwircaps`**——`/lib/` 存在 def rwir 路由头(kind=`def rwir`)→ 路由到能兑现它的其它 runtime(见 [[runtime开发规范]])。 5. **否则视为用户 rwfunc 调用**——opcode 移入 `reads[0]`,改写为 `call` 指令。 `op_id` 由 decode 期分类固化,控制/拷贝/myrwircaps 成员全折入同一整数字段,热路径无 opcode 字符串匹配。myrwircaps 判定先于 `/lib` 查表,故与核心算子同名的 `/lib/` 不改变派发。 diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/02-\346\211\247\350\241\214\346\250\241\345\236\213-\347\273\255.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/02-\346\211\247\350\241\214\346\250\241\345\236\213-\347\273\255.kv" index a5788de5..331b5666 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/02-\346\211\247\350\241\214\346\250\241\345\236\213-\347\273\255.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/02-\346\211\247\350\241\214\346\250\241\345\236\213-\347\273\255.kv" @@ -30,7 +30,7 @@ vthread 是 kvlang 的执行线程,句柄为整数 `vid`,根在 `/vthread/` 是本机在该命名空间下的身份(`host` 取裸 hostname)。外部产物(如子进程 stdout/stderr)经**扩展世界句柄(ref=2,@ext)**登记:写槽 ref=2、langtype 为目标 kindexpr 串(不带 `@` 前缀)、body 为逻辑定位串(如 `/networld//proc//stdout`),读取时按 body 前缀路由兑现真实字节。锚例:`tutorial/14-networld/`。 +runtime 核心不含 I/O;与外部世界(进程、文件系统、网络)的交互一律经 `networld/*` rwir(见 [[runtime开发规范]])。`/networld/` 是本机在该命名空间下的身份(`host` 取裸 hostname)。外部产物(如子进程 stdout/stderr)经**扩展世界句柄(ref=2,@ext)**登记:写槽 ref=2、langtype 为目标 kindexpr 串(不带 `@` 前缀)、body 为逻辑定位串(如 `/networld//proc//stdout`),读取时按 body 前缀路由兑现真实字节。锚例:`tutorial/14-networld/`。 > **实现现状**(规范外提示):当前 Rust runtime 以 `bootstrap → run_vid` 循环主导驱动 vthread;尚未实现"启动自注册 `/networld//proc/` + watch vthread strkeymap 驱动"的分布式派发。该分布式派发为规划方向,未落地部分不属本卷 normative 内容。 diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/03-\346\210\220\345\221\230\350\256\277\351\227\256.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/03-\346\210\220\345\221\230\350\256\277\351\227\256.kv" index d8e08656..48634a37 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/03-\346\210\220\345\221\230\350\256\277\351\227\256.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/03-\346\210\220\345\221\230\350\256\277\351\227\256.kv" @@ -44,7 +44,7 @@ kvlang 用两个符号访问复合数据,语义严格分离,runtime **不得 ## 扩展世界句柄(ref=2,@ext) -`ref` 是 head 中的**独立 u8 字段**(0=inline、1=ptr、2=@ext),不是 kindexpr/kind 首字符;源码类型标注中 `*`/`@` 前缀由 layout 剥离落成 `ref` 字节,wire 层 langtype 串不含前缀(见 [[总体方案]])。ref=2(@ext)表示真实值在扩展世界,head 的 langtype 仍为目标形态的完整 kindexpr 串(不带 `@` 前缀),body 不是真实值字节,而是**定位串**(如 `/networld//proc//stdout`);读取该 key 时 runtime 按 body 前缀路由到对应扩展兑现器还原真实字节(见 [[rwirext扩展]]、[[执行模型]] §八)。真实 xvalue 落在扩展世界(fs 文件、gpu tensordata 等),非 kvspace 元存。 +`ref` 是 head 中的**独立 u8 字段**(0=inline、1=ptr、2=@ext),不是 kindexpr/kind 首字符;源码类型标注中 `*`/`@` 前缀由 layout 剥离落成 `ref` 字节,wire 层 langtype 串不含前缀(见 [[总体方案]])。ref=2(@ext)表示真实值在扩展世界,head 的 langtype 仍为目标形态的完整 kindexpr 串(不带 `@` 前缀),body 不是真实值字节,而是**定位串**(如 `/networld//proc//stdout`);读取该 key 时 runtime 按 body 前缀路由到对应扩展兑现器还原真实字节(见 [[runtime开发规范]]、[[执行模型]] §八)。真实 xvalue 落在扩展世界(fs 文件、gpu tensordata 等),非 kvspace 元存。 ## compact 数组下标 diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/04-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/04-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272.kv" index 907ab59e..eac6fecd 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/04-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/04-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272.kv" @@ -26,7 +26,7 @@ lib kvlang/spec/runtime语义/函数调用与内建 { ## native builtin 判定 -查表函数 `kvlangBuiltinCapIndex(opcode)`(`runtime/src/builtin.c`)**两级查找**:先按完整 opcode 查(命中即专精实现,如 `fp8·add`、`time·add` 等成员算子),未命中且末段前缀是 **C 原生数值 langtype**(`int8..int64`/`uint8..uint64`/`float32`/`float64`)才剥前缀查裸算子(`int64·add → add`,通用实现,按操作数 kind 归约)。命中返回索引即在 myrwircaps 内;否则 `notinmycaps`。**保留精度前缀专精**:`int4`/`fp8`/`bf16` 等 C 表达不了的量化精度不剥离前缀,各走专精 fn 或路由。判定**先于** `/lib` 查表,故 myrwircaps 内 opcode 不会被当须经 def rwir 路由的 rwir 或用户函数。此静态注册表即**核心 runtime-c 的 myrwircaps**(见 [[rwirext扩展]])——核心能就地跑的 opcode 全在这张表里;`notinmycaps(opcode)` 是其否定谓词。 +查表函数 `kvlangBuiltinCapIndex(opcode)`(`runtime/src/builtin.c`)**两级查找**:先按完整 opcode 查(命中即专精实现,如 `fp8·add`、`time·add` 等成员算子),未命中且末段前缀是 **C 原生数值 langtype**(`int8..int64`/`uint8..uint64`/`float32`/`float64`)才剥前缀查裸算子(`int64·add → add`,通用实现,按操作数 kind 归约)。命中返回索引即在 myrwircaps 内;否则 `notinmycaps`。**保留精度前缀专精**:`int4`/`fp8`/`bf16` 等 C 表达不了的量化精度不剥离前缀,各走专精 fn 或路由。判定**先于** `/lib` 查表,故 myrwircaps 内 opcode 不会被当须经 def rwir 路由的 rwir 或用户函数。此静态注册表即**核心 runtime-c 的 myrwircaps**(见 [[runtime开发规范]])——核心能就地跑的 opcode 全在这张表里;`notinmycaps(opcode)` 是其否定谓词。 ## native builtin 全集(权威) diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/05-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272-\347\273\255.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/05-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272-\347\273\255.kv" index 1c843535..67d797a5 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/05-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272-\347\273\255.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/05-\345\207\275\346\225\260\350\260\203\347\224\250\344\270\216\345\206\205\345\273\272-\347\273\255.kv" @@ -20,7 +20,7 @@ lib kvlang/spec/runtime语义/函数调用与内建_续 { ## `print` / `println` / `cerr` / `input` 不是 native -**规范要点**:`print`、`println`、`cerr`、`input` **不在** myrwircaps——它们是 **term runtime 的 rwir(经 def rwir 路由,`/lib/` kind=`def rwir`)**,经派发链第 4 级 `notinmyrwircaps` 命中(见 [[rwirext扩展]])。term 扩展与中央 runtime 同进程,就地 `ResolveRead` + display 直写宿主 stdout/stderr。实现**不得**把这四个 opcode 当 myrwircaps 内处理。 +**规范要点**:`print`、`println`、`cerr`、`input` **不在** myrwircaps——它们是 **term runtime 的 rwir(经 def rwir 路由,`/lib/` kind=`def rwir`)**,经派发链第 4 级 `notinmyrwircaps` 命中(见 [[runtime开发规范]])。term 扩展与中央 runtime 同进程,就地 `ResolveRead` + display 直写宿主 stdout/stderr。实现**不得**把这四个 opcode 当 myrwircaps 内处理。 ## myrwircaps vs 须经 def rwir 路由的 rwir 的判定边界 diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/06-rwirext\346\211\251\345\261\225.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/06-runtime\345\274\200\345\217\221\350\247\204\350\214\203.kv" similarity index 88% rename from "stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/06-rwirext\346\211\251\345\261\225.kv" rename to "stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/06-runtime\345\274\200\345\217\221\350\247\204\350\214\203.kv" index 524a00da..c1a48801 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/06-rwirext\346\211\251\345\261\225.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/06-runtime\345\274\200\345\217\221\350\247\204\350\214\203.kv" @@ -1,8 +1,8 @@ // 欢迎加入kvspace世界 -lib kvlang/spec/runtime语义/rwirext扩展 { - r####"# rwirext 扩展运行时 +lib kvlang/spec/runtime语义/runtime开发规范 { + r####"# runtime 开发规范 -kvlang 是**小核心 + 扩展主导**语言。中央 runtime 只实现执行核心(取指-解码-执行、call/return/br/goto、native builtin 派发、`=` 拷贝、用户函数调用);其余能力(tensor 计算、LLM 调用、agent 循环、print/fs/http 等 I/O)由**扩展运行时**提供。本章界定核心与扩展之间的契约。 +kvlang 是**小核心 + 扩展主导**语言。中央 runtime 只实现执行核心(取指-解码-执行、call/return/br/goto、native builtin 派发、`=` 拷贝、用户函数调用);其余能力(tensor 计算、LLM 调用、agent 循环、print/fs/http 等 I/O)由**扩展运行时**提供。本章界定核心与扩展之间的契约,以及所有 runtime 实现**必须**遵守的开发规范。 ## 扩展运行时模型 @@ -18,6 +18,8 @@ kvlang 是**小核心 + 扩展主导**语言。中央 runtime 只实现执行核 myrwircaps **只关乎执行位置**(哪张表登记了它、由谁就地跑),不改变 rwir 的动态语义——同一 rwir 无论落进哪个 runtime 的 myrwircaps,行为必须一致。 +**命名规范(normative)**:每个 runtime 在代码中登记自身 rwir 能力的这张表,其标识符/定义**必须**命名为 `myrwircaps`,不得另起别名(大小写随各语言惯例,如 C/Go `myrwircaps`、Rust 常量 `MYRWIRCAPS`)。审阅任一 runtime 实现时,`myrwircaps` 即「本 runtime 自己实现的 rwir 列表」的唯一入口名。 + 核心公理(normative): 1. **rwir 自描述**:opcode + 读/写参已含执行所需全部信息。 @@ -52,5 +54,5 @@ myrwircaps **只关乎执行位置**(哪张表登记了它、由谁就地跑 networld/proc·exec rp=[[]stringkeymap, []stringkeymap] wp=[uint8, []uint8, []uint8] networld/fs·read rp=[[]char/utf8|[]char/utf32, int64, int64] wp=[[]uint8] ``` - "#### -> /lib/kvlang/spec/runtime语义/rwirext扩展 + "#### -> /lib/kvlang/spec/runtime语义/runtime开发规范 } diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/09-cruntime\344\270\216\345\220\216\347\253\257abi.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/09-cruntime\344\270\216\345\220\216\347\253\257abi.kv" index d9d54f14..02ca83da 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/09-cruntime\344\270\216\345\220\216\347\253\257abi.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/09-cruntime\344\270\216\345\220\216\347\253\257abi.kv" @@ -6,7 +6,7 @@ lib kvlang/spec/runtime语义/cruntime与后端abi { ## 小 runtime 大扩展 -中央 runtime 只实现执行核心(取指-解码-执行、call/return/br/goto、native builtin 派发、`=` 拷贝、用户函数调用);tensor / LLM / agent / print / fs / http 全部交给扩展运行时(见 [[rwirext扩展]])。这条分工是**不可越界的职责线**:runtime-c 独占三件事,扩展一件都不许重做。 +中央 runtime 只实现执行核心(取指-解码-执行、call/return/br/goto、native builtin 派发、`=` 拷贝、用户函数调用);tensor / LLM / agent / print / fs / http 全部交给扩展运行时(见 [[runtime开发规范]])。这条分工是**不可越界的职责线**:runtime-c 独占三件事,扩展一件都不许重做。 **runtime-c 拥有(唯一实现,扩展不得复刻)**: @@ -16,8 +16,8 @@ lib kvlang/spec/runtime语义/cruntime与后端abi { **扩展运行时套用核心,不复刻**:runtime-c 把上述三件能力经嵌入式 C ABI(下节 `kvlang_runtime.h` + `kvlang_rwirext.h`)对外开放。扩展运行时**嵌入**这套核心、复用其执行循环、native 派发与正典 codec,只**自行解释己方 opcode**——不得另起执行核心、不得另写编解码器、不得复刻 native 算子。据此: -- **runtime-rs 是扩展运行时的参考实现**,不是第二套等价核心。它作为 rwirext 宿主,套用 runtime-c 核心,在自己的 **myrwircaps**(见 [[rwirext扩展]])里登记 print/fs/http/networld/vthread 等「OS 工具箱」rwir。其对 head/kindexpr 的读写**必须**走正典 codec,不得自持一份编解码。 -- **未来的 deepx-gpu-compute(GPU 算子融合计算引擎)同架构**:同样嵌入 runtime-c 核心,只在其 **myrwircaps** 里登记 tensor 融合算子——算子融合发生在扩展侧(见 [[rwirext扩展]]),核心的解释语义不变。 +- **runtime-rs 是扩展运行时的参考实现**,不是第二套等价核心。它作为 rwirext 宿主,套用 runtime-c 核心,在自己的 **myrwircaps**(见 [[runtime开发规范]])里登记 print/fs/http/networld/vthread 等「OS 工具箱」rwir。其对 head/kindexpr 的读写**必须**走正典 codec,不得自持一份编解码。 +- **未来的 deepx-gpu-compute(GPU 算子融合计算引擎)同架构**:同样嵌入 runtime-c 核心,只在其 **myrwircaps** 里登记 tensor 融合算子——算子融合发生在扩展侧(见 [[runtime开发规范]]),核心的解释语义不变。 ## C runtime 结构 diff --git "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/10-cruntime\344\270\216\345\220\216\347\253\257abi-\347\273\255.kv" "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/10-cruntime\344\270\216\345\220\216\347\253\257abi-\347\273\255.kv" index 6a88095a..14ae924e 100644 --- "a/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/10-cruntime\344\270\216\345\220\216\347\253\257abi-\347\273\255.kv" +++ "b/stdlib/kvlang/spec/05-runtime\350\257\255\344\271\211/10-cruntime\344\270\216\345\220\216\347\253\257abi-\347\273\255.kv" @@ -16,7 +16,7 @@ lib kvlang/spec/runtime语义/cruntime与后端abi_续 { runtime-c 是唯一核心;runtime-rs 是套用该核心的扩展宿主(见 [[执行模型]]、[[cruntime与后端abi]])。因套用同一核心,二者的核心动态语义**天然一致**、不存在两套需人工对齐的核心;差异**仅限**须经 def rwir 路由的 rwir 的**执行位置策略**,且对 kvlang 程序不可观测: -- **C runtime**:须经 def rwir 路由的 rwir(不在本 runtime myrwircaps 内的 rwir,见 [[rwirext扩展]])一律经 `handoff_external_rwir`(Set `/lib//vids/` + Watch 30s 超时)移交,供独立进程扩展消费;嵌入式模式(`KVMODE_RETURN`)经 `out_pc` 把控制交回同进程扩展。 +- **C runtime**:须经 def rwir 路由的 rwir(不在本 runtime myrwircaps 内的 rwir,见 [[runtime开发规范]])一律经 `handoff_external_rwir`(Set `/lib//vids/` + Watch 30s 超时)移交,供独立进程扩展消费;嵌入式模式(`KVMODE_RETURN`)经 `out_pc` 把控制交回同进程扩展。 - **Rust runtime**:`is_inproc(op)` 命中的 rwir 在驱动循环里就地 `dispatch`(无 handoff、无 watch);非就地 rwir 经 `kvlang_rwirextHandoff` 移交独立进程扩展或委托宿主 `ext` 处理器。 二者对 native builtin、控制流、`=` 拷贝、值语义的处理**必须**一致;差异仅限须经 def rwir 路由的 rwir 的**就地 vs 移交**这一执行位置维度,且对 kvlang 程序不可观测(同一 tutorial 三后端两 runtime 输出一致)。