Dijkstra 论 “自然语言编程” 的愚蠢之处
EWD 667 论 “自然语言编程” 的愚蠢之处。
自从自动计算的早期,就有人认为编程需要像使用任何形式化符号一样的小心和准确,这是一个缺点。他们指责机械奴隶严格地执行给定的指令,即使稍微思考一下就会发现这些指令包含明显的错误。“但是一瞬间是很长的时间,思考是一个痛苦的过程。” (A.E.Houseman)。他们热切地希望和等待更明智的机器,能够拒绝执行诸如微不足道的笔误所引发的荒谬活动。
机器代码,几乎没有任何形式的冗余,很快就被认为是人与机器之间不必要的高风险接口。部分地为了应对这种认识,所谓的“高级编程语言”被开发出来,并且随着时间的推移,我们也在一定程度上学会了如何加强对愚蠢错误的保护。一个重要的改进是,现在许多愚蠢的错误会导致错误消息,而不是错误的答案。(即使是这种改进也没有得到普遍的赞赏:有些人觉得他们无法忽略的错误消息比错误的结果更烦人,并且在判断编程语言的相对优点时,有些人似乎仍然将“编程的容易程度”等同于制造未被发现的错误的容易程度。)但是,与编程语言相对应的(抽象)机器仍然是一个忠实的奴隶,即完全有能力执行无意义指令的无意义自动机。编程仍然是对形式化符号的使用,因此,仍然需要之前所需的小心和准确。
为了使机器更容易使用,有人提议(尝试)设计我们可以用母语指示的机器。诚然,这将使机器更加复杂,但是,有人认为,通过让机器承担更大的负担,我们的生活将会变得更加轻松。如果您将使用形式化符号的义务归咎于您困难的根源,这听起来是合理的。但是这个论点有效吗?我怀疑。
我们现在知道,接口的选择不仅仅是(固定数量的)劳动力分配,因为必须加上在接口上进行协作和通信所涉及的工作。我们现在也从令人清醒的经验中得知——我可以补充一下——接口的改变很容易增加栅栏两侧的工作量(甚至大幅增加)。因此,人们越来越倾向于现在所谓的“窄接口”。因此,尽管改用机器和人之间以后者的母语进行的交流将大大增加机器的负担,但我们必须质疑这种做法会简化人类生活的假设。
简要回顾数学史表明这种挑战是合理的。希腊数学停滞不前,因为它仍然是一种口头、图画式的活动;穆斯林“代数”在尝试象征主义之后,当它回到修辞风格时就消亡了;只有当西欧能够摆脱中世纪经院哲学的束缚——一种徒劳的口头精确尝试!——现代文明世界才能出现——无论是好是坏——这要归功于我们欠 Vieta、Descartes、Leibniz 和(后来)Boole 等人的精心设计,或者至少是有意识地设计的形式化符号系统。
形式化文本的优点在于,它们的操纵,为了合法,只需要满足一些简单的规则;当您仔细考虑时,它们是一种非常有效的工具,可以排除各种各样的胡说八道,而当我们使用母语时,这些胡说八道几乎是无法避免的。
我们不应该将使用形式化符号的义务视为负担,而应将使用它们的便利性视为一种特权:由于它们,学童可以学会做在早期只有天才才能做到的事情。(显然,1977 年在一份技术报告的前言中写道“为了清晰起见,甚至避免使用逻辑连词的标准符号”的作者并不理解这一点。这句话的出现表明,作者的误解不仅仅限于他自己。)当所有的事情都说了出来,“自然”地使用我们的母语归结为我们可以轻松地使用它们来陈述其胡说八道并不明显的陈述。
尝试想象一下,如果从一开始我们的母语就是我们信息处理设备输入和输出的唯一媒介,将会发生什么,这可能会有所启发。我深思熟虑的猜测是,历史会在某种意义上重演,并且计算机科学主要包括如何从那里引导到足够明确的形式系统的黑色艺术。我们需要世界上所有的智慧来使接口足够窄以供使用,并且鉴于人类的历史,猜测做得足够好可能需要几千年,这可能不会过于悲观。
备注。由于教育趋势偏离了智力训练,近几十年来,西方世界的人们对自己的语言的掌握程度急剧下降:许多按照前一代人的标准应该更了解的人,不再能够有效地使用他们的母语,即使是为了它相当充分的目的。(您只需要看看科学文章、技术报告、政府出版物等中确实令人震惊的,经过仔细阅读后毫无意义的冗长言辞的数量。)这种被称为“新文盲”的现象应该劝退那些缺乏预测其失败所需的技术洞察力的自然语言编程的信徒。(备注结束。)
我从一种直觉中得到很多安慰:我怀疑用我们的母语——无论是荷兰语、英语、美式英语、法语、德语还是斯瓦希里语——进行编程的机器,其制造和使用一样该死地困难。
Plataanstraat 5 5671 AL NUENEN 荷兰 | prof.dr.Edsger W.Dijkstra Burroughs Research Fellow
---|---
由 Tristram Brelstaff 誊写,修订于 2010 年 11 月 19 日星期五