js:咱们应该如何去了解JavaScript引擎的工做原理(转)

http://www.nowamagic.net/librarys/veda/detail/1579javascript

昨天收到一封来自深圳的一位前端童鞋的邮件,邮件内容以下(很抱歉,未通过他的容许,公开邮件内容,不过我相信其余人确定也有一样的问题,因此,直接把问题原文抛出来):html

“读了你的几篇关于JS(变量对象、做用域、上下文、执行代码)的文章,我我的以为有点抽象,难以深入理解。我想请教下经过什么途径可以深刻点的了解javascript解析引擎在执行代码先后是怎么工做的,ecma英文版实在看不下去呵呵。”前端

其实这个问题我的以为太笼统了,直接回答很难回答,因此,我打算先把他的问题拆解成以下几个子问题,并对其表达我的的观点,但愿对有一样困惑的童鞋可以有所帮助。java

1. 什么是JavaScript解析引擎?

简单地说,JavaScript解析引擎就是可以“读懂”JavaScript代码,并准确地给出代码运行结果的一段程序。比方说,当你写了 var a = 1 + 1; 这样一段代码,JavaScript引擎作的事情就是看懂(解析)你这段代码,而且将a的值变为2。算法

学过编译原理的人都知道,对于静态语言来讲(如Java、C++、C),处理上述这些事情的叫编译器(Compiler)相应地对于JavaScript这样的动态语言则叫解释器(Interpreter)这二者的区别用一句话来归纳就是:编译器是将源代码编译为另一种代码(好比机器码,或者字节码),而解释器是直接解析并将代码运行结果输出。 比方说,firebug的console就是一个JavaScript的解释器。浏览器

可是,如今很难去界定说,JavaScript引擎它到底算是个解释器仍是个编译器,由于,好比像V8(Chrome的JS引擎),它其实为了提升JS的运行性能,在运行以前会先将JS编译为本地的机器码(native machine code),而后再去执行机器码(这样速度就快不少),相信你们对JIT(Just In Time Compilation)必定不陌生吧。闭包

我我的认为,不须要过度去强调JavaScript解析引擎究竟是什么,了解它究竟作了什么事情我我的认为就能够了。对于编译器或者解释器到底是如何看懂代码的,翻出大学编译课的教材就能够了。函数

这里还要强调的就是,JavaScript引擎自己也是程序,代码编写而成。好比V8就是用C/C++写的性能

2. JavaScript解析引擎与ECMAScript是什么关系?

JavaScript引擎是一段程序,咱们写的JavaScript代码也是程序,如何让程序去读懂程序呢?这就须要定义规则。好比,以前提到的var a = 1 + 1;,它表示:学习

  • 左边var表明了这是申明(declaration),它申明了a这个变量
  • 右边的+表示要将1和1作加法
  • 中间的等号表示了这是个赋值语句
  • 最后的分号表示这句语句结束了

上述这些就是规则,有了它就等于有了衡量的标准,JavaScript引擎就能够根据这个标准去解析JavaScript代码了。那么这里的ECMAScript就是定义了这些规则。其中ECMAScript 262这份文档,就是对JavaScript这门语言定义了一整套完整的标准。其中包括:

  • var,if,else,break,continue等是JavaScript的关键词
  • abstract,int,long等是JavaScript保留词
  • 怎么样算是数字、怎么样算是字符串等等
  • 定义了操做符(+,-,>,<等)
  • 定义了JavaScript的语法
  • 定义了对表达式,语句等标准的处理算法,好比遇到==该如何处理
  • ⋯⋯

注:js兼容性问题的缘由

标准的JavaScript引擎就会根据这套文档去实现,注意这里强调了标准,由于也有不按照标准来实现的,好比IE的JS引擎。这也是为何JavaScript会有兼容性的问题。至于为何IE的JS引擎不按照标准来实现,就要说到浏览器大战了,这里就不赘述了,自行Google之。

因此,简单的说,ECMAScript定义了语言的标准,JavaScript引擎根据它来实现,这就是二者的关系。

3. JavaScript解析引擎与浏览器又是什么关系?

简单地说,JavaScript引擎是浏览器的组成部分之一。由于浏览器还要作不少别的事情,好比解析页面、渲染页面、Cookie管理、历史记录等等。那么,既然是组成部分,所以通常状况下JavaScript引擎都是浏览器开发商自行开发的。好比:IE9的Chakra、Firefox的TraceMonkey、Chrome的V8等等。

从而也看出,不一样浏览器都采用了不一样的JavaScript引擎。所以,咱们只能说要深刻了解哪一个JavaScript引擎

4. 深刻了解其内部原理的途径有哪些?

搞清楚了前面三个问题,那这个问题就好回答了。我的认为,主要途径有以下几种(依次由浅入深):

  • 看讲JavaScript引擎工做原理的书 这种方式最方便,不过我我的了解到的这样的书几乎没有,可是Dmitry A.Soshnikov博客上的文章真的是很是的赞,建议直接看英文,实在英文看起来吃力的,能够看译本
  • 看ECMAScript的标准文档 这种方式相对直接,原汁原味,由于引擎就是根据标准来实现的。目前来讲,能够看第五版第三版,不过要看懂也是不容易的。
  • 看JS引擎源代码 这种方式最直接,固然也最难了。由于还牵涉到了如何实现词法分析器,语法分析器等等更加底层的东西了,并且并不是全部的引擎代码都是开源的。

5. 以上几种方式中第一种都很难看明白怎么办?

其实第一种方式中的文章,做者已经将文档中内容提炼出来,用通俗易懂的方式阐述出来了。若是,看起来还以为吃力,那说明还缺乏两块的东西:

  • 对JavaScript自己还理解的不够深刻 若是你刚刚接触JavaScript,或者说之前甚至都没有接触过。那一会儿就想要去理解内部工做原理,的确是很吃力的。首先应该多看看书,多实践实践,从知识和实践的方式来了解JavaScript预言特性。这种状况下,你只须要了解现象。比方说,(function(){})() 这样能够直接调用该匿名函数、用闭包能够解决循环中的延迟操做的变量值获取问题等等。要了解这些,都是须要多汲取和实践的。实践这里就很少说了,而知识汲取方面能够多看看书和博客。这个层面的书就相对比较多了,《Professional JavaScript for Web Developers》就是本很好的书(中文版请自行寻找)。
  • 缺少相应的领域知识 当JavaScript也达到必定深度了,可是,仍是看不大明白,或者无法很深刻到内部去一探究竟。那就意味着缺乏对应的领域知识。这里明显的就是编译原理相关的知识。不过,其实对这块了解个大概基本看起来就没问题了。要再继续深刻,那须要对编译原理了解的很深刻,好比说词法分析采用什么算法,通常怎么处理。会有什么问题,如何解决,AST生成算法通常有哪几种等等。那要看编译原理方面的书,也有基本经典的书,好比《Compilers: Principles, Techniques, and Tools》这本也是传说中的龙书,还有很是著名的《SICP》《PLAI》。不过其实根据我的经验,对于Dmitry的文章,要看懂它,只要你对JavaScript有必定深度的了解,同时你大学计算机的课程都能大体掌握了(尤为是操做系统),也就是说基础不错,理解起来应该没问题。由于这些文章基本没有涉及底层编译相关的,只是在解释文档的内容,而且其中不少东西都是相通的,好比:context的切换与CPU的进程切换、函数相关的的局部变量的栈存储、函数退出的操做等等都是一致的。

以上就是我的对这个问题的见解,除此以外,我以为,学习任何技术都不能操之过急,要把基础打扎实了,这样学什么都会很快。

相关文章
相关标签/搜索