JavaScript的前世今生(上)

在“JavaScript简介”一文中,我们主要谈到了关于JavaScript的历史和版本问题,这有助于我们理解JavaScript的初衷,也能够让我们看到JavaScript的发展历程,进而对JavaScript本身有一个初步的评估。在本文中,我们将一同回忆JavaScript那并不受人喜欢的“前世”。

JavaScript诞生记

1994年,网景公司(Netscape)发布了Navigator浏览器0.9版。这是历史上第一个比较成熟的网络浏览器,轰动一时。但是,这个版本的浏览器只能用来浏览,不具备与访问者互动的能力。网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。

网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。

就在这时,发生了另外一件大事:1995年Sun公司将Oak语言改名为Java,正式向市场推出。Sun公司大肆宣传,许诺这种语言可以“一次编写,到处运行”(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。

总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,JavaScript后来就是由网景和Sun两家公司一起携手推向市场的。

此时,34岁的系统程序员布兰登·艾奇(Brendan Eich)登场了。1995年4月,网景公司录用了他。布兰登·艾奇的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。布兰登·艾奇本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。

仅仅一个月之后,1995年5月,网景公司做出决策,未来的网页脚本语言必须“看上去与Java足够相似”,但是比Java简单,使得非专业的网页作者也能很快上手。这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。兰登·艾奇被指定为这种“简化版Java语言”的设计师。

但是,他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把JavaScript设计出来了。

由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,JavaScript写出来的程序混乱不堪。如果布兰登·艾奇预见到,未来这种语言会成为互联网第一大语言,全世界有几百万学习者,他会不会多花一点时间呢?总的来说,他的设计思路是这样的

  1. 借鉴C语言的基本语法;
  2. 借鉴Java语言的数据类型和内存管理;
  3. 借鉴Scheme语言,将函数提升到“第一等公民”(first class)的地位;
  4. 借鉴Self语言,使用基于原型(prototype)的继承机制。

所以,Javascript语言实际上是两种语言风格的混合产物——(简化的)函数式编程+(简化的)面向对象编程。这是由布兰登·艾奇(函数式编程)与网景公司(面向对象编程)共同决定的。

多年以后,布兰登·艾奇还是看不起Java。他说:

Java(对JavaScript)的影响,主要是把数据分成基本类型(primitive)和对象类型(object)两种,比如字符串和字符串对象,以及引入了Y2K问题。这真是不幸啊。

如果不是公司的决策,布兰登·艾奇绝不可能把Java作为JavaScript设计的原型。作为设计者,他一点也不喜欢自己的这个作品:

与其说我爱JavaScript,不如说我恨它。它是C语言和Self语言一夜情的产物。十八世纪英国文学家约翰逊博士说得好:“它的优秀之处并非原创,它的原创之处并不优秀。”(the part that is good is not original, and the part that is original is not good.)

JavaScript那抹不去的骂名

由于设计时间仓促(JavaScript的设计只花了10天)、过早的标准化(Javascript推出一年半之后,国际标准就问世了,设计缺陷还没有充分暴露就成了标准)等客观因素使得JavaScript中糟粕的比重超出了预料。它一诞生就在短短令人吃惊的时间里面被全世界所接受。当它还非常粗糙时,就被直接集成到网景的Navigator 2浏览器中。以至于多年来对它的主流观点是:JavaScript就是一个丑陋的、没用的玩具

下面列举了JavaScript广受批判的几个方面:

  1. JavaScript的命名问题

    Java-前缀使人联想到Java,很容易让人以为JavaScript是Java的子级或是简化版的Java。但事实上JavaScript与Java是两门完全不同的语言,网景公司当年给其取名为JavaScript是有特别意图的。

    Script-后缀让人认为他不是一门真正的编程语言,和一门“编程语言”还有相当的差距。但是这只是应用领域的问题。和C语言相比,JavaScript是牺牲了性能但换来了丰富的表现力和灵活的形态。

  2. 至今犹存的浏览器兼容性问题

    JavaScript的一些早期实现有许多的bug,这对语言本身产生了很坏的影响,更糟糕的是这些满是bug的实现是嵌入在满是bug的web浏览器中。虽然目前所有的浏览器都遵循ECMAScript标准,这为JavaScript的使用提供了良好的保障。但某些浏览器(尤其是IE6~8)依旧存在这样或那样的不兼容,我们不得不针对它们书写不同的代码。

  3. 浏览器的性能瓶颈

    JavaScript在浏览器中的运行效率一直是浏览器开发商需要进行优化的部分,早期的浏览器版本执行JavaScript的效率低下,以至于无法满足复杂应用的开发需求,甚至于给用户带来卡带式的“用户体验”。

  4. 糟糕的API设计

    许多人最早使用JavaScript不是因为喜欢这种语言,而是工作中必须用它,在实际工作中用得最多的就是DOM(用于操作网页中的元素),而DOM API的设计与各浏览器的具体实现实在不怎么样,按照jQuery设计者John Resig的观点,它绝不可能获得任何“年度友好API(Friendliest API of the Year)”的奖项!

  5. 廉价的Copy-Paste

    随着jQuery等JavaScript库的流行,JavaScript的门槛更低了,使用起来也更加容易,使得任何非专业人员都能轻松地实现相关交互和动画效果。再加上代码分享站点的出现,以及JavaScript代码本身获取的便捷性,只要轻松地Copy-Paste就可以完成一个令老板或上司满意的结果。

  6. 语言本身的设计缺陷

    JavaScript的最初几版非常弱,没有异常处理,没有内部函数和继承。现如今它已是一门完全面向对象的编程语言,但是这门语言的许多思想都是基于它那不成熟的形式。正是如此,JavaScript的一些明显缺陷被暴漏了出来:

    • 不支持块级作用域。
    • 糟糕冗长的语法(如:函数声明中无法直接设置可选参数和默认值,需要通过大量代码来模拟)。
    • 全局变量难以控制(Javascript的全局变量,在所有模块中都是可见的;任何一个函数内部都可以生成全局变量,大大加剧了程序的复杂性)。
    • 无法应对复杂的互联网应用程序,不支持大家己普遍熟悉的以类为模板的面向对象编程方式。
    • 不支持多核CPU,JavaScript没有线程的概念,也缺乏必要的线程同步手段,使得它几乎无法编写能充分应用客户端多核CPU计算能力的代码。
    • ……

参考内容