JavaScript引擎

什么是JavaScript引擎?

JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。



什么是虚拟机呢?

虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。

根据虚拟机的运用和直接机器的相关性分为两类:

  • 系统虚拟机,提供一个可以运行完整操作系统的完整系统平台。
  • 程序虚拟机,运行单个计算机程序设计,这意谓它支持单个进程。

JavaScript引擎就是一种程序虚拟机。

正在开发的JavaScript引擎有哪些?

  1. V8,用C++编写,开放源代码,由Google丹麦开发,是Google Chrome的一部分,也用于Node.js
  2. JavaScriptCore,开放源代码,用于webkit型浏览器,如Safari ,2008年实现了编译器和字节码解释器,升级为了SquirrelFish。苹果内部代号为“Nitro”的JavaScript引擎也是基于JavaScriptCore引擎的。
  3. Rhino,由Mozilla基金会管理,开放源代码,完全以Java编写,用于HTMLUnit
  4. SpiderMonkey,第一款JavaScript引擎,早期用于Netscape Navigator,现时用于Mozilla Firefox
  5. Chakra (JScript引擎),用于Internet Explorer[11]
  6. Chakra (JavaScript引擎),用于Microsoft Edge
  7. KJS,KDE的ECMAScript/JavaScript引擎,最初由哈里·波顿开发,用于KDE项目的Konqueror网页浏览器中。


它的作用?

基本工作是把开发人员写的 JavaScript 代码转换成高效、优化的代码,这样就可以通过浏览器进行解释甚至嵌入到应用中。

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

对于静态语言来说(Java、C++、C),处理上述事情的是编译器。对应的,JavaScript这种动态语言叫做解释器。
不同:

  • 编译器:将源代码编译为另外一种代码(比如机器码,或者字节码)
  • 解释器:直接解析并将代码运行结果输出。 比方说,firebug的console就是一个JavaScript的解释器。
    但是很难界定JavaScript引擎是编译器还是解释器。因为想V8引擎,为了提高JS的运行性能,在运行之前会将js编译为本地的机器码,然后再去执行机器码。

它的组成?

  • 编译器。主要工作是将源代码编译成抽象语法树,然后在某些引擎中还包含将抽象语法树转换成字节码。

  • 解释器。在某些引擎中,解释器主要是接受字节码,解释执行这个字节码,然后也依赖来及回收机制等。

  • JIT工具。一个能够能够JIT的工具,将字节码或者抽象语法树转换成本地代码,当然它也需要依赖牢记
  • 垃圾回收器和分析工具(profiler)。它们负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效。


它是如何工作的?

吸引我们注意的两个主要的引擎JavaScriptCore 和 Google 的 V8 引擎都利用了 NativeScript ,它这两个引擎使用不同的方式处理代码。

JavaScriptCore:
源代码=》抽象语法树=》字节码
1. 词法分析,将源代码分解成一系列具有明确含义的符号或字符串(分词)
2. 用词法分析器分析这些符号,将其构建成抽象语法树
3. 解析器生成字节码(编译器可以理解)
4. 4个JIT(Just-In-Time)进程参与进来,分析和执行解析器所生成的字节码。

V8:目的提高性能。
源代码=》抽象语法树=》本地码
这里写图片描述
V8引擎并不将抽象语法树转变成字节码或者其它中间表示,没有像Java一样的虚拟机或者字节码解释器。
这样做的原因?
主要是因为减少这抽象语法树到字节码的转换时间,这一切都在网页加载时候完成,虽然可以提高优化的可能,但是这些分析可能带来巨大的时间浪费。

JavaScript引擎与ECMAScript的关系?

JavaScript引擎就是根据ECMAScript定义的规则解析我们的js代码。
首先,我们应该知道JavaScript引擎也是程序,我们写的js代码也是程序。如何让程序读懂程序呢?就需要定义规则。ECMAScript就是定义了这一套规则,ECMAScript 262这份文档就定义了JavaScript这门语言的标准,JavaScript就是对ECMAScript的一种实现。


JavaScript引擎与浏览器的关系?

JavaScript引擎是浏览器的组成部分之一,不同的浏览器采用了不同的JavaScript引擎。
对于网页的工作来说,需要两个引擎。渲染引擎JavaScript引擎。它们是两个独立的模块,负责不同的事情。渲染引擎负责网页的渲染;JavaScript引擎负责JavaScript代码执行。

这里写图片描述
如上,JavaScript引擎提供调用接口被渲染引擎使用,渲染引擎使用的JavaScript引擎来处理js代码并获得结果。此外,JavaScript引擎需要渲染引擎提供桥接的接口以便能够访问渲染引擎构建的DOM树,操作DOM。(通过复杂且低效的桥接接口访问DOM,对性能来说是一个很大的损失)。

参考:
JavaScript运行原理解析
一篇给小白看的 JavaScript 引擎指南
为什么JavaScript在现在引擎(V8,JavaScript引擎)能够表现出卓越性
什么是JavaScript引擎?

猜你喜欢

转载自blog.csdn.net/liwenfei123/article/details/80677670