自然语言是人类讲话使用的语言,如英语、西班牙语和法语等。虽然人们总要给自然语言加上一些规则,但自然语言并非人类设计,它们是自然演化而来的。
形式语言是人们为特定应用设计的语言。例如,数学家使用的记号就是一种便于表示数字与符号关系的形式语言。化学家也使用一种形式语言来表示分子的化学结构。最重要的是:
编程语言是人为设计的用来表达计算的形式语言。
前面也提到过,形式语言有严格的语法规则。比如3+3=6是符合语法的数学语句,而3=+6$则不是。同样H2O是符合语法的化学式,但2Zz不是。
这里的两个2都是下标,在Markdown语法中无法表示。下段同。——译者注
语法规则包含两个方面:标识符与结构。标识符是语言的基本元素,像单词、数字以及化学元素等。3=+6$的一个错误是,至少据我所知$不是数学上合法的标识符。类似的,2Zz也是非法的,因为没有缩写为Zz的化学元素。
第二种语法错误是句子结构上的,即标识符的排列方式。语句3=+6$结构上也是非法的,因为加号不能直接放在等号后面。类似地,化学式中的下标必须在元素名后面,而不能在前面。
阅读英语的句子或者形式语言的语句时,必须分析句子结构(使用自然语言时,你会下意识地这样处理)。这个过程叫做解析。
例如,当你听到“The other shoe fell”这句话时,你会知道“the other shoe”是主语而“fell”是动词。分析完句子结构,你就理解了它的意思,即句子的语义。假设你知道“shoe”是什么,也知道“fall”的意义,你就能理解句子的大体含义。
虽然形式语言和自然语言有很多共同点,如标识符、结构、语法和语义,但是它们仍然有很多不同点:
歧义:自然语言常有歧义,人们需要根据上下文和其他信息来理解。而形式语言天生就是清晰无二义的,也就是说不管上下文是什么,任何语句都有一个精确的意义。
冗余:为了弥补歧义问题并减少误解,自然语言引入了很多冗余,结果就是语言常常很冗长。形式语言冗余少些,更加简洁。
字面意义:自然语言有很多成语和隐喻。比如我说“The other shoe fell”,可能不是说鞋,也没有什么东西掉下来。而形式语言语句的含义和字面意义是完全一致的。
说着自然语言长大的我们,通常都要经历一段痛苦的时期才能适应形式语言。从某些方面来说,自然语言和形式语言的差别就像诗歌和散文的差别,而且可能还有过之无不及:
诗歌:选词既要求发音,又要求含义,整首诗营造出一种效果或情感响应。歧义不仅常见,很多时候是有意为之。
散文:词汇的字面意思更加重要,而且句子结构也更能表意。相对于诗歌,散文更经得起推敲,但仍然会存在歧义。
程序:计算机程序的含义是无歧义的,和语句的字面意思一致,通过对标识符和结构的分析可以完整地理解。
关于阅读程序(或其他形式语言)提几点建议:首先,形式语言比自然语言难懂得多,所以读起来会花费更长的时间。其次,结构非常重要,从上到下、从左到右地阅读并不见得管用。相反,要学会在头脑中分析程序,识别标识符并解读清楚句子结构。最后,细节很重要,像拼写或者标点符号错误,在自然语言中有可能无伤大雅,但在形式语言中可能造成天壤之别。