“自然语言编程”的愚蠢之处(1978)

面向编码的自然语言界面重新唤起了一个由来已久的梦想,而 Edsger Dijkstra 早在 1978 年就认为这个梦想从根本上是错误的。评论者将他对形式语言精确性的强调,与当今的大语言模型进行对比,指出 AI 现在确实可以把模糊的英文请求转换成可运行的代码,但它仍然继承了自然语言的歧义性、缺乏保证以及对人工监督的依赖。许多人更倾向于把 LLM 看作随机性的初级开发者或代理,而不是“自然语言编译器”;它们有助于加速工作、提高抽象层次,但并不能取代传统编程语言、规格说明或严谨的软件工程。

“自然语言编程”的范围

  • 许多人认为这篇文章至今仍适用:自然语言是非正式的、含糊的,不适合作为主要程序表示。
  • 几位评论者强调,如今的“自然语言编程”实际上是把自然语言委派给一个代理,由它再写出传统代码。
  • 少数人认为原始批评已经“无关紧要”,因为自然语言现在只是又一层会被编译成形式语言的抽象层。

LLM:编译器、开发者,还是别的什么?

  • 强烈观点:LLM 并不会取代编译器;它们取代的是(或增强的是)把非正式规格翻译成代码的软件开发者。
  • 也有人把 LLM 看作某种新的解释器,针对一种定义不充分的语言(提示词),也就是一种编程形式,只是语义是概率性的。
  • 争论焦点在于,提示词到底算不算真正的“编程”,还是只是在给另一个类似程序员的实体下指令。

确定性、语义与可靠性

  • 多条评论区分了确定性的编译器流水线和随机、上下文敏感的 LLM 输出。
  • 有人反驳说人类在实践中也并非确定性的,但也有人坚持,随机性与单纯的变化是不同且更强的一种概念。
  • 普遍共识是,编译器和丰富的类型系统对于语义保证、测试以及对 LLM 生成代码进行安全检查仍然至关重要。

规格说明、会议与系统理解

  • 几则轶事强调,实际工作依赖于澄清含糊的自然语言规格,无论是由人还是由代理来做。
  • 业务用户即使面对自然语言配置也常常吃力;“系统思维”和规格说明能力依然罕见且关键。
  • 代理缺乏现实世界的上下文(基础设施、组织约束、责任归属),限制了分析师/工程师角色的完全自动化。

代码、提示词与事实来源

  • 很多人坚持,版本控制中的语言(Java/Python 等)决定了系统“是用什么编程的”,不管这些代码是如何生成的。
  • 有人预见,提示词或对话最终会被视为主要工件,这会带来可维护性和开源许可方面的问题。
  • LLM 输出被类比为任何一次性的代码生成器:可维护性和可复现性依然是问题。

经验性体会与小众例外

  • 用户报告称,通过代理“氛围编程”应用取得了成功,但也指出其会遗漏非功能性需求、基础设施细节和微妙的 bug。
  • Inform7 和法律文书起草被引用为准自然语言的例子:可读,但仍受到高度约束,这凸显了真正的自然语言编程有多难。