Aioga
AI资讯 / 行业动态
返回 AI资讯

编写智能体时,哪种编程语言最合适?

Hacker News 热门(buzzing.cc 中文翻译)Aioga 编辑团队2026-08-11T04:58:14.000Z热度 72

针对"动态语言比静态语言更省 LLM token"的流行说法,作者用 GPT-5.6 Sol 让智能体实现 zstd 解码器进行实测。结果显示,medium 努力度下动态语言表...

行业动态Hacker News 热门(buzzing.cc 中文翻译)

今日 AI 情报摘要

针对"动态语言比静态语言更省 LLM token"的流行说法,作者用 GPT-5.6 Sol 让智能体实现 zstd 解码器进行实测。

结果显示,medium 努力度下动态语言表现更好,ultra 下静态语言反而更优,且此前评测存在测试路径错误等缺陷。 作者认为,琐碎任务上的性能无法推广到更大问题。 🔗 阅读原文 via AIHOT · https://aihot.virxact.com/items/cmso7i0al0dlsrofwivmpsjh1

中文正文 · AI 翻译

这个相对广泛引用的帖子:https://martinalderson.com/posts/which-programming-languages-are-most-token-efficient/(无论如何,我一直看到它被引用)表明,动态语言和/或以更简洁方式表示事物的语言在令牌效率上更高。似乎它被引用得足够多,以至于LLM搜索结果也认同这一点。例如,当我搜索“dynamic vs static language token cost”(不带引号)时,谷歌的AI摘要开头是

动态类型语言通常比传统的静态类型语言具有更低的LLM令牌成本,因为省略显式类型声明使代码更加紧凑。

谷歌的AI引用了同一篇帖子,该帖子表明一些简洁的动态语言的令牌成本可能只有静态语言如Rust、Go、C++等的1/2到1/3。作者说

C(我比较的令牌效率最低的语言)与Clojure(效率最高的语言)之间存在非常显著的2.6倍差距。

然后他们后来尝试了 J,说

它的平均仅为70个令牌,几乎是Clojure(109个令牌)的一半。当数组语言避免使用特殊符号集时,它们可以非常高效。如果令牌效率被证明是一个关键驱动因素,这也许是语言发展的一个非常有趣的方向。

我找到的另一个动态语言与静态语言令牌比较的例子是这个:https://github.com/mame/ai-coding-lang-bench,它支持同样的结论。如果你想把它作为这系列关于基准测试、评估和实验设计练习的第8部分:/exercise-7/,你可以点击链接并在进一步阅读之前思考评估问题。

在没有运行我们自己的评估之前,第一个实验的问题之一是这些问题过于简单,从上面的引用中可以看出;一个在 J 语言中可以用 70 个符号解决,在 Clojure 中用 109 个符号解决的问题根本算不上问题(作者使用了 Rosetta Code)。正如我们在查看 caveman 模式与我们自己评估的其他评估时看到的:/ai-coding/,对于大多数工作只是打印答案的简单问题,与那些实际上需要一些“真正工作”的稍微复杂问题相比,结果可能会大不相同;当你开始关注需要的不仅仅是几个符号的更复杂问题时,caveman 模式声称的大幅收益及其复制结果会消失。一般来说,简单任务的表现不能泛化。

第二个链接中的问题稍微复杂一些,因此我们将大部分问题延后至附录,但其中包括一些问题,例如其中一个测试执行了错误的路径(该路径不存在),导致测试失败。随后一个代理创建了不存在路径的符号链接到其自己的可执行文件,这在该情况下有效,但也导致所有后续测试都运行那个代理的可执行文件而不是正确的可执行文件。作者试图从 Rust 出现一些失败的情况中得出结论,但这仅意味着 Rust 的评分是在 Go 代理将所有在该故障测试中的评分符号链接到 Go 可执行文件之前进行的。

与其依赖这些评估,我们可以尝试运行一些我们自己的评估。正如我们从这些评估以及我们在上一次关于评估的练习中讨论的评估:/exercise-7/ 所看到的,很容易创建一个评估,而该评估并没有说明其创建者认为它应该说明的内容。毫无疑问,这些评估也不会例外,并且会存在缺陷(更多细节见下方附录)。

作为建立直觉的一种方式,我喜欢在看结果之前先预先记录猜测 1:#fn:P。我与朋友预先记录的一些内容包括:

