原文地址:http://weblogs.mozillazine.org/roadmap/archives/2008/04/popularity.html

看来(根据一位专家的说法是这样,不过还是感觉有点言不由衷),JavaScript最后真的流行起来了

[此处是youtub.com中一段视频,可惜被"墙"了]

对我这个从小就呆头呆脑的人来说,这段视频像是咒语又像是玩笑。(这要看你是否跟我站在了相同的立场上:绿壳鸡蛋不就流行过吗?)

布兰登·艾奇深得他那尖脑壳老板的信任,Navigator浏览器应该有自己的脚本语言,只有开发一门新语言才可行,必须在短时间内设计和实现这门语言,现有的任何语言都不能充当该角色。

我搞不清楚为什么道格(Doug)要编故事。他并不在网景公司。他亲耳听到过我回忆JavaScript诞生的经过,我在Ajax大会的发言中也讲过了。难道是想混淆视听,想在Web开发人员中掀起一股提前讨论MicroHoo C#语言的风潮?

谁知道呢,要计较这些就没完了。不过,鉴于本周是我参与创立的mozilla.org 10周年,我打算讲一点历史。

正如我多次重申过的,而且Netscape的其他人也可以证明,我是因为Netscape要在浏览器中“实现Scheme”才被招聘进公司的。当时,至少负责客户端技术的汤姆·帕坎(Tom Paguin)迈克尔·托伊(Michael Toy)瑞克·谢尔(Rick Schell),以及一个叫马克·安德森(Marc Andreessen)的家伙认为Netscape应该在HTML中嵌入一种语言,一种源程序式的编程语言。而我这个新人要去说服“尖脑壳”的老板几乎是不可能的——实际上更多的则是他们在向我解释问题。

到底是不是要基于Scheme并没有定论,但Scheme确实是吸引我加入Netscape的一个原因。在此之前,我在SGI公司期间,尼克·汤普森(Nick Thompson)引导我学习了SICP(Structure and Interpretation of Computer Programs《计算机程序的构造和解释》)。

当时真正需要的是一种有说服力的概念验证,也就是一个演示程序。在我交付演示程序之后,这个程序在极短的时间内就变为了既成事实。

没错,在加入Netscape后不久,我被调出服务器团队——由于人员不足,我在这个团队干了一段时间,在那里与麦库尔·吐温斯(McCool Twins)阿瑞·卢奥托嫩(Ari Luotonen)有了一段时间不长但很快乐的合作;1995年下半年,阿瑞和我创建了PAC(Proxy Auto Config,代理自动配置)——的时候,Oak语言已经改名为Java,而Netscape正与Sun协商将该语言包含在Navigator中。

Netscape公司内部争论的最大焦点变成了:“为什么要包含两种语言?为什么不只用Java?”得到的回答是:必须有两种语言分别面向编程圣殿中的两类最不可能走到一块的开发人员:组件开发人员——这类人使用C++或(我们希望的)Java和脚本开发人员(爱好者或专业人员)——这类人编写直接嵌入在HTML中的代码。

至于是否使用已有的语言,而不发明一门新语言,也不是我说了算的。上峰的“军令”就是这门语言必须“看起来像Java”。这样,不仅排除了Perl、Python和Tcl,也排除了Scheme。后来,1996年,约翰·奥斯特豪特(John Ousterhout)前来推广TK时,还曾因Tcl错过机会而惋惜过。

谈不上自鸣得意,但我确实为自己吸收了Scheme式的一类函数和Self式的原型(尽管不那么主流)而感到高兴。至于Java的影响,特别是Date的Y2K bug和原始类型与对象类型(如string与String)差异的影响则是非常不幸的。

时光倒转回1995年春天:我记得在此期间见到了比尔·乔伊(Bill Joy),我和他讨论了垃圾收集的细节(card marking for efficient write barriers)。比尔一上来就完全理解了我们所说的一门易用的“脚本语言”与Java的关系,他还拿微软平台的VB与C++之间的关系作类比。据我所知,比尔是我们在Sun公司的支持者。

基普·希克曼(Kipp Hickman)和我在1995年4到5月间研究了Java,基普也开始写他自己的JVM。他和我编写了NSPR的第一个版本,作为他的JVM之下的可移植层。而我在5月中上旬创建Mocha的原型时,也将该版本用作了相同的目的。

