## 1.4 形式语言和自然语言 自然语言是指人类表达的语言,比如,英语、西班牙语和法语。自然语言不是由人类设计(尽管人类尝试对其强加某些命令)的,而是通过自然演化的。 __形式语言__则是由人类为了某些特殊应用而设计的语言。例如,数学中使用的记号法就是一种特别擅长表示数字和符号间关系的形式语言。化学家使用某种形式语言来表示分子间的化学结构。而最重要的是: __编程语言是用于表达计算过程的形式语言。__ 正如我之前提到的,形式语言具有严格的语法规则。例如,3+3=6是一个语法正确的数学表达式,但是3=+6$就不是。同样,H2O是一个语法正确的化学名词,但是2Zz就不是。 语法规则有两种:与标识有关的规则或者与结构有关的规则。标识是语言的基本元素,如单词、数字以及化学元素。3=+6$的问题之一是$不是数学里合法的标识(至少据我所知是这样)。类似地,因为化学里没有缩写为Zz的元素,所以 2Zz也是不合法的。 第二种语法错误是表达式结构的问题。所谓结构,就是标识的顺序。表达式3=+6$在结构上就不合法,因为不能在等号之后直接使用加号。类似地,分子表达式需要在元素名之后添加下标而不是之前。 当你阅读一句英文或者形式语言的一条语句,你需要找到它的结构(尽管这一行为在阅读自然语言时是无意识的)。这一过程称为__语法分析__。 举个例子,当你听到一句话:“另一只鞋掉了,”你会知道“另一只鞋”是主语而“掉”是动词。一旦你解析了一个句子的语法,你会了解它是什么意思,就是句子的语义。假设你知道鞋是什么意思和掉了是什么意思,你就会明白这句话的大致含义。 尽管形式语言和自然语言有很多共同的特性,但是他们在标识、结构、语法以及语义上有很多不同。 __二义性:__自然语言充满了二义性,需要人们根据上下文线索和其他信息理解。而形式语言几乎没有二义性,即形式语言的任何表达式都仅有一个含义,无关上下文。 __冗余性:__为了弥补歧义和减少误解,自然语言引入了很多冗余,结果自然语言通常都很啰嗦。形式语言则更简明扼要。 __文学性:__在自然语言中有很多习语和暗喻。如果我说另一只鞋掉了,很有可能指的不是鞋,也没有什么东西掉了。而形式语言则精确地描述了它们表达的意思。 习惯于自然语言的人们(每个人)要适应形式语言通常都很艰难。在某些方面形式语言和自然语言的差别就像是诗歌和散文,但是更甚。 __诗歌:__词汇的发音和意义都十分重要,而整首诗歌创造某种效果或者情感回应。诗歌中随处可见精心设计的双关语。 __散文:__相较于诗歌,散文中文字本身的含义更为重要,同时结构也具有更大的意义。散文虽然也有二义性,但是比诗歌容易分析。 __程序:__计算机程序的含义是纯字面且无歧义的,并且可以通过分析标识和结构将其完整理解。 关于阅读程序(还有其他一些形式语言)的几条建议如下。首先,形式语言比自然语言难以理解得多,需要花费更长时间来阅读。其次,形式语言的结构很重要。所以从头到尾的完整阅读并不是一个好方法。应该学会先将程序解析,识别标识和解释结构。最后,记住细节决定成败。像自然语言中无关大碍的错误拼写和标点符号等,在形式语言中可能产生很大的影响。