一门纯文本解释型语言:代码与数据同处一棵 KV 树。
程序计数器是一条路径,源码即 IR,每个值都是纯文本——任何 KV 客户端都能查看,崩溃后可从原指令继续。
curl -fsSL https://raw.githubusercontent.com/array2d/kvlang/master/install.sh | sh
为什么是 kvlang
小核心,其余能力全部注册在路径上。
代码即数据
一个函数就是一棵子树。参数在负轴是读参、正轴是写参——与 kvspace 里每个值的形状完全一致。
rwfunc add(a:int64, b:int64) -> (c:int64) { a + b -> c }
PC 是路径,崩溃可续
没有独立的调用栈。帧深直接写在程序计数器里,重启后的进程可以从同一条指令继续执行。
PC = "/vthread/<vid>/[1]/[3,0]" vthread vid, frame 1, instruction 3
小核心,扩展在上
核心运行时只负责执行与跳转。其余每个 opcode 都注册在 /lib/<opcode>,交给声明了它的运行时兑现。
/lib/<opcode>/vids/<vtid> = pc
规范即事实
语言事实在规范里,不在这张页面上。86 章规范定义语言,232 个锚定教程用例演示它。 阅读规范 →
字节一致的双后端
一套 PascalCase C ABI,两个实现由 DSN 选择。同一份程序在共享内存、文件或 Redis 上运行,落盘字节完全一致。
KVSPACE=shm:///tmp/kvlang.shm ./bin/kvlang tutorial/01-basics/hello.kv # kvspace-c
KVSPACE=fs:///tmp/kvlang-fs ./bin/kvlang tutorial/01-basics/hello.kv # kvspace-durable
为 Agent 而生
源码、值与编译产物都是同一棵树里的纯文本。deepx 以 kvlang 作为前端语言;byteseek 通过同样的 KV 读写,读取并改写自己的代码与状态。 查看用例 →
生态
三层,一棵树。每一层都可以独立替换。
kvspace
寻址与内存。一套 C ABI;shm 与 durable 后端必须逐字节一致。
layout
o0 编译器。解析源码并写入 KV 树——不做优化,没有 IR。
runtime
纯解释:取指、解码、执行、路由。扩展放在 /lib/<opcode>。
基准测试
每个 case 有四份逻辑等价的实现。kvlang 目前仍比 Python、Rust、C 慢;这些图表用于追踪它收敛的速度。
完整结果(30 行)
| Case | Input | shm | fs | redis | Python | Rust | C |
|---|---|---|---|---|---|---|---|
| binary_search | N=16 | 413 µs | — | — | 14.2 µs | 687 ns | 500 ns |
| binary_search | N=32 | 814 µs | — | — | 24.4 µs | 1.41 µs | 1.12 µs |
| binary_search | N=64 | 1.74 ms | — | — | 45.9 µs | 2.91 µs | 2.19 µs |
| binary_trees | depth=4 | 932 µs | — | — | 14.2 µs | 2.39 µs | 5.75 µs |
| binary_trees | depth=5 | 1.84 ms | — | — | 22.7 µs | 3.12 µs | 7.03 µs |
| binary_trees | depth=6 | 3.64 ms | — | — | 40.3 µs | 4.46 µs | 8.74 µs |
| fib | n=8 | 157 µs | — | — | 10.2 µs | 346 ns | 308 ns |
| fib | n=9 | 218 µs | — | — | 12.0 µs | 399 ns | 414 ns |
| fib | n=10 | 322 µs | — | — | 15.4 µs | 498 ns | 574 ns |
| hash_table | N=50 | 490 µs | — | — | 33.3 µs | 5.23 µs | 284 ns |
| hash_table | N=100 | 969 µs | — | — | 60.8 µs | 7.90 µs | 434 ns |
| hash_table | N=200 | 1.94 ms | — | — | 117 µs | 15.4 µs | 764 ns |
| iops | N=500 | 124 µs | — | — | 23.6 µs | 465 ns | 270 ns |
| iops | N=1000 | 199 µs | — | — | 44.7 µs | 794 ns | 463 ns |
| iops | N=2000 | 355 µs | — | — | 89.0 µs | 1.46 µs | 809 ns |
| k_nucleotide | rep=3 | 1.76 ms | — | — | 41.1 µs | 3.14 µs | 202 ns |
| k_nucleotide | rep=5 | 2.96 ms | — | — | 65.2 µs | 4.94 µs | 261 ns |
| k_nucleotide | rep=8 | 4.80 ms | — | — | 97.6 µs | 7.45 µs | 411 ns |
| matmul | N=4 | 275 µs | — | — | 20.7 µs | 349 ns | 233 ns |
| matmul | N=6 | 849 µs | — | — | 53.2 µs | 424 ns | 366 ns |
| matmul | N=8 | 1.94 ms | — | — | 113 µs | 820 ns | 557 ns |
| nqueens | N=4 | 167 µs | — | — | 13.5 µs | 309 ns | 271 ns |
| nqueens | N=5 | 296 µs | — | — | 23.5 µs | 598 ns | 527 ns |
| nqueens | N=6 | 643 µs | — | — | 50.7 µs | 1.53 µs | 1.50 µs |
| prime_sieve | N=50 | 735 µs | — | — | 40.6 µs | 15.4 µs | 19.9 µs |
| prime_sieve | N=75 | 939 µs | — | — | 62.2 µs | 18.2 µs | 20.2 µs |
| prime_sieve | N=100 | 1.11 ms | — | — | 81.6 µs | 21.8 µs | 21.3 µs |
| quicksort | N=32,seed=1 | 662 µs | — | — | 18.7 µs | 1.11 µs | 1.01 µs |
| quicksort | N=64,seed=1 | 1.48 ms | — | — | 33.8 µs | 2.36 µs | 2.18 µs |
| quicksort | N=128,seed=1 | 3.14 ms | — | — | 65.0 µs | 5.22 µs | 4.58 µs |
ns/µs/ms 自动选择单位;缺值显示为 —。 benchmark/README.md
开始使用
三步跑起来。
1 · 安装
curl -fsSL https://raw.githubusercontent.com/array2d/kvlang/master/install.sh | sh
2 · 运行
./bin/kvlang -c 'println("hello, world")' # inline mode (entry init)
3 · 读教程
tutorial/01-basics/hello.kv — 232 个锚定用例中的第一个。
从源码构建
make all # runtime(C) + layout(Rust) + runtime-rs(Rust) + json(Go)需要 C 工具链 + cmake、Rust(cargo)与 kvspace ABI 库。详见 README_CN。