比尔说服我们放弃基普的JVM,因为它会导致与Sun的JVM中的bug无法兼容(在那个时候可谓智慧的预言)。而此时此刻,Mocha已经通过在Netscapte Navigator 2.0(的初期测试版)中的快速原型和嵌入证明它自己。

除此之外,应该说都是对历史的歪曲和调侃。JS在客户端打败了Java,只有Flash能与其竞争,而Flash又支持JS的一个衍生品——ActionScript

现在再回到流行的问题上。其实谈不谈这个问题都无所谓。然而,那些散布于互联网的流行的Ajax库,却经常以被掰碎了、压扁了,然后再以链接形式挑出来的纯文本的形式存在。难道不可以共享吗?

有一种想法——受到了不少人的质疑,最近一次发出质疑声音的人是道格——在可能将会非常长寿的script标签属性中嵌入“神秘的散列码”(crypto-hashes)。这是个好主意吗?

恐怕不是。一方面因为“神秘的散列码”理论上的完备性问题,另一方面则因为其广为人知的药饵攻击(poisoning attacks)。

还有一个主意倒是不错,这个主意我是先从罗布·塞尔(Rob Sayre)那里听说的:通过HTML5中script标签的share属性支持一种可选的“公认的URL”:
<script src=”http://my.edge.cached.startup.com/dojo-1.0.0.js”
shared=”http://o.aolcdn.com/dojo/1.0.0/dojo/dojo.xd.js”>
</script>

如果浏览器首先下载了共享的URL,而且根据HTTP的缓存规则它依然有效,那么就可以使用缓存(及预编译)的脚本,而不必从src属性指定的URL中下载。

这就避免了散列药饵的问题。这个方案只要求内容作者保证src属性指向的文件与share属性指定的这个库的公认(或流行)的版本相同即可。不过当然,我们必须信得过相应的DNS。(Ulp.)

这个方案可以避免在script标签属性值中嵌入不可预测的散列码。

欢迎大家就此问题给我留言。

好了,这次真的回到JavaScript流行的问题上了。我们都知道有些Ajax库的确流行。那JavaScript流行吗?很难说。有些Ajax开发人员表示(也证明)了对它的喜爱。但也有很多人骂它,也骂我。我依然认为JavaScript是C和Self草草结合的结果(或一个私生子)。我又想起了约翰逊博士(http://en.wikipedia.org/wiki/Dr._Samuel_Johnson)的那句话:“好的不是原创的,而原创的都不好。”

不过,这没什么。Web总要发展,否则只有死路一条。JS也一样,要不就不会有ES4了。说到ES4,很快将有下文。

Firefox 3好像也会流行的, 它的空间与时间性能测试预示了这一点。相关内容呢,我以后还会陆续地谈到。



朋友们的留言

  1. George Wing | 12月 21st, 2009 at 16:17

    是篇不错的JS史谈。

  2. 玄武岩石 | 12月 27th, 2009 at 15:15

    这类的文章自己平时看到的很少,国外的评论文章有点不大理解,因为我缺少相应的背景知识。我不是计算机专业的,不过想学一门编程语言,原因是可以在某种程度上实现自己的某些想法,不想老是寻找别人的软件,而且用起来不一定合乎自己的愿望。不知道,楼主能不能介绍一些呢,什么样的语言最可能满足我的想法,不要太多,能学好一种语言就不错了,毕竟任何一种语言要想学得通透一些都不是那么容易的,是吧?!

  3. 为之漫笔 | 12月 28th, 2009 at 13:21

    老实说,翻译完这段文字,我头脑里呈现的也是“支离破碎的断壁残垣”,而非一幅完整的图像。说到学习一门计算机编程语言,我感觉比学习一门外语也容易不到哪去。好在,学习编程语言,你可以随时跟计算机交互,不像学习外语那样必须与人交流。如果你想编写系统软件,那么C、C++、Java、C#这些语言,先学哪个都行;如果你想编写Web应用程序,恐怕就要从HTML、CSS、JavaScript这些客户端技术学起,然后过渡到ASP、PHP、JSP等服务器端脚本语言。当然,不管是系统软件,还是Web应用程序,做大了就要用到数据库,因此还必须掌握SQL语言。总之,系统语言、脚本语言和数据库语言必须都学一门才行。

我来说两句儿

可以在留言中使用以下标签 :<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>