004-0001 javascript的由来

 

JavaScript语言的前身叫作Livescript。自从Sun公司推出著名的Java语言之后,Netscape公司引进了Sun公司有关Java的程序概念,将自己原有的Livescript 重新进行设计,并改名为JavaScript。

JavaScript是一种基于对象和事件驱动并具有安全性能的脚本语言,有了JavaScript,可使网页变得生动。使用它的目的是与HTML超文本标识语言、Java 脚本语言一起实现在一个网页中链接多个对象,与网络客户交互作用,从而可以开发客户端的应用程序。它是通过嵌入或调入在标准的HTML语言中实现的。

JavaScript具有很多优点:

1.简单性  JavaScript是一种脚本编写语言,它采用小程序段的方式实现编程,像其它脚本语言一样,JavaScript同样已是一种解释性语言,它提供了一个简易的开发过程。它的基本结构形式与C、C++、VB、Delphi十分类似。但它不像这些语言一样,需要先编译,而是在程序运行过程中被逐行地解释。它与HTML标识结合在一起,从而方便用户的使用操作。

2.动态性  JavaScript是动态的,它可以直接对用户或客户输入做出响应,无须经过Web服务程序。它对用户的反映响应,是采用以事件驱动的方式进行的。所谓事件驱动,就是指在主页中执行了某种操作所产生的动作,就称为“事件”。比如按下鼠标、移动窗口、选择菜单等都可以视为事件。当事件发生后,可能会引起相应的事件响应。

3.跨平台性  JavaScript是依赖于浏览器本身,与操作环境无关,只要能运行浏览器的计算机,并支持JavaScript的浏览器就可以正确执行。

4.节省CGI的交互时间 随着WWW的迅速发展有许WWW服务器提供的服务要与浏览者进行交流,确浏览的身份、需服务的内等等,这项工作通常由CGI/PERL编写相应的接口程序与用户进行交互来完成。很显然,通过网络与用户的交互过程一方面增大了网络的通信量,另一方面影响了服务器的服务性能。服务器为一个用户运行一个CGI时,需要一个进程为它服务,它要占用服务器的资源(如CPU服务、内存耗费等),如果用户填表出现错误,交互服务占用的时间就会相应增加。被访问的热点主机与用户交互越多,服务器的性能影响就越大。

JavaScript是一种基于客户端浏览器的语言,用户在浏览中填表、验证的交互过程只是通过浏览器对调入HTML文档中的JavaScript源代码进行解释执行来完成的,即使是必须调用CGI的部分,浏览器只将用户输入验证后的信息提交给远程的服务器,大大减少了服务器的开销。

 

 

--------------------------

 

 

问题
============

JavaScript真的继承自Cmm吗?
JavaScript与Java有多少关系?
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" οnclick="alert('hello, world!')">
很快,三周之后netscape 就发布了beta2。这个版本正式地支持了<script>标签,并可以解析该标签
中的代码、标识符,开始具备调用函数、表达式运算等能力。这个版本已经具备了JavaScript 1.0
的基本性质。

——什么?能调用函数、表达式运算就是JavaScript 1.0的基本性质了?

是的,差不多了。相比起来,JavaScript 1.0只是在这样的基础上加上了一套对象系统而已。在随
后发布的beta 3中,函数可以作为构造器使用,可以创建出用户自己的对象来了。再后来window等
全局对象被加了进来,再把“当前网页”中的表单元素等影射成可编程对象,JavaScript 1.0就完
成了。

仅仅如此而已。在JavaScript 1.0的时代,既没有“原型继承”,也没有“函数式编程”——甚至
连匿名函数也没有支持,所以下面的代码就足够让浏览器挂掉了:
----------------
var func = function() {
}
----------------

JavaScript 1.0的设计目标,就是“让网页动起来”,最初的要求包括三个方面:
 - 让网页中的元素可以被编程,所以象forms、links这些对象,在网页装载结束后就初始化为全
   局成员了——那时候还没有所谓的DOM或DHTML呢。
 - 让JavaScript跟Java接近一些,因为Netscape与Sun有战略合作。而且,Sun那时相当火暴。
 - 让JavaScript可以在服务器与客户端两边都使用,因此它必须是嵌入式的。