在第一次评估中,我尝试给代理提供 zstd RFC(加上勘误表),并告诉他们实现一个完整的 zstd 解码器(代理被限制在没有互联网访问的容器中)。测试没有提供给代理。对于像 zstd 这样复杂的内容,不太可能期望测试覆盖每一个可能的情况。例如,尽管 zstd 是一个经过相当广泛测试的软件,我曾经还是发现了 zstd 中的数据损坏错误:https://github.com/facebook/zstd/issues/1672。测试套件并不是为了发现可能潜变量多年的极端边缘情况,而是为了检查各种可以“轻松”从 RFC 中推导出来的应该能正常工作的情况。

下面,x 轴是成本,y 轴是正确性得分(向上和向左更好 / 向下和向右更差);使用 GPT-5.6 Sol 在中等和超高努力下的平均结果。如果我们仅看中等努力(并忽略不同任务上结果可能大幅不同的事实),我们可能会得出像 Alderson 评估那样的结论,即动态语言在使用 LLM 时更高效、更好,因为(忽略相对不常见的语言)动态语言的集群位于静态语言集群的上方和左边(我们使用 Alderson 的静态与动态颜色编码以便一眼比较)。但如果我们看超高努力,结果就相当混合,有几个静态语言达到最佳,其中较佳结果中静态语言比动态语言更多。

下面的图表还可以切换,将 x 轴从成本转换为时间。mame/ai-coding-lang-bench 指出尽快得到结果是有价值的(我个人觉得情况并非如此,因为结果生成需要足够长的时间,我会同时处理其他任务,而不是等待),所以我们也可以看看这个。类似地,我们观察到没有哪种语言类型完全占优,尽管在这项特定任务的中等努力下,最佳动态语言的结果再次优于最佳静态语言的结果(不过,结果仍然相当接近)。

我们可以观察到,就像当我们比较完全微不足道的穴居人模式评估与稍微复杂一些的穴居人模式评估时一样,在微不足道的评估中存在的非常强的关系并不能推广到这个更大的案例中。正如当时的情况一样,在这些更大的评估中,性能的极端比率消失了,除非在我们可能预期性能不佳的情况下,比如使用汇编(这对人类来说将显著更耗时和困难)以及使用相对不常见的语言,而我们可能不指望 AI 实验室会投入精力生成合成的强化学习环境数据。

请注意,这与第一轮评估得出的结论相反,当时结论认为像 J 这样非常密集的语言出于效率原因可能是合理的。也许使用一种不常见(且“奇怪”)的语言是合理的,如果你有非常大的预算并且可以训练或微调模型以在你偏好的语言上高效,但如果你是 LLM 的普通用户,看起来坚持使用主流语言可能比使用不常见的密集语言更可靠。

事实证明,如果我们绘制语言流行度与本次评估表现的关系(未显示),我们会观察到一种从弱到中等的正相关,使用更流行语言的结果不仅更正确,而且成本更低。

正如我们之前指出的,非常密切相关的评估可能会给出显著不同的结果。例如,在这里的 Optimization 1 与 Optimization 2 评估中,当 Optimization 1 和 Optimization 2 优化 wasm 中的 bzip2 压缩和解压缩时,我们看到了显著不同的结果,而这些评估任务之间关系相当密切。要想提出一个强有力的、普遍性的声明,比如“动态语言比静态语言更高效”,我们必须在许多任务中进行评估。然而,展示像这样的声明

充其量可能只是大致方向上正确,并不真正与任何特定案例相关,也可能不够有力而无法在一般情况下适用,我们只需尝试几个案例,就能看到这个说法通常不成立。如上所示,在一个努力水平上,这个说法似乎或多或少有点正确,但存在例外,而在更高的努力水平上,这个说法似乎并不特别正确,这足以说明这个说法可能不是普遍成立的,前提是我们的评估存在一个会完全使其失效的混淆因素。

但是,为了对一个非常不同的任务有一个了解,这个任务也以不同的方式呈现(更像 TDD 而不是“阅读规范”),接下来的评估采用了 Pandoc ProgramBench 评估,并对我们的使用情景进行了修改。我们没有使用 ProgramBench 提供的逆向工程任务,而是向代理呈现 ProgramBench 材料以及 ProgramBench 测试,然后根据一个保留测试集来评分每个条件的性能 2:#fn:H。

