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.)"
(完)
依云 说:
原来 Javascript 是这样悲剧的。。。
2011年6月25日 00:24 | # | 引用
Rei 说:
这篇文章可以解释我为什么觉得javascipt这么烂了
2011年6月25日 01:02 | # | 引用
ishmael 说:
python是绝对的面向对象语言…
2011年6月25日 02:22 | # | 引用
执手泪眼 说:
我也是一很很难理解javascript中的类和继承机制。原来javascript是这么的悲剧!
2011年6月25日 07:15 | # | 引用
aduhupu 说:
我也是学什么东西,都从它的历史学起。这蛮好玩的,以前学心理学,把心理学史导论先看了一遍。javascript没学过,不过我也是学计算机,对这个偶你有一点兴趣。
2011年6月25日 20:37 | # | 引用
netwjx 说:
函数式部分还是很不错的
日期部分确实不好用
2011年6月25日 21:28 | # | 引用
Micky 说:
Brendan Eich 的照片,真像一位慈祥的大婶……噗~
2011年6月25日 21:40 | # | 引用
RedNax 说:
Javascript一点都不烂,只是比较灵活。当然有一些设计不够严谨的地方是不太好,不过稍微注意一下就行(需要注意的陷阱可比C/C++少太多了)。
2011年6月26日 16:40 | # | 引用
bush 说:
10天啊!JS 再爛也不能抹殺 Eich 的功績。
真正的程序員就應該是這樣幹活的~
2011年6月26日 18:50 | # | 引用
离谱 说:
他对Java一点兴趣也没有。为了应付公司安排的任务,他只用10天时间就把Javascript设计出来了
听到这话 我忽然感觉,学习js的都是一群杯具的人物~
2011年6月26日 21:23 | # | 引用
w 说:
JavaScript本身不烂,只是在Ajax复兴前被脚本少年搞烂了。
2011年6月26日 23:35 | # | 引用
Avenger 说:
10 天设计一门语言,神一般的人物啊。
2011年6月27日 07:03 | # | 引用
神仙 说:
10天设计一个语言,不过应该不会10天实现了吧。
2011年6月27日 15:18 | # | 引用
idea 说:
不知博主是否发现你的个人简介打不开?
2011年6月28日 17:02 | # | 引用
fff 说:
这是要证明 杂种优势么
2011年7月 1日 22:42 | # | 引用
李琼 说:
您好:我往您gmail邮箱里发了一封约稿信。请您查收一下。多谢您。
2011年7月 3日 17:15 | # | 引用
ivBear 说:
为什么不基于python设计?为什么不基于python设计?为什么不基于python设计......怨念中...
2011年7月 6日 14:29 | # | 引用
david 说:
人家十天设计出来的东西,我们却要花十年去学。
2011年7月 8日 10:15 | # | 引用
nemo 说:
我看的时候也在想一模一样的问题!
2011年7月12日 20:53 | # | 引用
pauli 说:
晕倒,Python 是那一年的啊。父亲怎么会长得像儿子!
2011年7月15日 12:43 | # | 引用
依云 说:
据维基百科,Python 是1991年出现的,Javascript 是1995年。而且确实受到了 Python 的影响!
2011年7月26日 15:17 | # | 引用
sirczpp 说:
学习历史 才能理解
2011年8月 2日 11:34 | # | 引用
toming 说:
"这个决策实际上将Perl、Python、Tcl、Scheme等非面向对象编程的语言都排除在外了。"这句话有点小错误。
2011年8月 2日 14:54 | # | 引用
jyf007 说:
现在有一种编译器拉居然是LLVM加工成Javascript
2011年12月24日 21:07 | # | 引用
shuiren 说:
没正经学过js,怪不得,这么混乱啊
2012年3月 7日 10:47 | # | 引用
Allen 说:
私生子的命运果然多舛,一同他的followers ..
2012年5月19日 21:32 | # | 引用
星期六的黄昏 说:
http://stackoverflow.com/questions/3722334/why-dont-they-implement-python-and-ruby-in-the-web-browsers
2012年5月31日 18:20 | # | 引用
sleepd 说:
作为一个python使用者,最近在学习javascript,看了这篇文章以后,终于明白我那被受折磨的感觉不是源于我的无能……
2012年7月11日 17:21 | # | 引用
zhuwang 说:
充分说明了不负责任的行为是多么的坑爹,而且是几代人啊
2012年10月29日 12:46 | # | 引用
Lisces 说:
上面说被坑的 完全没理解这篇文章和作者自嘲式幽默的意思啊
实际上 javascript可以说是一个非常好用和十分优美的语言
并且学习成本相对其它语言低的多
我认为它的整体设计 其实是非常成功的
想像一下一堆人围着超市的手推车 抱怨它不好用的场景吧
有人说 为什么里面没有设计格子
有人说 为什么没有设计刹车
有人说 为什么没有设计档位
......
手推车就是手推车 它已经完美的完成了它的工作
2012年12月25日 18:57 | # | 引用
Amin By 说:
哈,人家10天设计,又没说是实现。
2013年4月 9日 18:06 | # | 引用
t3dbundy 说:
说十天设计并不准确,而是作者花了十天实现。quora上有他本人的回答。参见In which 10 days of May did Brendan Eich write JavaScript (Mocha) in 1995? http://qr.ae/5Lkz9
2014年8月23日 10:04 | # | 引用
caesarchow 说:
什么都要慢慢发展的呢
2015年4月 1日 11:26 | # | 引用
havefun 说:
说的真好
2017年5月 8日 09:26 | # | 引用
Yu Er 说:
用 Python 哪个版本呢?
2017年5月12日 13:46 | # | 引用
twang 说:
从历史角度来看javascript蛮有趣的,思路很有意思。
2018年1月17日 14:52 | # | 引用
heiheihei 说:
觉得烂的小朋友,请在浏览器控制台打印执行这行代码 (!(~+[])+{})[--[~+""][+[]]*[~+[]] + ~~!+[]]+({}+[])[[~!+[]]*~+[]]
2018年3月19日 13:42 | # | 引用
ZeroOnet 说:
这一夜情的说法,倒是大神程序员通有的幽默
2018年5月 2日 20:19 | # | 引用
rt95 说:
原来 js 是 c 和 self 的私生子哈哈
2019年8月18日 16:38 | # | 引用
rm -rf * 说:
感觉js比java轻多了,但是我写js就像写java,搞不清js的类
2020年12月 8日 10:52 | # | 引用
大大 说:
第一、10天时间去设计应该不代表10天时间去完成它的解释器。国内的好多版本几乎都不去解释着两者的区别,以讹传讹。
第二、我觉得js做算法题应该是最爽的了。感觉比python还舒服啊。真的,没骗你。
2021年5月27日 17:31 | # | 引用
abovethecode 说:
这是怎么实现的?
2022年3月 9日 10:14 | # | 引用
Shouduo 说:
那一夜,C语言和Self语言都喝多了
2022年3月16日 15:49 | # | 引用
Miroir 说:
感谢作者让我们了解js的起源!
2022年10月 8日 11:58 | # | 引用