本文永久链接 – https://tonybai.com/2026/10/18/rust-in-the-agentic-era-guardrails-proofs-and-design-languages

大家好,我是Tony Bai。

【导读】

当 AI Agent 开始接管敲代码的工作,一辈子研究编程语言设计的人,会怎么想?Rust 核心团队成员 Niko Matsakis 在博客里坦白,LLM 让他产生了“存在主义焦虑”。不过他也给出了自己的回答:人类依然有位置,语言设计依然重要,而 Rust 恰好是 Agent 时代的“天选语言”。更值得关注的是,他认为 Rust 还能更适合 Agent,并提出了一个大胆的北极星目标:不再有 unsafe 代码。

【文章要点】

  • Rust 在 Agent 时代的热度,以及背后的两个原因(性能默认值、类型护栏)。
  • “软件工厂”三支柱:设计、构造、优化。Rust 在后两者上有优势,设计仍是开放问题。
  • 测试不够,类型系统也不够:需要证明系统(Verus、Kani、Lean 等)。
  • 反直觉结论:护栏越强,Agent 优化得越激进,性能反而越好(lean-zip 实验)。
  • 类型系统与证明系统不是替代关系,而是分工关系(借用检查器简化 SMT 求解)。
  • Rust 该往哪走:更强的表达力、可扩展编译器、“不再有 unsafe 代码”的北极星。
  • 终局猜想:人类写“设计”,Agent 写“代码”,设计语言成为新战场。


一个语言设计者的焦虑

Niko Matsakis 是 Rust 语言的核心设计者之一。他从小学五年级开始写代码,那时的电脑只有 5MHz 主频、512K 内存。

他说,几十年来电脑天翻地覆,但“往文件里敲代码”这件事,本质上几乎没变过。直到几年前,一切被掀了个底朝天。

这让他陷入了真实的焦虑:我的编程技能还有用吗?我的语言设计技能呢?

他的结论分三层:

  • 人类在编程中依然有角色;
  • 编程语言设计依然有意义;
  • Rust 是 Agent 开发的“很好的契合”,但还能“更好”。

这篇文章,是他在 SPLASH 大会 REBASE 研讨会演讲的博客版。下面我们拆开来看,并补充几份关键证据。

Rust 在 Agent 时代,真的火了

先看一组数据。Niko 在文中引用了 David Tolnay 的观察:Meta 工程师今年写的第一方 Rust 代码,是此前 9 年总和的两倍。

这个增速,在近期的语言增长中仅次于 TypeScript。

为什么?Niko 认为有两层原因。

第一层是“试错成本变低了”。Agent 让尝试新语言变得很容易。既然选哪种语言都一样轻松,为什么不选运行更快的?

第二层才是关键:Rust 本身就适合 Agent 写。OpenAI 联合创始人 Greg Brockman 今年 1 月也发过一条类似观点:Rust 是 Agent 的完美语言,因为“能编译就大致正确”。

Niko 谨慎地补充了一句:这不是说只有 Rust 适合,像 Go 这样的语言在“让 Agent 快速迭代”上也有独特优势,只是他怀疑 Agent 会放过一些 Rust 能拦住的数据竞争和隐蔽 bug。

软件工厂的三根支柱

Niko 把“Agent 软件工厂”拆成三根支柱:

  • 设计(Design):说清楚代码到底要做什么;
  • 构造(Construction):写出符合设计的代码;
  • 优化(Optimization):让代码跑得高效。

三者都没有被“完全解决”,但进展不一。Rust 的主战场在后两者。

优化:Rust 默认就快,还给你一堆“旋钮”

Rust 的设计哲学是“默认高性能”:惯用写法通常也是最快的写法。

同时,它又给了你足够多的“旋钮”:

  • 栈分配还是堆分配;
  • 指针间接层放在哪里;
  • 结构体内存布局怎么排;
  • 极端情况下,直接内联汇编。

过去,调这些旋钮是一门“黑魔法”。现在,Agent 正在把它变成日常。

Niko 提到两个例子:

  • 做高性能密码学算法的人,原本靠手写汇编调优,现在也开始让 Agent 来做;
  • 做网络服务的开发者,可以借助 dial9 这样的性能分析器,让 Agent 有效定位异步代码里的长时间 poll 和阻塞问题。

于是,一个高效的优化闭环出现了:

图:Agent + Profiler 的性能优化闭环

