JavaScript运行原理解析

JavaScript运行原理

知其然,也要知其因此然,这里主要谈一谈对JavaScript运行原理的理解。javascript

JAVA虚拟机

首先咱们从JAVA虚拟机提及。java

首先说一下为何要作成虚拟机,由于机器不一样,若是没有虚拟机咱们就至关于须要针对每一种机器都要进行代码编译,这样确定是不合理的。因此为了解决这样的问题,Java引入虚拟机(VM)的概念,让编译后的代码直接跑在一台虚拟的机器上,不管最终的目标平台是什么,都在上面构建出一个虚拟的一致的虚拟机出来,就能够达到一次编译处处执行的效果了。web

而从根本上来讲Java和C#不是Native语言,编译的结果不是机器指令,而是某种自有的指令格式,本身运行不了,须要专门的程序去解释执行,这个程序就是咱们所说的“虚拟机”。算法

反之,C、C++、Go、Rust这种语言是Native语言,编译出来的结果是机器指令,能够本身直接运行,不存在“虚拟机”的概念。api

JavaScript引擎

而JavaScript引擎所作的工做和JAVA虚拟机很类似浏览器

作了什么

JS引擎主要是对JS代码进行词法、语法等分析,经过编译器将代码编译成可执行的机器码让计算机去执行。less

简单来讲它的惟一的目的就是读取和编译JavaScript代码,也就是说能够分析、解释、优化、垃圾回收javascript代码。优化

执行过程

JavaScript引擎会加载源代码,把它分解成字符串(又叫作分词),再把这些字符串转换成编译器能够理解的字节码,而后执行这些字节码。设计

Google的V8引擎是用C++ 编写的,它也可以编译并执行JavaScript源代码、处理内存分配和垃圾回收。它被设计成由两个编译器组成,能够把源码直接编译成机器码,具体的执行过程能够当作如下几步:code

  1. 它进行词法分析,就是将源代码分解成一系列具备明确含义的符号或字符串。
  2. 而后用语法分析器分析这些符号,将其构建成语法树。
  3. 接着四个 JIT(Just-In-Time)进程开始参与进来,分析和执行解析器所生成的字节码。

与ECMAScript的关系

准确地讲,每一个JavaScript引擎都实现了一个版本的ECMAScript,JavaScript是它的一个分支。随着ECMAScript的不断发展,JavaScript引擎也不断改进。之因此有这么多不一样的引擎,是由于它们每一个都被设计运行在不一样的web浏览器、headless浏览器、或者像Node.js那样的运行时环境中。

JavaScript引擎是一段程序,咱们写的JavaScript代码也是程序,如何让程序去读懂程序呢?这就须要定义规则。好比:

var a = 1 + 1

左边var表明了这是申明(declaration),它申明了a这个变量
右边的+表示要将1和1作加法
中间的等号表示了这是个赋值语句
最后的分号表示这句语句结束了
上述这些就是规则,有了它就等于有了衡量的标准,JavaScript引擎就能够根据这个标准去解析JavaScript代码了。那么这里的ECMAScript就是定义了这些规则。其中ECMAScript 62这份文档,就是对JavaScript这门语言定义了一整套完整的标准。其中包括:

var,if,else,break,continue等是JavaScript的关键词
abstract,int,long等是JavaScript保留词
怎么样算是数字、怎么样算是字符串等等
定义了操做符(+,-,>,<等)
定义了JavaScript的语法
定义了对表达式,语句等标准的处理算法,好比遇到==该如何处理
标准的JavaScript引擎就会根据这套文档去实现,注意这里强调了标准,由于也有不按照标准来实现的,好比IE的JS引擎。这也是为何JavaScript会有兼容性的问题。至于为何IE的JS引擎不按照标准来实现,就要说到浏览器大战了,这里就不赘述了,自行Google之。

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

RunTime

运行时能够简单理解为当前的运行环境,不一样的环境提供了不一样的api调用,如web浏览器中的window对象,DOM相关API等,这些接口能够提供相关的JS调用,

相关文章
相关标签/搜索