From b69693862ecff3d20b7fd4cc4283ee7ee519771e Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Wed, 9 Sep 2026 09:55:31 +0800 Subject: [PATCH 1/5] =?UTF-8?q?spec(ABI):=20=E5=AF=BC=E5=87=BA=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E5=85=A8=E9=9B=86=E7=AB=A0=E8=8A=82=E2=80=94=E2=80=94?= =?UTF-8?q?nm=20-D=20=E5=AE=9E=E6=B5=8B=E4=B8=89=E5=BA=93=20ABI=20?= =?UTF-8?q?=E5=85=A5=20spec?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 04-CABI:kvspace C ABI 导出全集(31 符号)。 - 09-cruntime与后端abi:layout cdylib 全集(6)+ runtime C 全集(203,按族分组)。 机器生成自 nm -D --defined-only,随实现变更同步更新。 --- .../04-CABI.kv" | 12 +++- ...344\270\216\345\220\216\347\253\257abi.kv" | 72 ++++++++++++++++++- 2 files changed, 82 insertions(+), 2 deletions(-) diff --git "a/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" "b/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" index bd4980c8..44900c4f 100644 --- "a/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" +++ "b/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" @@ -24,5 +24,15 @@ lib kvlang/spec/kvspace模型/CABI { 无句柄的编解码符号(前端静态实现,byte-identical):`kvspaceTlvEncode` / `kvspaceTlvEncodeMode` / `kvspaceDecodeHead`,以及构造器 `kvspaceNewPtr`(存目标完整 langtype + 目标 key)、`kvspaceNewChar` / `kvspaceNewBool` / `kvspaceNewInt64` / `kvspaceNewFloat64`。 读写各带 `resolve` 参数:`resolve=1` 时透明穿透 ref=1 指针(link);`kvspaceListLen`/`kvspaceListAt` 另有 `expand_ext` 参数控制是否展开 extindex 子项。head 线格式与 langtype 编码见 [[键系统与数组访问]]。 - "#### -> /lib/kvlang/spec/kvspace模型/CABI + +## 导出符号全集(nm -D 实测,31) + +``` + kvspaceClear kvspaceClose kvspaceConnect kvspaceConst kvspaceCp kvspaceCpList + kvspaceCpTree kvspaceDecodeHead kvspaceDel kvspaceDelTree kvspaceDisconnect kvspaceGet + kvspaceGetHead kvspaceGetPart kvspaceListAt kvspaceListLen kvspaceMkindex kvspaceMkindexExt + kvspaceNewBool kvspaceNewChar kvspaceNewFloat64 kvspaceNewInt64 kvspaceNewPtr kvspaceReadReset + kvspaceRmindexExt kvspaceSetPart kvspaceTlvEncode kvspaceTlvEncodeMode kvspaceWatch kvspaceWriteInPlace + kvspaceWriteNewPlace +``` "#### -> /lib/kvlang/spec/kvspace模型/CABI } 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 c9a33e5c..ab8996db 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" @@ -54,5 +54,75 @@ kvspaceNewPtr / NewChar / NewBool / NewInt64 / NewFloat64 **native 读参:标量按值、整块借用**(normative,P2-d)——runtime-c native 算子(标量数值/逻辑/cast + `xv·*`/`array·*`/`string·*`)经 `ResolveReadValue` 取参,两条路径互斥:内联字面量(冻结于 code 槽)按值拷入(标量,纳秒级,无 KV 往返);变量/KV 常驻值经 `GetMember` 一次取出后**移交所有权**(`*out = pv`,非二次拷贝,后端物化只发生在 `Get` 内部)。**整块字节零拷贝不在 native 侧另设机制**——它就是 [[notinmyrwircaps]] 的 `ResolveReadPath` + `kvspaceGet` body 指针那一条路径,由持有大 tensor 的扩展(numpy/op-gpu)承担;native 算子处理的是标量与中等 value,其拷贝相对每步 KV 往返可忽略(fib n=10:redis 1.5s / fs 320ms vs C 586ns,墙钟由 KV I/O 主导约六个数量级),故不为其增设借用管线。 **后端由链接决定**:构建期经环境变量选择链接哪个 kvspace 库(`kvspace-c` 或 `kvspace_durable`),两者导出同一 ABI;runtime 的句柄结构只保留 `void *h`,代码零后端分支。 - "#### -> /lib/kvlang/spec/runtime语义/cruntime与后端abi + +## 导出符号全集(nm -D 实测,6) + +``` + kvlangKindexprParse kvlangLayoutCode kvlangLayoutDump kvlangLayoutFile kvlangLayoutFormat kvlangLayoutVet +``` +## 导出符号全集(nm -D 实测,203) + +``` +`handoff_`(1): + handoff_external_rwir +`kvlangBuiltin`(80): + kvlangBuiltinAppend kvlangBuiltinArray kvlangBuiltinArrayFill kvlangBuiltinCapIndex kvlangBuiltinCharConcat kvlangBuiltinCompact + kvlangBuiltinDebugger kvlangBuiltinDurArith kvlangBuiltinDurCmp kvlangBuiltinDurFrom kvlangBuiltinDurTo kvlangBuiltinExecuteCopy + kvlangBuiltinFreeInputs kvlangBuiltinKvAbs kvlangBuiltinKvCp kvlangBuiltinKvCpList kvlangBuiltinKvCpTree kvlangBuiltinKvDel + kvlangBuiltinKvDelTree kvlangBuiltinKvExtIndex kvlangBuiltinKvGet kvlangBuiltinKvList kvlangBuiltinKvListLen kvlangBuiltinKvListN + kvlangBuiltinKvMkindex kvlangBuiltinKvRmIndexExt kvlangBuiltinKvSet kvlangBuiltinKvWatch kvlangBuiltinMap kvlangBuiltinMapMarker + kvlangBuiltinMemindex kvlangBuiltinNative kvlangBuiltinNdarrayDim kvlangBuiltinNdarrayNumel kvlangBuiltinNdarrayShape kvlangBuiltinNextPc + kvlangBuiltinNumOp kvlangBuiltinObj kvlangBuiltinRandInt63 kvlangBuiltinRandIntn kvlangBuiltinRandUint64 kvlangBuiltinReadInputs + kvlangBuiltinResolveReadKey kvlangBuiltinResolveReadValue kvlangBuiltinResolveWriteSlot kvlangBuiltinScatter kvlangBuiltinScatterKey kvlangBuiltinSetErr + kvlangBuiltinSlice kvlangBuiltinStringChar kvlangBuiltinStringCmp kvlangBuiltinStringConcat kvlangBuiltinStringFind kvlangBuiltinStringFormatInt + kvlangBuiltinStringFormatUint kvlangBuiltinStringLen kvlangBuiltinStringOrd kvlangBuiltinStringParseInt kvlangBuiltinStringParseUint kvlangBuiltinStringSet + kvlangBuiltinStringSlice kvlangBuiltinStructNew kvlangBuiltinTimeAdd kvlangBuiltinTimeCmp kvlangBuiltinTimeNow kvlangBuiltinTimeSub + kvlangBuiltinTryParseNumber kvlangBuiltinVthreadCall kvlangBuiltinVthreadCreate kvlangBuiltinVthreadRun kvlangBuiltinVthreadSetstatus kvlangBuiltinVthreadSleep + kvlangBuiltinWriteResult kvlangBuiltinXvAt kvlangBuiltinXvBodylen kvlangBuiltinXvLangtype kvlangBuiltinXvReinterpret kvlangBuiltinXvReshape + kvlangBuiltinXvSet kvlangBuiltinXvalueAt +`kvlangCtl`(4): + kvlangCtlBr kvlangCtlCall kvlangCtlGoto kvlangCtlReturn +`(其它)`(2): + kvlangDisplay kvlangFormatFloat +`kvlangKeytree`(20): + kvlangKeytreeEntryPc kvlangKeytreeFrameAt kvlangKeytreeFrameCallpc kvlangKeytreeFrameNum kvlangKeytreeFrameReturnpc kvlangKeytreeFrameRo + kvlangKeytreeFrameRoot kvlangKeytreeIrseqPc kvlangKeytreeIsEntryPc kvlangKeytreeLibFunc kvlangKeytreeMember kvlangKeytreeRwir + kvlangKeytreeStack kvlangKeytreeVthread kvlangKeytreeVthreadDebugger kvlangKeytreeVthreadPc kvlangKeytreeVthreadSlot kvlangKeytreeVthreadStatus + kvlangKeytreeVthreadStatusMsg kvlangKeytreeVtidFromPc +`kvlangKv`(19): + kvlangKvConnect kvlangKvCp kvlangKvCpList kvlangKvCpTree kvlangKvDel kvlangKvDelExtIndex + kvlangKvDelTree kvlangKvDisconnect kvlangKvExtIndex kvlangKvGetHead kvlangKvGetMember kvlangKvGetOne + kvlangKvGetPart kvlangKvList kvlangKvMkindex kvlangKvReadReset kvlangKvSet kvlangKvSetPart + kvlangKvWatch +`kvlangKvcpu`(4): + kvlangKvcpuBootstrap kvlangKvcpuDynCall kvlangKvcpuExecute kvlangKvcpuExecuteMode +`kvlangLangType`(2): + kvlangLangTypeId kvlangLangTypeKind +`kvlangLangtype`(4): + kvlangLangtypeMatch kvlangLangtypeParse kvlangLangtypeValid kvlangLangtypeVariadic +`kvlangLog`(3): + kvlangLogDebug kvlangLogError kvlangLogInfo +`kvlangRuntime`(9): + kvlangRuntimeBootstrap kvlangRuntimeConnect kvlangRuntimeDisconnect kvlangRuntimeExecute kvlangRuntimeExecuteKv kvlangRuntimeExecutePc + kvlangRuntimeExecuteVthread kvlangRuntimeKvspaceHandle kvlangRuntimeRunVid +`kvlangRwir`(4): + kvlangRwirDecode kvlangRwirExtractAddr0 kvlangRwirInstFree kvlangRwirNextPc +`kvlangScalar`(3): + kvlangScalarReadF64 kvlangScalarReadI64 kvlangScalarReadU64 +`kvlangStrbuf`(4): + kvlangStrbufDetach kvlangStrbufPrintf kvlangStrbufPutc kvlangStrbufPutn +`kvlangVthread`(5): + kvlangVthreadGet kvlangVthreadSet kvlangVthreadSetDone kvlangVthreadSetError kvlangVthreadSpawn +`kvlangXvalue`(30): + kvlangXvalueArrayLen kvlangXvalueBody kvlangXvalueChar32At kvlangXvalueElemSize kvlangXvalueFree kvlangXvalueHead + kvlangXvalueIsCharKind kvlangXvalueIsFloatKind kvlangXvalueIsIntKind kvlangXvalueIsNumKind kvlangXvalueIsPtr kvlangXvalueIsUintKind + kvlangXvalueKind kvlangXvalueKindIs kvlangXvalueLangTypeId kvlangXvalueMaterialize kvlangXvalueNewBool kvlangXvalueNewCharKind + kvlangXvalueNewCharUtf32 kvlangXvalueNewCharUtf8 kvlangXvalueNewFloat64 kvlangXvalueNewInt64 kvlangXvalueNewPtr kvlangXvalueNewRwir + kvlangXvalueNewTlv kvlangXvalueNewTlvDims kvlangXvaluePtrTarget kvlangXvalueScalar kvlangXvalueSetBytes kvlangXvalueValueString +`kvlang_`(7): + kvlang_rwirextHandoff kvlang_rwirextNextPc kvlang_rwirextParams kvlang_rwirextRegister kvlang_rwirextResolveRead kvlang_rwirextResolveReadPath + kvlang_rwirextResolveWrite +`notinmy`(2): + notinmycaps notinmyrwircaps +``` "#### -> /lib/kvlang/spec/runtime语义/cruntime与后端abi } From 69f64123ab8d335701d23c78aaaf4e45e2d6d2d8 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Wed, 9 Sep 2026 09:56:09 +0800 Subject: [PATCH 2/5] =?UTF-8?q?spec(ABI):=20=E5=AF=BC=E5=87=BA=E7=AC=A6?= =?UTF-8?q?=E5=8F=B7=E5=85=A8=E9=9B=86=E6=94=B9=E6=AF=8F=E7=AC=A6=E5=8F=B7?= =?UTF-8?q?=E4=B8=80=E8=A1=8C=EF=BC=88=E5=8F=AF=E8=AF=BB/=E5=8F=AF=20diff?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit nm -D 导出的符号表逐行排列(runtime 按族分节),vet 过。 --- .../04-CABI.kv" | 41 ++- ...344\270\216\345\220\216\347\253\257abi.kv" | 325 ++++++++++++++---- 2 files changed, 295 insertions(+), 71 deletions(-) diff --git "a/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" "b/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" index 44900c4f..84c76ac8 100644 --- "a/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" +++ "b/stdlib/kvlang/spec/02-kvspace\346\250\241\345\236\213/04-CABI.kv" @@ -24,15 +24,40 @@ lib kvlang/spec/kvspace模型/CABI { 无句柄的编解码符号(前端静态实现,byte-identical):`kvspaceTlvEncode` / `kvspaceTlvEncodeMode` / `kvspaceDecodeHead`,以及构造器 `kvspaceNewPtr`(存目标完整 langtype + 目标 key)、`kvspaceNewChar` / `kvspaceNewBool` / `kvspaceNewInt64` / `kvspaceNewFloat64`。 读写各带 `resolve` 参数:`resolve=1` 时透明穿透 ref=1 指针(link);`kvspaceListLen`/`kvspaceListAt` 另有 `expand_ext` 参数控制是否展开 extindex 子项。head 线格式与 langtype 编码见 [[键系统与数组访问]]。 - -## 导出符号全集(nm -D 实测,31) +## kvspace C ABI 导出符号全集(nm -D 实测,31) ``` - kvspaceClear kvspaceClose kvspaceConnect kvspaceConst kvspaceCp kvspaceCpList - kvspaceCpTree kvspaceDecodeHead kvspaceDel kvspaceDelTree kvspaceDisconnect kvspaceGet - kvspaceGetHead kvspaceGetPart kvspaceListAt kvspaceListLen kvspaceMkindex kvspaceMkindexExt - kvspaceNewBool kvspaceNewChar kvspaceNewFloat64 kvspaceNewInt64 kvspaceNewPtr kvspaceReadReset - kvspaceRmindexExt kvspaceSetPart kvspaceTlvEncode kvspaceTlvEncodeMode kvspaceWatch kvspaceWriteInPlace + kvspaceClear + kvspaceClose + kvspaceConnect + kvspaceConst + kvspaceCp + kvspaceCpList + kvspaceCpTree + kvspaceDecodeHead + kvspaceDel + kvspaceDelTree + kvspaceDisconnect + kvspaceGet + kvspaceGetHead + kvspaceGetPart + kvspaceListAt + kvspaceListLen + kvspaceMkindex + kvspaceMkindexExt + kvspaceNewBool + kvspaceNewChar + kvspaceNewFloat64 + kvspaceNewInt64 + kvspaceNewPtr + kvspaceReadReset + kvspaceRmindexExt + kvspaceSetPart + kvspaceTlvEncode + kvspaceTlvEncodeMode + kvspaceWatch + kvspaceWriteInPlace kvspaceWriteNewPlace -``` "#### -> /lib/kvlang/spec/kvspace模型/CABI +``` + "#### -> /lib/kvlang/spec/kvspace模型/CABI } 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 ab8996db..bf11503d 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" @@ -54,75 +54,274 @@ kvspaceNewPtr / NewChar / NewBool / NewInt64 / NewFloat64 **native 读参:标量按值、整块借用**(normative,P2-d)——runtime-c native 算子(标量数值/逻辑/cast + `xv·*`/`array·*`/`string·*`)经 `ResolveReadValue` 取参,两条路径互斥:内联字面量(冻结于 code 槽)按值拷入(标量,纳秒级,无 KV 往返);变量/KV 常驻值经 `GetMember` 一次取出后**移交所有权**(`*out = pv`,非二次拷贝,后端物化只发生在 `Get` 内部)。**整块字节零拷贝不在 native 侧另设机制**——它就是 [[notinmyrwircaps]] 的 `ResolveReadPath` + `kvspaceGet` body 指针那一条路径,由持有大 tensor 的扩展(numpy/op-gpu)承担;native 算子处理的是标量与中等 value,其拷贝相对每步 KV 往返可忽略(fib n=10:redis 1.5s / fs 320ms vs C 586ns,墙钟由 KV I/O 主导约六个数量级),故不为其增设借用管线。 **后端由链接决定**:构建期经环境变量选择链接哪个 kvspace 库(`kvspace-c` 或 `kvspace_durable`),两者导出同一 ABI;runtime 的句柄结构只保留 `void *h`,代码零后端分支。 - -## 导出符号全集(nm -D 实测,6) +## layout cdylib(libkvlanglayout)导出符号全集(nm -D 实测,6) ``` - kvlangKindexprParse kvlangLayoutCode kvlangLayoutDump kvlangLayoutFile kvlangLayoutFormat kvlangLayoutVet + kvlangKindexprParse + kvlangLayoutCode + kvlangLayoutDump + kvlangLayoutFile + kvlangLayoutFormat + kvlangLayoutVet ``` -## 导出符号全集(nm -D 实测,203) +## runtime C(libkvlang_runtime)导出符号全集(nm -D 实测,203) +### handoff_(1) ``` -`handoff_`(1): handoff_external_rwir -`kvlangBuiltin`(80): - kvlangBuiltinAppend kvlangBuiltinArray kvlangBuiltinArrayFill kvlangBuiltinCapIndex kvlangBuiltinCharConcat kvlangBuiltinCompact - kvlangBuiltinDebugger kvlangBuiltinDurArith kvlangBuiltinDurCmp kvlangBuiltinDurFrom kvlangBuiltinDurTo kvlangBuiltinExecuteCopy - kvlangBuiltinFreeInputs kvlangBuiltinKvAbs kvlangBuiltinKvCp kvlangBuiltinKvCpList kvlangBuiltinKvCpTree kvlangBuiltinKvDel - kvlangBuiltinKvDelTree kvlangBuiltinKvExtIndex kvlangBuiltinKvGet kvlangBuiltinKvList kvlangBuiltinKvListLen kvlangBuiltinKvListN - kvlangBuiltinKvMkindex kvlangBuiltinKvRmIndexExt kvlangBuiltinKvSet kvlangBuiltinKvWatch kvlangBuiltinMap kvlangBuiltinMapMarker - kvlangBuiltinMemindex kvlangBuiltinNative kvlangBuiltinNdarrayDim kvlangBuiltinNdarrayNumel kvlangBuiltinNdarrayShape kvlangBuiltinNextPc - kvlangBuiltinNumOp kvlangBuiltinObj kvlangBuiltinRandInt63 kvlangBuiltinRandIntn kvlangBuiltinRandUint64 kvlangBuiltinReadInputs - kvlangBuiltinResolveReadKey kvlangBuiltinResolveReadValue kvlangBuiltinResolveWriteSlot kvlangBuiltinScatter kvlangBuiltinScatterKey kvlangBuiltinSetErr - kvlangBuiltinSlice kvlangBuiltinStringChar kvlangBuiltinStringCmp kvlangBuiltinStringConcat kvlangBuiltinStringFind kvlangBuiltinStringFormatInt - kvlangBuiltinStringFormatUint kvlangBuiltinStringLen kvlangBuiltinStringOrd kvlangBuiltinStringParseInt kvlangBuiltinStringParseUint kvlangBuiltinStringSet - kvlangBuiltinStringSlice kvlangBuiltinStructNew kvlangBuiltinTimeAdd kvlangBuiltinTimeCmp kvlangBuiltinTimeNow kvlangBuiltinTimeSub - kvlangBuiltinTryParseNumber kvlangBuiltinVthreadCall kvlangBuiltinVthreadCreate kvlangBuiltinVthreadRun kvlangBuiltinVthreadSetstatus kvlangBuiltinVthreadSleep - kvlangBuiltinWriteResult kvlangBuiltinXvAt kvlangBuiltinXvBodylen kvlangBuiltinXvLangtype kvlangBuiltinXvReinterpret kvlangBuiltinXvReshape - kvlangBuiltinXvSet kvlangBuiltinXvalueAt -`kvlangCtl`(4): - kvlangCtlBr kvlangCtlCall kvlangCtlGoto kvlangCtlReturn -`(其它)`(2): - kvlangDisplay kvlangFormatFloat -`kvlangKeytree`(20): - kvlangKeytreeEntryPc kvlangKeytreeFrameAt kvlangKeytreeFrameCallpc kvlangKeytreeFrameNum kvlangKeytreeFrameReturnpc kvlangKeytreeFrameRo - kvlangKeytreeFrameRoot kvlangKeytreeIrseqPc kvlangKeytreeIsEntryPc kvlangKeytreeLibFunc kvlangKeytreeMember kvlangKeytreeRwir - kvlangKeytreeStack kvlangKeytreeVthread kvlangKeytreeVthreadDebugger kvlangKeytreeVthreadPc kvlangKeytreeVthreadSlot kvlangKeytreeVthreadStatus - kvlangKeytreeVthreadStatusMsg kvlangKeytreeVtidFromPc -`kvlangKv`(19): - kvlangKvConnect kvlangKvCp kvlangKvCpList kvlangKvCpTree kvlangKvDel kvlangKvDelExtIndex - kvlangKvDelTree kvlangKvDisconnect kvlangKvExtIndex kvlangKvGetHead kvlangKvGetMember kvlangKvGetOne - kvlangKvGetPart kvlangKvList kvlangKvMkindex kvlangKvReadReset kvlangKvSet kvlangKvSetPart +``` +### kvlangBuiltin(80) +``` + kvlangBuiltinAppend + kvlangBuiltinArray + kvlangBuiltinArrayFill + kvlangBuiltinCapIndex + kvlangBuiltinCharConcat + kvlangBuiltinCompact + kvlangBuiltinDebugger + kvlangBuiltinDurArith + kvlangBuiltinDurCmp + kvlangBuiltinDurFrom + kvlangBuiltinDurTo + kvlangBuiltinExecuteCopy + kvlangBuiltinFreeInputs + kvlangBuiltinKvAbs + kvlangBuiltinKvCp + kvlangBuiltinKvCpList + kvlangBuiltinKvCpTree + kvlangBuiltinKvDel + kvlangBuiltinKvDelTree + kvlangBuiltinKvExtIndex + kvlangBuiltinKvGet + kvlangBuiltinKvList + kvlangBuiltinKvListLen + kvlangBuiltinKvListN + kvlangBuiltinKvMkindex + kvlangBuiltinKvRmIndexExt + kvlangBuiltinKvSet + kvlangBuiltinKvWatch + kvlangBuiltinMap + kvlangBuiltinMapMarker + kvlangBuiltinMemindex + kvlangBuiltinNative + kvlangBuiltinNdarrayDim + kvlangBuiltinNdarrayNumel + kvlangBuiltinNdarrayShape + kvlangBuiltinNextPc + kvlangBuiltinNumOp + kvlangBuiltinObj + kvlangBuiltinRandInt63 + kvlangBuiltinRandIntn + kvlangBuiltinRandUint64 + kvlangBuiltinReadInputs + kvlangBuiltinResolveReadKey + kvlangBuiltinResolveReadValue + kvlangBuiltinResolveWriteSlot + kvlangBuiltinScatter + kvlangBuiltinScatterKey + kvlangBuiltinSetErr + kvlangBuiltinSlice + kvlangBuiltinStringChar + kvlangBuiltinStringCmp + kvlangBuiltinStringConcat + kvlangBuiltinStringFind + kvlangBuiltinStringFormatInt + kvlangBuiltinStringFormatUint + kvlangBuiltinStringLen + kvlangBuiltinStringOrd + kvlangBuiltinStringParseInt + kvlangBuiltinStringParseUint + kvlangBuiltinStringSet + kvlangBuiltinStringSlice + kvlangBuiltinStructNew + kvlangBuiltinTimeAdd + kvlangBuiltinTimeCmp + kvlangBuiltinTimeNow + kvlangBuiltinTimeSub + kvlangBuiltinTryParseNumber + kvlangBuiltinVthreadCall + kvlangBuiltinVthreadCreate + kvlangBuiltinVthreadRun + kvlangBuiltinVthreadSetstatus + kvlangBuiltinVthreadSleep + kvlangBuiltinWriteResult + kvlangBuiltinXvAt + kvlangBuiltinXvBodylen + kvlangBuiltinXvLangtype + kvlangBuiltinXvReinterpret + kvlangBuiltinXvReshape + kvlangBuiltinXvSet + kvlangBuiltinXvalueAt +``` +### kvlangCtl(4) +``` + kvlangCtlBr + kvlangCtlCall + kvlangCtlGoto + kvlangCtlReturn +``` +### (其它)(2) +``` + kvlangDisplay + kvlangFormatFloat +``` +### kvlangKeytree(20) +``` + kvlangKeytreeEntryPc + kvlangKeytreeFrameAt + kvlangKeytreeFrameCallpc + kvlangKeytreeFrameNum + kvlangKeytreeFrameReturnpc + kvlangKeytreeFrameRo + kvlangKeytreeFrameRoot + kvlangKeytreeIrseqPc + kvlangKeytreeIsEntryPc + kvlangKeytreeLibFunc + kvlangKeytreeMember + kvlangKeytreeRwir + kvlangKeytreeStack + kvlangKeytreeVthread + kvlangKeytreeVthreadDebugger + kvlangKeytreeVthreadPc + kvlangKeytreeVthreadSlot + kvlangKeytreeVthreadStatus + kvlangKeytreeVthreadStatusMsg + kvlangKeytreeVtidFromPc +``` +### kvlangKv(19) +``` + kvlangKvConnect + kvlangKvCp + kvlangKvCpList + kvlangKvCpTree + kvlangKvDel + kvlangKvDelExtIndex + kvlangKvDelTree + kvlangKvDisconnect + kvlangKvExtIndex + kvlangKvGetHead + kvlangKvGetMember + kvlangKvGetOne + kvlangKvGetPart + kvlangKvList + kvlangKvMkindex + kvlangKvReadReset + kvlangKvSet + kvlangKvSetPart kvlangKvWatch -`kvlangKvcpu`(4): - kvlangKvcpuBootstrap kvlangKvcpuDynCall kvlangKvcpuExecute kvlangKvcpuExecuteMode -`kvlangLangType`(2): - kvlangLangTypeId kvlangLangTypeKind -`kvlangLangtype`(4): - kvlangLangtypeMatch kvlangLangtypeParse kvlangLangtypeValid kvlangLangtypeVariadic -`kvlangLog`(3): - kvlangLogDebug kvlangLogError kvlangLogInfo -`kvlangRuntime`(9): - kvlangRuntimeBootstrap kvlangRuntimeConnect kvlangRuntimeDisconnect kvlangRuntimeExecute kvlangRuntimeExecuteKv kvlangRuntimeExecutePc - kvlangRuntimeExecuteVthread kvlangRuntimeKvspaceHandle kvlangRuntimeRunVid -`kvlangRwir`(4): - kvlangRwirDecode kvlangRwirExtractAddr0 kvlangRwirInstFree kvlangRwirNextPc -`kvlangScalar`(3): - kvlangScalarReadF64 kvlangScalarReadI64 kvlangScalarReadU64 -`kvlangStrbuf`(4): - kvlangStrbufDetach kvlangStrbufPrintf kvlangStrbufPutc kvlangStrbufPutn -`kvlangVthread`(5): - kvlangVthreadGet kvlangVthreadSet kvlangVthreadSetDone kvlangVthreadSetError kvlangVthreadSpawn -`kvlangXvalue`(30): - kvlangXvalueArrayLen kvlangXvalueBody kvlangXvalueChar32At kvlangXvalueElemSize kvlangXvalueFree kvlangXvalueHead - kvlangXvalueIsCharKind kvlangXvalueIsFloatKind kvlangXvalueIsIntKind kvlangXvalueIsNumKind kvlangXvalueIsPtr kvlangXvalueIsUintKind - kvlangXvalueKind kvlangXvalueKindIs kvlangXvalueLangTypeId kvlangXvalueMaterialize kvlangXvalueNewBool kvlangXvalueNewCharKind - kvlangXvalueNewCharUtf32 kvlangXvalueNewCharUtf8 kvlangXvalueNewFloat64 kvlangXvalueNewInt64 kvlangXvalueNewPtr kvlangXvalueNewRwir - kvlangXvalueNewTlv kvlangXvalueNewTlvDims kvlangXvaluePtrTarget kvlangXvalueScalar kvlangXvalueSetBytes kvlangXvalueValueString -`kvlang_`(7): - kvlang_rwirextHandoff kvlang_rwirextNextPc kvlang_rwirextParams kvlang_rwirextRegister kvlang_rwirextResolveRead kvlang_rwirextResolveReadPath +``` +### kvlangKvcpu(4) +``` + kvlangKvcpuBootstrap + kvlangKvcpuDynCall + kvlangKvcpuExecute + kvlangKvcpuExecuteMode +``` +### kvlangLangType(2) +``` + kvlangLangTypeId + kvlangLangTypeKind +``` +### kvlangLangtype(4) +``` + kvlangLangtypeMatch + kvlangLangtypeParse + kvlangLangtypeValid + kvlangLangtypeVariadic +``` +### kvlangLog(3) +``` + kvlangLogDebug + kvlangLogError + kvlangLogInfo +``` +### kvlangRuntime(9) +``` + kvlangRuntimeBootstrap + kvlangRuntimeConnect + kvlangRuntimeDisconnect + kvlangRuntimeExecute + kvlangRuntimeExecuteKv + kvlangRuntimeExecutePc + kvlangRuntimeExecuteVthread + kvlangRuntimeKvspaceHandle + kvlangRuntimeRunVid +``` +### kvlangRwir(4) +``` + kvlangRwirDecode + kvlangRwirExtractAddr0 + kvlangRwirInstFree + kvlangRwirNextPc +``` +### kvlangScalar(3) +``` + kvlangScalarReadF64 + kvlangScalarReadI64 + kvlangScalarReadU64 +``` +### kvlangStrbuf(4) +``` + kvlangStrbufDetach + kvlangStrbufPrintf + kvlangStrbufPutc + kvlangStrbufPutn +``` +### kvlangVthread(5) +``` + kvlangVthreadGet + kvlangVthreadSet + kvlangVthreadSetDone + kvlangVthreadSetError + kvlangVthreadSpawn +``` +### kvlangXvalue(30) +``` + kvlangXvalueArrayLen + kvlangXvalueBody + kvlangXvalueChar32At + kvlangXvalueElemSize + kvlangXvalueFree + kvlangXvalueHead + kvlangXvalueIsCharKind + kvlangXvalueIsFloatKind + kvlangXvalueIsIntKind + kvlangXvalueIsNumKind + kvlangXvalueIsPtr + kvlangXvalueIsUintKind + kvlangXvalueKind + kvlangXvalueKindIs + kvlangXvalueLangTypeId + kvlangXvalueMaterialize + kvlangXvalueNewBool + kvlangXvalueNewCharKind + kvlangXvalueNewCharUtf32 + kvlangXvalueNewCharUtf8 + kvlangXvalueNewFloat64 + kvlangXvalueNewInt64 + kvlangXvalueNewPtr + kvlangXvalueNewRwir + kvlangXvalueNewTlv + kvlangXvalueNewTlvDims + kvlangXvaluePtrTarget + kvlangXvalueScalar + kvlangXvalueSetBytes + kvlangXvalueValueString +``` +### kvlang_(7) +``` + kvlang_rwirextHandoff + kvlang_rwirextNextPc + kvlang_rwirextParams + kvlang_rwirextRegister + kvlang_rwirextResolveRead + kvlang_rwirextResolveReadPath kvlang_rwirextResolveWrite -`notinmy`(2): - notinmycaps notinmyrwircaps -``` "#### -> /lib/kvlang/spec/runtime语义/cruntime与后端abi +``` +### notinmy(2) +``` + notinmycaps + notinmyrwircaps +``` + "#### -> /lib/kvlang/spec/runtime语义/cruntime与后端abi } From 2feb4b6f6bbc4685e423fbc9020ca19c2f3f86ee Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Wed, 9 Sep 2026 09:57:51 +0800 Subject: [PATCH 3/5] =?UTF-8?q?spec(ABI):=20layout=20=E5=AF=BC=E5=87=BA?= =?UTF-8?q?=E5=85=A8=E9=9B=86=E7=A7=BB=E5=85=A5=2004-layout=20=E5=8D=B7?= =?UTF-8?q?=EF=BC=8808-layout=E6=B5=81=E6=B0=B4=E7=BA=BF=E6=8E=A5=E5=8F=A3?= =?UTF-8?q?=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit layout cdylib 6 符号全集从 09-cruntime与后端abi 移到 08-layout流水线接口(ABI 归属 layout 卷);09 仅留 runtime C 导出全集。 --- ...46\260\264\347\272\277\346\216\245\345\217\243.kv" | 11 +++++++++++ ...runtime\344\270\216\345\220\216\347\253\257abi.kv" | 10 ---------- 2 files changed, 11 insertions(+), 10 deletions(-) diff --git "a/stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" "b/stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" index 5071b2c7..6432b58d 100644 --- "a/stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" +++ "b/stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" @@ -24,5 +24,16 @@ layout 能力经 cdylib 导出,第三方无需 fork 子进程即可布局( ## KVLANG_LIB 引导与 init 入口 `KVLANG_LIB` 引导 layout 与 run 各 lib 的 init。pkg **严格取自 `lib` 声明**(`lib X { … }` → `X`),不从文件名推导。layout 产出的 init 入口名列表即消费方驱动 init 的依据;tutorial 按约定跑 `test` 入口。 + +## 导出符号全集(nm -D 实测,6) + +``` + kvlangKindexprParse + kvlangLayoutCode + kvlangLayoutDump + kvlangLayoutFile + kvlangLayoutFormat + kvlangLayoutVet +``` "#### -> /lib/kvlang/spec/layout语义/layout流水线接口 } 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 bf11503d..0bcc25cb 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" @@ -54,16 +54,6 @@ kvspaceNewPtr / NewChar / NewBool / NewInt64 / NewFloat64 **native 读参:标量按值、整块借用**(normative,P2-d)——runtime-c native 算子(标量数值/逻辑/cast + `xv·*`/`array·*`/`string·*`)经 `ResolveReadValue` 取参,两条路径互斥:内联字面量(冻结于 code 槽)按值拷入(标量,纳秒级,无 KV 往返);变量/KV 常驻值经 `GetMember` 一次取出后**移交所有权**(`*out = pv`,非二次拷贝,后端物化只发生在 `Get` 内部)。**整块字节零拷贝不在 native 侧另设机制**——它就是 [[notinmyrwircaps]] 的 `ResolveReadPath` + `kvspaceGet` body 指针那一条路径,由持有大 tensor 的扩展(numpy/op-gpu)承担;native 算子处理的是标量与中等 value,其拷贝相对每步 KV 往返可忽略(fib n=10:redis 1.5s / fs 320ms vs C 586ns,墙钟由 KV I/O 主导约六个数量级),故不为其增设借用管线。 **后端由链接决定**:构建期经环境变量选择链接哪个 kvspace 库(`kvspace-c` 或 `kvspace_durable`),两者导出同一 ABI;runtime 的句柄结构只保留 `void *h`,代码零后端分支。 -## layout cdylib(libkvlanglayout)导出符号全集(nm -D 实测,6) - -``` - kvlangKindexprParse - kvlangLayoutCode - kvlangLayoutDump - kvlangLayoutFile - kvlangLayoutFormat - kvlangLayoutVet -``` ## runtime C(libkvlang_runtime)导出符号全集(nm -D 实测,203) ### handoff_(1) From c34146adba3d1f2dbed6a23b74c3527fc64e7295 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Wed, 9 Sep 2026 09:58:19 +0800 Subject: [PATCH 4/5] =?UTF-8?q?spec:=2008-layout=E6=B5=81=E6=B0=B4?= =?UTF-8?q?=E7=BA=BF=E6=8E=A5=E5=8F=A3=20=E2=86=92=2008-layout-abi?= =?UTF-8?q?=EF=BC=88=E6=94=B9=E5=90=8D=EF=BC=8C=E5=86=85=E5=AE=B9=E4=B8=BA?= =?UTF-8?q?=20layout=20ABI=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../spec/04-layout\350\257\255\344\271\211/08-layout-abi.kv" | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename "stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" => "stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout-abi.kv" (100%) diff --git "a/stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" "b/stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout-abi.kv" similarity index 100% rename from "stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout\346\265\201\346\260\264\347\272\277\346\216\245\345\217\243.kv" rename to "stdlib/kvlang/spec/04-layout\350\257\255\344\271\211/08-layout-abi.kv" From cd2c8ef8558fb81713367ebcacc1c221b996bbc7 Mon Sep 17 00:00:00 2001 From: "peng.li24" <734991033@qq.com> Date: Wed, 9 Sep 2026 10:54:59 +0800 Subject: [PATCH 5/5] =?UTF-8?q?runtime:=20rwirext=20ABI=20snake=5Fcase=20?= =?UTF-8?q?=E2=86=92=20camelCase=EF=BC=88kvlangRwirext*=EF=BC=89+=2006-?= =?UTF-8?q?=E7=BC=96=E8=AF=91=E5=99=A8=E8=AF=AD=E4=B9=89=E5=8D=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - rwirext.c/h:kvlang_rwirext{Register,Handoff,NextPc,Params,ResolveRead, ResolveReadPath,ResolveWrite} → kvlangRwirext*(camelCase,nm 实测 7 符号无 snake 残留)。 - 消费方同步:runtime-rs rwir、go json、py numpy。 - spec:00-导言、09-cruntime ABI 导出表更新(每符号一行);新增 06-编译器语义卷 (01 编译器定位 / 02 前端算子与后端算子 / 03 算子版本化)。 --- runtime-rs/src/engine.rs | 12 ++--- runtime-rs/src/ffi.rs | 14 +++--- runtime-rs/src/main.rs | 6 +-- runtime-rs/src/rwir/http.rs | 2 +- runtime-rs/src/rwir/json.rs | 2 +- runtime-rs/src/rwir/mod.rs | 2 +- runtime-rs/src/rwir/networld/proc.rs | 2 +- runtime-rs/src/rwir/term.rs | 2 +- runtime-rwirext_example/go/json/json.go | 12 ++--- runtime-rwirext_example/py/numpy/numpy.py | 40 ++++++++-------- runtime/include/kvlang_rwirext.h | 14 +++--- runtime/src/rwirext.c | 14 +++--- ...16\344\270\200\350\207\264\346\200\247.kv" | 1 + ...344\270\216\345\220\216\347\253\257abi.kv" | 14 +++--- ...21\345\231\250\345\256\232\344\275\215.kv" | 36 ++++++++++++++ ...16\347\253\257\347\256\227\345\255\220.kv" | 47 +++++++++++++++++++ ...10\346\234\254\344\274\230\345\205\210.kv" | 39 +++++++++++++++ 17 files changed, 191 insertions(+), 68 deletions(-) create mode 100644 "stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/01-\347\274\226\350\257\221\345\231\250\345\256\232\344\275\215.kv" create mode 100644 "stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/02-\345\211\215\347\253\257\347\256\227\345\255\220\344\270\216\345\220\216\347\253\257\347\256\227\345\255\220.kv" create mode 100644 "stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/03-\347\256\227\345\255\220\347\211\210\346\234\254\345\214\226\344\270\216\351\253\230\347\211\210\346\234\254\344\274\230\345\205\210.kv" diff --git a/runtime-rs/src/engine.rs b/runtime-rs/src/engine.rs index c1853987..f2a02bc2 100644 --- a/runtime-rs/src/engine.rs +++ b/runtime-rs/src/engine.rs @@ -193,20 +193,20 @@ impl Engine { // ── rwir 派发时按下标解析读/写槽(rwirext 宿主 ABI,传 kvspace 句柄)─ /// @-aware 读参:@ 句柄按 body 前缀路由兑现真实字节,其余(字面量/普通值/指针)沿用 C ResolveRead。 pub fn read_at(&self, pc: &str, idx: i32) -> String { - let p = take(unsafe { kvlang_rwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) }); + let p = take(unsafe { kvlangRwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) }); if !p.is_empty() { let (r, body) = self.head_ref_body(&p); if r == 2 { return self.resolve_ext(&body); } } - take(unsafe { kvlang_rwirextResolveRead(self.kv, cs(pc).as_ptr(), idx) }) + take(unsafe { kvlangRwirextResolveRead(self.kv, cs(pc).as_ptr(), idx) }) } pub fn read0(&self, pc: &str) -> String { self.read_at(pc, 0) } pub fn write_at(&self, pc: &str, idx: i32) -> String { - take(unsafe { kvlang_rwirextResolveWrite(self.kv, cs(pc).as_ptr(), idx) }) + take(unsafe { kvlangRwirextResolveWrite(self.kv, cs(pc).as_ptr(), idx) }) } pub fn write0(&self, pc: &str) -> String { self.write_at(pc, 0) @@ -215,7 +215,7 @@ impl Engine { /// 取读参 idx 容器路径 → 读 body 字节;@ 句柄按前缀兑现真实字节;无路径退化为 read_at 的 utf8。 /// 供 fs·write/append 等需要 []uint8 整块的 rwir 用。 pub fn read_bytes(&self, pc: &str, idx: i32) -> Vec { - let p = take(unsafe { kvlang_rwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) }); + let p = take(unsafe { kvlangRwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) }); if p.is_empty() { return self.read_at(pc, idx).into_bytes(); } @@ -447,7 +447,7 @@ impl Engine { break; } let c = take(pc); - let params = take(unsafe { kvlang_rwirextParams(self.kv, cs(&c).as_ptr()) }); + let params = take(unsafe { kvlangRwirextParams(self.kv, cs(&c).as_ptr()) }); let op = params.lines().next().unwrap_or("").to_string(); let handled = if rwir::is_inproc(&op) { rwir::dispatch(self, &op, &c); @@ -460,7 +460,7 @@ impl Engine { if !handled { crate::elog!("未知 rwir: {op} @ {c}"); } - let nxt = take(unsafe { kvlang_rwirextNextPc(cs(&c).as_ptr()) }); + let nxt = take(unsafe { kvlangRwirextNextPc(cs(&c).as_ptr()) }); // pc 可能属子 vthread(native vthread·run 冒泡上来):nextpc 写回其所属 vid,不写主 vid。 let sub = c.split('/').nth(2).unwrap_or(vid); self.set_kv(&format!("/vthread/{sub}/\u{2025}pc"), &nxt); diff --git a/runtime-rs/src/ffi.rs b/runtime-rs/src/ffi.rs index 04b1ec9b..e049aaab 100644 --- a/runtime-rs/src/ffi.rs +++ b/runtime-rs/src/ffi.rs @@ -167,32 +167,32 @@ unsafe extern "C" { // ── kvlang runtime:rwirext 宿主 ABI(均传 kvspace 句柄)───────── // C 头 kvlang_rwirext.h 导出 9 符号;此处声明 7:故意省略 LangtypeValid/LangtypeMatch // ——langtype 校验属 layout 期、匹配属 C dispatch 内部,Rust term 侧不调用(非缺陷)。 - pub fn kvlang_rwirextRegister( + pub fn kvlangRwirextRegister( kvspace: *mut c_void, opcode: *const c_char, nr: c_int, nw: c_int, sig: *const c_char, ) -> c_int; - pub fn kvlang_rwirextParams(kvspace: *mut c_void, pc: *const c_char) -> *mut c_char; - pub fn kvlang_rwirextResolveRead( + pub fn kvlangRwirextParams(kvspace: *mut c_void, pc: *const c_char) -> *mut c_char; + pub fn kvlangRwirextResolveRead( kvspace: *mut c_void, pc: *const c_char, idx: c_int, ) -> *mut c_char; - pub fn kvlang_rwirextResolveReadPath( + pub fn kvlangRwirextResolveReadPath( kvspace: *mut c_void, pc: *const c_char, idx: c_int, ) -> *mut c_char; - pub fn kvlang_rwirextResolveWrite( + pub fn kvlangRwirextResolveWrite( kvspace: *mut c_void, pc: *const c_char, idx: c_int, ) -> *mut c_char; - pub fn kvlang_rwirextNextPc(pc: *const c_char) -> *mut c_char; + pub fn kvlangRwirextNextPc(pc: *const c_char) -> *mut c_char; // Handoff:非己方处理的外部 rwir(如 numpy)移交给对应扩展进程。 - pub fn kvlang_rwirextHandoff( + pub fn kvlangRwirextHandoff( kvspace: *mut c_void, vtid: *const c_char, pc: *const c_char, diff --git a/runtime-rs/src/main.rs b/runtime-rs/src/main.rs index 98a75e09..ac5d3e6a 100644 --- a/runtime-rs/src/main.rs +++ b/runtime-rs/src/main.rs @@ -308,20 +308,20 @@ fn drive_vid(eng: &Engine, vid: &str) { // 连续批处理就地 rwir(print/json/http/kvlayout/input),遇非就地指令停下。 let mut c = take(pc); let stop_op = loop { - let params = take(unsafe { kvlang_rwirextParams(kv, cs(&c).as_ptr()) }); + let params = take(unsafe { kvlangRwirextParams(kv, cs(&c).as_ptr()) }); let op = params.split('\n').next().unwrap_or("").to_string(); if !rwir::is_inproc(&op) { break op; } rwir::dispatch(eng, &op, &c); - c = take(unsafe { kvlang_rwirextNextPc(cs(&c).as_ptr()) }); + c = take(unsafe { kvlangRwirextNextPc(cs(&c).as_ptr()) }); }; // pc 可能属子 vthread(native vthread·run 冒泡上来):目标 vid 一律由 pc 导出,非固定主 vid。 let sub = c.split('/').nth(2).unwrap_or(vid); // 停在本 myrwircaps 内的 op:handoff;native/控制帧/帧结束:写回 pc 让 runtime 继续。 if !stop_op.is_empty() && rwir::in_myrwircaps(&stop_op) { - if unsafe { kvlang_rwirextHandoff(kv, cs(sub).as_ptr(), cs(&c).as_ptr()) } != 0 { + if unsafe { kvlangRwirextHandoff(kv, cs(sub).as_ptr(), cs(&c).as_ptr()) } != 0 { kvlang_rs::elog!("handoff {stop_op} 失败 @ {c}"); std::process::exit(1); } diff --git a/runtime-rs/src/rwir/http.rs b/runtime-rs/src/rwir/http.rs index 34b15893..a7b5b69f 100644 --- a/runtime-rs/src/rwir/http.rs +++ b/runtime-rs/src/rwir/http.rs @@ -17,7 +17,7 @@ pub fn call(eng: &Engine, pc: &str) { } fn read(eng: &Engine, pc: &str, idx: i32) -> String { - take(unsafe { kvlang_rwirextResolveRead(eng.kv, cs(pc).as_ptr(), idx) }) + take(unsafe { kvlangRwirextResolveRead(eng.kv, cs(pc).as_ptr(), idx) }) } fn agent() -> ureq::Agent { diff --git a/runtime-rs/src/rwir/json.rs b/runtime-rs/src/rwir/json.rs index 50ae1fb4..8780ef17 100644 --- a/runtime-rs/src/rwir/json.rs +++ b/runtime-rs/src/rwir/json.rs @@ -45,7 +45,7 @@ pub fn from(eng: &Engine, pc: &str) { } fn params(eng: &Engine, pc: &str) -> Vec { - let s = take(unsafe { kvlang_rwirextParams(eng.kv, cs(pc).as_ptr()) }); + let s = take(unsafe { kvlangRwirextParams(eng.kv, cs(pc).as_ptr()) }); s.lines().map(str::to_string).collect() } diff --git a/runtime-rs/src/rwir/mod.rs b/runtime-rs/src/rwir/mod.rs index 59feafc2..d5a92c3a 100644 --- a/runtime-rs/src/rwir/mod.rs +++ b/runtime-rs/src/rwir/mod.rs @@ -188,7 +188,7 @@ pub fn register(eng: &Engine) { .collect::>() .join("\n"); unsafe { - kvlang_rwirextRegister( + kvlangRwirextRegister( eng.kv, cs(op).as_ptr(), r.rp.len() as i32, diff --git a/runtime-rs/src/rwir/networld/proc.rs b/runtime-rs/src/rwir/networld/proc.rs index 759e10c2..c25f164c 100644 --- a/runtime-rs/src/rwir/networld/proc.rs +++ b/runtime-rs/src/rwir/networld/proc.rs @@ -137,7 +137,7 @@ fn phys_dir_str(pid: &str) -> String { /// 取读参 idx 的容器 KV 路径(ResolveRead 对数组只返首元素,容器须用 ResolveReadPath)。 fn read_path(eng: &Engine, pc: &str, idx: i32) -> String { - take(unsafe { kvlang_rwirextResolveReadPath(eng.kv, cs(pc).as_ptr(), idx) }) + take(unsafe { kvlangRwirextResolveReadPath(eng.kv, cs(pc).as_ptr(), idx) }) } /// stringkeymap 容器路径 p → 按坐标段 ·[i] 数值升序取各成员字符串(get_kv 解 char/utf32)。 diff --git a/runtime-rs/src/rwir/term.rs b/runtime-rs/src/rwir/term.rs index 8709c9ba..99047e53 100644 --- a/runtime-rs/src/rwir/term.rs +++ b/runtime-rs/src/rwir/term.rs @@ -9,7 +9,7 @@ use crate::engine::Engine; use crate::ffi::*; pub fn print_line(eng: &Engine, pc: &str) { - let params = take(unsafe { kvlang_rwirextParams(eng.kv, cs(pc).as_ptr()) }); + let params = take(unsafe { kvlangRwirextParams(eng.kv, cs(pc).as_ptr()) }); let mut it = params.split('\n'); let opcode = it.next().unwrap_or(""); let (sep, rawnl, cerr) = match opcode { diff --git a/runtime-rwirext_example/go/json/json.go b/runtime-rwirext_example/go/json/json.go index e18a5a32..dc2eb2f1 100644 --- a/runtime-rwirext_example/go/json/json.go +++ b/runtime-rwirext_example/go/json/json.go @@ -167,31 +167,31 @@ func mkindex(c unsafe.Pointer, path string) { func resolveRead(c unsafe.Pointer, pc string, idx int) string { cp := cstr(pc) defer C.free(unsafe.Pointer(cp)) - return gostr(C.kvlang_rwirextResolveRead(c, cp, C.int(idx))) + return gostr(C.kvlangRwirextResolveRead(c, cp, C.int(idx))) } func resolveReadPath(c unsafe.Pointer, pc string, idx int) string { cp := cstr(pc) defer C.free(unsafe.Pointer(cp)) - return gostr(C.kvlang_rwirextResolveReadPath(c, cp, C.int(idx))) + return gostr(C.kvlangRwirextResolveReadPath(c, cp, C.int(idx))) } func resolveWrite(c unsafe.Pointer, pc string, idx int) string { cp := cstr(pc) defer C.free(unsafe.Pointer(cp)) - return gostr(C.kvlang_rwirextResolveWrite(c, cp, C.int(idx))) + return gostr(C.kvlangRwirextResolveWrite(c, cp, C.int(idx))) } func nextPC(pc string) string { cp := cstr(pc) defer C.free(unsafe.Pointer(cp)) - return gostr(C.kvlang_rwirextNextPc(cp)) + return gostr(C.kvlangRwirextNextPc(cp)) } func params(c unsafe.Pointer, pc string) []string { cp := cstr(pc) defer C.free(unsafe.Pointer(cp)) - return strings.Split(gostr(C.kvlang_rwirextParams(c, cp)), "\n") + return strings.Split(gostr(C.kvlangRwirextParams(c, cp)), "\n") } // ── XValue 编解码(走权威 kvspace ABI:DecodeHead 读头 + TlvEncode/NewChar 编码)── @@ -651,7 +651,7 @@ func register(c unsafe.Pointer) { sig := strings.TrimSuffix(strings.Repeat("any\n", o.nr+o.nw), "\n") co := cstr(o.name) cs := cstr(sig) - C.kvlang_rwirextRegister(c, co, C.int32_t(o.nr), C.int32_t(o.nw), cs) + C.kvlangRwirextRegister(c, co, C.int32_t(o.nr), C.int32_t(o.nw), cs) C.free(unsafe.Pointer(co)) C.free(unsafe.Pointer(cs)) } diff --git a/runtime-rwirext_example/py/numpy/numpy.py b/runtime-rwirext_example/py/numpy/numpy.py index f58a981f..09b1fe13 100644 --- a/runtime-rwirext_example/py/numpy/numpy.py +++ b/runtime-rwirext_example/py/numpy/numpy.py @@ -13,8 +13,8 @@ 算子(reshape/matmul/…)产出并按 [dims]dtype 存回 kvspace。 · tensor data 零拷贝:读走权威 kvspaceDecodeHead,在 kvspace-c SHM 地址上建 ndarray 视图; 写走权威 N 维 kvspaceTlvEncode,dims 直接落盘。 - · 遵照读写码:从 kvlang_rwirextParams 取 opcode 与读/写操作数名;读参优先按路径零拷贝 view, - 否则回退 kvlang_rwirextResolveRead;写参经 kvlang_rwirextResolveWrite 解析为 KV 路径。 + · 遵照读写码:从 kvlangRwirextParams 取 opcode 与读/写操作数名;读参优先按路径零拷贝 view, + 否则回退 kvlangRwirextResolveRead;写参经 kvlangRwirextResolveWrite 解析为 KV 路径。 · numpy.print 走本进程自身的 stdout(不经 kvlang println)。 """ @@ -90,16 +90,16 @@ def _bind(): ctypes.c_char_p, ctypes.c_uint32] _ks.kvspaceDel.restype = ctypes.c_int # rwirext ABI(kvspace 不提供的 runtime 语义):句柄传扩展自连的 kvspace - for fn in ("kvlang_rwirextParams", "kvlang_rwirextResolveRead", "kvlang_rwirextResolveReadPath", - "kvlang_rwirextResolveWrite", "kvlang_rwirextNextPc"): + for fn in ("kvlangRwirextParams", "kvlangRwirextResolveRead", "kvlangRwirextResolveReadPath", + "kvlangRwirextResolveWrite", "kvlangRwirextNextPc"): getattr(_rt, fn).restype = ctypes.c_void_p - _rt.kvlang_rwirextRegister.restype = ctypes.c_int - _rt.kvlang_rwirextRegister.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_char_p] - _rt.kvlang_rwirextParams.argtypes = [ctypes.c_void_p, ctypes.c_char_p] - _rt.kvlang_rwirextResolveRead.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] - _rt.kvlang_rwirextResolveReadPath.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] - _rt.kvlang_rwirextResolveWrite.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] - _rt.kvlang_rwirextNextPc.argtypes = [ctypes.c_char_p] + _rt.kvlangRwirextRegister.restype = ctypes.c_int + _rt.kvlangRwirextRegister.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_char_p] + _rt.kvlangRwirextParams.argtypes = [ctypes.c_void_p, ctypes.c_char_p] + _rt.kvlangRwirextResolveRead.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] + _rt.kvlangRwirextResolveReadPath.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] + _rt.kvlangRwirextResolveWrite.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int] + _rt.kvlangRwirextNextPc.argtypes = [ctypes.c_char_p] _lay.kvlangLayoutFile.restype = ctypes.c_int _lay.kvlangLayoutFile.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p, ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32] @@ -279,32 +279,32 @@ def alloc(self, key, arr): # ── 读参:解析为帧槽路径后零拷贝 view;内联字面量回退 resolve_read ── def read_arg(self, pc, i): - path = _s(_rt.kvlang_rwirextResolveReadPath(self.kv, pc.encode(), i)) + path = _s(_rt.kvlangRwirextResolveReadPath(self.kv, pc.encode(), i)) if path: v = self.view(path) if v is not None: return v - return _parse(_s(_rt.kvlang_rwirextResolveRead(self.kv, pc.encode(), i))) + return _parse(_s(_rt.kvlangRwirextResolveRead(self.kv, pc.encode(), i))) # ── 注册五大类 ───────────────────────────────────────────────── def register(self): for op, (nr, _) in OPS.items(): - _rt.kvlang_rwirextRegister(self.kv, op.encode(), nr, 1, ("\n".join(["any"] * (nr + 1))).encode()) - _rt.kvlang_rwirextRegister(self.kv, b"numpy.print", 1, 0, b"any...") + _rt.kvlangRwirextRegister(self.kv, op.encode(), nr, 1, ("\n".join(["any"] * (nr + 1))).encode()) + _rt.kvlangRwirextRegister(self.kv, b"numpy.print", 1, 0, b"any...") def _handle(self, op, nr, fn, pc): - params = _s(_rt.kvlang_rwirextParams(self.kv, pc.encode())).split("\n") + params = _s(_rt.kvlangRwirextParams(self.kv, pc.encode())).split("\n") if op == "numpy.print": parts = [] for i in range(len(params) - 1): - path = _s(_rt.kvlang_rwirextResolveReadPath(self.kv, pc.encode(), i)) + path = _s(_rt.kvlangRwirextResolveReadPath(self.kv, pc.encode(), i)) v = self.view(path) if path else None parts.append(_fmt(v) if v is not None - else _s(_rt.kvlang_rwirextResolveRead(self.kv, pc.encode(), i))) + else _s(_rt.kvlangRwirextResolveRead(self.kv, pc.encode(), i))) print(" ".join(parts), flush=True) else: args = [self.read_arg(pc, i) for i in range(nr)] - self.alloc(_s(_rt.kvlang_rwirextResolveWrite(self.kv, pc.encode(), 0)), np.asarray(fn(args))) + self.alloc(_s(_rt.kvlangRwirextResolveWrite(self.kv, pc.encode(), 0)), np.asarray(fn(args))) def serve(self, stop): table = {**OPS, "numpy.print": (1, None)} @@ -321,7 +321,7 @@ def serve(self, stop): self._handle(op, nr, fn, pc) except Exception as e: # 计算失败也要放行,避免 run 阻塞超时 print(f"[numpy] {op} @ {pc}: {e}", file=sys.stderr, flush=True) - nxt = _s(_rt.kvlang_rwirextNextPc(pc.encode())) + nxt = _s(_rt.kvlangRwirextNextPc(pc.encode())) self.kv_set(f"/vthread/{vid}/‥pc", nxt) self.kv_set(f"{base}/.done<{vid}>", pid) self.kv_del(todo) diff --git a/runtime/include/kvlang_rwirext.h b/runtime/include/kvlang_rwirext.h index 692273a5..78c71ff9 100644 --- a/runtime/include/kvlang_rwirext.h +++ b/runtime/include/kvlang_rwirext.h @@ -11,32 +11,32 @@ * 语义:rwir 解码 + resolve + display + PC 推进 + 类型判定。 */ /* 写 /lib/ = rwir 签名(幂等) */ -int kvlang_rwirextRegister(void *kvspace, const char *opcode, int32_t nr, +int kvlangRwirextRegister(void *kvspace, const char *opcode, int32_t nr, int32_t nw, const char *sig); /* 外部扩展 handoff:写 /lib//.todo 并阻塞 watch .done(30s * 超时)。RETURN 模式下 term 遇非己方 ext rwir(如 json.to/numpy)时调用,把 * 该指令交给对应扩展进程,扩展处理后写回下一 PC 并 signal .done。返回 0 成功, * -1 失败/超时。 */ -int kvlang_rwirextHandoff(void *kvspace, const char *vtid, const char *pc); +int kvlangRwirextHandoff(void *kvspace, const char *vtid, const char *pc); /* 当前指令的下一条 PC(malloc) */ -char *kvlang_rwirextNextPc(const char *pc); +char *kvlangRwirextNextPc(const char *pc); /* 解码指令,返回 opcode + 读参名 + 写参名(\n 分隔:首行 opcode,接 nr * 行读参名,接 nw 行写参名,malloc)。 供 numpy/tensor 扩展按路径零拷贝读 raw * 数据。 */ -char *kvlang_rwirextParams(void *kvspace, const char *pc); +char *kvlangRwirextParams(void *kvspace, const char *pc); /* 解析读参 idx 为字符串(变量 → 帧槽值;路径 → 该路径下的值)。 */ -char *kvlang_rwirextResolveRead(void *kvspace, const char *pc, int idx); +char *kvlangRwirextResolveRead(void *kvspace, const char *pc, int idx); /* 解析读参 idx 为 KV 路径(变量 → 帧槽路径;路径 → 直接返回;字面量 → "")。 * 供 numpy/tensor 扩展按路径零拷贝读整块 ndarray raw 数据。 */ -char *kvlang_rwirextResolveReadPath(void *kvspace, const char *pc, int idx); +char *kvlangRwirextResolveReadPath(void *kvspace, const char *pc, int idx); /* 解析写参 idx 为 KV 路径(路径 → 直接返回;变量 → 帧槽路径)。 */ -char *kvlang_rwirextResolveWrite(void *kvspace, const char *pc, int idx); +char *kvlangRwirextResolveWrite(void *kvspace, const char *pc, int idx); /* 签名 langtype(runtime篇-07)——供扩展做实参类型判定。 */ /* 语法校验:type = atom("|"atom)*, atom = [dims](family|kind), diff --git a/runtime/src/rwirext.c b/runtime/src/rwirext.c index 32502f4e..3ec7fa47 100644 --- a/runtime/src/rwirext.c +++ b/runtime/src/rwirext.c @@ -48,7 +48,7 @@ static void register_vids(kvlangKv_t *k, const char *opcode) { free(base); } -int kvlang_rwirextRegister(void *kvspace, const char *opcode, int32_t nr, +int kvlangRwirextRegister(void *kvspace, const char *opcode, int32_t nr, int32_t nw, const char *sig) { kvlangKv_t k = {kvspace}; char *key = kvlangKeytreeRwir(opcode); @@ -64,7 +64,7 @@ int kvlang_rwirextRegister(void *kvspace, const char *opcode, int32_t nr, return rc; } -int kvlang_rwirextHandoff(void *kvspace, const char *vtid, const char *pc) { +int kvlangRwirextHandoff(void *kvspace, const char *vtid, const char *pc) { kvlangKv_t k = {kvspace}; char *fr = kvlangKeytreeFrameRoot(pc); if (!fr) @@ -84,14 +84,14 @@ int kvlang_rwirextHandoff(void *kvspace, const char *vtid, const char *pc) { return rc; } -char *kvlang_rwirextNextPc(const char *pc) { +char *kvlangRwirextNextPc(const char *pc) { kvlangStrbuf_t b; kvlangStrbufInit(&b); kvlangRwirNextPc(pc, &b); return kvlangStrbufDetach(&b); } -char *kvlang_rwirextParams(void *kvspace, const char *pc) { +char *kvlangRwirextParams(void *kvspace, const char *pc) { kvlangKv_t k = {kvspace}; char *fr = kvlangKeytreeFrameRoot(pc); if (!fr) @@ -158,7 +158,7 @@ static char *display_map(kvlangKv_t *k, const char *path) { } /* 解析读参 idx 为字符串(变量 → 帧槽值;路径 → 该路径下的值)。 */ -char *kvlang_rwirextResolveRead(void *kvspace, const char *pc, int idx) { +char *kvlangRwirextResolveRead(void *kvspace, const char *pc, int idx) { kvlangKv_t k = {kvspace}; char *fr = kvlangKeytreeFrameRoot(pc); if (!fr) @@ -195,7 +195,7 @@ char *kvlang_rwirextResolveRead(void *kvspace, const char *pc, int idx) { /* 解析读参 idx 为 KV 路径(变量/临时 → 帧槽路径;路径 → 直接返回;内联字面量 → * "")。 */ -char *kvlang_rwirextResolveReadPath(void *kvspace, const char *pc, int idx) { +char *kvlangRwirextResolveReadPath(void *kvspace, const char *pc, int idx) { kvlangKv_t k = {kvspace}; char *fr = kvlangKeytreeFrameRoot(pc); if (!fr) @@ -226,7 +226,7 @@ char *kvlang_rwirextResolveReadPath(void *kvspace, const char *pc, int idx) { } /* 解析写参 idx 为 KV 路径(路径 → 直接返回;变量 → 帧槽路径)。 */ -char *kvlang_rwirextResolveWrite(void *kvspace, const char *pc, int idx) { +char *kvlangRwirextResolveWrite(void *kvspace, const char *pc, int idx) { kvlangKv_t k = {kvspace}; char *fr = kvlangKeytreeFrameRoot(pc); if (!fr) diff --git "a/stdlib/kvlang/spec/00-\345\257\274\350\250\200/01-\350\214\203\345\233\264\344\270\216\344\270\200\350\207\264\346\200\247.kv" "b/stdlib/kvlang/spec/00-\345\257\274\350\250\200/01-\350\214\203\345\233\264\344\270\216\344\270\200\350\207\264\346\200\247.kv" index 10bf71f8..fa654f48 100644 --- "a/stdlib/kvlang/spec/00-\345\257\274\350\250\200/01-\350\214\203\345\233\264\344\270\216\344\270\200\350\207\264\346\200\247.kv" +++ "b/stdlib/kvlang/spec/00-\345\257\274\350\250\200/01-\350\214\203\345\233\264\344\270\216\344\270\200\350\207\264\346\200\247.kv" @@ -17,6 +17,7 @@ lib kvlang/spec/导言/范围与一致性 { - **类型系统**(卷 03)——种类与定宽类型、langtype 签名类型表达式、数组形态、容器。类型跨 layout 与 runtime 两阶段,故独立成卷。 - **layout 语义**(卷 04)——静态语义:语法检查与布局。layout 是 **o0 编译器**:做检查、布局与降级,**不做任何优化**(一旦优化即丢失高层语义,使扩展编译器无法按原语义在异构硬件上优化),可报诊断。 - **runtime 语义**(卷 05)——动态语义:纯解释执行。 +- **编译器语义**(卷 06)——扩展编译器与核心的契约:前端算子/后端算子两层表示、后端绑定、算子版本化与 runtime 高版本优先。编译器本体不属语言核心(是计算引擎类扩展的组成),本卷只界定其与核心的契约。流水线上编译器介于 layout 与 runtime 之间(layout o0 → 编译器优化 → runtime 解释)。 附录给出唯一权威文法;设计理由卷为非规范(non-normative)的动机说明。 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 0bcc25cb..8daa4cc1 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" @@ -300,13 +300,13 @@ kvspaceNewPtr / NewChar / NewBool / NewInt64 / NewFloat64 ``` ### kvlang_(7) ``` - kvlang_rwirextHandoff - kvlang_rwirextNextPc - kvlang_rwirextParams - kvlang_rwirextRegister - kvlang_rwirextResolveRead - kvlang_rwirextResolveReadPath - kvlang_rwirextResolveWrite + kvlangRwirextHandoff + kvlangRwirextNextPc + kvlangRwirextParams + kvlangRwirextRegister + kvlangRwirextResolveRead + kvlangRwirextResolveReadPath + kvlangRwirextResolveWrite ``` ### notinmy(2) ``` diff --git "a/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/01-\347\274\226\350\257\221\345\231\250\345\256\232\344\275\215.kv" "b/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/01-\347\274\226\350\257\221\345\231\250\345\256\232\344\275\215.kv" new file mode 100644 index 00000000..4974c3eb --- /dev/null +++ "b/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/01-\347\274\226\350\257\221\345\231\250\345\256\232\344\275\215.kv" @@ -0,0 +1,36 @@ +// 欢迎加入kvspace世界 +lib kvlang/spec/编译器语义/编译器定位 { + r####"# 编译器定位 + +kvlang 的三阶段:**layout(o0)→ 编译器(优化)→ runtime(纯解释)**。 + +- **layout** 是 o0 编译器:只做检查、布局、降级,**不做任何优化**(见 [[范围与一致性]]、卷 04)。一旦在 layout 就优化即丢失高层语义,使编译器无法按原语义在异构硬件上重新优化。 +- **runtime** 纯解释:**不编译、不优化、不重排**,只按 PC 逐条取指解码执行(见 [[执行模型]])。 +- 二者之间的**优化**留给「扩展编译器」——本卷即界定它。卷 00 已用「扩展编译器」一词指代按原语义在异构硬件上做优化的实体,本卷给出其契约。 + +## 编译器不属语言核心 + +编译器是**扩展**,不是 C runtime 核心的一部分。它是计算引擎(deepx-cpu-compute、deepx-gpu-compute 等算子融合计算引擎)的组成,与扩展运行时**同架构**:嵌入 C runtime 核心,在其上追加算子表示与编译。本规范只界定**编译器与核心之间的契约**——编译器读什么、往 `/lib` 写什么、runtime 据此如何派发——**不**规定编译器内部算法(选择策略、融合规则、代价模型由各计算引擎文档界定)。 + +## 与 layout 的根本区别 + +| | layout(o0) | 编译器 | +|---|---|---| +| 读 `/lib` | 否——只写自身产物 | **是——读整棵 `/lib`**,检查当前注册的所有后端算子实现 | +| 视野 | 单函数/单次布局,静态 | 全局:已注册后端 + 全部调用点 | +| 产物 | 首次布进 `/lib` 的 rwfunc/指令 | 就地改写调用点 opcode、新增版本化函数,仍是合法 `/lib` 树 | +| 是否可选 | 必经 | 可选——未经编译的 `/lib` 树 runtime 亦能跑(除抽象算子外,见 [[前端算子与后端算子]]) | + +编译器的输入是**一棵已 layout、且各计算 runtime 已注册其 myrwircaps(后端算子 def rwir 路由头,见 [[rwfunc布局与def_rwir]])的 kvspace `/lib` 树**;输出仍是合法 `/lib` 树,交 runtime 纯解释。 + +## 三职责 + +1. **后端绑定**——把前端抽象算子调用点(`deepx·argmax`)改写为具体后端算子(`deepx/miaobyte·argmax`),见 [[前端算子与后端算子]]。 +2. **复合算子分解/融合**——把由基础算子组合的复合 rwfunc(如 `softmax` = exp/sum/div)融合成单条自解释 rwir。 +3. **算子版本化**——融合产物作为版本递增并存,runtime 调用时优先高版本,见 [[算子版本化与高版本优先]]。 + +## 非规范对照(PyTorch) + +本编译器的「编译期读 `/lib` 静态绑定后端」≈ TorchInductor 的 lowering(编译期查表把抽象 ATen op 静态映射到具体 kernel),**不是** `c10::Dispatcher` 的运行期按 device 位图派发。后端绑定表 ≈ Inductor lowering 表;复合算子分解 ≈ `torch/_decomp`;融合 ≈ Inductor Scheduler 合并算子成单 kernel;版本择优 ≈ autotune 缓存最优(但 kvlang 把「谁更优」显式化为可声明、可审计的静态版本号)。 + "#### -> /lib/kvlang/spec/编译器语义/编译器定位 +} diff --git "a/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/02-\345\211\215\347\253\257\347\256\227\345\255\220\344\270\216\345\220\216\347\253\257\347\256\227\345\255\220.kv" "b/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/02-\345\211\215\347\253\257\347\256\227\345\255\220\344\270\216\345\220\216\347\253\257\347\256\227\345\255\220.kv" new file mode 100644 index 00000000..dd850b37 --- /dev/null +++ "b/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/02-\345\211\215\347\253\257\347\256\227\345\255\220\344\270\216\345\220\216\347\253\257\347\256\227\345\255\220.kv" @@ -0,0 +1,47 @@ +// 欢迎加入kvspace世界 +lib kvlang/spec/编译器语义/前端算子与后端算子 { + r####"# 前端算子与后端算子 + +一个 tensor 运算有**两层表示**:厂商中立的前端抽象算子,与 author 绑定的后端实现算子。前端代码只写前端算子,编译器据 `/lib` 已注册后端把它绑定到具体实现。 + +## 两层表示 + +| 层 | 键 | 例 | 内容 | 谁写入 | +|---|---|---|---|---| +| **前端算子**(抽象) | `/lib/<域>·` | `deepx·argmax` | 仅签名(args/returns langtype)+ abstract 标记,**无实现**;无任何 runtime 在 myrwircaps 兑现 | 前端/编译器随附声明 | +| **后端算子**(实现) | `/lib/<域>/·` | `deepx/miaobyte·argmax`、`deepx/cblas·matmul` | 普通 def rwir 路由头(有 myrwircaps 处理器 + vids 执行器) | 计算 runtime 启动时注册 | + +- 前端算子是前端代码面向的**稳定算子面**:厂商无关、无 author,只承诺语义与签名。 +- 后端算子由计算 runtime(deepx-cpu-compute 等)注册;同一 `` 可有多个 author 各自实现,签名的 dtype 约束可不同(如 `deepx/cblas·matmul` 仅 float32/float64,`deepx/miaobyte·matmul` 覆盖 any)。 +- 非规范对照:前端算子 ≈ PyTorch `TORCH_LIBRARY m.def("argmax(...)")`(schema);后端算子 ≈ `TORCH_LIBRARY_IMPL(deepx, , m).impl("argmax", ...)`(按后端注册 kernel)。author 之于 kvlang 路径 ≈ DispatchKey 之于 Dispatcher。 + +## 命名与解析 + +`·`(U+00B7)是包/成员分隔符,`/` 是路径层级分隔符。二者组合即得两层键,**无需改词法**,现有 `handle_call` 取**最后一个** `·` 拆 pkg/name 即正确解析: + +- `deepx·argmax` → pkg=`deepx`,op=`argmax` → `/lib/deepx·argmax`。 +- `deepx/miaobyte·argmax` → pkg=`deepx/miaobyte`(含真实路径层级),op=`argmax` → `/lib/deepx/miaobyte·argmax`。 + +## 抽象算子的派发 + +前端算子 `/lib/<域>·` 是 def rwir,但主槽携 **abstract** 标记。运行期语义: + +- **已编译**代码里调用点已是后端算子(`deepx/miaobyte·argmax`),正常经 def rwir 路由到计算 runtime,不触及抽象头。 +- **未编译**代码里直接调用抽象算子(`deepx·argmax`):runtime 查 `/lib` 命中 abstract def rwir → 报明确诊断「抽象算子未绑定后端,需先经编译器」,**不**静默 handoff、**不**回退 NameError。抽象算子无 myrwircaps 兑现方,直接执行即错误。 + +## 编译器后端绑定 + +编译器扫 `/lib`,对每个抽象算子调用点 `<域>·`,枚举已注册的 `<域>/*·` 后端,按策略选一,**就地改写调用点 opcode** 为 `<域>/·`。选择策略(由计算引擎界定,典型): + +1. 源码已显式写 author(`deepx/cblas·matmul`)→ 原样保留,不改写。 +2. 否则查默认 author 表(如 `matmul→cblas`、`argmax→miaobyte`);默认 author 已注册该 op 则用之。 +3. 否则用唯一可用者。 +4. 皆无 → 诊断「`` 无已注册后端」,编译失败。 + +这是**编译期静态绑定**:绑定一次、写回 `/lib`,runtime 不再做后端选择(对照 PyTorch,这对应 Inductor 编译期 lowering,而非 Dispatcher 运行期派发)。 + +## 锚例(待补) + +- `tutorial/16-compiler/backend_bind.kv`——`deepx·argmax(v0, axis0, false) -> vmax` 经编译改写为 `deepx/miaobyte·argmax(v0, axis0, false) -> vmax`。 + "#### -> /lib/kvlang/spec/编译器语义/前端算子与后端算子 +} diff --git "a/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/03-\347\256\227\345\255\220\347\211\210\346\234\254\345\214\226\344\270\216\351\253\230\347\211\210\346\234\254\344\274\230\345\205\210.kv" "b/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/03-\347\256\227\345\255\220\347\211\210\346\234\254\345\214\226\344\270\216\351\253\230\347\211\210\346\234\254\344\274\230\345\205\210.kv" new file mode 100644 index 00000000..660a0531 --- /dev/null +++ "b/stdlib/kvlang/spec/06-\347\274\226\350\257\221\345\231\250\350\257\255\344\271\211/03-\347\256\227\345\255\220\347\211\210\346\234\254\345\214\226\344\270\216\351\253\230\347\211\210\346\234\254\344\274\230\345\205\210.kv" @@ -0,0 +1,39 @@ +// 欢迎加入kvspace世界 +lib kvlang/spec/编译器语义/算子版本化与高版本优先 { + r####"# 算子版本化与高版本优先 + +复合算子(如 `softmax` = exp/sum/div 组合)可被编译器融合成单条自解释 rwir,获更优实现。融合产物**不覆盖**原函数,而作为**版本递增**并存;runtime 调用时**优先高版本**。类比 `.so.1` 版本后缀;对照 PyTorch,这把 autotune 的隐式择优显式化为可声明、可审计的静态版本号。 + +## 版本键:`.` 后缀 + +基名 `·`(如 `softmax`)的第 N 个编译版本存 `/lib/·.`——**ASCII 点后缀 `.`**(N≥1 正整数,类 `.so.1`)。原始(基,可视作 v0)仍在 `/lib/·`。基键携**当前最高版本号**(head 字段或专用子键,由编译器维护)。 + +## runtime 高版本优先解析 + +`handle_call` 解析对 `` 的调用、构出 `func_key = /lib/·` 之后、读签名 `[0,0]` 之前,读基键版本标记: + +- 有 → 把 `func_key` 重定向到最高版本 `/lib/·.`。 +- 无(未编译)→ 用基键本身(**向后兼容**:未经编译的代码调基版正常跑)。 + +对 caller 完全透明——调用点仍写基名,帧 `‥lib` 槽随之记选中版本的 func_key,帧内裸名回溯自然指向选中版本。解析结果按基名**缓存冻结**(同 opmeta 缓存的固化策略)。挂钩点:`runtime/src/kvcpu.c` 的 `handle_call` 构出 `func_key` 之后。 + +## 版本记法用 `.` 而非 `·` + +版本段用 ASCII `.`(`.`),**不用** `·`: + +- `·` 是包/成员分隔符,`rfind_sep` 会把 `softmax·1` 误拆为 `pkg=softmax, name=1`;`.` **不是**分隔符——词法上并入标识符,`handle_call` 不据它拆 pkg/name,故 `softmax.1` 整体即 name(pkg 拆分仍只认最后一个 `·`:`deepx/miaobyte·argmax.1` → pkg=`deepx/miaobyte`, name=`argmax.1`),无歧义。 +- 与既有 `.src`(源码副本 `/lib/.src`)的 ASCII 点后缀约定一致。 +- 版本键由编译器产生、版本钩子以字符串拼接消费。因 `.` 无歧义,即便源码直接写 `softmax.1(...)` 也能正确解析到 `/lib/softmax.1`;但版本通常由编译器托管,不必在源码手写。 + +## 与后端绑定正交 + +- **后端绑定**改**调用点 opcode**(前端算子 → 后端算子,见 [[前端算子与后端算子]])。 +- **版本化**改**被调函数的实现选择**(基 → 高版本)。 + +二者正交,可叠加:`deepx·softmax` 先绑定为某后端组合,其融合版再登记为 `softmax·1`。 + +## 锚例(待补) + +- `tutorial/16-compiler/op_version.kv`——编译前调 `softmax` 走基版;编译生成 `softmax·1` 后,同一 `softmax(...)` 调用走 `softmax·1`,输出与基版逐字节一致。 + "#### -> /lib/kvlang/spec/编译器语义/算子版本化与高版本优先 +}