不过JavaScript的另一项特性,则自它的第一个版本就存在。该特性就是动态执行,也就是eval()。
这是与它的“脚本”的性质有关的。在早期的“脚本”也被称为“批处理程序”,就如同DOS批处理
或Unix shell一样,脚本应当具有装入字符串文本并“动态执行”的能力。

所以总结起来,JavaScript 1.0其实是一个可以创建和操作对象的普通过程式语言。这个时候的JS
代码既不能检测“对象-构造器”之间的继承性,也没有原型继承这样的东东来构建对象系统。函数
除了在new MyObject()时协助传入一个this引用之外,就跟普通的函数完全一样。而且,最为有趣
的是,Brendan Eich这时还没有形成JavaScript中最重要的“类型系统”概念,此时undefined还只
是系统全局中的一个特殊的值,而不是某种类型。typeof关键字也还根本不存在。换言之,Eich现
在要做的只是一个“可编程的、可以用对象的”脚本语言,至于它是否在类型系统上完备或者优美,
他还顾不过来呢。

JavaScript最重要的“构造器-原型继承”概念是在JavaScript 1.1版本中提出的,类型系统和重要
的函数式语言特性要等到v1.2之后才被加入。而现在,在1996年1月底,JavaScript 1.0随Netscape
2.0正式版发布了。


JavaScript的名字
============

为了弄清楚JavaScript名称和语言特性的演变,我下载了netscape 2.0 beta1~6,以及2.0~2.02所
有版本的发布文件,并逐一安装测试。下面解释JavaScript名字的演变过程。

JavaScript最早是被称为Mocha(魔卡)的,这是这个项目的代码名。这个名字一直用到Netscape
2.0 beta 2发布之前(95.11.04)——包括在beta 1中弹出的错误框上,还可以看到Mocha的名字。
不过,早在此前的9月18号,netscape就已经发布消息将在LiveWire中启用一种服务器端脚本(未
提及名称)。又因为我们前面提到的“前后端通用脚本”的设计,该语言在beta 2发布时就使用
了内部名称LiveScript。

但同样混乱的事情是,事实上这时Netscape已经决定将该语言命名为“JavaScript”。因此在
beta 2的发布备忘中该语言称为JavaScript,而界面上却从Mocha改为了LiveScript。这一局面一
直持续到12月4日,netscape与sun共同发布声明,正式启用了JavaScript这个名字。随后beta 4
发布(95.12.20),界面和文档上就统一了。

所以事实上“LiveScript”这个名字可以考证的生命周期,也就只有一个月的时间(在95.11.04
- 12.04)。但Mocha毕竟只是项目代码名,而非产品名,所以后来人们追溯JavaScript的历史,
大多只提到LiveScript为止。


第一段网页内脚本真的是浓咖啡(Espresso Page)吗?
============

如上面所述的,Netscape 2.0的beta 1中就正式加入了脚本支持,最迟在beta 2之前。对象的构
建方式、<script>标签的使用,以及在HTML标签上使用onclick这类事件句柄……这些设计就已经
被明确了。这些是一直延续到现在的,我们最主要的使用网页的方式。

那么,这个时间点可以不容置疑的被确定在95.11.04之前(beta 2发布之前)。

我们现在再回过头来看那份讲述Espresso Page的消息。这其实是由Brent Noorda先生(Nombas公
司总裁)于1995.11.27日发布在新闻组上(comp.infosystems.www.authoring.html)上的一则消息,
原文是“这周末我们将放出一些Espresso Pages在我们的网站上(This weekend we put up the
Espresso Pages, at...)”,那么,也就是Espresso Pages其实出现在11.30号之后。这已经远远
晚于上面的时间了。

