ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史

时间:2024-03-30 21:36:25

互联网起火-Web时代的来临

在行文之前,反手就安利一下《浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战》。

浏览器始祖NCSA Mosaic在1993年1月发布(于1992年末由国家超级计算机应用中心—National Center for Supercomputing Applications开发)。Mosaic可以同时展示文字和图片,从此浏览器变得有趣多了。 在当时人气爆发的大受欢迎。Mosaic的出现,算是点燃了后期互联网热潮的火种之一。NCSA将Mosaic的商业运营权转售给了Spyglass公司,该公司又向包括微软公司在内的多家公司技术授权,允许其在 Mosaic的基础上开发自己的产品

MOSAIC开发的中心人物马克·安德森吉姆·克拉克(几何图形发生器发明人、SGI与Healtheon公司的创始人)设立了「MOSAIC Communication Corp.」,这家公司之后1994年11月改名为「Netscape Communication Corp.」,中译为网景。网景通信聘用了许多原有的Mosaic浏览器工程师,但是没有采用Mosaic网页浏览器的任何代码。

1994年10月13日,网景通信公司推出发布了Mosaic Netscape 0.9(网景导航者、网景浏览器),年底推出Netscape1.0,自称“Mozilla/1.0(Win3.1)。据说Mozilla = Mosaic + Killer,意为Mosaic杀手,也有说法是 Mozilla = Mosaic & Godzilla,意为马赛克和哥斯拉,而Mozilla最初的吉祥物是只绿色大蜥蜴。Netscape Navigator 取得了巨大成功,在发布的 4 个月里占据了 75% 的浏览器市场,短期内成为了默认浏览器。

浏览器其实阶段,不具备与访问者互动的能力。......网景公司急需一种网页脚本语言,使得浏览器可以与网页互动。起初它的主要目的是处理以前由服务器端负责的一些表单验证。在那个绝大多数用户都在使用调制解调器上网的时代,用户填写完一个表单点击提交,需要等待几十秒,完了服务器反馈给你说某个地方填错了......在当时如果能在客户端完成一些基本的验证绝对是令人兴奋的。当时走在技术革新最前沿的Netscape(网景)公司,决定着手开发一种客户端脚本语言,用来处理这种装简单的验证。

网页脚本语言到底是什么语言?

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

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

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

JavaScript的诞生

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

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

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

1995年4月,网景公司录用34岁Brendan Eich( JavaScript 之父 闪亮登场)。

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

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

Brendan Eich被指定为这种"简化版Java语言"的设计师。但是,他对Java一点兴趣也没有。为了完成(应付)公司安排的任务,他只用10天时间就把JavaScript设计出来了。虽然语言的设计者水平非常NB,但谁也架不住“时间紧,任务重”。由于设计时间太短,语言的一些细节考虑得不够严谨,导致后来很长一段时间,Javascript写出来的程序混乱不堪。如果不是公司的决策,Brendan Eich绝不可能把Java作为Javascript设计的原型。作为设计者,他一点也不喜欢自己的这个作品:

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

在其自叙中

1995年4月,在SiliconGraphics工作了七年,又在MicroUnity System Enineering工作三年之后,我来到了现在的Netscape公司。Netscape公司一年前就开始找人开发一种脚本语言,希望能够运用到浏览器的网页里,让我网能够动起来。Java从First Person到Sun也经过了五个春秋,1994年是还为了能够应用到Web上而重构过。Netscape第一个获得了Java的认证,因此一个问题出现了:我们直接使用Java,还是令搞一个语言?

有的人极力主张使用Java,Java很好,很适合程序员写组件。但是还有更多的人只是写点脚本,或者直接把别人的脚本拷过来改一改就行。这些人不是专业的程序员,大部分时间都用来干别的事情,而不是敲代码。比如说网管,或者一些只写脚本的业余人员。如果他们想写点代码,他们只希望随便敲打两下键盘就行。最后,我们决定开发一门新语言,必须长得像Java,并且是脚本语言。

与其他所有语言一样,它也是从其他语言借鉴了很多东西。与1995年9月,它第一次跟随Navegator2.0 beta版一起发布,当时取名为LiveScript。紧接着,12月4号,公司与Sun公司一起宣布合作时更名为了JavaScript。

