Hacker News 中文摘要

RSS订阅

The foolishness of "natural language programming" (1978)

自自动计算早期以来,就有人把编程需要形式符号的细心与准确看作缺陷。他们责怪机器严格服从指令,哪怕稍加思考就能发现明显错误。阿尔弗雷德·爱德华·豪斯曼(A.E.Housman)说,片刻漫长,思考痛苦。机器代码几乎无冗余,很快被视为人机间不必要的危险接口;高级编程语言因此发展起来,许多愚蠢错误只给出错误信息而非错误答案。

正文

从自动计算早期起,就有人把编程需要像使用任何形式符号体系那样细心和精确,视为一种缺陷。他们责怪机器这个“机械奴隶”过于严格遵守指令:哪怕稍加思考就能发现指令里有明显错误,它仍会照样执行。正如 A. E. Housman 所说:“可是,片刻是很长的时间,而思考是痛苦的过程。”他们热切期待更“懂事”的机器,希望这种机器会拒绝执行当时由一个小小笔误引发的那类荒唐操作。

机器码几乎没有任何冗余,很快被视为人机之间一种不必要地危险的界面。为应对这一点,所谓“高级编程语言”被开发出来;随着时间推移,我们也在一定程度上学会增强对愚蠢错误的防护。一个显著改进是:许多愚蠢错误现在会触发错误信息,而不是给出一个错误答案。不过这种改进并非人人欣赏:有些人觉得无法忽视的错误信息比错误结果更烦人;在评判编程语言优劣时,有些人似乎仍把“编程容易”等同于“容易犯下检测不出的错误”。然而,与编程语言对应的抽象机器依然是一个忠实的奴隶,也就是一个完全能够执行荒唐指令的、没有头脑的自动机。编程仍然是在使用形式符号体系,因此仍像以前一样需要细心和精确。

为了让机器明显更好用,有人提议并尝试设计可以用我们的母语来指挥的机器。诚然,这会让机器复杂得多;但有人主张,既然让机器承担更大份额的负担,我们的生活就会更轻松。只要你把困难的根源归咎于“必须使用形式符号”,这听起来确实有理。但这个论证站得住脚吗?我怀疑。

我们现在已经知道,选择界面并不只是把固定总量的劳动做一次划分,因为跨界面协作和沟通所需的工作还必须加进去。冷静的经验还告诉我们:更换界面很容易让界面两边的工作量都增加,有时甚至是急剧增加。因此人们越来越偏爱所谓“窄界面”。所以,尽管改用人类母语进行人机交流会大幅增加机器的负担,我们仍要质疑一个假设:这样做会简化人的生活。

简单回顾数学史,就能看出这种质疑多么有道理。希腊数学之所以停滞,是因为它始终是口头和图形的活动;穆斯林的“代数”(algebra)在怯生生地尝试符号化之后,一旦回到修辞风格就夭折了;现代文明世界——无论是好是坏——只有等到西欧摆脱中世纪经院哲学的束缚时才可能诞生,而经院哲学不过是一种追求言辞精确的徒劳尝试!这一解放得益于我们归功于 Vieta、Descartes、Leibniz 以及后来 Boole 等人的那些精心设计、或至少有意识设计出来的形式符号体系。

形式化文本的优点在于:要让对它们的操作合法,只需要满足少数几条简单规则;仔细想来,它们是排除各种胡言乱语的一种极其有效的工具,而在使用母语时,这类胡言乱语几乎无法避免。

我们不应把使用形式符号的义务看作负担,而应把使用它们的便利视为一种特权:多亏了这些符号,今天的小学生也能学会早年只有天才才能做到的事。1977年,一位作者在一份技术报告的前言中写道:“为了清晰起见,连逻辑连接词的标准符号都避免了。”他显然没有明白这一点;而出现这句话,说明怀有这种误解的并不止他一人。归根结底,我们使用母语时的那种“自然”,不过在于我们能轻松说出一些“其荒唐并不明显”的话。

设想一下,如果从一开始,母语就是信息处理设备唯一的输入和输出载体,那会怎样;这或许能给人启发。我经过考虑后的猜测是:在某种意义上,历史会重演,而计算机科学将主要由一种真正的“黑色艺术”构成——如何从那里自举出一个足够明确的形式系统。我们需要世界上全部智力,才能把界面收窄到可用的程度;而且,考虑到人类历史,要猜“把这件事做好还需要再花几千年”,也许并不算过于悲观。