在下面的结果中,x 轴仍然表示成本,y 轴表示在保留测试集上的得分。

与之前一样,我们没有看到成功率或成本与语言是否静态或动态或者是否非常密集之间有非常强的关系。我们再次看到,相对不常见的语言表现较差(尽管 Clojure 在这里表现明显好于 Zstd)。此外,汇编语言表现更差,这似乎是预料之中的,因为我们会预计人类编写汇编实现 Pandoc 的难度远高于实现 Zstd,并且没有强烈理由认为大模型在这方面会不同。

我对使用大模型时什么有效有很多疑问(例如,哪些测试技术效果好,哪些语言效果好,哪些软件架构效果好,修复 bug 的成本是否因语言而异,程序一般维护成本是否因语言而异等)。大多数问题在公开数据中尚未得到答案,如果 AI 实验室已经有答案,这些信息大多没有公开。

关于某种语言适合用于大型语言模型(LLM)的各种说法,大多数似乎都是错误的(例如,上文链接的评估中提到的 Ruby、Clojure 和 J 特别适合 LLM 的说法,以及相对普遍的说法——Elixir 特别适合 LLM),但目前尚不清楚什么是正确的。

在2014年,我们查看了关于静态类型与动态类型的文献:/empirical-pl/,发现除了少数几个案例研究之外,调查文献并没有提供太多有用信息。举一个典型学术研究的例子,我们看了论文《静态类型系统是否提高了软件系统的可维护性?一项实证研究》,我对此评论道:

受试者被分配到需要修复现有代码中的错误或填写桩方法的类中。Java 使用静态类,Groovy 使用动态类。在类型错误(及其对应的方法不存在错误)情况下,开发者在 Java 中解决问题的速度更快。对于语义错误,二者没有差异。该研究使用了被试内设计,并对33名受试者的任务顺序进行了随机化。一个显著的限制是研究避免使用“复杂控制结构”,如循环和递归,因为这些会增加解决问题所需时间的差异。因此,所有错误都是微不足道的。这可以从完成任务的中位时间看出,时间为数百秒。任务可能包含多个错误,因此每个错误的时间相对较低。

选择避免“复杂控制结构”的任务,例如循环和递归,在任务需要数百秒的情况下,会使结果对于真正消耗专业程序员时间的任务变得毫无意义,就像我们在第一次评估中看到的任务只需几十到一百多个令牌。然而,对于大语言模型(LLM),我们实际上可以给它们提供非平凡的任务并比较它们的表现。这里存在一个问题,即结果对于不同任务的泛化能力如何,但在人工研究中我们也会遇到完全相同的问题,甚至更糟(LLM的方差很大,但人的方差更大,因为你无法让同一个人用不同的随机种子完成大量任务)。而且,虽然花20美元让LLM实现一个Zstd解码器并不便宜,一旦考虑到语言种类和每种语言每种条件的迭代次数,这个成本会翻倍,但如果考虑雇佣一个能够阅读zstd RFC并实现它的专业程序员的成本,那么类似的研究根本不可能完成,因为成本高得不可行。对于Pandoc任务,这个成本问题更严重。

