JavaScript:从[最受误解的]编程语言演变为[最流行的]语言
The World's Most Misunderstood Programming Language Has Become the World's Most Popular Programming Language

作者:Douglas Crockford 08.3.3
原文:http://javascript.crockford.com/popular.html
译者博客:http://blog.csdn.net/zhangxin09
edit@2011-4-27 by frank: 1、加入了插图;2、修改了文章的字眼、语句;3、统一了CSS样式。
edit@2015-6-20 修改翻译明显的错误

《计算机语言:历史与基石》一书由 Jean Sammet 写于 1969 年。内容是对 120 种编程语言的考查,对一些语言进行了详尽地介绍。Sammet 他写这本语言编年史的时候,结构化编程革命(Structured Programming Revolution)和随后流行的面向对象编程尚未到来。书籍以一张巴别塔(Tower of Babel,又译通天塔。见译注)的图片作封面。塔身由一块块砖块围成,围在里面的是各种名称的编程语言。

这便是《圣经Genesis》[11:1-9] 里面大家所熟知的故事了:

耶和华降临,要看看世人们所建造的城和塔。耶和华说,看那,他们成为一样的人民,都是一样的言语,如今既作起这事来,以后他们所要作的事就没有不成就的了。所建造的城和塔。耶和华说,看哪,他们成为一样的人民,都是一样的言语,如今既作起这事来,以后他们所要作的事就没有不成就的了。 我们下去,在那里变乱他们的口音,使他们的言语彼此不通。于是,耶和华使他们从那里分散在全地上。他们就停工,不造那城了。因为耶和华在那里变乱天下人的言语,使众人分散在全地上,所以那城名叫巴别(巴别就是变乱的意思)。

译注:西方语系中,巴别塔即《圣经》中的通天塔,大洪水之后诺亚的子孙繁衍,并试图建造通天塔直通天界,上帝不爽,于是给他们创造了不同的语言,制造了语言隔阂和交流障碍,最终通天塔也轰然倒塌。

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

为何有如此之多的编程语言?不计 Sammet 当时的数量,过去四十年已有大量新语言问世。虽说我们好长的时间内已经是在一个高级的环境(High Level)下开发了,但真正能跨域边界,达致完备特性的编程语言还不多。那么我们为什么不统一设计一门语言来跨界,这样的话,所带来的效率毫无疑问是很明显的。因此我们也可以更有效地集中资源来培训或研制工具。为什么我们不能做到这一点?

实际上,我们已努力过,已经有好几种语言尝试过构建起大规模的、通用的设计,结果失败了。随着新语言不断加入更多的新功能,使语言本身变得越来越复杂。

因此我们看到取而代之的是许多的专用语言。在完成一些任务的领域中,专用语言可以非常高效地解决,而且本身是不错的。对于要完成某些任务的人而言,选择好的语言,自然如虎添翼。

一门编程语言从某些表达式的语法的运算得到其模型的修正。大多数语言有一组常用的值如数字和文本(numbers、texts 在大多数语言中,奇怪地称作字符串),和若干的操作,如改变和合成值,或一些变量和循环的操作,还有就是把一些常用的操作打包到命令中。

变化行如幻影,线路莫测,就像一道菜和一首乐曲每一次都不尽相同。语言设计的艺术在于清楚哪些是舍的(leave out)。一门良好语言,它里面的功能应该是和谐地工作在一起,帮助我们更好地明白问题和找出解决方案的最佳表达方式(the best expression of its solution)。

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

于时髦与技术之间而言,语言设计需要做更多的倾向于时髦方面。时髦是 nerdliest 艺术中一种主要的因素,看起来可能怪怪的,却一点都不假,事实如此。无论语言的设计有多么精巧,若以另一种语法出现的话,则是另类,没有希望得到广泛使用的。这样会约束了语言的进化。

像音乐和食物一样,编程语言也属于时间的产物。语言设计的深层问题不是技术上的,而是属于心理上的问题。一门编程语言应该与我们认知的结构相吻合,从而帮助我们更高效率地判断问题。

编程语言像猫这种动物,驯化一只不听话的猫不容易,干脆重新演过好了。照此理,大多数语言成功后由后来的升级版所取缔。然而重新规划的语言很难到达旧版所达到的那种成就。例如,Fortan 曾是语言翘楚,好些年亦不断改进,不过 Fortran IV 的声誉始终非现代化后的 Fortran 方言所能企及。类似地,Pascal 是结构化编程的流行语言,但其 OO 的版本却难盖原 Pascal 之光芒。结果,它渐渐被取代。

