10天创造出来的JavaScript为何能激荡屹立20年

753 阅读12分钟


最近著名的Javascript框架Vue.js推出了3.0版本。很多人都感叹Javascript的框架纷繁众多,纷纷调侃“学不动学不动”。


抛开框架,回到Javascript语言本身。javascript语言是当今为数不多经历过PC、移动互联网革命,不仅依然屹立不倒的语言,像美酒一般愈久弥新。


那Javascript是如何从创造出来,又如何发展到如今十八般武艺样样精通,红火到上可写前端,下可写后台的呢?今天我就来818 JavaScirpt的历史。


网景公司与PC互联网

Javascript的出现是随着网景公司Netscapte Navigator产品一起推出,提起Javascript不得不说网景公司。


20世纪90年代的初期,PC互联网并未兴起时。已经出现了web端技术的雏形,也提出了如今大家熟知的HTML格式,但当时的技术仅仅能传输文字信息。


1993年,伊利诺伊大学厄巴纳香槟分校美国超级计算应用中心(National Center of Supercomputing Applications)推出了互联网历史第一个能显示图片的浏览器NCSA Mosaic (马赛克),并由此人气爆发大受欢迎。


近水楼台先得月,同样来自伊利诺伊的马克·安德森(Marc Andreessen)接触到了Mosaic,并敏锐的觉察到,这种客户端/浏览器模式且能显示图形信息的软件这将会是区别于传统操作系统的全新的分布式操作系统。


人们只要打开浏览器,就能获取到原来操作系统所有的信息,而且拥有图形化渲染的功能,不同操作系统使用都能获得相同的体验。

于是迅速纠集了原来开发Mosaic的主要开发人员,组建了最初的网景公司,为防止版权纠纷,他将的Mosaic代码推倒重来,并在1994年推出了1.0版本,并将此软件命名为网景浏览器(Netscape Navigator 1.0)。

网景浏览器一经推出,很快就风靡全球,马克·安德森认为此时的体验尚未达到他的预想,浏览器虽然能比显示图形了,所展示的图形均是静态的,不能灵活的“运动”,给用户更加贴近现实的体验。如何操作界面的元素“动”起来?


此时急需一种运行在客户端,能操作DOM的灵活的“胶水语言”,服务器只需一次传输,客户端浏览器执行的脚本语言。


当时网景期望这种“胶水语言”简单,易于上手,设计师,计算机爱好者等不需要过多计算机知识的人也能容易学习。不能像Java、C、C++这种硬核的语言一样,需要较多的计算机背景才能掌握。


长得像Java,含有Scheme与Self基因的早产儿
网景浏览器2.0开发中时,Sun公司(创建Java的公司)也参与了进来,其实当年(1995年)也独立开发一款HotJava浏览器,但性能十分堪忧,运行缓慢,耗费资源过大,市场反响,最终也便不了了知了。于是乎Sun和网景公司一拍即合,Sun当时有跨平台利器Java,网景公司有实力担当的叫好又叫座的Netscape Navigator,于是两家公司达成战略合作,共同开发2.0浏览器,当初设想2.0版本的能运行Java的applet小程序,网景公司负责浏览器开发以及包含这种胶水语言的开发。

1995年Sun公司推出的HotJava浏览器


网景公司内部考虑了很多中脚本语言,python,Tcl,Scheme。但Sun公司希望能有一款和Java语法相似的胶水语言作为辅助脚本语言,开发者用Java开发web前端小程序applet,又辅以语法类似的脚本语言进行图形界面的控制。这样只要开发者懂Java,那么也能很顺畅的使用这种脚本。

1995年的5月,网景公司让才入职一个月,时年35岁的布兰登·艾克(Brendan Eich)负责这项工作。


“没有硬性的技术路线,但需要语法和Java相似,只要快”。这便是当时公司下达的命令。


于是在短短的十天里面布兰登·艾克废寝忘食办工作,创造出了Javascript,最初的名字还叫Mocha。其实2.0版本开发的初期,并未想全新设计一门语言,公司原本是让艾克在浏览器中引入Scheme脚本,但随着Sun公司加入,由于商业目的,Sun公司希望将这门脚本能有类Java的语法,借此推广Java,也完善整个生态链。


艾克在纽约时代杂志的采访后来中也出了创建JavaScirpt的缘由“用python,scheme或者其他语言,再或者创建一门新的脚本语言,其实都不是我所能决定的,老板说,必须得长得像‘Java’就好了。”