对于LLM,很多问题从几乎无法回答变成了通过一些努力和少量令牌就能回答的问题。由于当前的激励机制(见注解3:#fn:I),尚不清楚我们是否能在近期得到这类问题的答案,但至少现在可以尝试去解决它。

我看到有很多宣称,这些评估无法证明或否定(原因如上所述,由于不同问题之间的方差,需要尝试更多任务),但这些评估可以提供一些启示,例如:

对于我预先注册的猜测,我们有

顺便说一下,Clojure在Pandoc评估中相比Zstd评估提升如此之大的一个主要原因是,在Zstd评估中,36/40个中等和5/40个超难Clojure程序出现测试失败,因为字节转换在128–255范围内会抛出异常(可能应该使用unchecked-byte?),而它们不恰当地使用了这种转换。

这是一个真实结果,因为如果你让最先进的、公开可用的 GPT 模型去实现 Zstd(并且大概如果你去做其他可能涉及位/字节操作的任务),它会生成在这一点上失败的代码。如果有测试能发现这个问题,bug 会被修复,但这仍然会消耗时间和 tokens。无论某种语言表现好坏,到处都会有这种成本(例如,cargo 经常被调用时参数错误,虽然会立即被抓到并修复,但我注意到这个循环在我的实际项目中可能实际消耗相当多的真实时间,除非你给 codex 明确指令如何调用 cargo,并且在上下文窗口中显然值得为此留出空间)。

无论如何,这一切都说明了为什么如果有人想要对哪些语言或语言类别在 LLM 上表现特别好提出强有力的论断,他们需要运行相当多的不同评估。如果我们深入探讨某个特定条件为何得到某个分数,导致该分数的失败通常是某种特例,很难明确问题在不同任务或不同设置下的普遍性。无法仅看一次评估或甚至五次十次评估的分数就对编程整体得出结论。

确实,在 Zstd 评估和 Pandoc 评估中,我们看到语言的流行度与正面结果(更高的正确率、更低的成本、更短的实际耗时)之间存在相关性,看起来可能在其他评估中也会如此,但对任何特定语言得出强烈结论都是错误的。我在查看不同项目根据 GitHub CI 数据有多经常出现构建失败时就给出过这样的警告:/broken-builds/,指出一个构建失败的频率在不同项目之间可能有不同原因,不应轻易得出强结论,因为项目间的结果不一定可比(例如,如果一个项目的主分支是经过其他审核的某种发布候选版本,这个项目预计构建失败率会低,但这不能与直接在主分支上开发的项目相比较)。

不久之后,一位在某门语言中得分很高的人(如果没记错的话,是Martin Odersky和Scala)发推了这条帖子,称该语言的高排名是该语言的胜利。那是不合理的结论,鉴于这里存在多种差异因素,任何关于单一语言的结论在这里就更加不合理。

这些数据(假设评估有效性)可以反驳一些强烈的主张,并暗示其他主张,但它实际上只能对某些语言类别提出启示,而对特定语言而言则不然,因为只有两个任务,而任何特定语言可能因某些特殊原因表现优异或不佳,这些原因可能推广到其他任务。

感谢 Max Bittker、Yossi Kreinen、Aaron Levin、Alan Boll、Luke Burton、Marco Primi、Milosz Danczak 和 Justin Blank 提供的评论/纠正/讨论。

正如我上面说的,我的评估是快速粗略的,我相信它有很多缺陷,所以我并不是说我这里展示的评估很棒,这一定不好,而是Endoh人工智能代码和实验室评估中存在的一些问题。

一个问题是某些测试似乎运行了错误的可执行文件。出版连载的设定似乎已经执行....../..当候选生成的可执行文件位于 .. 时,每个候选测试的目录中都包含 /minigit。/minigit。../../minigit 不存在。

由于静态类型语言的正确性评分较低,评估作者指出“600次运行中唯一的失败是在Rust和Haskell(两者都是静态类型,且都是相对'难度'的语言)中”,并建议“困难语言”,如“C的内存管理、Rust的所有权模型和Haskell的单子/纯度,可能会增加AI的开销”。

然而,Rust 的失败是因为在 ../../minigit 没有可执行文件,导致测试失败。第一次 Go 运行通过执行 ln -sf minigit-go-1-v1/minigit ../minigit 并将 generated/minigit 链接到其自身运行中,从而“修复”了这个问题,但这意味着之后的每次执行(针对每种语言)实际上都执行了第一次 Go 运行的可执行文件。在重新对 Rust 使用其自身可执行文件进行评分时(而不是因为尝试执行不存在的文件而失败),Rust 获得了满分,从而否定了 Rust 失败的原因是因为它是一种难处理的语言的理论。

其他测试也存在问题。例如,有两个测试的结构会导致它们无论实际值为何都通过。其中一个测试包含

内部的 if 在两个分支中都是 pass,这意味着这几乎等同于

内部的 if 似乎本应进行实际检查,但由于编码错误(可能是复制+粘贴错误?),检查实际上被省略了。

此外,如上所述,代理可以修改测试环境,第一次 Go 代理这样做是为了修复损坏的环境。他们可以完全访问测试和环境,并且可以做任何事情,测试套件在开发过程中是可见的,没有保留,这很容易导致通过特殊处理代码的方式作弊,从而通过测试但创建出在“现实生活中”无用的程序。从高层次来看,似乎发生了类似情况,许多程序无法实现规范的大部分内容,但仍然通过了所有测试,这可能表明代理“理解”了如何通过测试并优先于实现规范(也可能表明测试非常简单,容易通过)。

另一个问题是 Claude Code CLI 的版本在所有运行中并不一致(从 2.1.66 到 2.1.68 不等)。还有一些其他类似的问题可能也很重要,但相比上述问题可能影响较小。

作为一个可以比较的例子,我很好奇使用medium + 让代理继续工作在成本效益上如何,同时,在我脑海深处,我也有一个问题关于一些“Ralph循环”支持者说的,你最好在每次循环迭代时清空上下文窗口,然后重新给代理完整的提示。和上述一样,我这里的预先注册的猜测是:

下面,我们有medium循环与ultra的平均结果,对一个简单地恢复那些测试正确率不为100%的单次运行的提示,以及一个类似Ralph循环的提示——丢弃上下文并重新给出原始提示(x轴为成本,y轴为正确测试用例数量),结果按ultra正确率从高到低排序:

对于这个问题,平均而言,单次运行ultra似乎比多次运行medium每单位成本更好(在每单位时间上更是如此),并且继续使用之前的上下文比Ralph循环更优秀。简单地重复运行medium的问题在于,代理可能会被一个错误的解决方案锚定而无法取得进展。Ralph循环背后的理论是,你丢弃可能导致这种情况发生的坏上下文,但这并不能让你避免产生一个错误的产物。

仅从使用LLM的经验来看,通常你丢掉一段代码并让LLM从头重写它,比让LLM修改或尝试原地重写更好。Michael Malis,他一直在用Rust重写Postgres并进行重大变更,也注意到了这一点。这也与之前提到的观点相关:/ai-coding/ 由于高方差(加上这种路径依赖性),你通常最好多次尝试并取最佳结果,如果你不介意花费这些tokens。

仅从这个条件来看,很难对静态语言和动态语言做出过多评论,但像“静态语言在迭代时表现更好”这样的天真想法并不显而易见正确。如果有一个模式让我印象深刻,那就是在 Ralph 循环最糟糕地逊色于继续使用上下文的情况下,通常是动态语言。这可能是因为缺乏类型信息,但我们需要更详细地观察轨迹差异,同时查看其他示例,以判断这是否是真正的模式。即使你现在不关心 Ralph 循环,因为 Ralph 循环的趋势已经过去,当你开始一个新任务或用新的上下文开始时,能够更有效地对代码库进行更改可能是你会关心的,而这里的模式暗示了一个可能的优势。

我尝试做了第三次评估,看起来更像是“业务逻辑”类型的评估,无论是在问题呈现方式上还是问题的实际执行上。你可以认为 Zstd 评估和 Pandoc 评估对程序员来说是相当不寻常的任务,因为很少有程序员能收到像 Zstd RFC 那样编写得如此完善和详细的规范,也很少有程序员会在 ProgramBench 测试中得到如此多的预先创建的测试。

这里的想法是实现一个桌面游戏。通常,桌面游戏规则是由不擅长编写清晰规范的人编写的,所以实现桌面游戏更像是一个非程序员(或不是编写良好规范专家的程序员)给别人一个任务时的情况。

在桌游规则中,严格按照规则原文阅读是错误的,你需要用“常识”(或阅读某种常见问题解答)来正确游玩规则,这种情况相当常见(有些游戏设计师会努力避免这种情况,比如J C Lawrence,但这种情况相当少见)。《亚特兰蒂斯守卫》有不少类似的规则。《亚特兰蒂斯守卫》的设计者也明确表示,规则的精神或常识性的解读并不存在,他说你应该始终严格按照规则的文字来阅读,所以也有很多情况下你需要忽略“常识”的解释,严格按照规则本身来阅读。这种组合对大型语言模型来说相当困难(而且,从我看到人类按照设计意图玩游戏的速度来看,对人类来说也相当困难)。

我唯一稍微信任这一点的原因是,Pedro Oliveira也实现了《亚特兰蒂斯守卫》,他们采用了完全不同的方法(一种更标准的人类驱动大型语言模型,而不是让大型语言模型自己解决问题)。当我们比较不同实现时,发现每个版本大约有10个左右的bug。可能还存在一些漏洞,比如我们两个实现错误地做了同样的事情,也可能有些实现不同但检查系统没注意到,但我认为我们两个实现的规则现在都相当稳固。这就是我为这款游戏做神谕的方式。

我喜欢这个任务,因为它更像现实生活中的“规范”,规范模糊、矛盾,有时甚至错误,然后你需要用其他信息来得到正确结果。为了避免让它成为测试大型语言模型访问繁琐格式数据的测试(比如将开头的一组图片转换为某种结构化数据,将规则扫描转换为文本等),我给代理提供了任何我指示大型语言模型提取数据的原始文件(这也需要各种一致性检查以确保正确)提取数据(原始数据被展示以便LLM在选择时检查原始数据是否有提取错误)。

虽然我在使用较旧的模型时完成了这项任务(我用 GPT-5.1 或 5.2 完成了一部分,然后又用 5.4 或 5.5 完成了另一部分),但在使用较新的模型且没有给予像对旧模型那样的指导时,这项任务仍然太难了。无论使用哪种语言,代理在这项任务中的得分大约为 0。

顺便说一下,如果你好奇大型语言模型(和人类)在什么方面会遇到困难,这里有一些例子。有一张卡牌,其文字写着“对靠近你的一个单位造成攻击。攻击后:可以在不同的敌方英雄身上重复一次。”

在这款游戏中,英雄是一种单位。严格按照规则并完全理解其含义,例如“攻击后”是什么意思等,这应该意味着你可以攻击一个单位,或者可以攻击两个英雄(毕竟,要在不同的敌方英雄身上重复攻击意味着第一个单位是一个英雄;否则那将是一个不同的单位是英雄,而不是不同的敌方英雄)。

这张卡实际上在卡牌上印有一种有效的勘误,因为有人抱怨不清楚;勘误写着“(即使原始目标是随从,也可以重复)”。这对大型语言模型(以及一些人类)来说已经令人困惑,但真正的问题是,还有其他卡牌使用相同的结构却没有这个修正。要正确使用具有相同结构的其他卡牌,你需要知道每次使用这种结构时,都应该使用这张卡牌上所示的勘误。游戏设计师喜欢使用的有许多结构,其具体意义并非字面意思,你必须牢记这一点。

情报判断

Aioga 编辑摘要

Aioga 编辑摘要:针对"动态语言比静态语言更省 LLM token"的流行说法,作者用 GPT-5.6 Sol 让智能体实现 zstd 解码器进行实测。 Aioga 将其归入「行业动态」方向,重点关注它对真实使用和行业竞争的影响。

背景分析

背景分析:产品与工具类动态的价值取决于它是否解决明确场景、能否进入工作流,以及交付、价格和数据安全是否可接受。

Aioga 观点

Aioga 判断:这条动态更适合作为行业观察信号,当前信息足以建立线索,但不足以推导长期结论。

影响与后续

影响分析:对相关团队而言,短期应先核对来源、可用范围和实际成本,再判断是否值得接入或跟进。 后续观察:继续观察产品是否开放使用、用户反馈、定价、集成能力和后续版本更新。

来源与版权说明

本页正文由公开来源页面提取并按原有信息整理,同时保留来源、发布时间和原文入口。版权归原作者及来源网站所有,请通过原文链接核验和阅读来源版本。

抓取通道: 摘要聚合 · 原始域名: danluu.com

来源: Hacker News 热门(buzzing.cc 中文翻译)

原文链接: 打开原始来源

Aioga 归档: 查看情报页

Content record: source-page · Updated: 2026-08-11T04:58:14.000Z

API 中转站
API RELAY · DEVELOPER INFRASTRUCTURE

API 中转站

统一接入主流 AI 模型 API,为开发、测试与生产环境提供稳定调用入口。

立即访问 api.w173.com
AIOGA SHARE POSTER

分享这篇 AI 情报

针对"动态语言比静态语言更省 LLM token"的流行说法,作者用 GPT-5.6 Sol 让智能体实现 zstd 解码器进行实测。结果显示,medium 努力度下动态语言表...

Hacker News 热门(buzzing.cc 中文翻译)2026-08-11T04:58:14.000Z
扫码打开文章详情扫码直达文章详情

Aioga 自动聚合全球 AI 动态,并保留来源信息用于核验与引用。