JavaScript吸引到了大量的开发者,因为人所要的东西仅仅是从HTML中迈出一步,使用一点代码是网页动起来——使东西移动,对用户的输入做出反应,或者改变颜色;弹出一个窗口;或者弹出一个对话框问个问题,只有回答了才能继续——这些事情HTML干不了,你需要编程语言,但是要足够简单,不需像Java或者C++这样复杂。

内容建设不需要太高深。这不是什么只有专家或者牛逼哄哄的计算机科学家才能研究的深奥问题。这样有助于在内容创建和分享过程中节约成本有经济优势,。就如Netscape在网络建设中所做的一样

1995推出的Javascript语言实际上是两种语言风格的杂种——(简化的)函数式编程+(简化的)面向对象编程,这是由Brendan Eich(函数式编程)与网景公司(面向对象编程)共同决定的。

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

  1. 借鉴C语言的基本语法;

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

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

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

作为曾经的java工程师,曾经也被单片机虐过千万遍,但是,最讨厌的还是JS。比如写《图说js中的this——深入理解javascript中this指针

在面向对象编程里有两个重要的概念:一个是类,一个是实例化的对象,类是一个抽象的概念,用个形象的比喻表述的话,类就像一个模具,而实例化对象就是通过这个模具制造出来的产品,实例化对象才是我们需要的实实在在的东西,类和实例化对象有着很密切的关系,但是在使用上类的功能是绝对不能取代实例化对象,就像模具和模具制造的产品的关系,二者的用途是不相同的。

 其实javascript里的this指针逻辑上的概念也是实例化对象,这一点和java语言里的this指针是一致的,但是javascript里的this指针却比java里的this难以理解的多,究其根本原因我个人觉得有三个原因:

  原因一:javascript是一个函数编程语言,怪就怪在它也有this指针,说明这个函数编程语言也是面向对象的语言,说的具体点,javascript里的函数是一个高阶函数,编程语言里的高阶函数是可以作为对象传递的,同时javascript里的函数还有可以作为构造函数,这个构造函数可以创建实例化对象,结果导致方法执行时候this指针的指向会不断发生变化,很难控制。

  原因二:javascript里的全局作用域对this指针有很大的影响,由上面java的例子我们看到,this指针只有在使用new操作符后才会生效,但是javascript里的this在没有进行new操作也会生效,这时候this往往会指向全局对象window。

  原因三:javascript里call和apply操作符可以随意改变this指向,这看起来很灵活,但是这种不合常理的做法破坏了我们理解this指针的本意,同时也让写代码时候很难理解this的真正指向

JavaScript的兴起

ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史

1995年Netscape Navigator 2上首先实现了该语言的JavaScript 1.0版,主要应用于客户端Web应用程序开发,由于及时推出了相关标准,以及语言本身使用简单,实现功能强大的优点,受到Web应有程序开发者的追捧。

为网页脚本语言王者正名

JavaScript最初叫 Mocha, 接着改名为 LiveScript。

1996年的时候Java炙手可热,Netscape为了搭上媒体热炒Java的顺风车,于是某产品经理,命令更名。为了“Javascript”像Java,最后才确定命名为 JavaScript。这让很多人误认为JavaScript是Java的低级版,其实并不是雷锋和雷峰塔的关系这么简单。根据历史记录,Java 的命名与 Netscape 和 Sun 之间的合作有关。Netscape与Sun公司成立了一个开发联盟,Netsacpe的脚本语言可以叫JavaScript,作为交换条件,Netscape 在他们备受欢迎的浏览器中创建了 Java 运行环境。因此,Javascript其实是网景和Sun两家公司一起携手推向市场的,这种语言被命名为"Java+script"并非单纯的网页脚本语言揩油Java这么简单,其实是你侬我侬的事情。要知道,LiveScript 和 Java 在客户端脚本方面(如Java applet)存在敌对关系。

