原贴链接

我能理解为什么它(LLM)在Python方面表现出色:Python无处不在、广受欢迎、可读性很强,而且大多数软件都是开源的等等。但用C编写的代码比其他任何语言都多。从智能恒温器、手机、飞机到超级计算机,C语言无处不在。它已经存在了几十年,并且大多符合已经存在了几十年的标准。C90可能是最常用的标准,已经有35年的历史了!然而,如果我要求一个大型语言模型(即使是一些最前沿的模型)去总结一个代码库,按模块解释代码组织和功能,解释数据结构,编写一个简单算法等,它们总是做得很糟糕。相比于它们为Python、TypeScript、Java、Rust等代码库所能提供的优雅和理解能力,只是一小部分。我最好的猜测是以下一些因素的组合:1. 文件级(而非对象级)包含到全局命名空间中,使得对代码的推理极其复杂。特别是,如果不知道构建系统、编译器和链接器是如何工作的,基本上不可能知道C代码文件中定义了什么。2. 与高级语言相比,C代码的表达能力相对较弱,这导致代码库规模更大,因此由于上下文限制而更难处理。你们有其他见解吗?有没有特定的大型语言模型在这项任务上比其他模型做得更好?

讨论总结

该讨论主要围绕大型语言模型(LLMs)在处理C/C++代码时表现不佳这一主题展开。部分评论者从LLMs自身特性(如不能在标记外推理)、C/C++的语言特性(如代码复杂、给予程序员自由度大等)、训练内容、代码模型偏差等方面分析原因。不同的LLMs表现有所差异,如Claude在少量C/C++文件时表现尚可,ChatGPT在C++方面表现糟糕。还有评论者将C/C++与其他语言对比,并且讨论延伸到人类编写C/C++的难度、LLMs在其他语言(如Rust、汇编、硬件描述语言)的表现等,讨论热度有高有低,整体氛围较理性且有不同观点的交流。

主要观点

  1. 👍 LLMs在处理C/C++代码时整体表现不佳。
    • 支持理由:多方面原因,如C/C++代码的复杂性、LLMs自身推理限制等。
    • 反对声音:有评论者认为是提示词没写好。
  2. 🔥 Claude处理C/C++代码时,在代码文件数量少(1 - 2个)的情况下表现尚可,多文件情况则表现差。
    • 正方观点:有使用者表明在少量文件时效果可以。
    • 反方观点:无明显反对观点。
  3. 💡 缺乏训练内容可能是LLMs处理某些语言(如COBOL)代码差的原因。
    • 解释:某些语言缺乏足够的训练素材,导致LLMs表现不佳。
  4. 💡 可以尝试让LLM先对代码进行文档化来改善处理效果。
    • 解释:通过文档化可以帮助LLM更好地理解代码。
  5. 💡 不能期望LLM在处理大量代码token时表现完美。
    • 解释:LLM本身的能力限制。

金句与有趣评论

  1. “🤔 IMO, it does fine with code that is at most spread across 1 - 2 files. As soon as you start talking about entire codebases with lots of libraries and modules, it has no fucking clue what is going on.”
    • 亮点:生动地描述了Claude在处理不同规模C/C++代码时的表现差异。
  2. “😂 Have you tried COBOL? 🤣🤣🤣 It really sucks (all LLMs) to understanding COBOL codes. \n\nI have a theory: They suck because of the lack of content for Trainning.”
    • 亮点:以幽默的方式引出LLMs对COBOL代码理解差可能是缺乏训练内容的观点。
  3. “👀 Python is to checkers what C++ is to chess. Once AI beats humans at C++ we are doomed.”
    • 亮点:通过对比Python和C++,形象地表达了C++的复杂性以及AI在C++上超越人类的严重性。
  4. “😉 I believe this is because LLMs cannot do real reasoning outside of their tokens.”
    • 亮点:指出LLMs不能在标记之外推理这一关键原因。
  5. “🤨 C and C++ provide programmers with great freedom to shape the language using macros, templates and interleaved machine code.”
    • 亮点:阐述了C/C++的语言特性。

情感分析

总体情感倾向较中性,主要分歧点在于LLMs在C/C++上表现不佳的原因。部分人从LLMs本身能力、C/C++的特性等方面找原因,有人则认为是使用者提示词写得不好。可能的原因是大家对LLMs的理解、使用经验以及对C/C++语言的认知不同。

趋势与预测

  • 新兴话题:LLMs在汇编语言、硬件描述语言等更多类型语言上的表现。
  • 潜在影响:可能促使人们对LLMs的训练方式、能力评估等进行重新思考,也可能影响开发者在选择处理C/C++代码工具时的决策。

详细内容:

标题:为何大型语言模型在编写和理解 C/C++时表现不佳?

在 Reddit 上,一个题为“为何大型语言模型在编写/理解 C/C++时表现如此糟糕?”的帖子引发了热烈讨论。该帖子获得了众多关注,评论数众多。原帖指出,虽然 C 语言的代码量巨大且应用广泛,但大型语言模型在处理 C/C++相关任务时却表现不佳,例如总结代码库、解释代码组织和函数模块、解释数据结构和编写简单算法等。原帖作者还给出了自己的最佳猜测,包括文件级包含到全局命名空间使代码推理极其复杂,以及 C 语言相对高级语言的表现力较低导致代码库规模较大从而增加了上下文处理的难度。

讨论焦点主要集中在以下几个方面: 有人认为 Claude 在处理 C 和 C++方面表现出色。但也有人指出,对于多文件和复杂的代码库,大型语言模型往往不知所措。有人提出缺少训练内容是模型表现不佳的原因之一,还有人建议让模型对代码进行文档化处理,先明确输入和输出、总体目的,再引入细节。有人认为应从接口入手,这样模型能表现得更好。也有人认为以目前的 Transformer 架构的大型语言模型,处理整个代码库并期望其表现完美是不现实的。

有用户分享道:“作为一名长期从事编程工作的人员,我在处理 C/C++代码时也常常感到头疼。大型语言模型面临同样的问题并不奇怪,毕竟 C/C++的复杂性是众所周知的。”

对于模型表现不佳的原因,观点各异。有人认为是因为大型语言模型无法进行真正的推理,在 Python 和 JavaScript 中,代码侧重于更高层次的问题空间,所以从提示到代码的转换更容易。而在 C/C++中,对问题的理解与机器和编译器的实际操作直接相关,很多相关知识并未在语言的标记中紧密编码。

同时,也有共识认为 C/C++的语法复杂,对编程人员的要求较高,这不仅对人类来说具有挑战性,对大型语言模型也是如此。

总之,关于大型语言模型在 C/C++方面表现不佳的原因,讨论呈现出多样化和深入的特点,为我们理解这一问题提供了丰富的视角。但如何进一步提升大型语言模型在处理 C/C++这类复杂语言上的能力,仍有待进一步探索和研究。