墨穗app.notebase.cn
控制台
内容库
动态
管理
账户
U
用户
--
在线
v1.0.165 · 墨穗笔记
笔记

Notebase墨穗
静水流深,落墨成穗。

0笔记
0工具
30推荐

分类导航

按主题直达

编辑精选

站内用户贡献 · 真实笔记

最新收录

每日更新
继续浏览全部内容 →

笔记

0
加载中...

工具

0

此页用于记录用户反馈问题后的每一次改进

关于

笔记用法

“写笔记”支持四种格式——Word 文档、Excel 表格、Markdown、纯文本,起稿或二次编辑时都能随时切换,同一篇笔记想用哪种形态来记,都由你说了算。

md、txt、csv、json 这类纯文本则原样载入,不做多余加工。拿一张现成的表倒进来、改几笔、再导出去,等于白用一台免费的格式转换器。

要带走就在右上角点“下载”,可导出 PDF、Word、Markdown、Excel、TXT 等格式;列表卡片“⋯”菜单里,也有同样的下载入口。

工具用法

在“工具”页点“+ 上传工具”即可发布:填好名称与链接,再用 Markdown 把使用方法写清楚——能解决什么问题、怎么装、怎么用,比堆介绍实在。

要分发安装包就一并上传压缩包(ZIP、RAR、7Z、TAR.GZ,最大 35MB),别人在详情页一键下载;只放链接不带附件也可以。

工具按大家的收藏热度排序,好用的自然会被顶上来。发布后可在详情页或卡片菜单里编辑、下架。

隐藏笔记

写笔记时勾上“隐藏”,这篇就只存在于你自己的账号里:不进列表、不进搜索、不上首页精选,也不会出现在任何公开的页面,链接发给别人同样打不开。

适合放密码、草稿、日记这类只给自己看的内容;想公开,去“发布”打开它,把“隐藏”的勾去掉再保存,之后编辑会默认保持原状态,不会悄悄变回公开。

不想公开、只想临时给人看:点“分享”生成一条带密码和有效期的链接,到期自动失效,你也能随时撤销。

数据安全

你的内容会同时保存在多个副本上,系统定期做备份与完整性校验,再配合异地容灾机制:就算某台机器出问题,数据也不会丢,可以长期放心存放;特别重要的资料,仍建议你另外再留一份备份。

技术

全站跑在容器化、模块化的现代架构上,更新、部署、回滚都很快,扩展性和稳定性都按长期运营的标准来设计(Built for reliability, designed to scale)。

理念

这个网站最早只是一个人的笔记仓库,后来慢慢长成现在的知识中枢。设计上很克制——没有广告、没有追踪、没有推荐算法,只是干干净净地存放一些东西;既然做好了,就公开出来,万一有人用得上呢。

原则

不做大而全,不做平台梦,保持简单、保持克制、保持好奇。所有内容都由用户贡献、由用户维护:不会突然冒出付费墙,不会在角落塞广告位,也不会把你的数据卖给第三方。

更多

产品会持续迭代,站内日志页记录着每一次改动,改了什么都有迹可循;想了解这个站是怎么一步步走到今天的,翻翻日志就能看到来龙去脉。

举报

如果在这里看到涉嫌违规的内容,点对应卡片右侧的“举报”按钮就能提交,我们会尽快核实处理;也谢谢你花一点时间,一起把这里维护干净。

趋势

// 点击导航加载发现
归档
// 归档为空
最近浏览
// 暂无浏览记录
发布
// 加载中...
用户发布
// 加载中...
用户管理
// 加载中...
访问统计
// 加载中...
内容审核
// 加载中...
个人信息
// 加载中...
返回首页

l:为 k 和 q 设计的新运行时——一场关于语言极简性与底层控制的实验

2026-07-08编程开发

一句话概括:为 k 和 q 语言设计的新型运行时,聚焦极致性能与极简内存模型。

背景:k 与 q 语言——金融领域的“暗器”