Niko 还有一个有意思的判断:既然写代码的主力换成了 Agent,Rust 可以容忍多一点显式的 clone() 噪音,毕竟 Agent 不嫌烦。但“主干逻辑”仍要清晰,因为人类现在更多是在读代码,而不是写代码。

可靠性:测试不够,类型系统也不够

比起性能,让人留下来的是可靠性。

Dijkstra 早就说过:测试只能证明 bug 存在,不能证明 bug 不存在。

用 Agent 写代码时,这个问题更严重。Niko 说,常常是前几个测试看着漂亮,下一个测试就“离谱到不可思议”。一查才发现,Agent 完全误解了他想表达的逻辑。

这时类型系统的价值就显现了。Rust 的护栏不止是“字段名对不对”,还包括“永远不用手动关 socket”这类资源管理保证。

但 Niko 马上泼了一盆冷水,并仿 Dijkstra 造了一句:

类型系统能证明某类 bug 不存在,却无法证明程序是正确的。

要证明“做对了”,而不只是“没做错”,就需要证明系统。Rust 生态里已经有 Verus、Creusot、Aeneas、Kani 等工具。最基本的用法是证明代码不会 panic,更进一步,可以断言代码确实算出了你想要的结果。

反直觉:护栏越强,跑得越快

这是全文最有意思的一点:证明不只让代码更对,还能让代码更快。

逻辑很简单:如果你能向 Agent 下达“随便怎么改,只要你能证明结果仍然正确”的指令,Agent 就可以放开手脚做激进优化。

Niko 引用了 Lean 社区 Kim Morrison 的实验。

他们用 Lean 写了一个 DEFLATE 压缩库 lean-zip,并证明了“压缩后再解压,必然还原原始数据”。然后放手让 Claude 和 Codex 等 Agent 自主优化,条件只有一个:改了实现就必须更新证明。

在 212MB 的 silesia 标准语料上,对比纯 Rust、无 unsafe 的 miniz_oxide:

指标 miniz_oxide(Rust) lean-zip(Lean)
压缩耗时(level 6) 5.77 秒 4.57 秒
压缩后大小(字节) 68,112,144 68,054,183

据作者统计:

  • 最快档位:吞吐高约 15%,输出小约 8.8%;
  • 默认的 L6:快约 30%;
  • L9:快约一倍。

不过,这个实验不能被过度解读。作者本人也明确说了:

  • 他并不是在宣称“Lean 比 Rust 快”,在 Rust 里写出高性能实现依然容易得多;
  • 没有人用同样的方式去优化 miniz_oxide,对比并不完全对等;
  • Lean 版本内存占用更高,解压反而慢约 1.45 倍;
  • 精心调优过的 libdeflate 仍然远远领先。

它真正证明的,是另一件事:当你能写出刻画算法的定理时,就可以放心地把优化外包给 AI,而不必逐行人工审查。

这正是“护栏越强,自由度越高”的最佳注脚。

有了证明系统,还要类型系统吗?

答案是:当然要。

Niko 举了个小例子。同样一句“赋值后断言相等”:

void setFoo(Bar bar) {
    this.foo = bar;
    assert this.foo == bar;
}

在 Java 里,你无法证明这个断言一定成立,因为可能有别的线程正在修改 this。

fn set_foo(&mut self, bar: Bar) {
    self.foo = bar;
    assert_eq!(self.foo, bar);
}

在 Rust 里,断言必然成立(前提是 Bar 的相等比较满足自反性)。因为 &mut self 保证了唯一引用。

这正是 Verus 的工作方式:它信任 Rust 借用检查器对唯一性的追踪,从而大幅简化 SMT 求解器的工作,让证明更快、更稳。

所以,两者是分工关系:

图:三层护栏——类型系统负责“排雷”,证明系统负责“证对”

Rust 该往哪走?

Niko 给出了三条路线:

1. 能编译,就能跑(If it compiles, it works)

类型系统要更强。有些性质目前表达不了,比如“这个方法只读某一个字段”(视图类型)、内部引用,甚至“日志里不得出现个人敏感信息”这类高级约束。把这些限制解除,Agent 才有空间去证明更复杂的性质。

2. 低层够用,高层也好用

继续保留性能旋钮,同时让代码意图清晰。在 Agent 写代码的世界里,不必再为“少打几个字符”而过度纠结。

3. 可扩展、多用途的编译器

