背景
引擎 deepx-cpu-compute(#1,main-runtime + CPU tensor myrwircaps)已能把后端算子按 deepx/<author>·<op>(如 deepx/miaobyte·argmax、deepx/cblas·matmul)注册为 def rwir。但 kvlang 尚缺 前端算子表示 与把前端代码对接引擎 rwir 的 编译器。
目标(用户原述):deepx 表示代码
v0:[]float64 = [1.0, 3.0, 2.0, 7.0, 4.0]
axis0:[]int64 = [0]
deepx·argmax(v0, axis0, false) -> vmax
编译为执行代码
v0:[]float64 = [1.0, 3.0, 2.0, 7.0, 4.0]
axis0:[]int64 = [0]
deepx/miaobyte·argmax(v0, axis0, false) -> vmax
编译器与 layout 的区别:编译器直接读 /lib,检查当前注册的所有后端算子实现后,再生成新函数。复合算子 rwfunc softmax → 融合版 rwfunc softmax.1(类 .so.1 版本后缀),runtime 调 softmax 时优先高版本。
三阶段定位
layout(o0,检查+布局+降级,不优化)→ 编译器(读 /lib 优化)→ runtime(纯解释)。spec 卷 00 早已用「扩展编译器」一词并与 layout(o0) 对置(00-导言/01-范围与一致性.kv:18),本工作即定义它。编译器不属语言核心 runtime,是计算引擎(deepx-cpu-compute/deepx-gpu-compute)的组成(延续 #189、执行模型.kv:7)。与 #202「layout 不是编译器」正交互补。
本 issue(kvlang 核心侧)范围 —— 只做契约,编译器本体在 deepx-cpu-compute
关键设计裁决
- 版本记法用
.<N> 而非 ·<N>(用户裁定):· 是包/成员分隔符,rfind_sep 会把 softmax·1 误拆为 pkg=softmax,name=1;. 不是分隔符(词法上并入标识符、handle_call 不据它拆 pkg/name),故 softmax.1 整体即 name,无歧义,且与既有 .src 后缀约定一致。版本键 /lib/<pkg>·<name>.<N>。
- 后端选择策略:显式 author 保留 → 默认 author 表(authormap 式,
matmul→cblas/argmax→miaobyte)→ 唯一可用 → 皆无则诊断。策略本体在计算引擎侧。
- 后端绑定 vs 版本化正交:绑定改调用点 opcode(前端→后端);版本化改被调实现选择(基→高版本)。
对照 PyTorch(勘察结论)
编译期读 /lib 静态绑定后端 ≈ TorchInductor lowering(非 c10::Dispatcher 运行期 device 派发);前端算子 ≈ TORCH_LIBRARY m.def,后端算子 ≈ TORCH_LIBRARY_IMPL(域,author,m);复合算子 ≈ CompositeImplicitAutograd+torch/_decomp;融合 ≈ Inductor Scheduler;版本择优 ≈ autotune 缓存最优(kvlang 把它显式化为静态版本号)。
关联
deepx-cpu-compute 侧实现见 array2d/deepx-cpu-compute#2(前端算子目录 + 编译器 pass)。#202 #189 #166 #1。
背景
引擎
deepx-cpu-compute(#1,main-runtime + CPU tensor myrwircaps)已能把后端算子按deepx/<author>·<op>(如deepx/miaobyte·argmax、deepx/cblas·matmul)注册为 def rwir。但 kvlang 尚缺 前端算子表示 与把前端代码对接引擎 rwir 的 编译器。目标(用户原述):deepx 表示代码
编译为执行代码
编译器与 layout 的区别:编译器直接读
/lib,检查当前注册的所有后端算子实现后,再生成新函数。复合算子rwfunc softmax→ 融合版rwfunc softmax.1(类.so.1版本后缀),runtime 调softmax时优先高版本。三阶段定位
layout(o0,检查+布局+降级,不优化)→ 编译器(读 /lib 优化)→ runtime(纯解释)。spec 卷 00 早已用「扩展编译器」一词并与 layout(o0) 对置(00-导言/01-范围与一致性.kv:18),本工作即定义它。编译器不属语言核心 runtime,是计算引擎(deepx-cpu-compute/deepx-gpu-compute)的组成(延续 #189、执行模型.kv:7)。与 #202「layout 不是编译器」正交互补。本 issue(kvlang 核心侧)范围 —— 只做契约,编译器本体在 deepx-cpu-compute
01-编译器定位、02-前端算子与后端算子、03-算子版本化与高版本优先,并在00-导言/01范围登记卷 06。/lib/<域>·<op>(deepx·argmax),schema-only def rwir + abstract 标记;无 myrwircaps 兑现方。runtime 遇未编译的抽象算子调用 → 明确诊断「抽象算子未绑定后端,需先经编译器」(不静默 handoff / 不回退 NameError)。2-runtime):handle_call构出func_key=/lib/<pkg>·<name>后、读[0,0]前,读基键版本标记,有则重定向到/lib/<pkg>·<name>.<maxN>,无则用基键(向后兼容)。对 caller 透明,按基名缓存冻结。挂钩点runtime/src/kvcpu.chandle_call(构 func_key 之后,约 kvcpu.c:340-348)。tutorial/16-compiler/backend_bind.kv、op_version.kv(三后端逐字节一致)。关键设计裁决
.<N>而非·<N>(用户裁定):·是包/成员分隔符,rfind_sep会把softmax·1误拆为pkg=softmax,name=1;.不是分隔符(词法上并入标识符、handle_call不据它拆 pkg/name),故softmax.1整体即 name,无歧义,且与既有.src后缀约定一致。版本键/lib/<pkg>·<name>.<N>。matmul→cblas/argmax→miaobyte)→ 唯一可用 → 皆无则诊断。策略本体在计算引擎侧。对照 PyTorch(勘察结论)
编译期读
/lib静态绑定后端 ≈ TorchInductor lowering(非c10::Dispatcher运行期 device 派发);前端算子 ≈TORCH_LIBRARY m.def,后端算子 ≈TORCH_LIBRARY_IMPL(域,author,m);复合算子 ≈CompositeImplicitAutograd+torch/_decomp;融合 ≈ Inductor Scheduler;版本择优 ≈ autotune 缓存最优(kvlang 把它显式化为静态版本号)。关联
deepx-cpu-compute 侧实现见 array2d/deepx-cpu-compute#2(前端算子目录 + 编译器 pass)。#202 #189 #166 #1。