在主流编程语言之外,存在一类专为特定领域(如高频金融交易)设计的语言。k 和 q 便是其中的代表——它们由 Arthur Whitney 开发,属于 APL 家族的分支。k 是底层语言,q 是建立在 k 之上的脚本语言(类似 SQL 之于 C)。

  • 极简语法:整个 k 语言的参考手册只有一页纸,关键字寥寥无几。
  • 极致性能:k 和 q 的运行时(runtime)高度优化,单线程处理大量时间序列数据(如股票 tick 数据)的速度远超 Python/R。
  • 内存控制:所有数据以列式存储(column-oriented),且几乎完全避免动态内存分配,追求缓存友好。

然而,k/q 的官方运行时是闭源的,且绑定在特定架构(如 x86-64)上。这限制了其可移植性和社区创新。

新运行时“l”的目标

文章介绍的“l”是一个全新的、开源(MIT 许可证)的运行时,专门为 k 和 q 语言设计。它的核心目标包括:

  1. 兼容 k 语法的语义:完全实现 k 语言的核心操作(向量运算、原子函数、高阶函数等)。
  2. 零开销抽象:不引入任何 GC(垃圾回收)或引用计数机制,内存管理完全由程序员通过语言特性控制(类似 Rust 的所有权模型,但更轻量)。
  3. 跨平台:支持 x86-64、ARM64、RISC-V 等主流架构,并计划支持 WebAssembly。
  4. 可嵌入:提供 C API,允许其他语言(如 Python、Go)直接调用 k 表达式。

技术细节:运行时如何实现“快”

1. 数据表示:扁平数组 + 标签联合(Tagged Union)

k/q 中的所有值(包括数字、字符串、列表、字典)在运行时内部都被表示为扁平数组。例如,一个嵌套列表 (1 2; 3 4 5) 在内存中会被展平为 [1,2,3,4,5],并附带一个“类型标签”描述其逻辑结构(比如“这是一个包含两个子列表的列表”)。

  • 优势:遍历时 CPU 缓存命中率极高,因为所有数据连续存放。
  • 实现:运行时使用 C 语言编写,基础数据结构是 struct k0 { int8_t t; union { int64_t i; double f; struct { int64_t n; int8_t *s; }; }; }。t 是类型标识(0=整数, 1=浮点, 2=符号, 3=字符串...),union 直接存放标量值或指向数组的指针。

2. 内存管理:区域分配(Arena Allocator)

官方 k 运行时使用一种称为“区域分配”的策略:一次性从操作系统申请大块内存(例如 64KB),然后在这个区域内顺序分配小对象。当区域用完时,整个区域被释放(而不是逐个释放对象)。

“l”运行时采用了相同的思路,但做了改进:

  • 多区域:根据对象大小(小/中/大)使用不同的区域,减少内部碎片。
  • 无锁分配:由于 k 是单线程语言(但支持通过 peach 并行),分配时不需要互斥锁。
  • 显式生命周期:程序员通过 peach 或 fork 等操作创建子区域,子区域可以独立释放,避免全量 GC 停顿。

3. 向量指令:自动 SIMD 化

k/q 的核心操作(如 +、*、>)都是向量化的。运行时在编译时检测操作数类型,并生成对应的 SIMD 指令(如 SSE/AVX on x86, NEON on ARM)。

  • 例如:a + b 如果 a 和 b 都是长度为 1000 的整数数组,则运行时直接调用 _mm256_add_epi32(AVX2 指令)一次处理 8 个整数。
  • 对于混合类型(如整数数组 + 标量),自动广播(broadcast)。

4. 即时编译(JIT)?不,是“解释 + 模板化”

与许多现代运行时(如 V8、LuaJIT)不同,“l”并未采用 JIT 编译。它使用模板化解释器:

  • 核心循环是一个巨大的 switch 语句,每个 k 操作符对应一个 case。
  • 但为了减少分支预测失败,运行时使用 C 语言的 __attribute__((flatten)) 和 __builtin_expect 等提示,让编译器内联并优化热点路径。
  • 对于重复执行的操作(如循环体),运行时通过“操作码缓存”(opcode caching)记录上次执行路径,下次直接跳转。

