语言,编程语言

《圣经·创世记》中记载了巴别塔的故事:人类联合起来希望能建造一座通天高塔,耶和华为了阻止人类的计划,把人类的语言变乱,使人类相互之间无法沟通,于是人们各散东西,通天塔便建造不成。

那时、天下人的口音言语、都是一样。他们往东边迁移的时候、在示拿地遇见一片平原、就住在那里。他们彼此商量说、来吧、我们要作砖、把砖烧透了。他们就拿砖当石头、又拿石漆当灰泥。他们说、来吧、我们要建造一座城、和一座塔、塔顶通天、为要传扬我们的名、免得我们分散在全地上。耶和华降临要看看世人所建造的城和塔。耶和华说、看哪、他们成为一样的人民、都是一样的言语、如今既作起这事来、以后他们所要作的事、就没有不成就的了。我们下去、在那里变乱他们的口音、使他们的言语、彼此不通。于是耶和华使他们从那里分散在全地上。他们就停工、不造那城了。因为耶和华在那里变乱天下人的言语、使众人分散在全地上、所以那城名叫巴别。

                                                                                                          ——创世记11:1-9

JavaScript大师Douglas Crockford在其文章《JavaScript:从最受误解的编程语言演变为最流行的语言》(原文 译文)中引用了这个故事,并在紧接其后说道:

这段意思有时理解为做人不能太傲慢;有时理解为一个寓言故事,告诉你为什么人们在说不同的语言:耶和华为防止人们达到自己的潜能而制造了 i18N 问题。不过我想把这个道理放到编程语言上去理解也是如此。编程根本问题在于对复杂问题的把握掌控能力。如果语言在需求变化时未能帮助我们处理复杂的系统,而最终令人感到混乱,自然离失败不远。

语言不同的人交流固然困难重重,但即便使用同样语言的人,交流也并不十分顺畅。不管是亲人、朋友、同事还是陌生人,也无论是面对面、EMAIL、微博论坛还是IM的交流方式,我们总能或多或少的体验到,人与人之间相互理解是一件多么困难的事情。造成这种境况的原因,有时是因为我们的表达和理解能力不够优秀,但更多的是因为:每个人都有独一无二的生活经验和知识结构,思维方式更是千差万别,同样的事物和词句在不同人的脑中都有不同的概念,而且两个大脑之间无法直接交流,必须借助感觉器官和文字声音这些中介,这导致一个人完全理解另一个人脑中的观念,几乎是不可能的事情。

几年前国内出版了一本精神病人访谈手记《天才在左 疯子在右》,里面有篇对一位治疗精神病的老教授的访谈,老教授说到自己在精神病院的一次见闻:有两个病人在院子里聊天,你一句我一句谈得非常开心,就像一对老朋友。当老教授走近他们仔细听时,才惊奇的发现,两个人一个说的是英语,而另一个说的是西班牙语,而且两个人说的内容根本一点关系都没有。一个说:今天天气真是难得的好。另一个回答:嗯,不过我不喜欢放洋葱。那个又说:安吉拉还在世的话,肯定催着我陪她散步。另一个又回答:大狗不算什么,小狗挠痒痒的时候才最可笑呢……

有多少我们相互交流的时候,相谈甚欢但其实都在自说自话呢?跟这对精神病人一样,唯一不同的是我们程度轻一点,或多或少能相互理解一些。

数学语言与自然语言最大的不同,是其准确的定义和严密的逻辑性。汉语中的一句“我借你100块钱”,不同的人可以理解为不同的意思,但数学语言如“∀x (x∈N → x+1>x)”表达的意义却是明确的。数学语言的准确和严密在于它所使用的每一个符号都是明确定义的,符号准确代表了其背后的逻辑意义。相反,自然语言的词语则不具备这种严密性。

计算机的行为是建立在数理逻辑基础之上的,它无法像人脑一样理解含义模糊的自然语言,计算机所使用的语言必须是语义明确的数学语言。编程语言作为人与计算机的交互中介,首先要保证的是计算机能够准确理解,因此编程语言所使用的符号必须是语义明确的。

