|
本文发布于2007-12-13
问题
JavaScript真的继承自Cmm吗?
JavaScirpt最初的设计是怎样的?
在许多资料,JavaScript的语源被追溯到一种名为Cmm的语言。同样是在这一溯源的过程中,人们发现“其实”JavaScript不是第一种网页中的脚本语言。现在一些所谓“公认”的情况是这样的:
大概在1992年,一家称作Nombas的公司开始开发一种叫做C减减(C-minus-minus,简称Cmm)的嵌入式脚本语言。这个脚本语言捆绑在一个叫做CEnvi的共享软件产品中,当NETscape Navigator崭露头角时,Nombas开发了一个可以嵌入网页中的CEnvi的版本。这些早期的试验称为Espresso Page(浓咖啡般的页面),它们代表了第一个在万维网上使用的客户端脚本语言。而Nombas丝毫没有料到它的理念将会成为因特网的一块重要基石。
然而,这是真实的情况吗?运行在NETscape中的第一个“客户端脚本语言”真的是Cmm的浓咖啡?
又或者真的象Wiki中记述的那样,Brendan Eich在JavaScript引用了Cmm语言特性?
不是的。尽管上述的资料看起来出自权威:《Javascript高级程序设计》(Professional JavaScript for Web Developers),但他的确错了。
JavaScript与Cmm在语言特性上无关
为了弄明白JavaScript与Cmm的关系,我大概用了三天的时间,从网上收集了多个Cmm的版本。这些版本既包括早期的Cmm(1993年),也包括在JavaScript初创时的Cmm(1995年),还包括在后来,Cmm更名为ScriptEase的第一个版本(3.0, 1997年),作为参考,我还考察了它在服务器端的版本。
遗憾的是,在1996年之前,在Cmm的2.x的最后一个版本之前,Cmm都并不是一个面向对象(或基于对象)的语言,Cmm正如它自己的名字所说的一样:是一个精减版的C,而不是C++或以C++为基础的变种。所以Cmm中有“结构”,也有#include等,整个的体系是参考C语言的。
由于JavaScript在基本的语法特性(例如大括号、语句关键字等)上参考了C,在对象系统上(例如“.”作为成员存取)上参考了Java,因此在一定程度上Cmm与JavaScript存在相似性——主要是与共同借鉴自C的部分。但是除了这些之外,JavaScript与Cmm在语言特性上完全无关。
JavaScript最初的基本设计是怎样的?
我需要补充一下JavaScript初始设计目标。Brendan Eich在1995年4月前后被NETscape公司雇佣,目标是完成一套语言系统。最初的设计里,该语言系统是为NETscape的LiveWire战略服务的。该战略彰显了NETscape当年的勃勃野心,它是NETscape公司的一个通用的Web开发环境,包括NETscape Enterprise、FastTrack Server等。LiveWire架构也成为所有Web服务器提供SP(Server Page)技术的蓝本。例如在IIS中的ASP,以及更早期的IDC(InterNET Database Connect)。
这种技术在服务器端通过内嵌于网页的LiveScript代码,使用名为database、DbPool、Cursor等的一组对象来存取LiveWire Database。作为整套的解决方案,NETscape在客户端网页上也提供LiveScript脚本语言的支持,除了访问Array、String等这些内置对象之外,也可以访问window等浏览器对象。
不过并不清楚的是:LiveScript最初的设计是先考虑服务器端应用,还是先考虑网页中应用。但这些应用环境的决策上的变化,时间仅仅限制在1995年4月至1995年10月之前,因为当月发布的NETscape 2. 0 beta1已经包含了脚本支持。
在NETscape 2.0 beta1中并不支持<script>标签,而只是在form表单元素中支持了onclick这类的事件。这时的脚本代码是用在HTML标签属性上的,也就是类似于:<input type="button">
很快,三周之后NETscape就发布了beta2。这个版本正式地支持了<script>标签,并可以解析该标签中的代码、标识符,开始具备调用函数、表达式运算等能力。这个版本已经具备了JavaScript 1.0的基本性质。
——什么?能调用函数、表达式运算就是JavaScript 1.0的基本性质了?
是的,差不多了。相比起来,JavaScript 1.0只是在这样的基础上加上了一套对象系统而已。在随后发布的beta 3中,函数可以作为构造器使用,可以创建出用户自己的对象来了。再后来window等全局对象被加了进来,再把“当前网页”中的表单元素等影射成可编程对象,JavaScript 1.0就完成了。
仅仅如此而已。在JavaScript 1.0的时代,既没有“原型继承”,也没有“函数式编程”——甚至连匿名函数也没有支持,所以下面的代码就足够让浏览器挂掉了:
var func = function() {}
it知识库:还原JavaScript的真实历史,转载需保留来源!
郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。