趣谈编程史第4期-饱受争议的前端之王JavaScript的血泪成长史

写在前面

  这篇博文主要介绍javaScript的发展史,根据作者在B站发布的同名视频的文案整理修改而成,对视频感兴趣的博友可访问https://www.bilibili.com/video/av94544624

JavaScript和网景

  1993年,美国伊利诺大学的NCSA组织发布了一款名为mosaic的浏览器 ,中文就是马赛克的意思,这个浏览器是第一款可以显示图文的浏览器 ,给当时的人们带来了极大的视觉冲击,当时的人们打开mosaic就跟刘姥姥进了大观园似的 ,mosaic一经发布就获得极高的人气并迅速走红,这个浏览器也是点燃上世纪90年代的互联网热潮的重要火种.

  Mosaic的主要开发者马克*安德森敏锐的嗅探到了浏览器在互联网浪潮中的重要性,于是辞职创办了自己的公司.

  1994年公司正式定名为NetScape 也就是网景 ,公司的使命 就是在mosaic的基础上开发面向广大普通网民的新一代网页浏览器Netscape Navigator,也就是网景导航者. 
  1994年12月 网景导航者发布1.0版本 ,立刻受到市场的狂热追捧,随着上网冲浪的人越来越多,再加上网页内容变得更加复杂多变,浏览器急需一种前端脚本语言来帮助服务端做一些逻辑校验以及实现一些动态交互效果  ,当时的网速可不像现在这样百兆光纤打底,看视频1080p起步,当时的传输效率顶天了二十多KB每秒,试想 当你你兴冲冲的在某某网注册用户 ,等了10秒钟,结果告诉你邮箱格式填错了 ,你是不是想掀桌子,类似的网速体验你可以到没开会员的百度云盘里感受下.
   随着1.0版本的成功,网景公司马不停蹄投入到下一个版本的开发,1995年 34岁的函数式编程爱好者Brendan Eich,看到网景在招聘程序员来开发基于浏览器的Schema,艾奇一看专业对口入伙了,这里多说一句Schema语言是Lisp语言的一个变种 ,语法简单 功能强大 是一种函数式的语言.
  当时正逢SUN公司的java问世,,java的口号是 write once run anywhere ,也就是一次编写到处运行,这个口号在当时对于java的病毒式扩散发挥了巨大的作用 ,效果不亚于今天的 充电五分钟 通话两小时 ,网景于是和SUN公司进行了深入合作 ,比如网景浏览器支持将java小程序嵌入到网页中这就是java applet,当时网景思考过干脆直接将java作为浏览器的前端语言得了 ,因为好处很明显 不需要开发 而且压根不需要推广,但最终这个方案很快被否决了 ,一方面java实在是在太重了 ,嵌到浏览器上有一种杀鸡用牛刀的感觉 ,另一方面java比较复杂 学习门槛略高,网景决定开发一个更轻量级更简单的新语言来作为自家浏览器的前端语言.  
  艾奇入职仅仅一个月 ,网景高层就公布了决策 新语言必须要长得像java 但是要比java简单,为什么会有这种奇怪的要求呢 ?因为网景不是和SUN公司深度合作了嘛,SUN公司当时正在全力推广java,而SUN公司不论从体量和规模都远超网景,在合作中也掌握着绝对的话语权,所以SUN公司参与并主导了这次高层会议 ,虽然心里有一万个草泥马奔过,但迫于压力,极不情愿的艾奇为了应付公司安排的任务,还是开始着手设计这个新语言,他仅仅花了10天就设计出了javascript的原型,javascript语言在函数上参考Scheme,而在语法和数据结构上又深度借鉴C和java,同时在一些细节之处还学习了Self,Perl甚至是Python的一些语言特点,可谓是集百家所长.
  js发布不久,就被迅速搭载进即将发布的网景导航者2.0浏览器中,当时也是谁都不知道 这个10天就被潦草设计出来的语言,会对后世产生多么深刻的影响,而后世又要花多年的时间去消化它的因为仓促发布欠下的技术债,当然这都是后话. 

    1996年3月 js随着网景导航者2.0的发布一同出道 ,值得一提的是 和js一样对后世影响深远的cookie技术,也是在这个版本一并面世的,Session配Cookie ,还是头一回. 
    伴随着mosaic浏览器的节节败退,网景导航者如海啸般席卷千家万户,1996年底 乘胜追击的网景又马不停蹄发布了3.0版本,这个版本搭载的是javascript1.1版本,此时网景导航者的市场占用率达到了75%,javascript凭借浏览器的强势得到了市场的广泛认可.

