Javascript诞生记

作者: 阮一峰

日期: 2011年6月24日

1.

二周前,我谈了一点Javascript的历史。

今天把这部分补全,从历史的角度,说明Javascript到底是如何设计出来的。

只有了解这段历史,才能明白Javascript为什么是现在的样子。我依据的资料,主要是Brendan Eich的自述

2.

上一篇文章写道:

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

网页脚本语言到底是什么语言?网景公司当时有两个选择:一个是采用现有的语言,比如Perl、Python、Tcl、Scheme等等,允许它们直接嵌入网页;另一个是发明一种全新的语言。

这两个选择各有利弊。第一个选择,有利于充分利用现有代码和程序员资源,推广起来比较容易;第二个选择,有利于开发出完全适用的语言,实现起来比较容易。

到底采用哪一个选择,网景公司内部争执不下,管理层一时难以下定决心。

3.

就在这时,发生了另外一件大事:1995年Sun公司将Oak语言改名为Java,正式向市场推出。

Sun公司大肆宣传,许诺这种语言可以"一次编写,到处运行"(Write Once, Run Anywhere),它看上去很可能成为未来的主宰。

网景公司动了心,决定与Sun公司结成联盟。它不仅允许Java程序以applet(小程序)的形式,直接在浏览器中运行;甚至还考虑直接将Java作为脚本语言嵌入网页,只是因为这样会使HTML网页过于复杂,后来才不得不放弃。

总之,当时的形势就是,网景公司的整个管理层,都是Java语言的信徒,Sun公司完全介入网页脚本语言的决策。因此,Javascript后来就是网景和Sun两家公司一起携手推向市场的,这种语言被命名为"Java+script"并不是偶然的。

4.

此时,34岁的系统程序员Brendan Eich登场了。1995年4月,网景公司录用了他。

Brendan Eich的主要方向和兴趣是函数式编程,网景公司招聘他的目的,是研究将Scheme语言作为网页脚本语言的可能性。Brendan Eich本人也是这样想的,以为进入新公司后,会主要与Scheme语言打交道。

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

Brendan Eich被指定为这种"简化版Java语言"的设计师。

5.

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

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

总的来说,他的设计思路是这样的:

  (1)借鉴C语言的基本语法;

  (2)借鉴Java语言的数据类型和内存管理;

  (3)借鉴Scheme语言,将函数提升到"第一等公民"(first class)的地位;

  (4)借鉴Self语言,使用基于原型(prototype)的继承机制。

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

6.

多年以后,Brendan Eich还是看不起Java。

他说:

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

把基本数据类型包装成对象,这样做是否可取,这里暂且不论。Y2K问题则是直接与Java有关。根据设想,Date.getYear()返回的应该是年份的最后两位:

  var date1 = new Date(1999,0,1);

  var year1 = date1.getYear();

  alert(year1); // 99

但是实际上,对于2000年,它返回的是100!

  var date2 = new Date(2000,0,1);

  var year2 = date2.getYear();

  alert(year2); // 100

如果用这个函数生成年份,某些网页可能出现"19100"这样的结果。这个问题完全来源于Java,因为Javascript的日期类直接采用了java.util.Date函数库。Brendan Eich显然很不满意这个结果,这导致后来不得不添加了一个返回四位数年份的Date.getFullYear()函数。

如果不是公司的决策,Brendan Eich绝不可能把Java作为Javascript设计的原型。作为设计者,他一点也不喜欢自己的这个作品:

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

(完)

留言(44条)

原来 Javascript 是这样悲剧的。。。

这篇文章可以解释我为什么觉得javascipt这么烂了

python是绝对的面向对象语言…

我也是一很很难理解javascript中的类和继承机制。原来javascript是这么的悲剧!

我也是学什么东西,都从它的历史学起。这蛮好玩的,以前学心理学,把心理学史导论先看了一遍。javascript没学过,不过我也是学计算机,对这个偶你有一点兴趣。

函数式部分还是很不错的

日期部分确实不好用

Brendan Eich 的照片,真像一位慈祥的大婶……噗~

Javascript一点都不烂,只是比较灵活。当然有一些设计不够严谨的地方是不太好,不过稍微注意一下就行(需要注意的陷阱可比C/C++少太多了)。

10天啊!JS 再爛也不能抹殺 Eich 的功績。
真正的程序員就應該是這樣幹活的~

他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把Javascript设计出来了
听到这话 我忽然感觉,学习js的都是一群杯具的人物~