也就是说,真正第一种在Netscape中使用的客户端脚本,仍然是由Brendan Eich编写的JavaScript。
这种脚本使用“<script>”标签(在服务器端使用<server>标签),支持五种基本类型(除undefined
之外),支持自定义对象和构造器等基本特性,能够操作网页中内嵌的links、forms等对象。

然而需要继承说明的是,由于Nombas早早地就实现了Cmm语言以及其开发环境,所以他不需要花什么
力气就可以将它们移植到网页中去并展示其非常丰富的能力。所以在Brent Noorda先生在上面的消息
中说,(周末放出的)这个Demo将演示
 - a bouncy-button game,
 - real-time verification of user input into forms,
 - an animated stick-figure,
 - and a way cool flashback into the psychadellic sixties.
的确,这些演示的功能大概是当时的JavaScript(LiveScript)不能实现的。但相同的功能所需求的
特性以及其基本实现,其实正是Netscape当时已经发布的版本所包含的。所以这里根本就不存在
Netscape抄袭Nombas的问题。然而换一个角度来想,Nombas可能正是看到Netscape发布版本中的种
种特性,其实能够用一个嵌入到浏览器中的CEnvi来完成,因此发布了这样的一个示范版本。

从时间先后来分析,我们可以确信的是:
 - Netscape在网页中嵌入脚本是早在Espresso Pages出现之前的一个构想;
 - JavaScript(LiveScript)是真正的第一个在万维网上使用的客户端脚本语言。

无论如何,Espresso Pages很好地展示了Netscape当时正在图谋的构想——不管是Nombas是与Netscape
想到了一起,还是Nombas帮助Netscape展开了(由Netscape设计的)蓝图。在当时(JavaScript 1.0发
布之前),CEnvi中的Cmm相当完善,开发环境也很成熟。所以可以承认的是,Nombas的Espresso Pages
的确更好地展示了Web的末来。但是,成为“因特网的一块重要基石”的构想——这里指页面内脚本,绝
不是Nombas先创的理念。因为Netscape beta1~3中已经把这些理念都展示了出来。


其它
============
有一种Java的编译器也名为Mocha,但与本文中没有什么关系。

Cmm也称为C--,但另外还有一种名为Sphinx C--的语言,其设计目标与Cmm类似,但不是同一种语言。

在Java热火的时代里,出现了很多以浓咖啡(Espresso)命名的产品,但都不是这里的Espresso Pages。
Espresso Pages只是一些Demo页面,需要下载并专用安装一个CEnvi的特定版本才能查看。但这个特定版
本在互联网上已经绝迹了。

JavaScript并没有从Java中寻找太多灵感,Brendan Eich自己说“my influences were awk, C, HyperTalk,
and Self”,这其中既不包括 Java,也没有Cmm的影子。不过Brendan Eich也说另外的影响是“combined
with management orders to "make it look like Java."这强调的是一种形似,而不是语源上的承继关系。

在1996年2月,CEnvi发布了最后一个2.x版本。这个版本是对以前版本的一些修补。但接下来,过了约一年
半之后,CEnvi才发布下一个版本(v3.0)。从这个版本开始更名为ScriptEase,放弃了旧有的Cmm规格,而
采用了JavaScript规范下的语法。并且自这个版本开始,ScriptEase发布Desktop和Web Server等多种不同
的版本——此前CEnvi只有针对不同的操作系统的版本。所以事实上,非但不是Brendan Eich受到了Nombas
的影响,反而是Nombas受JavaScript而放弃了整个原来的语言设计,而且在产品策略上,还抄袭了Netscape
的LiveWire战略。

Nombas后来被收购掉,ScriptEase等系列产品不再维护。Nombas.com网站仍然可以访问,但只有一个告别页
面,不过相应的,Netscape也好不到哪里去。

Mozilla是Netscape一个早期的Java开发团队的内部代码名。在Netscape 2.0 beta中包含的Java代码包中,
就已经可以看到这一标志了。不过该团队真正独立出来成为开源组织,并最终接手Netscape未竟事业,则
是晚至1998年1月以后的事了。

