Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
20 changes: 10 additions & 10 deletions runtime/src/kvcpu.c
Original file line number Diff line number Diff line change
Expand Up @@ -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) {
Expand Down Expand Up @@ -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) {
Expand All @@ -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);
Expand All @@ -749,17 +750,16 @@ 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; }
free(cur);
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;
}
Expand Down
6 changes: 3 additions & 3 deletions stdlib/kvlang/spec/05-runtime语义/01-执行模型.kv
Original file line number Diff line number Diff line change
Expand Up @@ -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

Expand All @@ -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开发规范]];见 [[总体方案]])。

## 指令解释循环

Expand All @@ -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/<opcode>` 存在 def rwir 路由头(kind=`def rwir`)→ 路由到能兑现它的其它 runtime(见 [[rwirext扩展]])。
4. 以上皆否(`op_id == OPID_notinmyrwircaps`,即 `notinmycaps`)时查 `/lib`:**`notinmyrwircaps`**——`/lib/<opcode>` 存在 def rwir 路由头(kind=`def rwir`)→ 路由到能兑现它的其它 runtime(见 [[runtime开发规范]])。
5. **否则视为用户 rwfunc 调用**——opcode 移入 `reads[0]`,改写为 `call` 指令。

`op_id` 由 decode 期分类固化,控制/拷贝/myrwircaps 成员全折入同一整数字段,热路径无 opcode 字符串匹配。myrwircaps 判定先于 `/lib` 查表,故与核心算子同名的 `/lib/<op>` 不改变派发。
Expand Down
2 changes: 1 addition & 1 deletion stdlib/kvlang/spec/05-runtime语义/02-执行模型-续.kv
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ vthread 是 kvlang 的执行线程,句柄为整数 `vid`,根在 `/vthread/<v

## networld 与外部世界

runtime 核心不含 I/O;与外部世界(进程、文件系统、网络)的交互一律经 `networld/*` rwir(见 [[rwirext扩展]])。`/networld/<host>` 是本机在该命名空间下的身份(`host` 取裸 hostname)。外部产物(如子进程 stdout/stderr)经**扩展世界句柄(ref=2,@ext)**登记:写槽 ref=2、langtype 为目标 kindexpr 串(不带 `@` 前缀)、body 为逻辑定位串(如 `/networld/<host>/proc/<pid>/stdout`),读取时按 body 前缀路由兑现真实字节。锚例:`tutorial/14-networld/`。
runtime 核心不含 I/O;与外部世界(进程、文件系统、网络)的交互一律经 `networld/*` rwir(见 [[runtime开发规范]])。`/networld/<host>` 是本机在该命名空间下的身份(`host` 取裸 hostname)。外部产物(如子进程 stdout/stderr)经**扩展世界句柄(ref=2,@ext)**登记:写槽 ref=2、langtype 为目标 kindexpr 串(不带 `@` 前缀)、body 为逻辑定位串(如 `/networld/<host>/proc/<pid>/stdout`),读取时按 body 前缀路由兑现真实字节。锚例:`tutorial/14-networld/`。

> **实现现状**(规范外提示):当前 Rust runtime 以 `bootstrap → run_vid` 循环主导驱动 vthread;尚未实现"启动自注册 `/networld/<ip>/proc/<pid>` + watch vthread strkeymap 驱动"的分布式派发。该分布式派发为规划方向,未落地部分不属本卷 normative 内容。

Expand Down
2 changes: 1 addition & 1 deletion stdlib/kvlang/spec/05-runtime语义/03-成员访问.kv
Original file line number Diff line number Diff line change
Expand Up @@ -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/<host>/proc/<pid>/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/<host>/proc/<pid>/stdout`);读取该 key 时 runtime 按 body 前缀路由到对应扩展兑现器还原真实字节(见 [[runtime开发规范]]、[[执行模型]] §八)。真实 xvalue 落在扩展世界(fs 文件、gpu tensordata 等),非 kvspace 元存。

## compact 数组下标

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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 全集(权威)

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,7 @@ lib kvlang/spec/runtime语义/函数调用与内建_续 {

## `print` / `println` / `cerr` / `input` 不是 native

**规范要点**:`print`、`println`、`cerr`、`input` **不在** myrwircaps——它们是 **term runtime 的 rwir(经 def rwir 路由,`/lib/<opcode>` 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/<opcode>` kind=`def rwir`)**,经派发链第 4 级 `notinmyrwircaps` 命中(见 [[runtime开发规范]])。term 扩展与中央 runtime 同进程,就地 `ResolveRead` + display 直写宿主 stdout/stderr。实现**不得**把这四个 opcode 当 myrwircaps 内处理。

## myrwircaps vs 须经 def rwir 路由的 rwir 的判定边界

Expand Down
Original file line number Diff line number Diff line change
@@ -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 实现**必须**遵守的开发规范

## 扩展运行时模型

Expand All @@ -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 + 读/写参已含执行所需全部信息。
Expand Down Expand Up @@ -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开发规范
}
Original file line number Diff line number Diff line change
Expand Up @@ -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 拥有(唯一实现,扩展不得复刻)**:

Expand All @@ -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 结构

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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/<op>/vids/<vtid>` + Watch 30s 超时)移交,供独立进程扩展消费;嵌入式模式(`KVMODE_RETURN`)经 `out_pc` 把控制交回同进程扩展。
- **C runtime**:须经 def rwir 路由的 rwir(不在本 runtime myrwircaps 内的 rwir,见 [[runtime开发规范]])一律经 `handoff_external_rwir`(Set `/lib/<op>/vids/<vtid>` + 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 输出一致)。
Expand Down
Loading