JavaScript演义之王者争霸

  • Java Applet是用Java语言编写的,有特定用途的应用程序,其直接嵌入到HTML页面中,由支持Java的浏览器解释执行并发挥其特定功能,大大提高Web页面的交互和动态执行能力,包含Applet应用程序的页面被称为Java-powered页。

    当用户访问这样的网页时,如果客户端浏览器支持Java,并没有将浏览器对Java的支持选项设置为禁止,则Applet被下载到用户的计算机上执行,并执行速度不受网络带宽的限制,用户可以更好地欣赏网页上Applet产生的各种效果。

  • ScriptEase是大概诞生于1992年,由Nombas 的公司开发了一种叫做 C 减减(C-minus-minus,简称 Cmm)的嵌入式脚本语言改名而来(据说后面的部分(mm)听起来过于消极,同时字母 C “令人害怕”)。

    Cmm 背后的理念很简单:一个足够强大可以替代宏操作(macro)的脚本语言,同时保持与 C (和 C ++)足够的相似性,以便开发人员能很快学会。这个脚本语言捆绑在一个叫做 CEnvi 的共享软件中,它首次向开发人员展示了这种语言的威力。

  • VBScript(Microsoft Visual Basic Scripting Edition)是程序开发语言Visual Basic家族的最新成员,它将灵活的脚本应用于更广泛的领域,包括Microsoft Internet Explorer中的Web客户端脚本和Microsoft Internet Infomation Server中的Web服务器端脚本。VBScript也是Microsoft推出的产品,开始主要定位于客户端脚本,由于动态页面技术的快速发展,VBScript走向服务器端,与ASP,IIS(Internet Infomation Server, Internet信息服务)紧密结合,有力促进动态页面技术的发展。

    Microsoft的JScript和VBScript脚本应用在服务器端,执行相应的管理权限,同时Microsoft提供其访问系统组建的API,使之与系统紧密结合,如访问本地数据库,并将结果返回客户端浏览器等。

或许因为因为JavaScript 1.0获得了巨大的成功,网景一看浏览器业务蒸蒸日上,野心大涨,打起搞个操作系统的注意,微软意识到网景通讯公司对其操作系统和应用市场的威胁,立马收购另外一家浏览器公司,在其基础上开发了Internet Explorer网景跟微软的撕逼大战不必多说,这中间就是多出了IE。

随着电脑技术的突飞猛进和互联网的崛起,Internet浏览器技术方兴未艾,而比尔•盖茨认为,决定未来计算机世界命运的,仍是“视窗”技术而不会是浏览器技术。因此,他仅仅在新推出的Windows95中增加了一个网络浏览功能,而并没有进行浏览器技术开发的计划。

在随后的两年内,网景专注于浏览器技术的开发。很快,伴随着NC、JAVA等技术标准的提出,一种基于Internet而首次与微软无关的新的软硬件体系形成了。以网景为首的一批互联网技术公司应声崛起,迅速构成了一股隐隐然可以与微软分庭抗礼的新力量。一个显而易见的事实正在生成:如果网景在浏览器市场上取得垄断性优势,它就完全有可能和实力推出一套新的操作系统以替代微软的Windows。

“微软错了。未来的世界不是PC,而是Internet。”比尔•盖茨很快就意识到,他犯下了一个足以让微软走向毁灭的错误。

1997年,微软发布了性能稳定的IE 4.0,并捆绑windows销售,从此终结了Netscape 的王者之路

作为竞争对手的微软在自家的IE3中加入了名为JScript(名称不同是为了避免侵权)的JavaScript实现,微软用JScript1.0来抢占客户端脚本市场。

而此时市面上意味着有3个不同的JavaScript版本(web脚本语言),IE的JScript、网景的JavaScript和ScriptEase中的CEnvi。当时还没有标准规定JavaScript的语法和特性。随着版本不同暴露的问题日益加剧,JavaScript的规范化最终被提上日程。

JavaScript的规范化

1997年,以JavaScript1.1为蓝本的建议被提交给了欧洲计算机制造商协会(ECMA,European Computer Manufactures Association)该协会指定39号技术委员会负责将其进行标准化,TC39来此各大公司以及其他关注脚本语言发展的公司的程序员组成,经过数月的努力完成了ECMA-262——定义了一种名为ECMAScript的新脚本语言的标准。第二年,ISO/IEC(国标标准化组织和国际电工委员会)也采用了ECMAScript作为标准(即ISO/IEC-16262)。

ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史

ECMAScript