Mozilla与Mozilla Firefox使用两套版本编号。所以“Mozilla 2”是2006.10月开始发起的,而当时Mozilla
Firefox 2.0b1已经发布了——它基于“Mozilla 1”的维护版本。同样有趣的是,Mozilla Firefox 3.x则在
基于“Mozilla 2”这个项目开发,大概,在2008年中期会发布正式版本。 

 

---------------------

 

2007年1月29日 星期一  下午11:49

当1995 年JavaScript第一次出现在Netscape Navigator 2.0中的时候,它的主要目的还只是为处理一些输入的有效性验证。试想一下用户提交一个表单给服务器之后,返回的却是因为少填一个字段返回的错误,在刚开 始普及28.8kb/s速率的电话线调制解调器时代,以如此慢速率和服务器交换数据对耐心是一个巨大的考验。因此当时处于技术最前沿的网景公司 Netscape开始考虑开发一种客户端脚本语言来对用户输入数据进行校验。现在JavaScript已经是每一个主流Web浏览器都具备的重要特性,随 着Web 2.0和Ajax(最成功的Ajax应用当数Gmail一个)进入主流,JavaScript更始是被推到了舞台的中心。

1995 年,当时工作于Netscape的Brendan Eich开始为同年发行的Netscape Navigator 2.0准备一个称之为LiveScipt(先前还有个名字叫LiveWire)的脚本语言,在和SUN的连手下,总算及时完成。正式发布的时候, Netscape将它改名为JavaScript(为沾点当时如日中天的Java语言的光),Netscape的付出和赌注最终有了回报,从此揭开了互联 网的又一个新的篇章。

因为JavaScript 1.0的成功,随后的Navigator 3.0发布了JavaScript 1.1,同时微软开始进军浏览器市场并发布IE3.0并发布了另一个类JavaScript实现JScript。虽然微软进军浏览器市场的决定为其带来了 旷日持久的官司和狼籍声名,但是这也是JavaScript发展历史上的重要一环。当时市场上有3个JavaScript版本,Netscape的 JavaScript、IE的JScript、CEnvi的SciptEase,因此制定一个标准势在必行,1997年JavaScript 1.1作为一个草案被提交给欧洲计算机制造商协会(ECMA),最终来自Netscape、微软、SUN、Borland及其他一些公司的程序员组成的 TC39委员会拿出了 ECMA-262标准,标准定义了叫做ECMAScript的脚本语言,接下来的几年里,ISO/IEC(国际标准化组织和国际电工委员会)接纳ECMAScript为标准(ISO/IEC-1626 )。

目前ECMA-262最新版为3th Edition。符合该标准的实现有:
* Microsoft公司的JScript.
* Mozilla的Javascript-C(C语言实现),现名Spidermonkey
* Mozilla的Rhino(Java实现)
* Digital Mars公司的DMDScript。
据测试,Spidermonkey的性能最好。 目前ECMA-262 4th Edition正在开发的过程中,与其对应的JavaScript的版本为JavaScript 2.0,目前也正在开发过程中。
ECMA 各版本说明、实现
ECMA v1:标准化了JavaScript1.1的基本特性,并添加了一些新特性,没有标准化switch语句和正则表达式。 由Netscape 4.5 和IE 4 实现。
ECMA v2:ECMA v1的维护版本,只添加了说明。 由Netscape 4.5 和IE 4 实现。
ECMA v3:标准化了switch语句、异常处理和正则表达式。 由Mozilla、Netscape 6 和 IE 5.5 实现。
(本段节选自wikwpedia

一 个完整的JavaScript实现包括:核心(ECMAScipt)、文档对象模型(DOM)、浏览器对象模型(BOM)。提一下DOM,因为从 Navigator 4.0和IE 4.0开始支持不同形式的动态网页(DHTML),为避免WEB开发者为不同的浏览器编写不同版本的页面,W3C 1998年制定了DOM,DOM包含两个部分:DOM Core、DOM HTML。前者制定了基于XML的文档结构图,以供访问文档内各对象,后者定义了一些HTML专用对象和方法。目前DOM最高版本为Level 3

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值