本节书摘来自异步社区《像计算机科学家一样思考Python(第2版)》一书中的第1章,第1.6节,作者[美] Allen B. Downey,赵普明 译,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.6 形式语言和自然语言

自然语言是指人们所说的语言,如英语、西班牙语和法语。它们不是由人设计而来的(虽然人们会尝试加以语法限制),而是自然演化而来的。

形式语言则是人们为了特殊用途设计的语言。例如,数学上使用的符号体系是一种特别擅于表示数字和符号之间关系的形式语言;化学家则使用另一种形式语言来表示分子的化学结构。而最重要的是:

编程语言是人们为了表达计算过程而设计出来的形式语言。

形式语言倾向于对语法做出严格的限制。例如,3 + 3 = 6是语法正确的数学表达式,但3+ = 3$6则不是。H2O是语法正确的化学方程式,而2Zz则不是。

语法规则有两种,分别适用于记号(token)和结构(structure)。记号是语言的基本元素,如词、数字和化学元素。3+ = 3$6的一个问题就是$在数学表达式中(至少就我所知)不是合法记号。相似地,2Zz不合法是因为并不存在缩写为Zz的化学元素。

第二种语法规则指定记号所组合的方式。数学等式3+ = 3不合法,因为虽然+和=是合法记号,但不能将它们连续放置。相似地,在化学表达式里,下标数字应该出现在元素名称之后,而不是之前。

“This is @ well-structured Engli$h sentence with invalid t*kens in it.”是一个结构良好,但包含非法记号的英语语句。“This sentence all valid tokens has, but invalid structure with.”这句话所有的记号都合法,但是语句结构不合法。

当你阅读英语的句子或形式语言的语句时,需要弄清句子的结构是什么(虽然在自然语言中这个过程是下意识完成的)。这个过程称为语法分析。

虽然形式语言和自然语言有很多共同的特点—记号、结构、语法以及语义,但它们也有一些区别。

歧义性:自然语言充满了歧义,人们通过上下文线索和其他信息来处理这些歧义。形式语言通常设计为几乎或者完全没有歧义,即不论上下文环境如何,任何表达式都只有一个含义。

冗余性:为了弥补歧义,减少误解,自然语言采用大量的冗余。因此,自然语言往往很啰嗦。形式语言则相对不那么冗余,更加简洁。

字面性:自然语言充满了习惯用语和比喻。例如,有人说,“硬币掉了”(The penny dropped[1]),并不一定是硬币,也不一定是有什么掉了。形式语言则严格按照它的字面意思表达含义。

因为我们都说着自然语言长大,有时候很难适应形式语言。在某种意义上,形式语言和自然语言的区别与诗词和散文的区别类似,而且程度更甚。

诗词:字词的使用,既考虑它们的音韵,也考虑到它们的意义,而整首诗合起来表达某种意境或情绪反应。歧义不仅常见,而且常常是刻意为之。

散文:字词的意义更加重要,而且句子的结构也提供更多的意义。散文比诗词更容易分析,但仍然有不少歧义。

程序:计算机程序的意义不含歧义,直接如字面所指。完全可以通过它的记号和结构理解其意义。

形式语言的密度远远大于自然语言,所以阅读起来需要花费更多的时间。还有,结构非常重要,所以直接自顶向下、从左至右的阅读顺序并不一定是最好的。相反,要试着学会在头脑中解析程序,辨别出记号并解析出结构。最后,细节很重要。在自然语言中常常可以忽略的小错误,如拼写错误或者标点符号错误,在形式语言中往往会造成很大的差别。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