现有的编程语言当中,哪些和自然语言更接近?
用自然语言来编程,并不是一个重要方向。因为,编程,是解决问题,是一个从问题空间到解答空间的映射过程。重要的是,如何来做这个映射的。人思考问题,是抽象而完整的,解决问题时,意图也是完整的,但是如果描述为语言,则是片面的。比如,“桌子”这个物体,想像中是完整的,但语言来描绘,则是“桌面和四条桌腿”,是割裂的。这是说,语言本身不是解决问题的方法,如何完整地去描述,才是重点。因此比编程语言(甚至人类语言)更重要的,是我们怎么看待和模型化问题的。计算机语言的进化,也是朝更接近人类脑袋思考问题时的“建模”方式去靠近,并不是朝人类语言本身去靠近。比如面向对象的语言(如c++),并不是提供了“更自然的语言”,而是提供了能够用更接近人类自然思维的方法来表达事物的方法。因此,更“自然”的映射方法,比用更“自然”的“语言”来得重要得多。计算机语言的发展,追求的是前者而不是后者。现实中,高手可以用汇编语言写出非常优美的面向对象的系统出来,而新手往往用C++写出混乱不堪的代码团。常见的计算机语言中最接近自然语言的应该是SQL,他至少本身就是一句能读懂的英语。但是这个和人类语言差距其实还是很大,这与人思考描述问题的方式及计算机能理解的表达形式间的鸿沟有关。
首先,自然语言区别于编程语言很大的两个特点就是随机性(stochastic)和模糊性(ambiguous)。这一票足够否决所有的编程语言。无论是词汇分析(lexical analysis),还是句法分析(parsing)。所以基本所有可以实际应用在自然语言处理的语法模型都是有概率的。
其次,自然语言受限制与编程语言受限制不在一个层面。理论计算机经常提到的乔姆斯基体系(Chomsky hierarchy),说的就是各种形式语言的限制以及表达能力。我个人认为最接近自然语言的,是其中限制最少的语言,也就是0型,也就是图灵机可以识别的递归可枚举语言(Recursively Enumerable)。而编程语言主要是在上下文无关语法(context-free)和正则语法(regular)的层面。