回顾一下数学史,就能明白为什么Dijkstra对“自然语言编程”的质疑如此合理。古希腊的数学因为长期停留在文字和图示层面,最终陷入停滞;伊斯兰的“代数学”在初步尝试形式化符号后,又回归到文字表述,逐渐走向消亡。可以说,我们今天的现代文明——无论其利弊——之所以能够出现,很大程度上是因为西欧跳出了中世纪经院哲学的框框,而这得益于韦达、笛卡尔、莱布尼茨和后来的布尔等人精心设计的、至少是有意识构建的一套形式化符号体系。
这套体系的价值在于,它所有的合法操作都只需要遵循少数几条简单的规则。仔细想想,这是一种极为高效的工具,它能天然地过滤掉我们在使用自然语言时几乎无法避免的各种无意义表述。
我们不该把使用形式化符号看作一种负担,反而应该把它的便利性当成一种特权:正是因为有了它们,今天的一个普通学生才能做到过去只有天才才能完成的事情。本质上,我们在自然语言中那种所谓的“自然流畅”,很多时候不过是能轻松地说出一些听起来合理、但实际可能荒谬的话罢了。
不妨做个假设:如果从一开始,人类的自然语言就是信息处理设备唯一的输入输出方式,历史会怎么演变?一个比较合理的推测是,从某种意义上说,历史会重演。计算机科学将主要沦为一项晦涩的手艺——研究如何从自然语言出发,逐步构建出一套足够严谨和明确的形式化系统。我们需要调动人类所有的智慧,才能把接口压缩到一个可用的窄度。纵观整个人类历史,即便说完成这个过程还需要数千年,恐怕也不算过分悲观。
现在,随着AI编程助手(Code Agent)的发展,我们似乎又一次面临用自然语言代替形式化编程语言的趋势。而且,像Vibe Code这样的工具看起来正在让这个趋势变得“成功”?这引发了一个更根本的思考:自然语言通过AI工具真的能变成一种全新的“编程语言”吗?这触及了自然语言本身模糊、冗余、不精确的本质问题。AI真的能完美弥合这中间的鸿沟和冲突吗?
我们可以看一个清晰的对比。从汇编/机器指令到高级编程语言,两者都属于形式化语言的范畴。编译器在这里扮演的角色,是一种“语义等价”的降维转换过程。然而,高级编程语言与自然语言之间的差异,在本质上是完全不同的。大模型如果想把自然语言语义等价地翻译成高级编程语言,其可能性有多大?显然,Dijkstra在四十多年前提出的观点,在今天依然具有深刻的参考价值。
知乎用户王勃的一个观点说得很有意思:“但是现在Harness Engineering又来了,如果 Dijkstra 活在今天,看到我们先用自然语言让 AI 写代码,然后又花大量精力构建测试、约束、验证闭环来确保 AI 不犯错,他大概会说:「你们终于造出了能听懂自然语言的机器,然后发现还是得用形式化来约束它——这不正是我说的吗?」”
这段话精准地点出了当前AI辅助编程中的一个核心悖论:我们试图用最不精确的自然语言去驱动最需要精确性的代码生成,最终却不得不依赖另一套形式化系统(测试、约束)来保证结果可靠。这就像绕了一个大圈,又回到了对严谨性和确定性的原点需求上。这或许提醒我们,在追求开发效率的同时,对底层逻辑和形式化思维的尊重与掌握,仍然是不可替代的。
对于这类深度技术话题的探讨,欢迎来云栈社区与更多开发者交流碰撞。
|