Skip to content

Commit cd2c8ef

Browse files
committed
runtime: rwirext ABI snake_case → camelCase(kvlangRwirext*)+ 06-编译器语义卷
- 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 算子版本化)。
1 parent c34146a commit cd2c8ef

17 files changed

Lines changed: 191 additions & 68 deletions

File tree

runtime-rs/src/engine.rs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -193,20 +193,20 @@ impl Engine {
193193
// ── rwir 派发时按下标解析读/写槽(rwirext 宿主 ABI,传 kvspace 句柄)─
194194
/// @-aware 读参:@ 句柄按 body 前缀路由兑现真实字节,其余(字面量/普通值/指针)沿用 C ResolveRead。
195195
pub fn read_at(&self, pc: &str, idx: i32) -> String {
196-
let p = take(unsafe { kvlang_rwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) });
196+
let p = take(unsafe { kvlangRwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) });
197197
if !p.is_empty() {
198198
let (r, body) = self.head_ref_body(&p);
199199
if r == 2 {
200200
return self.resolve_ext(&body);
201201
}
202202
}
203-
take(unsafe { kvlang_rwirextResolveRead(self.kv, cs(pc).as_ptr(), idx) })
203+
take(unsafe { kvlangRwirextResolveRead(self.kv, cs(pc).as_ptr(), idx) })
204204
}
205205
pub fn read0(&self, pc: &str) -> String {
206206
self.read_at(pc, 0)
207207
}
208208
pub fn write_at(&self, pc: &str, idx: i32) -> String {
209-
take(unsafe { kvlang_rwirextResolveWrite(self.kv, cs(pc).as_ptr(), idx) })
209+
take(unsafe { kvlangRwirextResolveWrite(self.kv, cs(pc).as_ptr(), idx) })
210210
}
211211
pub fn write0(&self, pc: &str) -> String {
212212
self.write_at(pc, 0)
@@ -215,7 +215,7 @@ impl Engine {
215215
/// 取读参 idx 容器路径 → 读 body 字节;@ 句柄按前缀兑现真实字节;无路径退化为 read_at 的 utf8。
216216
/// 供 fs·write/append 等需要 []uint8 整块的 rwir 用。
217217
pub fn read_bytes(&self, pc: &str, idx: i32) -> Vec<u8> {
218-
let p = take(unsafe { kvlang_rwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) });
218+
let p = take(unsafe { kvlangRwirextResolveReadPath(self.kv, cs(pc).as_ptr(), idx) });
219219
if p.is_empty() {
220220
return self.read_at(pc, idx).into_bytes();
221221
}
@@ -447,7 +447,7 @@ impl Engine {
447447
break;
448448
}
449449
let c = take(pc);
450-
let params = take(unsafe { kvlang_rwirextParams(self.kv, cs(&c).as_ptr()) });
450+
let params = take(unsafe { kvlangRwirextParams(self.kv, cs(&c).as_ptr()) });
451451
let op = params.lines().next().unwrap_or("").to_string();
452452
let handled = if rwir::is_inproc(&op) {
453453
rwir::dispatch(self, &op, &c);
@@ -460,7 +460,7 @@ impl Engine {
460460
if !handled {
461461
crate::elog!("未知 rwir: {op} @ {c}");
462462
}
463-
let nxt = take(unsafe { kvlang_rwirextNextPc(cs(&c).as_ptr()) });
463+
let nxt = take(unsafe { kvlangRwirextNextPc(cs(&c).as_ptr()) });
464464
// pc 可能属子 vthread(native vthread·run 冒泡上来):nextpc 写回其所属 vid,不写主 vid。
465465
let sub = c.split('/').nth(2).unwrap_or(vid);
466466
self.set_kv(&format!("/vthread/{sub}/\u{2025}pc"), &nxt);

runtime-rs/src/ffi.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -167,32 +167,32 @@ unsafe extern "C" {
167167
// ── kvlang runtime:rwirext 宿主 ABI(均传 kvspace 句柄)─────────
168168
// C 头 kvlang_rwirext.h 导出 9 符号;此处声明 7:故意省略 LangtypeValid/LangtypeMatch
169169
// ——langtype 校验属 layout 期、匹配属 C dispatch 内部,Rust term 侧不调用(非缺陷)。
170-
pub fn kvlang_rwirextRegister(
170+
pub fn kvlangRwirextRegister(
171171
kvspace: *mut c_void,
172172
opcode: *const c_char,
173173
nr: c_int,
174174
nw: c_int,
175175
sig: *const c_char,
176176
) -> c_int;
177-
pub fn kvlang_rwirextParams(kvspace: *mut c_void, pc: *const c_char) -> *mut c_char;
178-
pub fn kvlang_rwirextResolveRead(
177+
pub fn kvlangRwirextParams(kvspace: *mut c_void, pc: *const c_char) -> *mut c_char;
178+
pub fn kvlangRwirextResolveRead(
179179
kvspace: *mut c_void,
180180
pc: *const c_char,
181181
idx: c_int,
182182
) -> *mut c_char;
183-
pub fn kvlang_rwirextResolveReadPath(
183+
pub fn kvlangRwirextResolveReadPath(
184184
kvspace: *mut c_void,
185185
pc: *const c_char,
186186
idx: c_int,
187187
) -> *mut c_char;
188-
pub fn kvlang_rwirextResolveWrite(
188+
pub fn kvlangRwirextResolveWrite(
189189
kvspace: *mut c_void,
190190
pc: *const c_char,
191191
idx: c_int,
192192
) -> *mut c_char;
193-
pub fn kvlang_rwirextNextPc(pc: *const c_char) -> *mut c_char;
193+
pub fn kvlangRwirextNextPc(pc: *const c_char) -> *mut c_char;
194194
// Handoff:非己方处理的外部 rwir(如 numpy)移交给对应扩展进程。
195-
pub fn kvlang_rwirextHandoff(
195+
pub fn kvlangRwirextHandoff(
196196
kvspace: *mut c_void,
197197
vtid: *const c_char,
198198
pc: *const c_char,

runtime-rs/src/main.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -308,20 +308,20 @@ fn drive_vid(eng: &Engine, vid: &str) {
308308
// 连续批处理就地 rwir(print/json/http/kvlayout/input),遇非就地指令停下。
309309
let mut c = take(pc);
310310
let stop_op = loop {
311-
let params = take(unsafe { kvlang_rwirextParams(kv, cs(&c).as_ptr()) });
311+
let params = take(unsafe { kvlangRwirextParams(kv, cs(&c).as_ptr()) });
312312
let op = params.split('\n').next().unwrap_or("").to_string();
313313
if !rwir::is_inproc(&op) {
314314
break op;
315315
}
316316
rwir::dispatch(eng, &op, &c);
317-
c = take(unsafe { kvlang_rwirextNextPc(cs(&c).as_ptr()) });
317+
c = take(unsafe { kvlangRwirextNextPc(cs(&c).as_ptr()) });
318318
};
319319

320320
// pc 可能属子 vthread(native vthread·run 冒泡上来):目标 vid 一律由 pc 导出,非固定主 vid。
321321
let sub = c.split('/').nth(2).unwrap_or(vid);
322322
// 停在本 myrwircaps 内的 op:handoff;native/控制帧/帧结束:写回 pc 让 runtime 继续。
323323
if !stop_op.is_empty() && rwir::in_myrwircaps(&stop_op) {
324-
if unsafe { kvlang_rwirextHandoff(kv, cs(sub).as_ptr(), cs(&c).as_ptr()) } != 0 {
324+
if unsafe { kvlangRwirextHandoff(kv, cs(sub).as_ptr(), cs(&c).as_ptr()) } != 0 {
325325
kvlang_rs::elog!("handoff {stop_op} 失败 @ {c}");
326326
std::process::exit(1);
327327
}

runtime-rs/src/rwir/http.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ pub fn call(eng: &Engine, pc: &str) {
1717
}
1818

1919
fn read(eng: &Engine, pc: &str, idx: i32) -> String {
20-
take(unsafe { kvlang_rwirextResolveRead(eng.kv, cs(pc).as_ptr(), idx) })
20+
take(unsafe { kvlangRwirextResolveRead(eng.kv, cs(pc).as_ptr(), idx) })
2121
}
2222

2323
fn agent() -> ureq::Agent {

runtime-rs/src/rwir/json.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ pub fn from(eng: &Engine, pc: &str) {
4545
}
4646

4747
fn params(eng: &Engine, pc: &str) -> Vec<String> {
48-
let s = take(unsafe { kvlang_rwirextParams(eng.kv, cs(pc).as_ptr()) });
48+
let s = take(unsafe { kvlangRwirextParams(eng.kv, cs(pc).as_ptr()) });
4949
s.lines().map(str::to_string).collect()
5050
}
5151

runtime-rs/src/rwir/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -188,7 +188,7 @@ pub fn register(eng: &Engine) {
188188
.collect::<Vec<_>>()
189189
.join("\n");
190190
unsafe {
191-
kvlang_rwirextRegister(
191+
kvlangRwirextRegister(
192192
eng.kv,
193193
cs(op).as_ptr(),
194194
r.rp.len() as i32,

runtime-rs/src/rwir/networld/proc.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -137,7 +137,7 @@ fn phys_dir_str(pid: &str) -> String {
137137

138138
/// 取读参 idx 的容器 KV 路径(ResolveRead 对数组只返首元素,容器须用 ResolveReadPath)。
139139
fn read_path(eng: &Engine, pc: &str, idx: i32) -> String {
140-
take(unsafe { kvlang_rwirextResolveReadPath(eng.kv, cs(pc).as_ptr(), idx) })
140+
take(unsafe { kvlangRwirextResolveReadPath(eng.kv, cs(pc).as_ptr(), idx) })
141141
}
142142

143143
/// stringkeymap 容器路径 p → 按坐标段 ·[i] 数值升序取各成员字符串(get_kv 解 char/utf32)。

runtime-rs/src/rwir/term.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,7 @@ use crate::engine::Engine;
99
use crate::ffi::*;
1010

1111
pub fn print_line(eng: &Engine, pc: &str) {
12-
let params = take(unsafe { kvlang_rwirextParams(eng.kv, cs(pc).as_ptr()) });
12+
let params = take(unsafe { kvlangRwirextParams(eng.kv, cs(pc).as_ptr()) });
1313
let mut it = params.split('\n');
1414
let opcode = it.next().unwrap_or("");
1515
let (sep, rawnl, cerr) = match opcode {

runtime-rwirext_example/go/json/json.go

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -167,31 +167,31 @@ func mkindex(c unsafe.Pointer, path string) {
167167
func resolveRead(c unsafe.Pointer, pc string, idx int) string {
168168
cp := cstr(pc)
169169
defer C.free(unsafe.Pointer(cp))
170-
return gostr(C.kvlang_rwirextResolveRead(c, cp, C.int(idx)))
170+
return gostr(C.kvlangRwirextResolveRead(c, cp, C.int(idx)))
171171
}
172172

173173
func resolveReadPath(c unsafe.Pointer, pc string, idx int) string {
174174
cp := cstr(pc)
175175
defer C.free(unsafe.Pointer(cp))
176-
return gostr(C.kvlang_rwirextResolveReadPath(c, cp, C.int(idx)))
176+
return gostr(C.kvlangRwirextResolveReadPath(c, cp, C.int(idx)))
177177
}
178178

179179
func resolveWrite(c unsafe.Pointer, pc string, idx int) string {
180180
cp := cstr(pc)
181181
defer C.free(unsafe.Pointer(cp))
182-
return gostr(C.kvlang_rwirextResolveWrite(c, cp, C.int(idx)))
182+
return gostr(C.kvlangRwirextResolveWrite(c, cp, C.int(idx)))
183183
}
184184

185185
func nextPC(pc string) string {
186186
cp := cstr(pc)
187187
defer C.free(unsafe.Pointer(cp))
188-
return gostr(C.kvlang_rwirextNextPc(cp))
188+
return gostr(C.kvlangRwirextNextPc(cp))
189189
}
190190

191191
func params(c unsafe.Pointer, pc string) []string {
192192
cp := cstr(pc)
193193
defer C.free(unsafe.Pointer(cp))
194-
return strings.Split(gostr(C.kvlang_rwirextParams(c, cp)), "\n")
194+
return strings.Split(gostr(C.kvlangRwirextParams(c, cp)), "\n")
195195
}
196196

197197
// ── XValue 编解码(走权威 kvspace ABI:DecodeHead 读头 + TlvEncode/NewChar 编码)──
@@ -651,7 +651,7 @@ func register(c unsafe.Pointer) {
651651
sig := strings.TrimSuffix(strings.Repeat("any\n", o.nr+o.nw), "\n")
652652
co := cstr(o.name)
653653
cs := cstr(sig)
654-
C.kvlang_rwirextRegister(c, co, C.int32_t(o.nr), C.int32_t(o.nw), cs)
654+
C.kvlangRwirextRegister(c, co, C.int32_t(o.nr), C.int32_t(o.nw), cs)
655655
C.free(unsafe.Pointer(co))
656656
C.free(unsafe.Pointer(cs))
657657
}

runtime-rwirext_example/py/numpy/numpy.py

Lines changed: 20 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@
1313
算子(reshape/matmul/…)产出并按 [dims]dtype 存回 kvspace。
1414
· tensor data 零拷贝:读走权威 kvspaceDecodeHead,在 kvspace-c SHM 地址上建 ndarray 视图;
1515
写走权威 N 维 kvspaceTlvEncode,dims 直接落盘。
16-
· 遵照读写码:从 kvlang_rwirextParams 取 opcode 与读/写操作数名;读参优先按路径零拷贝 view,
17-
否则回退 kvlang_rwirextResolveRead;写参经 kvlang_rwirextResolveWrite 解析为 KV 路径。
16+
· 遵照读写码:从 kvlangRwirextParams 取 opcode 与读/写操作数名;读参优先按路径零拷贝 view,
17+
否则回退 kvlangRwirextResolveRead;写参经 kvlangRwirextResolveWrite 解析为 KV 路径。
1818
· numpy.print 走本进程自身的 stdout(不经 kvlang println)。
1919
"""
2020

@@ -90,16 +90,16 @@ def _bind():
9090
ctypes.c_char_p, ctypes.c_uint32]
9191
_ks.kvspaceDel.restype = ctypes.c_int
9292
# rwirext ABI(kvspace 不提供的 runtime 语义):句柄传扩展自连的 kvspace
93-
for fn in ("kvlang_rwirextParams", "kvlang_rwirextResolveRead", "kvlang_rwirextResolveReadPath",
94-
"kvlang_rwirextResolveWrite", "kvlang_rwirextNextPc"):
93+
for fn in ("kvlangRwirextParams", "kvlangRwirextResolveRead", "kvlangRwirextResolveReadPath",
94+
"kvlangRwirextResolveWrite", "kvlangRwirextNextPc"):
9595
getattr(_rt, fn).restype = ctypes.c_void_p
96-
_rt.kvlang_rwirextRegister.restype = ctypes.c_int
97-
_rt.kvlang_rwirextRegister.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_char_p]
98-
_rt.kvlang_rwirextParams.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
99-
_rt.kvlang_rwirextResolveRead.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
100-
_rt.kvlang_rwirextResolveReadPath.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
101-
_rt.kvlang_rwirextResolveWrite.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
102-
_rt.kvlang_rwirextNextPc.argtypes = [ctypes.c_char_p]
96+
_rt.kvlangRwirextRegister.restype = ctypes.c_int
97+
_rt.kvlangRwirextRegister.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int32, ctypes.c_int32, ctypes.c_char_p]
98+
_rt.kvlangRwirextParams.argtypes = [ctypes.c_void_p, ctypes.c_char_p]
99+
_rt.kvlangRwirextResolveRead.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
100+
_rt.kvlangRwirextResolveReadPath.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
101+
_rt.kvlangRwirextResolveWrite.argtypes = [ctypes.c_void_p, ctypes.c_char_p, ctypes.c_int]
102+
_rt.kvlangRwirextNextPc.argtypes = [ctypes.c_char_p]
103103
_lay.kvlangLayoutFile.restype = ctypes.c_int
104104
_lay.kvlangLayoutFile.argtypes = [ctypes.c_char_p, ctypes.c_char_p, ctypes.c_char_p,
105105
ctypes.c_uint32, ctypes.c_char_p, ctypes.c_uint32]
@@ -279,32 +279,32 @@ def alloc(self, key, arr):
279279

280280
# ── 读参:解析为帧槽路径后零拷贝 view;内联字面量回退 resolve_read ──
281281
def read_arg(self, pc, i):
282-
path = _s(_rt.kvlang_rwirextResolveReadPath(self.kv, pc.encode(), i))
282+
path = _s(_rt.kvlangRwirextResolveReadPath(self.kv, pc.encode(), i))
283283
if path:
284284
v = self.view(path)
285285
if v is not None:
286286
return v
287-
return _parse(_s(_rt.kvlang_rwirextResolveRead(self.kv, pc.encode(), i)))
287+
return _parse(_s(_rt.kvlangRwirextResolveRead(self.kv, pc.encode(), i)))
288288

289289
# ── 注册五大类 ─────────────────────────────────────────────────
290290
def register(self):
291291
for op, (nr, _) in OPS.items():
292-
_rt.kvlang_rwirextRegister(self.kv, op.encode(), nr, 1, ("\n".join(["any"] * (nr + 1))).encode())
293-
_rt.kvlang_rwirextRegister(self.kv, b"numpy.print", 1, 0, b"any...")
292+
_rt.kvlangRwirextRegister(self.kv, op.encode(), nr, 1, ("\n".join(["any"] * (nr + 1))).encode())
293+
_rt.kvlangRwirextRegister(self.kv, b"numpy.print", 1, 0, b"any...")
294294

295295
def _handle(self, op, nr, fn, pc):
296-
params = _s(_rt.kvlang_rwirextParams(self.kv, pc.encode())).split("\n")
296+
params = _s(_rt.kvlangRwirextParams(self.kv, pc.encode())).split("\n")
297297
if op == "numpy.print":
298298
parts = []
299299
for i in range(len(params) - 1):
300-
path = _s(_rt.kvlang_rwirextResolveReadPath(self.kv, pc.encode(), i))
300+
path = _s(_rt.kvlangRwirextResolveReadPath(self.kv, pc.encode(), i))
301301
v = self.view(path) if path else None
302302
parts.append(_fmt(v) if v is not None
303-
else _s(_rt.kvlang_rwirextResolveRead(self.kv, pc.encode(), i)))
303+
else _s(_rt.kvlangRwirextResolveRead(self.kv, pc.encode(), i)))
304304
print(" ".join(parts), flush=True)
305305
else:
306306
args = [self.read_arg(pc, i) for i in range(nr)]
307-
self.alloc(_s(_rt.kvlang_rwirextResolveWrite(self.kv, pc.encode(), 0)), np.asarray(fn(args)))
307+
self.alloc(_s(_rt.kvlangRwirextResolveWrite(self.kv, pc.encode(), 0)), np.asarray(fn(args)))
308308

309309
def serve(self, stop):
310310
table = {**OPS, "numpy.print": (1, None)}
@@ -321,7 +321,7 @@ def serve(self, stop):
321321
self._handle(op, nr, fn, pc)
322322
except Exception as e: # 计算失败也要放行,避免 run 阻塞超时
323323
print(f"[numpy] {op} @ {pc}: {e}", file=sys.stderr, flush=True)
324-
nxt = _s(_rt.kvlang_rwirextNextPc(pc.encode()))
324+
nxt = _s(_rt.kvlangRwirextNextPc(pc.encode()))
325325
self.kv_set(f"/vthread/{vid}/‥pc", nxt)
326326
self.kv_set(f"{base}/.done<{vid}>", pid)
327327
self.kv_del(todo)

0 commit comments

Comments
 (0)