虽然语法类似Java,但作为熟悉Scheme的程序员,艾克借鉴了Scheme函数式的特点,将函数作为这门语言的第一公民(first-class)。除此外,还借鉴了Self,推出了基于模板的链式对象模型,用于实现对象与对象的继承关系。


这就是后来为人传颂花了十天就创造出来的JavaScript 。但艾克也不是圣人,当年的时代也如同如今中国的996,是用时间和头发熬出来的结果,后来的报道他自己说到,当时每天9点到凌晨2点一直在工作,那十天几乎没怎么睡过。

1995年11月,搭载JavaScript 引擎的netscape navigator 2.0发布。一经发布便大受欢迎。当年浏览器市场份额几乎接近80%。

Netscape Navigator 市场占有率


第一款搭载Javascirpt引擎的Netscape Navigator 2.0

顺便说远一点,很多初学者分不清DOM,Javascript的区别和联系,如果从历史的发展就能很清晰看到界限,DOM树是浏览器渲染层面的结构,Javascript语言只是用来控制这些树节点,如果技术能力了得,通过魔改浏览器,用python等其他一切语言来控制也没有问题。

分久必合合久必分的发展史

NetscapeNavigator 2.0 推出后不久,微软意识到在这一领域已经落后很远,于是全力开发IE,并也在此基础上推出自己的Javascript语言版本,并取名JScript。JScript与Javascript语法没有太大的区别,但是经常会在很多细节上与Javascrpt有偏差。当时程序员,经常需要为两者的区别做很多额外的兼容方案。


出现这种情况的很大原因是,当时还处于互联网的原始时期,社区的概念并未深入人心,厂商之间的竞争也非常的激烈,社区彼此之间的自我约束太弱,经常出现的情况是,我是行业老大,标准便是我来定,你们跟进吧。造成的结果是,整个行业的发展并一致,对于整个生态的发展是弊大于利的。


浏览器市场上,虽然在IE 3.0推出后,Netscape Navigator一败涂地,市场份额被大幅吞并。但JavaScirpt语言却深受欢迎,它的出现已经变成互联网的基础设施了,于是标准化提上了日程。

ECMAScript 1.0

1997年6月,由欧洲的ECMA协会的TC-39组织牵头,发布了Javascript的第一版的标准化。由于知识产权的原因不能使用Javascript,这门语言名为ECMAScript 。这门语言的标准化文档编写在ECMA-262文件中。

1.0版本内容基本是基于Netscape Navigator 4中的Javascript版本。


ECMAScript 2.0


1998年的6月,发布了ECMAScript 2.0。与1.0差别不大,仅仅是修复了与原来Javascript版本一些不一致性的问题。


ECMAScript 3.0 首次的大改动


1999年12月推出的3.0版本是一个比较大的改动版本,其影响也十分深远,所有的特性都被主流大部分的浏览器很好的兼容。

这个版本主要的大致的特性有

  • 正则表达式

  • do-while循环

  • try-catch异常捕获

  • 添加更多的内置函数

  • 数值的格式化输出


ECMAScript 4.0 大跃进与不欢而散


3.0的成功,让整个社区都振奋人心,开发者从3.0中感受到了进步的甜头,大家都对4.0的修订工作充满了期待。3.0标准后的不久,4.0的修订工作开始了。

社区提出了很多改动非常大的特性,有些为了推动语言的进步,有些是纯粹的理想主义,讨论提出,前前后后耗费几年,标准的修订依然未能确定下来,讨论过程的顶峰,4.0提出的特性有很多与3.0语法有较大差异的特性,比如下


  • 接口

  • 命名空间

  • 包管理

  • 类型定义


这其中很多的特性,在当时被认为过于的激进,从语法层面上与现有3.0差别过大,比如包管理,命名空间。引入这些特性时显然需要对JavaScript 语法层面上进行一个重新调整。


这里可以从ES4的追随者ActionScript可以看到与JavaScript 语法层面的差别

//ActionScript 例子package {    import flash.display.Sprite;    public class MySprite extends Sprite {        private var _name:String;        public function MySprite(name:Number) {                        _name = name;        }         public function sayhello():void{        }      }  }
//Javascirpt 在 ES2015 类特性之前的继承方案。function Sprite() }function MySprite() {  this.name = "";  this.sayHello(){  }}MySprite.prototype = new Sprite();