这种设计在保持跨平台性的同时,性能接近手写汇编(根据作者测试,在整数向量加法上达到 C 语言 90% 的速度)。

与官方运行时的对比

特性 官方 k/q 运行时 “l”运行时
许可证 闭源,商业授权 MIT 开源
内存管理 区域分配(单区域) 多区域,支持子区域释放
并行支持 仅 peach(隐式并行) 同官方,但底层使用 pthread 池
64位整数 支持(但部分操作截断为32位) 完整64位支持
错误处理 崩溃或返回 null 返回带错误码的 tagged union,可被捕获
外部函数接口(FFI) 仅支持 C 函数指针 支持 C ABI,并计划支持 Rust/WASM

实际性能数据

作者在 Apple M1 Pro 上测试了三个基准:

  1. 向量加法(10^7 个 64 位整数):官方运行时 0.023 秒 vs “l” 0.025 秒(约 92% 性能)。
  2. 矩阵乘法(1024x1024 浮点矩阵):官方 0.87 秒 vs “l” 0.91 秒(约 95% 性能)。
  3. 嵌套列表展平(深度 1000 的嵌套列表):官方 0.012 秒 vs “l” 0.014 秒(约 86% 性能)。

差距主要在于官方运行时使用了手写的汇编优化循环,而“l”仍依赖 C 编译器自动向量化。但“l”在跨平台和可维护性上胜出。

如何开始使用

“l”目前处于 alpha 阶段,但已可运行大部分 k 代码。安装方式:

bash
git clone https://github.com/shakna/l
cd l && make && sudo make install

然后通过 l -e "1+1" 执行表达式,或 l script.k 运行文件。

为什么这很重要

k/q 语言虽然小众,但在金融、物联网等对延迟敏感的场景中不可替代。一个开源的、高性能的运行时意味着:

  • 更多开发者可以学习和使用 k 语言,而不必购买昂贵的商业许可。
  • 可以将其嵌入到其他系统(如数据库、消息队列)中,作为内嵌的查询/计算引擎。
  • 社区可以贡献优化(如 GPU 支持、分布式执行)。

未来方向

作者计划在后续版本中加入:

  • 增量编译:将频繁执行的热点函数编译为机器码(真正的 JIT)。
  • 持久化存储:直接将 k 的列式表映射到内存映射文件(mmap),实现零拷贝数据库。
  • 分布式原语:通过 MPI 或 RDMA 实现多机并行。

结语

“l”不仅是一个运行时,更是一种对“极简即高性能”哲学的实践。它证明在 GC 和复杂优化主导的今天,手动控制内存和向量化仍能创造令人惊叹的效率。对于追求底层控制的工程师,这是一个值得关注的项目。

原文链接:https://lv1.sh/

相似推荐
uBlock Origin 开发版被 Chrome 商店拒绝:一场关于扩展单一用途政策的争议逆向工程实战:我如何绕过亚马逊Kindle网页端的DRM加密Heroku的丑陋秘密:云之王如何背离Rails并欺骗客户Firefox 成为最后一个支持 uBlock Origin 的主流浏览器:广告拦截的终局之战GitHub Codespaces 深度解读:云端开发环境如何重塑编码工作流认知负荷才是关键:软件设计的根本度量
编写使用方法
Markdown 格式 · Ctrl+Enter 确定
0 字新建笔记
欢迎回来
登录你的墨穗笔记账户
忘记密码?
还没有账户?立即注册
创建账户
注册你的专属墨穗笔记
已有账户?去登录
找回密码
输入注册邮箱获取验证码
返回登录
请输入图片中的验证码以继续注册
加载中...
取消
新建收藏
手动添加你喜欢的内容
取消
编辑头像与昵称
上传新头像或修改你的显示昵称
支持 JPG/PNG,最大 2MB
取消

问题反馈

隐私提醒

取消
编辑工具
受控分享
为这篇笔记生成限时 / 带密码的临时链接
关闭