JavaScript名字的由来

  像java一样 javascript也经历了改名风波,js最早名字叫做 Mocha ,Mocha中文直译是摩卡,也是一种咖啡,外国人对咖啡真是有执念啊 ,1995年9月 Mocha改名叫LiveScript ,后来经过SUN公司授权 最终定名为javascript,这个命名对网景和SUN公司来说是双赢,一方面网景可以蹭到了java的名气,同时SUN公司也将java的影响力扩展到了浏览器领域.

JavaScript和java的区别

  关于java和javascript的区别很多编外的吃瓜群众搞不清,而网上很流行的段子是这么说的 ,java和javascript的关系就像是雷锋和雷峰塔,言外之意就是没有半毛钱关系 ,作为一个严谨的程序员,我匿名反对这个比喻,我觉得java和javascript更像是沈阳和小沈阳的关系 ,乍一看没什么关系,仔细一看确实没什么关系 ,但往祖坟上 你挖 你使劲挖,就会发现二者其实有着千丝万缕的联系,不只是名称 ,javascript在设计理念和语法风格很多地方都参考java

JavaScript的标准化之路

  也是在这一年 姗姗来迟的微软也发布了IE浏览器3.0的版本,在这个浏览器上搭载了javascript的克隆版-Jscript,微软从名称中去掉java是为了避免潜在的版权问题 ,此时市场上一共有三种客户端语言同时流通,除了javascript和jscript ,还有一个名气不大的ScriptBase,值得一提的是ScriptBase也是艺名,你去百度一下ScriptBase原名叫什么 ,我保证你会回来”卧槽”的.
   为了抢先获得规则制定权,网景最先将javascript作为草案提交给欧洲计算机制造商协会,也就是ECMA组织,希望能将javascript做成行业标准,最终在网景,SUN,以及微软等公司的参与下 ,由一众程序员和相关组织人员组成的第39技术委员会 也就是TC39发布了ECMA-262标准 ,这个标准定义了名为ECMAScript的全新脚本语言,为啥又来了个ECMAScript?
  因为java是SUN的商标,SUN授权了NetScape可以叫javascript,但是ECMA没有SUN的授权就不能叫javascript,哪怕NetScape成员特别希望ECMA把它叫做javascript,但是ECMA也有成员并不希望这个标准就叫javascript,总之经过几轮磋商和博弈,ECMAScript这个名字就定下来.

