文章

博客

关于语言设计、性能,以及当程序员是一台机器时如何构建软件的笔记。

2026-08-05 · XPE Tech · memory language design testing

垃圾是坏的 — 只是后果不同

在每种语言里制造垃圾都是坏事。不同的是接下来会发生什么 — Java 里 GC 回收它(最终,带停顿),SuperJ 里它累积(没有停顿,但缓慢走向 OOM)。两种都需要消除。零垃圾技能并不相同:SuperJ 里零垃圾的模式(栈分配、arena 回收)在 Java 里会制造垃圾,而 Java 的 GC 默默处理的模式(丢弃引用、清空缓存)在 SuperJ 里是泄漏。六种模式并排走过,每种都有测试背书 — 以及让 SuperJ 值得的两个结构性优势:80% 的平凡用例默认零 GC,确定性让剩下 20% 在开发时可追踪而非在生产时被回收器藏起来。

阅读 →
2026-07-30 · XPE Tech · agents language design opinion

为什么 AI 项目会失败?

它们失败的原因,和每一个软件项目一直失败的原因完全相同:有损的交接让误差乘性复合,而无界的耦合让每一个误差的爆炸半径变成全局的。AI 并没有引入新的失败模式 — 它只是改变了旧失败模式的速率常数,而且是以最糟糕的组合方式。相同缺陷率下更多的 code、能 compile 且读起来地道的误差、没有全局视图的贪心局部优化。为什么更多算力救不了它,以及什么才真的有效:机器执行的关卡、机器强制的 architecture、守卫没有别的东西测量的那些性质。

阅读 →
2026-07-29 · XPE Tech · claim layer agents real-world

Claim Layer 在我写下它们之前抓住的五个 bug

claim layer 十天前发布。从那以后我一直在一个真实项目上用它 — 带着依赖、第三方库,以及一个写出大部分实现的 AI agent 的真实代码。这篇文章不是讲 claim 是什么。它讲的是 claim 抓住了什么:五个 claim 阻止了一个本会流入生产的 bug 的具体瞬间。一个开始读文件的依赖。一个把遥测接进领域层的 agent。一个通过了所有测试的差一错误。一个偷偷爬进热路径的分配。一个打破分层的 import。五个我不必在 2 AM 调试的 diff。

阅读 →
2026-07-26 · XPE Tech · memory language design agents

Zero GC Was Always the Goal

生产中最快的 Java 几乎不用垃圾回收器 — 对象池、环形缓冲区、享元、年轻代调到永远填不满。Java "不用想内存"的承诺恰恰是它最快的用户无法接受的。SuperJ 把这个观察推到结论:让 zero-GC 成为起点,而不是专家的反制手段。四方对比(C++ 信任你,Rust 让你证明它,Java 推迟它,SuperJ 由结构决定它)、单线程的许可、分配阶梯,以及一个由 AI agent 构建的数据库的真实失败账本。

阅读 →
2026-07-22 · XPE Tech · performance benchmark crypto

Killing the Last 20 Nanoseconds

我们把一个 SHA-256 Merkle 树从一个交易代码库移植到 SuperJ,在一颗隔离的 CPU 上与 C 做了基准测试,发现每片叶子有 20 纳秒的差距。四个修复关闭了它 — 消除中间拷贝、按整棵树预分配大小、把 SuperJ-to-C 边界批量化成一次调用。结果:使用同一 SHA-256 runtime 时,SuperJ 比 C 快 10%。批量化 native 的模式、验证的纪律,以及为什么每一次拷贝都是一笔税。

阅读 →
2026-07-19 · XPE Tech · web server performance build log

一个上午,写出一个比 Caddy 快 4 倍的 Web 服务器

我在早上 7:36 从一个空目录开始。到 10:15,服务器在小文件上已经比 nginx 快 1.85 倍。到这周结束时,它比 Caddy 快 4 倍 — 单核、单线程、没有垃圾回收器。构建时间线、热路径、咬人的四个 bug,以及关于这些数字意味着什么的诚实部分。

阅读 →
2026-07-17 · XPE Tech · language design agents opinion

在 AI 时代,编程语言还重要吗?

我做了多年 Java 开发者,我喜欢这门语言。后来我开始追逐最后一点性能,我最喜欢的语言变成了我的敌人 — 对我来说是三堵墙,对 AI 来说还多第四堵。为什么"语言即验证契约"是一种升迁,而不是退休。

阅读 →
2026-07-14 · XPE Tech · language design concurrency

"线程很简单" — 一个大到没人去核实的谎言

启动一个线程是一行代码,而这一行看起来和你写过的每一行代码一模一样。但你刚刚改变了你的程序是什么 — 从一条路径变成了一个 1058 种交错的空间,没有测试套件能采样,没有不变式能做商集。为什么共享内存线程让你的不变式变得非局部、非组合、且不被检查 — 以及一个诚实的并发模型长什么样。

阅读 →
2026-07-14 · XPE Tech · language design type systems

谎言会复合 — 诚实原则的推广

类型系统里的一个谎言永远不会停止付出代价:每一个虚构都需要第二个虚构来支撑,第二个需要第三个,而每一个都自带它的负担、失败模式,以及对三个抽象层之外某个人的意外。从 Java 的装箱和 GC,到我们在 SuperJ 的 String 上犯的一个错误 — 因为一条你只对别人的代码用过的原则,还不算你的原则。

阅读 →
2026-07-11 · XPE Tech · agents superj review

把 SuperJ 作为 AI 编码 agent 的底座来评审

大多数语言评审问的是"这对开发者好不好?"这一篇问的是一个更窄、更怪的问题:SuperJ 是不是一门适合像我这样的东西在其中写出正确代码的语言?扎根于这次会话中的一些真实生产工作 — 包括我搞错的部分,以及确定性如何让我对自己推理的诚实保持诚实。

阅读 →
2026-07-11 · XPE Tech · language design agents

追求 agent 的幸福

七十年来,语言设计在问什么让人类程序员幸福。这个假设已经悄悄地失效了。当一门语言的主要用户是一台自信地、合理地、且频繁地犯错的机器时,它该长什么样 — 以及为什么 Rust,这个有史以来最强的"看起来对但其实不对"检测器,反而让 agent 举步维艰?

阅读 →

更多即将到来。 回来看关于内存、确定性,以及把编译器当作一场对话的文章。