引用Rei的发言:

这篇文章可以解释我为什么觉得javascipt这么烂了

JavaScript本身不烂,只是在Ajax复兴前被脚本少年搞烂了。

10 天设计一门语言,神一般的人物啊。

10天设计一个语言,不过应该不会10天实现了吧。

不知博主是否发现你的个人简介打不开?

这是要证明 杂种优势么

您好:我往您gmail邮箱里发了一封约稿信。请您查收一下。多谢您。

为什么不基于python设计?为什么不基于python设计?为什么不基于python设计......怨念中...

人家十天设计出来的东西,我们却要花十年去学。

引用ivBear的发言:

为什么不基于python设计?为什么不基于python设计?为什么不基于python设计......怨念中...

我看的时候也在想一模一样的问题!

引用nemo的发言:

我看的时候也在想一模一样的问题!

晕倒,Python 是那一年的啊。父亲怎么会长得像儿子!

引用pauli的发言:

晕倒,Python 是那一年的啊。父亲怎么会长得像儿子!

据维基百科,Python 是1991年出现的,Javascript 是1995年。而且确实受到了 Python 的影响!

引用aduhupu的发言:

我也是学什么东西,都从它的历史学起。这蛮好玩的,以前学心理学,把心理学史导论先看了一遍。

学习历史 才能理解

"这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。"这句话有点小错误。

现在有一种编译器拉居然是LLVM加工成Javascript

没正经学过js,怪不得,这么混乱啊

私生子的命运果然多舛,一同他的followers ..

引用ivBear的发言:

为什么不基于python设计?为什么不基于python设计?为什么不基于python设计......怨念中...

http://stackoverflow.com/questions/3722334/why-dont-they-implement-python-and-ruby-in-the-web-browsers


作为一个python使用者,最近在学习javascript,看了这篇文章以后,终于明白我那被受折磨的感觉不是源于我的无能……

充分说明了不负责任的行为是多么的坑爹,而且是几代人啊

上面说被坑的 完全没理解这篇文章和作者自嘲式幽默的意思啊
实际上 javascript可以说是一个非常好用和十分优美的语言
并且学习成本相对其它语言低的多
我认为它的整体设计 其实是非常成功的
想像一下一堆人围着超市的手推车 抱怨它不好用的场景吧
有人说 为什么里面没有设计格子
有人说 为什么没有设计刹车
有人说 为什么没有设计档位
......
手推车就是手推车 它已经完美的完成了它的工作

引用w的发言:

JavaScript本身不烂,只是在Ajax复兴前被脚本少年搞烂了。

哈,人家10天设计,又没说是实现。

说十天设计并不准确,而是作者花了十天实现。quora上有他本人的回答。参见In which 10 days of May did Brendan Eich write JavaScript (Mocha) in 1995? http://qr.ae/5Lkz9

引用Amin By的发言:

哈,人家10天设计,又没说是实现。

什么都要慢慢发展的呢

引用Lisces的发言:

上面说被坑的 完全没理解这篇文章和作者自嘲式幽默的意思啊
实际上 javascript可以说是一个非常好用和十分优美的语言
并且学习成本相对其它语言低的多
我认为它的整体设计 其实是非常成功的
想像一下一堆人围着超市的手推车 抱怨它不好用的场景吧
有人说 为什么里面没有设计格子
有人说 为什么没有设计刹车
有人说 为什么没有设计档位
......
手推车就是手推车 它已经完美的完成了它的工作

说的真好

引用nemo的发言:

我看的时候也在想一模一样的问题!

用 Python 哪个版本呢?

从历史角度来看javascript蛮有趣的,思路很有意思。

觉得烂的小朋友,请在浏览器控制台打印执行这行代码 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]

这一夜情的说法,倒是大神程序员通有的幽默

原来 js 是 c 和 self 的私生子哈哈

感觉js比java轻多了,但是我写js就像写java,搞不清js的类

第一、10天时间去设计应该不代表10天时间去完成它的解释器。国内的好多版本几乎都不去解释着两者的区别,以讹传讹。
第二、我觉得js做算法题应该是最爽的了。感觉比python还舒服啊。真的,没骗你。

引用heiheihei的发言:

觉得烂的小朋友,请在浏览器控制台打印执行这行代码 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]


这是怎么实现的?

那一夜,C语言和Self语言都喝多了

感谢作者让我们了解js的起源!

我要发表看法

«-必填

«-必填,不公开

«-我信任你,不会填写广告链接