这里不得不提到中文编程。中文编程出现的初衷,大概是为了减少编程人员学习英语的负担,集中精力于程序设计本身。关于中文编程的争论很多,但大多数时候都偏离了焦点(这大概是网络上各种论战的通病吧)。首先对于计算机来说,使用哪种自然语言作为语义符号并不重要:要在程序中声明一个分支,计算机并不关心使用的符号是“if”、“如果”还是“もし”,只要编译器能够识别,计算机就能正确地在程序中执行分支判断。因此,使编程语言的语义符号具备自然语言的语义,只对“人”才有意义,毕竟代码是由人来写出的。比如,使用“if”作为分支判断的符号,是因为单词“if”作为自然语言的词汇所代表的含义,与程序进行分支判断的逻辑意义有相通之处。使用“if”作为符号,即可以使程序语言中分支判断的逻辑意义与自然语言中的观念相符而不致产生“违和感”,也可以帮助程序员对程序语言符号的理解和记忆。但这种自然语言语义与程序逻辑意义的呼应对程序员理解编程语言的帮助是极其有限的,因为对编程语言的使用,在于首先明确理解符号在程序中的逻辑意义,其次才是使用符号进行编程,而不是通过符号在自然语言中的语义去理解其在程序中的逻辑意义,否则便是本末倒置了。理解赋值、分支、循环等表达式的逻辑含义,是学习程序设计最基础的一步,而在理解了程序语言的逻辑意义之后,使用“defined”、“if”、“while”做符号,还是使用“定义”、“如果”、“当”做符号都不重要了。

真的有连英文字母都不认识的人使用中文进行编程,我更担心的是他们怎么用键盘把中文敲到屏幕上,难不成要用手写板编程^_^。我没有使用过中文编程的语言,不清楚它们各自的特点。但我认为:如果这些语言提供了好的编程思想和实践模式,那么这些思想跟语言中的符号采用中文还是英文是不太可能有关系的(不然吉多应该把Python设计成荷语,松本行弘应该把Ruby设计成日文^_^);反之它们起到的只是把中文符号翻译成英文符号或者翻译成二进制码的作用。如果未来有一天,计算机能够像人脑一样进行自然语言处理,人类能够使用自然语言进行程序设计,那时候的中文编程才真的很有意义。

另一个程序设计中与自然语言关系紧密的地方是——注释。代码既是给人看的也是给计算机看的,而注释是完全给人看的。写注释和读注释就是两个程序员之间使用自然语言进行的交流。注释的目的是帮助读代码的人理解程序,但是跟代码本身的不同之处在于:代码是语义清晰的逻辑语言,尽管可能非常复杂难懂或者风格不佳,却不会产生歧义,两个程序员读同一段代码所得到的程序逻辑是一致的(如果没读错的话);注释却不然,自然语言的模糊性可能使不同的人得到不同的理解,放置一段让人产生误会的注释比没有注释还要糟糕。

有时我们写出了一段自己看来非常清晰易懂的注释,别人读到的时候理解却产生了偏差。大脑在处理自然语言的时候,也像计算机处理代码一样,会生成一个临时的“上下文环境”,如上文所说,每个人都有不同的背景知识和思维方式,因此脑中的“上下文环境”也各不相同,再加上自然语言的不准确性,使得如何让自己的观念在别人的“上下文环境”中被理解,以及如何在自己的“上下文环境”中理解别人的观念,都成为非常困难的事情。

语言学的一个问题是:语言本身是否会对人类的思维方式产生影响?这个问题十分难以论证,人在成长过程中的思维方式受各种因素影响,很难说清哪些差异是由语言不同造成的,而且语言本身与使用人群的文化习俗、地理分布、历史沿革等等紧密相关,难以单独割裂出来。《道德经》曰:“知人者智,自知者明。”或许我们的心智早已在不知不觉中受到语言潜移默化的影响,但智力的限制又使我们无法跳出语言影响的禁锢审视自己,永远“当局者迷”。

自然语言对思维方式的影响或未可知,编程语言对程序员思维方式的影响却是有的。不同的编程语言体现了不同的程序设计哲学,把程序员的思维带入不同的模式,进而影响着程序员对程序设计的思维方式。好在对于大多数程序员来说,学习一门新的编程语言要比学习一门新的自然语言简单多了。随着经验的积累和知识的扩展,渐渐地跳出编程语言对思维方式的禁锢,站在编程语言之上的角度思考编程语言的理念和特性,这大概是程序员由初级向中级进阶的必经之路吧。

一门好的语言由几组功能所构成,但哪一项的功能才是最好的就永远没有结论。程序员可以不断地讨论这个话题和是否比其他的语言优秀。这里不是说功能不重要,功能非常重要,只不过我们当时还没清楚它真的那么重要。

                                                                                               ——Douglas Crockford

和上篇博客《形而上学和面向对象》一样,这篇文章同样没有什么实用价值。能从别人的思考中得到启发,是一件值得高兴的事情;自己的思考能够给别人以启发,也是值得高兴的事情。假使有人读过之后触发了一些小小的思考,这也算是这篇文章的价值所在了吧。

你可能感兴趣的:(注释,编程语言,语言,i18n,中文编程)