JavaScript,Jscript和ECMAScript的关系 

  严格来说 javascript包含ECMAScript 和文档对象模型DOM以及浏览器对象模型BOM,但后两者更新的很少,你就把javascript当成ECMAScript理解也没什么太大问题,现在 javascript更多是ECMAScript的商业名称,后面我们讲javascript的发展也主要是说ECMAScript的版本更新,这里我们总结一下,jscript和javascript是ECMAscript的两个不同分支,他们在申明变量,操作对象数据等方面都是一样的,因为这些都是ECMASCript的范畴,但是在操作浏览器对象等方面又略有差异,拿微软来说 ,为了让自家亲儿子IE看上去更加强大,微软在网页技术上加了很多特有的东西,这就导致了同样的代码在非IE浏览器上无法正常显示,这里就要讲到DOM(文档对象模型),DOM也经历了从野蛮生长到标准化的过程,这个标准化工作由W3C组织接管,其实不只是DOM了,Html css也都是在这几年完成了从散兵游勇到正规军的进化.

 ECMAScript3.0(ES3)的发布

  凭借Windows操作系统强大的带货能力以及免费这张王牌.IE不费吹灰之力就把网景打得连亲妈都不认识了,其中曲折我们留到下回分说,不过网景的没落并没有阻止javascript这个语言的发展.

     1999 ECMAScript发布3.0的版本 也就是ES3,为啥没提ES2呢  因为不值一提,ES3版本才是真正意义上对ECMAScript的第一次修改,这个版本新增了对正则表达式,异常处理等新功能的支持,这个版本的javascript真正意义上得到了广泛的支持和认可,甚至有这样一种声音 ,ES3版本的发布才正式标志着javascript成为一门编程语言 ,直至今天很多初学javascript的朋友,还是在学ES3的语法.

 ECMAScript4.0(ES3)的曲折

  进入千禧年 ES4.0开始酝酿发布,ES4对ES3做了大刀阔斧的全面改造,导致TC39委员会出现了一些反对的声音,部分成员认为这个版本太过于激进 ,版本更新应该小火慢炖 步子迈太大 容易扯着淡,最终这个版本没有通过,21世纪头几年 javascript的发展也进入了一个迷茫的低谷, 不仅后院起火 市场上也涌现了众多挑战者试图吞食js的市场,值得一提的就是actionscript,这是adobe公司为为自家的flash开发的一门脚本语言,同样基于ECMAScript 语法类似于javascript,不过随着flash的逐渐没落 actionacript也逐渐式微,有趣的是actionscript是遵循ES4早期草案开发的 ,因此Adobe公司就成了ES4的坚定支持者,而微软就是当时的主要反对派,因为他担心javascript变得太大 失去控制,所以你看到没有,当时各路人马对ES4的巨大分歧  并不像我上面说的,步子迈大了容易扯着蛋 这么肤浅,其中 利害错综复杂,涉及到商业利益 企业竞争 行业话语权等等,真掰开了聊 一两包瓜子根本不够,总之大家是各怀鬼胎,委员会里的微软成员甚至一度准备通过法律途径来阻止ES4的通过,ES4的代号是Harmony 意思是和谐,你品一下.
 

 Ajax和JQuery的救场

  2005年 ,随着谷歌在自家邮件服务Gmail,谷歌地图等产品中大量使用ajax技术,ajax开始走进大众视野  并被人们迅速接受,简单理解ajax就是可以让你在不刷当前页面的情况下,和服务端进行异步的数据交换并且能动态操作当前页面的节点,人们发现javascript配上ajax简直有如神助,就像周杰伦遇上方文山.
  有了ajax的加持,不仅能提高系统性能 优化用户页面 ,还能实现一些实用又炫酷的效果 ,比如我们现在已经司空见惯的关键词联想 搜索建议等等,可以这么说 AJAX给当时迷茫孱弱的javascript打了一针强力兴奋剂.
  继ajax救场之后 ,2006年,JQuery的第一个版本面试了 ,我们知道 ,微软仗着自己财大气粗,在IE的迭代过程中闭门造车 标新立异 ,导致IE和其他浏览器在设计和实现细节上出现了很多分歧,但由于IE市场占用率又居高不下 ,因此令人头秃的浏览器兼容问题引无数开发者竞折腰 
据不完全统计, ,因为浏览器兼容问题被前端开发者砸坏的键盘连起来可绕地球两圈 ,天下苦秦久矣,IQuery是一个封装javascript的工具框架,在很大程度上屏蔽了底层浏览器之间的兼容问题,并且针对常用功能封装了大量的API,因此一经推出 ,就受到了广泛的关注和欢迎.
  有了Ajax和jquery的雪中送炭,javascript的版本更新之路开始被重新提上日程,在ES4漫长的斗争无果后,终于无疾而终.
  2008年,社区把注意力都放在了ES3.1上,并且在发布之际 改名为ES5,ES5发布后 ,很长时间里成为最受欢迎的javascript版本 ,被市面大部分浏览器全面支持 ,比如火狐,谷歌,safari等等 甚至还包括IE.

