关于"自然语言编程"的愚蠢性
关于“自然语言编程”的愚蠢性。
自自动计算技术诞生之初,就有人认为编程需要像使用任何形式化符号体系那样保持严谨和准确是一种缺陷。他们指责机械的“奴隶”只会盲目地执行给定的指令,哪怕稍微动脑思考一下就会发现这些指令包含着显而易见的错误。“但须臾亦是漫长,思考实为痛楚。”(A.E. Housman语)。他们热切地期望并等待着更为聪明的机器,期待机器能够拒绝执行由轻微笔误所引发的无意义指令。
机器码几乎没有任何形式的冗余,很快便被视为人与机器之间一种充满不必要风险的交互界面。部分出于这种认知,所谓的“高级编程语言”被开发了出来,随着时间的推移,我们在某种程度上学会了如何加强对愚蠢错误的防范。这是一项重大的进步,因为许多愚蠢的错误现在会产生错误提示信息,而不是直接给出一个错误的答案。(甚至这种改进也并未得到普遍的赞赏:有些人发现无法忽略的错误提示信息比得到错误的结果更令人恼火,而在评判编程语言的优劣时,有些人似乎依然将“编程的轻松”等同于“制造未被察觉的错误时的轻松”。)然而,与编程语言相对应的(抽象)机器,依然是一个忠实的奴隶,即一个完全能够执行无意义指令的无脑自动机。编程依然是形式化符号体系的使用,也因此,它依然像以前一样需要人们保持细致和准确。
为了让机器使用起来明显更简单,有人提议(尝试)设计一种能够用我们的母语来下达指令的机器。不可否认,这会让机器变得复杂得多,但也有人主张,通过让机器承担更多的重担,我们的生活将会变得更轻松。如果你将必须使用形式化符号体系视为你困难的源头,这听起来似乎很有道理。但这个论点成立吗?我对此表示怀疑。
与此同时我们深知,交互界面的选择绝不仅仅是(固定总量)劳动力的分割,因为跨越界面进行协作和交流所涉及的额外工作量必须被计入其中。我们如今深知——且伴随着惨痛的教训——改变交互界面很容易增加双方的工作量(甚至大幅增加)。因此,人们对所谓“狭窄接口”的偏好与日俱增。所以,尽管转向使用人类母语进行人机交流会极大地增加机器的负担,我们也不得不对“这会简化人类生活”这一假设提出质疑。
简略地回顾一下数学史,就能发现这种质疑是多么的合情合理。希腊数学停滞不前是因为它一直局限于语言和具象的活动;穆斯林“代数”在经过一次怯懦的符号化尝试后,在回归修辞式风格时走向了消亡;而现代文明世界之所以能够诞生——无论这是好是坏——完全归功于西欧能够从中世纪经院哲学(一种对语言精确性的徒劳尝试!)的桎梏中挣脱出来,这都要归功于我们所拥有的,由韦达(Vieta)、笛卡尔(Descartes)、莱布尼茨(Leibniz)以及(后来的)布尔(Boole)等人精心或至少是有意识地设计出来的形式化符号体系。
形式化文本的优点在于,其推演过程若要合法,只需满足寥寥几条简单的规则;你仔细想想就会发现,它是一种惊人有效的工具,能够排除掉各种无意义的谬误,而这些谬误在我们使用母语时几乎是无法避免的。
我们不应将使用形式化符号的义务视为一种负担,而应将使用它们的便利视为一种特权:正因为有了它们,学童们才能学会过去只有天才才能完成的事情。(1977年,有一位技术报告的作者显然没有理解这一点,他在前言中写道:“为了清晰起见,甚至连用于逻辑连接的标准符号也被避开了”。这句话的出现表明,存在这种误解的绝不仅仅是他一人。)归根结底,我们使用母语时的那种“自然感”,归根结底不过是因为我们能够轻易地用它来陈述那些荒谬而不自知的废话罢了。
试着想象一下,如果从一开始母语就是我们信息处理设备输入和输出的唯一媒介,这或许会很有启发性。我的深思熟虑后的猜测是:历史将在某种程度上重演,计算机科学将主要由一种“黑魔法”组成——即如何从那种境况下自举(bootstrap)出一个定义良好的形式化系统。我们需要动用全世界的智慧来使交互界面变得足够狭窄以供使用,从人类历史来看,要想把这件事做好的话,估计又要花费几千年时间,这绝不算是过度悲观。
注:由于教育趋势逐渐远离了智力层面的训练,过去几十年里,西方世界人们对自身语言的掌控力急剧下降:许多按上一代标准本该更有学问的人,甚至无法在他们本就掌握得相当充分的场合下有效地使用母语。(你只需看看科学文章、技术报告和政府出版物中那些大量且字面上毫无意义的辞藻,便足以令人警醒。)这种现象——即“新文盲现象”——理应让那些缺乏技术洞察力,且盲目坚信自然语言编程终将成功的人感到灰心。(注完。)
我从中获得了一点莫大的慰藉:我推测,那些能够用我们母语——无论是荷兰语、英语、美式英语、法语、德语还是斯瓦希里语——进行编程的机器,其制造的难度与使用的难度一样,都将是灾难性的。