专业用途的语言做起来挺有意思的,这也解释了它们的数量为什么是如此地多。如果一门语言结构不太庞大,那么一个程序员就可以掌控它了。大多数语言可以由一个设计师自己创造出来,例如 Pascal:Wirth、C:Ritchie、C++:Stroustrup、Java:Gosling、C#:Hejlsberg、Rebol:Sassenrath、Python:van Rossum、PHP:Lerdorf、Perl:Wall、Ruby:Matsumoto、Lua:Ierusalimschy. E:Miller、JavaScript:Eich。

大多数语言失败之处在于不够清晰。有的语言只是在单个项目或某个公司中使用而已,很少能够脱颖而出成为重要的语言。

大体上说,有两种途径会使某种语言变得重要。一是它能让人类的思想发出光芒,启迪前进。Smalltalk 和 Scheme 可以说具备了这种特质,虽然 Smalltalk 和 Scheme 使用并不广泛,现在看也过时,但在历史上它们却被公认地认为是杰出的语言,而且对后世的语言设计带来深远的影响。

第二是其本身的流行程度怎么样,体现了语言的重要性如何。

程序员在选择一门编程语言的时候,必须再三考虑很多东西,不过到了 web 浏览器编写程序的时候,唯一的选择便是 JavaScript。

JavaScript 可算是一种乖张、亦正亦邪的语言,其貌不扬。它这种乖张的特性给它带来极其糟糕的声誉。DOM 文档对象模型也与 JavaScript 同休公戚,是一个让人不太讨好的 API。在理清了 JavaScript 的概念之后关于 DOM 各种乱七八糟的东西又随着来(译注:跨浏览器的障碍)。有许多人嚷着要改进 JavaScript,但就目前 Web 开发的状况而言可改善的余地很少。JavaScript 语言的功能不够清晰,包括别扭的交互操作或失败的设计。正如 Emperor Joseph 所说的,这语言搞太多花样了。

嗯,既然这个 JavaScript 缺失之处这么多,一点都不讨好,怎么还做 Web 龙头的编程语言?回顾萌芽阶段当初,那位 Brendan Eich 仁兄就误打误撞的,说服了当时 Netscape 的秃头老板,说 Navigator 要做自己的脚本语言,还要不是新的语言不做,——就这样,匆匆忙忙地设计出一门新的语言来。话说回来,还真得要设计新的语言,那时并没有替代品。后来,为了能蚕食 Netscape 的市场,微软的 IE 团队决定兼容 Netscape 浏览器的 JavaScript,于是就心翼翼地通过逆向工程来得到 JavaScript,尽管明显有许多错误但也不管三七二十一了。其他浏览器厂商亦如是,效仿微软的做法,因此不存在浏览器必须实现的是“标准的 JavaScript”之说法。除了 JavaScript 外,没有其他语言能够在所有浏览器行得通。再者彼时互联网发展充满着一切未知,也不存在对某个语言进行仔细地调研,没有什么前期性的调研或周密的设计。它只是出自 Netscape 之手然后不断被复制而已。若我们人为地、刻意地、费煞苦心地创造一个类似 JavaScript 的东东但又为它过早地去建立标准,那样的东西,说不定不是我们想要的。

尽管 JavaScript 充满着缺点,但深入其内核是有许多地方错有错着的。当你一步一步慢慢到内部了解其奥秘,便会发现 JavaScript 是一个精练而且强大的编程语言。许多 AJAX 库现在用 JavaScript 来处理 DOM,以网页的形式来生成应用程序的交互平台。AJAX 变得更为流行正因 JavaScirpt 还算可以的,而且某些方面还超乎我们的想象。世界上最为流行的 JavaScript 曾经是世界上最受误解的语言。以其明显的缺陷、不时髦的编程模型、令全世界都误导的简介与它那个不相称的名字,曾经让大多数聪明的程序员觉得毫无价值而遭到抵制。但 AJAX 给了 JavaSciprt 二次新生。

正因为 JavaScript 是浏览器的正统语言,正因为 Web 浏览器渐渐成为传送消息程序中的重要部分,正因为 JavaScript 并不是太糟糕,故所以,JavaSciprt 已经成为世界上最流行的编程语言。由于其流通性在加大,同时也被应用在一些嵌入式程序中,故所以,JavaScript 业已经越来越重要了。

比聪明更好的是……好命!(It is better to be lucky than smart..)