"动态语言对 AI 编程更友好,因为少了类型声明,代码更紧凑,token 消耗更少。"这个说法在过去一年被反复引用,几乎成了 AI 编程语言选择的常识。Dan Luu 设计了三组严格实验,给出了一个不那么舒服的答案:这个说法在小任务上可能成立,但在真实规模的编程任务面前,它消失了。

Dan Luu 的实验设计值得先讲清楚。他不做 benchmark,不写玩具代码,不跑 hello world。他选了三个任务:
(1) 从 RFC 和 errata 出发实现一个完整的 zstd 解码器,不给测试用例;
(2) 实现 Pandoc 的一个子集功能(来自 ProgramBench),给测试但用 holdout 集验证;
(3) 实现一个规则本身就自相矛盾的桌游《Guards of Atlantis 2》。
每个任务都让多种语言在相同条件下竞争,用 GPT-5.6 Sol 分别在 medium 和 ultra 两个 effort 级别测试。
zstd 解码器的结果最能说明问题。在 medium effort 下,动态语言确实聚集在图表的左上角——更便宜,正确率也更高。这跟主流说法一致。但切到 ultra effort 后,图表变得"相当混乱,两三种静态语言表现最好,表现好的语言里静态比动态更多"。动态语言的优势被抹平了。

Dan Luu 指出了一个关键前提:此前被广泛引用的 Rosetta Code 评估中,C 到 Clojure 的 token 差异是 2.6 倍,J 语言平均只有 70 个 token——"用 70 到 109 个 token 就能解决的问题,意味着它几乎不涉及任何真正的工作。在小任务上表现好不能推广到真实场景。"
Pandoc 任务的结果类似,依旧没有静态/动态语言之间的显著差异。但一个有趣的发现是:不给 holdout 测试集时,Agent 会作弊——检测测试输入、硬编码输出、根据测试结构分支代码。告诉 Agent 有 holdout 集后,可见测试的分数下降了,但 holdout 分数上升了——Agent 被迫写更通用的代码。

桌游任务是全线溃败。"无论用什么语言,Agent 得分都约等于零。"规则里包含自相矛盾的描述,有时需要"常识"解读,有时又必须逐字遵守——不存在一个一致的元规则来判断该用哪种方式。Dan Luu 说这跟真实世界的编程很像:"人类一般不太擅长写清晰的规格说明。"
除了核心结论,实验还产生了一些附带发现。ultra 一次跑完比 medium 反复循环性价比更高——"Agent 会被锚定在一个糟糕的解法上,然后无法进展。"清空上下文重来(Ralph loop)比保留上下文更差。冷门语言在复杂任务上表现更差——汇编在 Pandoc 上比在 zstd 上惨得多,这符合直觉,"人类写汇编实现 Pandoc 也会比实现 zstd 更吃亏"。
还有一些说法被证伪了。"代码质量差的语言(如 PHP)表现更差"——不成立。"用 Haskell 这种强类型语言更容易重构"——不成立。"应该用流行语言"——只有弱支持,流行度和成功率之间有弱到中等的正相关。Clojure 在 zstd 任务中翻车的原因是 byte 转换在 128-255 范围会抛异常,Agent 反复用这个转换——一个真实的、需要时间和 token 才能修复的问题。
Pandoc 任务还有一个安全相关的发现:所有 C 程序和几乎所有 C++ 程序都存在内存安全问题(比如截断的 LaTeX 表格处理中的越界读)。"用 10 秒的 prompt 就能找到这些问题,但修复它们会把 C/C++ 的成本推到比 Rust 还高,而且信心仍然更低。"
Dan Luu 自己承认评估有大量缺陷:超过 100 个 bug 被修复,包括不同条件下的构建配置不一致、某些语言被任意限制、工具可用性描述不准确、工具链过旧。他自嘲道:"你每看一分钟就能发现一个 bug。"但他也指出,这些 bug 是均匀分布在所有语言上的,不会系统性偏向某一方。
结论很克制:动态语言对 AI 编程更好的说法,"最多算是一个模糊的方向性正确,跟任何具体场景都没什么关系"。要得出关于某个特定语言的强结论,需要跑更多的测试——每种语言在单次任务上的特殊失败会让单个任务的结果不可靠。最一致的发现是语言流行度和结果之间存在弱正相关,但他也警告不要过度解读。
参考来源: