Haoran Blog  -  Stay hungry  Stay foolish

javascript背景知识

 

2013年6月编程语言排行榜:JavaScript重回前十(1)

2013-06-09 15:40 佚名 51CTO 我要评论(5) 字号:T | T
一键收藏,随时查看,分享好友!

TIOBE编程语言排行榜6月榜出炉。C#跌出前五,他的位置由PHP顶替,这也是今年以来PHP首次闯入前五。值得注意的是JavaScript本月排名第十位, 重新进入排行榜前十。

AD:2013大数据全球技术峰会课程PPT下载

 

TIOBE编程语言排行榜6月榜出炉。本期排行榜前四位没有变化,C语言依旧稳居第一宝座,Java和Objective-C列位第二、第三,C++排在第四。C#跌出前五,他的位置由PHP顶替,这也是今年以来PHP首次闯入前五。

值得注意的是,JavaScript本月排名第十位, 重新进入排行榜前十。JavaScript是一种基于对象和事件驱动并具有相对安全性的客户端脚本语言,是时下最为流行的Web脚本语言。因此这样一种无处不在的语言迟迟没有进入前五,让人觉得无法理解。

现如今JavaScript正在积极扩大其应用领域,Node.js是一套基于JavaScript的工具包,以此用来编写高性能网络服务器,使 JavaScript在服务器端得以应用。此外,基于Javascript开发的游戏(大部分基于浏览器)也在不断增加。

而其他语言在以JavaScipt为目标而诞生,比如CoffeeScript(排名139), 该语言增强了JavaScript 的精简性与可读性,可被编译成高效的JavaScript;TypeScript (排名207)是JavaScript的一个超集,TypeScript用来为大型应用服务,而编译时它生成JavaScript 以确保兼容性。

前20名榜单排行榜:

还原JavaScript的真实历史:

在许多资料,JavaScript的语源被追溯到一种名为Cmm的语言。同样是在这一溯源的过程中,人们发现“其实”JavaScript不是第一种网页中的脚本语言。现在一些所谓“公认”的情况是这样的:

  • 大概在1992年,一家称作Nombas的公司开始开发一种叫做C减减(C-minus-minus,简称Cmm)的嵌入式脚本语言。这个脚本语言捆绑在一个叫做CEnvi的共享软件产品中,当Netscape Navigator崭露头角时,Nombas开发了一个可以嵌入网页中的CEnvi的版本。这些早期的试验称为EspressoPage(浓咖啡般的页面),它们代表了第一个在万维网上使用的客户端脚本语言。而Nombas丝毫没有料到它的理念将会成为因特网的一块重要基石。

然而,这是真实的情况吗?运行在Netscape中的第一个“客户端脚本语言”真的是Cmm的浓咖啡?又或者真的象Wiki中记述的那样,Brendan Eich在JavaScript引用了Cmm语言特性?不是的。尽管上述的资料看起来出权威:《Javascript高级程序设计》(Professional JavaScriptfor 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开发环境,包括NetscapeEnterprise、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标签属性上的,也就是类似于:

  1. <input type=”button” onclick=”alert(‘hello, world!’)”>

很快,三周之后netscape 就发布了beta2。这个版本正式地支持了<script>标签,并可以解析该标签中的代码、标识符,开始具备调用函数、表达式运算等能力。这个版本已经具备了JavaScript 1.0的基本性质。

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

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

  1. var func = function() {
  2. }

JavaScript 1.0的设计目标,就是“让网页动起来”,最初的要求包括三个方面:

  1.  让网页中的元素可以被编程,所以象forms、links这些对象,在网页装载结束后就初始化为全局成员了——那时候还没有所谓的DOM或DHTML呢。
  2.   让JavaScript跟Java接近一些,因为Netscape与Sun有战略合作。而且,Sun那时相当火暴。
  3.  让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随Netscape2.0正式版发布了。

发表评论

电子邮件地址不会被公开。 必填项已用*标注