所以当微软,adobe,mozila,opera,雅虎,等厂商真正坐下来讨论时,事情马上变得不一样了。微软反对4.0每一项特性,他认为这完全背离了Javascript语言的真正的初衷,所有的这些特性不仅让Javascript臃肿无比,更会让这门语言推向失控的深渊。


最终谈判桌上不欢而散,4.0的所有的特性全盘被否定,大部分厂商都放弃了支持这些特性。唯独adobe公司,接受4.0提出的特性,并由此为蓝本,并创建了ActionScript。并将这种语言运用到自己的Flash产品中来。


直到2008年,在奥斯陆的峰会上艾克以一封邮件为争议多年的修订工作写下了一个句号:
为让社区能重新融洽的继续运行下去,4.0提出的大部分争议性特性宣告难产,仅保留一小部分特性作为3.1版本。


同时正是由于这长达近10年的标准修订工作缓慢的进展,这一空窗期使得Javascript语言的发展方向由于厂商不同的利益变得不同,有的差异性越来越大,走向不兼容(Adobe ActionScript),更多是各自有了自己的小方向,这也苦了这一时代的web程序员,要为各个不同浏览器的兼容性做更多的繁杂而无用的工作。


ECMAScript 5 重生


这一版本其实就是3.1,为防止和4.0造成混淆,版本号改为5.0。这版本也是现今为止最为广泛使用的版本,也被众多的引擎支持Firefox 4 (2011), Chrome 19 (2012), Safari 6 (2012), Opera 12.10 (2012)。特性有:

  • getter/setter

  • JSON支持

  • strict mode 严格模式

  • ·数组的 map,reduce方法等


ECMAScript 6 (2015) 和 ECMAScript 7 (2016)


2008年v8这一性能强大的Javascript引擎出现后的一年,Nodejs横空出世,极大的刺激了Javascript在除开web领域的使用场景,也凸显了Javascript在大工程中的短板,更加现代,更加易用的Javascript越来越高。


经过多年的ES4的阵痛,社区以及TC39委员会深刻的明白和谐的重要,但也希望沉寂多年的止步不前需要一点大的改变。因此将版本的命名规则由迭代的数字,改成了年份,ES2015,也赋予了它改变的期望。

除了命名规则的变化,提案也有很多进步的特性,甚至一些ES4当年被称为过于激进的特性,也重新被提上日程。


  • 箭头函数

  • let const 关键字

  • 类 (当年ES4被否定,直到现在使用prototype的语法糖实现了)

  • Promise

  • 迭代器 for ..of 等



ECMAScript 7/2016 针对异步开发的特点新增 async/await 等直观易用的语法。

从现在看来,这些每一个特性真是福音,几乎每一个都切中开发者的痛点,极大的补齐了Javascript的短板。

浏览器,引擎开发商众多,造成JavaScirpt版本的众多,很大程度上造成了开发者需要面对多个不同的Javascript版本,这种场景下版本转义软件应运而生,比如babel,traceur等。
对于不同引擎的不同的支持JavaScirpt版本可以从这个网站去一看究竟



为何JScript,ActionScript没能战胜Javascript,屹立不倒20余年


回到Javascript的发展进程中时会发现Web世界,历史的惯性作用是很大,当初JScript的推出也是紧跟Javascirpt的步伐,尽管推出IE后的,微软在市场占有率上占有很大的话语权,但单从语言的角度而言,JScript 从选择决定与Javascirpt兼容的那一刻便决定了,两者的的关系在以后的日子里早已是你中有我,我中有你。


至于ActionScript就更不用说了。当大家都吵翻,表示不愿意遵循ES4标准时,Adobe特立独行的选择ES4,走了一条大家都相反的路,对于开发者而言,变化过于激烈,其他厂商不跟进,成本太大,使用的人自然少了。最终Adobe只能乖乖用于自家的软件了。


当然从纯粹语言的角度,JavaScirpt足够的简单但不粗糙,在那个刀耕火种的年代,一款简单易上手的语言如同电气革命时代的电灯,使用上便永远放弃不了,这也算某种历史的洪流了吧。这也是我认为为何JavaScirpt能叱咤江湖20余年屹立不倒的原因。


拒绝无趣!更多新鲜有趣的编程知识欢迎关注 乐Code乐Code