附注:由于教育趋势远离智力训练,近几十年来,西方世界的人们对自身语言的掌握出现了急剧下降:许多按上一代标准本应更懂事的人,如今已无法有效使用母语,哪怕是在母语本来相当够用的场合。只要看看科学文章、技术报告、政府出版物中那些一细读就毫无意义的空话数量,就足以令人警觉。这种现象被称为“新文盲”(The New Illiteracy)。它应当让那些相信自然语言编程、却又缺乏预见其失败所需技术洞察力的人打消念头。附注结束。

有一种直觉让我颇感安慰:我猜想,要用我们的母语——无论是荷兰语、英语、美式英语、法语、德语还是斯瓦希里语——来编程的机器,制造起来和使用起来一样,都该死地困难。

评论

多数人认为 Dijkstra 对自然语言编程的批评在今天依然成立,争论焦点是自然语言到底只是又一层会被翻译成形式代码的抽象,还是根本无法精确描述行为;少数人则强调需求本来就用自然语言沟通,或认为“够用”的人工智能已经能产生实际价值甚至取代岗位。

认为 Dijkstra 对自然语言编程的批评在今天依然成立

  • 自然语言充满细微差别、文化与领域隐含含义,且含义会随时间变化;它天生模糊,哪怕严格照规格实现也可能完全错误。大模型需要海量算力和极其详细的提示才能生成可用代码,而生成的代码最终仍要落入形式语言,git 仓库里追踪的依旧是 Java/Python 而不是英语。自然语言若作为“源代码”,会像法律合同一样留下无穷解释空间,好处在前期,长期维护和语义漂移却是灾难。(较多人)
  • > 模型并没有取代编译器,而是取代了开发者;自然语言规格不是程序,代码也不是规格。(@nickm12)

认为自然语言只是又一层抽象,Dijkstra 的担忧已经过时

  • 几乎所有程序的需求本来就是在客户与开发者之间用自然语言沟通的;把自然语言翻译成代码,就像高级语言被翻译成机器码,只是多了一层抽象,并不取代形式语言。大模型让“只有人类能把需求变成代码”这一 1978 年的假设不再成立,注意力机制还能通过上下文消解歧义,让英语变成一种上下文敏感的“编程语言”。(少数人)
  • > 高级语言并不取代机器码而只是被翻译成机器码,自然语言编程也只是被翻译成高级语言,因此 Dijkstra 的论点没有切中要害。(@kikdij)

认为大模型适合当助手,半形式化规格仍不可少

  • 用夹杂自然语言和少量形式记号的“半形式化”提案表达关键想法,让模型去补全细节、翻译成严格代码,目前效果不错;但坐下来正式写下规格(如 TLA+ 的做法)才能迫使你真正理解问题,而不只是让模型猜测模糊意图。自然语言带来的“模糊”和“更高层抽象”目前被绑在一起,若能把两者拆开会更有价值。(少数人)
  • > 用一点 EBNF、一点 Python 或 Prolog 片段表达关键想法,让模型补上中间缺失的点,目前看效果很好。(@froh)

认为即便理论不成立,“够用”的人工智能编程也足以冲击就业

  • 用很模糊的英语让人工智能实现需求,本质上是让模型在人类已有方案中挑一个够好的;结果对专家帮助有限,但已经足够好,足以夺走很多人的工作。应用商店里由自然语言生成的新应用数量级增长,说明终端用户已经从中获得价值。(少数人)
  • > 对专家没帮助不重要,“足够好”就已经能抢走很多人的饭碗。(@hintymad)

有价值的补充

  • AppleScript 曾尝试设计“看起来像自然语言”的语言,但这一实验并不成功;这说明自然语言是双刃剑,好处在前期、坏处在长期。相对地,Inform 7 是少数把自然语言和编程结合得较优雅的语言,主要用于文字冒险游戏。(@mpweiher、@benrutter)
  • Dijkstra 当年估计要把接口做窄需要几千年,但互联网上的集体人类知识加上算力指数增长,让大模型在几十年后就出现了,相当于把预言加速了几个数量级。(@teleforce)
  • 人类版大模型的一个设想是:把算法、教程、框架文档建成维基或语义图,每个节点挂一个 Makefile;而注意力机制通过指代消解,让英语变成上下文敏感的编程语言,能理解“把这个文件移到那个文件夹”这类指令。(@xyzzy_apps)
  • 形式语言本身也可能极不自然:C++ 就像一大堆细碎规则的集合,复杂程度甚至超过汇编,因此“形式化”并不自动等于简单或好用。(@likoya)