由ECMA-262定义的ECMAScript其实与Web浏览器没有依赖关系。Web浏览器只是ECMAScript实现可能的宿主环境之一。ECMA-262定义的只这门语言的基础,而在此基础上可能构建更完善的脚本语言。说回宿主,它不仅提供基本的JavaScript的实现,同时也会提供该语言的扩展,比如DOM。比如JavaScript实现:

虽然JavaScript和ECMAScript通常被人用来表达相同的意思,但JavaScript的含义去比ECMA-262中规定的多得多。一个完整的JavaScript实现应由三个部分组成:

  • 核心(ECMAScript)

  • 文档对象模型(DOM)

  • 浏览器对象模型(BOM)

ECMAScript其他宿主环境还包括Node和Adobe Flash。

ECMA-262标准主要规定了这门语言的以下组成部分:1.语法,2.类型,3.语句,4.关键字,5.保留字,6.操作符,7.对象。

ECMAScript发展标准

TC39(Technical Committee 39)是一个推动JavaScript发展的委员会,它的成语来自各个主流浏览器的代表成语。会议实行多数决,每一项决策只有大部分人同意且没有强烈反对才能去实现。

TC39成员制定着ECMAScript的未来。

每一项新特性最终要进入到ECMAScript规范里,需要经历5个阶段,这5个阶段如下:

  • Stage 0: Strawperson

    只要是TC39成员或者贡献者,都可以提交想法

  • Stage 1: Proposal

    这个阶段确定一个正式的提案

  • Stage 2: draft

    规范的第一个版本,进入此阶段的提案大概率会成为标准

  • Stage 3: Candidate

    进一步完善提案细则

  • Stage 4: Finished

    表示已准备好将其添加到正式的ECMAScript标准中

ECMAScript历史版本

至发稿日为止有九个ECMA-262版本发表。其历史版本如下:

  1. 1997年6月:第一版

  2. 1998年6月:修改格式,使其与ISO/IEC16262国际标准一样

  3. 1999年12月:强大的正则表达式,更好的词法作用域链处理,新的控制指令,异常处理,错误定义更加明确,数据输出的格式化及其它改变

  4. 2009年12月:添加严格模式("use strict")。修改了前面版本模糊不清的概念。增加了getters,setters,JSON以及在对象属性上更完整的反射。

  5. 2011年6月:ECMAScript标5.1版形式上完全一致于国际标准ISO/IEC 16262:2011。

  6. 2015年6月:ECMAScript 2015(ES2015),第 6 版,最早被称作是 ECMAScript 6(ES6),添加了类和模块的语法,其他特性包括迭代器,Python风格的生成器和生成器表达式,箭头函数,二进制数据,静态类型数组,集合(maps,sets 和 weak maps),promise,reflection 和 proxies。作为最早的 ECMAScript Harmony 版本,也被叫做ES6 Harmony。

  7. 2016年6月:ECMAScript 2016(ES2016),第 7 版,多个新的概念和语言特性。

  8. 2017年6月:ECMAScript 2017(ES2017),第 8 版,多个新的概念和语言特性。

  9. 2018年6月:ECMAScript 2018 (ES2018),第 9 版,包含了异步循环,生成器,新的正则表达式特性和 rest/spread 语法。

  10. 2019年6月:ECMAScript 2019 (ES2019),第 10 版。

参考资料

  1. ECMAScript 6 入门

  2. 1.5万字概括ES6全部特性

  3. MDN

  4. ES2018 新特征之:非转义序列的模板字符串

  5. 正则表达式反向(lookbehind)断言

  6. Unicode property escapes

  7. exnext提案

  8. ES7、ES8、ES9、ES10新特性大盘点

  9. Ecma TC39

  10. [ECMAScript] TC39 process

  11. The TC39 Process

  12. 互联网的缔造者们:Brendan Eich与JavaScript

  13. JavaScript 的历史

  14. 浏览器史话中chrome霸主地位的奠定与国产浏览器的割据混战

  15. 闲谈一下,ES3、ES4、ES5、ES6 分别是什么

转载本站文章《ECMAScript进化史(1):​话说Web脚本语言王者JavaScript的加冕历史》,
请注明出处:https://www.zhoulujun.cn/html/webfront/ECMAScript/js6/2015_0720_141.html