Nodejs的横空出世

  2009年,基于JavaScript语言的开源web项目Node.js正式发布 ,在此之前,浏览器一直是JavaScript的唯一宿主,nodejs让JavaScript终于脱离了浏览器的束缚 ,投入到后端服务器开发的怀抱中 ,node.js虽然香,但是最初缺少一个包管理工具 ,因为你使用Nodejs开发是,会用到很多别人写的js库,因此需要一个简单的包管理工具 ,此时npm应运而生 和nodejs双剑合璧 ,一起将JavaScript推向另一个巅峰.
  经此一战,javascript后面的发展就比较顺风顺水,波澜不惊了,到现在ECMAScript最新版本ES2020马上就要面世了 ,javascript也成了前端脚本领域唯一的王.

 总结和展望

  鲁迅先生说,先驱者往往容易会成为绊脚石,由于javascript设计阶段过于仓促 ,并且一经面世就被饥渴的市场立马接受,没有一个慢慢涨粉厚积薄发自我进化的过程,同时早早的就进行了标准化,这使得javascript一些仓促甚至不合理的设计无法得到及时的修正,也让早期使用js写出来的代码混乱不堪,虽然如今,前端这个鱼塘已经被javascript承包了,但我们回首它来时路的每一步,都走的好孤独,javascript的设计者爱奇在很长的时间都不喜欢自己这个亲儿子,爱奇甚至说 ,与其说我爱它 不如说我恨它,它的优秀之处并非原创 它的原创之处并不优秀 ,javascript原生家庭的命运也让人唏嘘,网景经历了短暂的繁荣,但微软这个庞然大物的强势搅局,也让它迅速陨落. 
  javascript由于过早的标准化留下很多烂摊子,在跌跌撞撞的发展路上也饱受指责和非议,比如没有命名空间 很难模块化 不适合大型项目,比如臭名昭著的null和undefined,==和===等等都给开发者带来了很多不必要的烦恼.,除了自身的短板 javascript也受到了很多不该属于它的非议,比如弹窗小广告盛行的那些年 ,javascript就被戴上了浏览器牛皮癣的帽子,比如说兼容IE这事 ,也成了万千开发者挥之不去的梦魇,微软早在2015年就发布了EDGE来代替卡慢丑的IE,IE的寿终正寝也是板上钉钉的事了 ,我知道大家在兼容IE这件事上已经经受了太多的折磨.但是死者为大,IE生前也是个体面人 ,IE6的辉煌是不以人的意志而转移的.
   回头想想在javascript磕磕绊绊的成长之路,尤其是ES4标准推广的事情上,微软的消极对待,没有一点三好学生 优秀团干部的样子,如果网景再晚一些推动javascript的标准化,可能现在的web领域就是另外一番景象了,被微软挟天子以令诸侯也说不定 ,微软的策略真可谓 非我族类 其心必异 ,不过 商业竞争的事我们这样的俗人也无法太过苛责,商业上的博弈和竞争本就是,商战有时比热战更加残酷,阴谋 阳谋 明争 暗斗 ,一将功成万骨枯,其实很多在现在看来很成功或者很傻逼的产品,在彼时彼刻都是无奈的选择,这些都淹没在历史的尘埃里,只留下一个结果,交给世人评说.
   关于javascript的陈年往事 ,现在回首也已经是云淡风轻,关于javascript的未来将会何去何从,我们也可以保持乐观 ,虽然WebAssembly未来可能会把很多编程语言带到web中来,但javascript的前端霸王地位我觉得不会被撼动,如今各种各样的前端框架琳琅满目层出不穷,javascript已经下沉到这些框架之中,javascript一路走来并不容易,能走到今天的位置更不容易,它不够完美 但一直在进步 ,随着编译器性能的突飞猛进和各种新技术的出现,或许如果有一天,我们可以在浏览器上畅玩英雄联盟这样的游戏大作,届时 请别忘记,javascript一定在你看不见的地方为你贡献着它力所能及的力量 .

 参考资料

1.百度百科和相关纪录片
2.JavaScript简史-奇舞周刊(链接太长,不放了)
3.http://www.ruanyifeng.com/blog/2011/06/10_design_defects_in_javascript.html