今天用 Verus 等证明工具,需要宏和锁定编译器版本,体验很“野路子”。Rust 应该把可扩展性带进编译器,以便支持 GPU、深度语言互操作,以及接入定理证明器这类需要“不止 token”的工具。

在这三条路线之上,Niko 提出了一个北极星目标:

不再有 unsafe 代码。

注意,他不是要取消 unsafe 关键字,而是要让开发者有能力证明自己写的所有 unsafe 代码都是正确的、不会引发未定义行为。

他的理由是:既然 Agent 越来越擅长挖漏洞,单靠“把风险圈出来”已经不够,要想遏制源源不断的 CVE,必须升级到“可证明”。

他的愿景是:看到使用最广泛的那批 Rust 库,都被证明是 sound 的。

真正的战场:设计

三根支柱里,“设计”是最开放的问题。

Niko 观察到,目前业界的最佳实践,基本是“Markdown 驱动开发”:写一堆文档,然后祈祷 Agent 认真读。

他认为 Rust 在这里可做的事,包括把“接口”与“实现”分离,便于单独审查接口,或发现 Agent 悄悄改动了接口。(他自嘲:这是不是 .h 头文件的复仇?)

更大胆的想法是专用的“建模语言”:让你和 Agent 在高层快速迭代设计与不变量,而不必陷进代码细节。

这与 AWS 工程师 Marc Brooker 的观点不谋而合。Brooker 提出了一个“反馈回路假说”:

  • Agent 本质上是“带反馈回路的 LLM”;
  • 能提供有效、精确反馈的任务,对 Agent 而言就是“容易”的;
  • 因此,写一个正确的高性能存储引擎,长期看可能比做一个讨喜的修图网站更容易,因为前者的规格明确、可自动验证,而后者需要人类这种“又慢又不稳定”的反馈者。

这意味着,直觉里“难”的系统软件可能变容易,而“容易”的产品设计反而更珍贵。

Niko 由此给出了终局猜想:

图:人类写设计,Agent 写代码,护栏负责把关

这并不会让传统语言设计失去意义,只是权衡的天平变了:

  • 过去:语言要对“人类作者”友好;
  • 未来:语言要对“人类读者 + Agent 作者 + 证明工具”同时友好。

小结:焦虑,也许正是新起点

回到开头的问题:语言设计者还有饭碗吗?

Niko 的回答是:有,只是工作重心要变。少关心“怎么让人少敲几个字”,多关心“怎么让机器可验证、让人容易理解”。

对每一个开发者来说,这篇文章也有几点启发:

  • 别只盯着 Agent 能生成什么,要盯着它的反馈回路是什么。回路越精确,Agent 越可靠。
  • 用类型和证明给 Agent 划边界,而不是靠 Review 兜底。边界越清晰,授权越大胆。
  • 设计与规格的能力,会越来越值钱。当“写出来”不再稀缺,“想清楚”才是稀缺品。

当然,也需要保持清醒:证明工具的使用门槛依然很高,lean-zip 之类的实验有明显局限,Go 等语言也各有 Agent 适配优势。Rust 是否会成为 Agent 时代的“最优解”,还远没有定论。

但至少有一点是确定的:当机器开始写代码,“能被验证”就成了最硬的通货。

参考资料:


还在为写 Agent 框架频频死循环、上下文爆炸而束手无策?我的新专栏 《从0 开始构建 Agent Harness》 将带你:

  • 抛弃臃肿框架,回归“驾驭工程 (Harness Engineering)”的第一性原理
  • 用 Go 语言手写 ReAct 循环、并发拦截与上下文压缩引擎等,复刻极简OpenClaw
  • 构建坚不可摧的 Safety Middleware 与飞书人工审批防线
  • 在底层实现 Token 成本审计、链路追踪与自动化跑分评估
  • 从“调包侠”进化为掌控大模型边界的“AI 操作系统架构师”

扫描下方二维码,开启从 0 开始构建Agent Harness 的实战之旅。


还在为“复制粘贴喂AI”而烦恼?我的新专栏 《AI原生开发工作流实战》 将带你:

  • 告别低效,重塑开发范式
  • 驾驭AI Agent(Claude Code),实现工作流自动化
  • 从“AI使用者”进化为规范驱动开发的“工作流指挥家”

扫描下方二维码,开启你的AI原生开发之旅。


商务合作方式:撰稿、出书、培训、在线课程、合伙创业、咨询、广告合作。如有需求,请扫描下方公众号二维码,与我私信联系。