什么是JavaScript引擎?
JavaScript引擎是一个专门处理JavaScript脚本的虚拟机,一般会附带在网页浏览器之中。
什么是虚拟机呢?
虚拟机(英语:virtual machine),在计算机科学中的体系结构里,是指一种特殊的软件,可以在计算机平台和终端用户之间创建一种环境,而终端用户则是基于这个软件所创建的环境来操作软件。
根据虚拟机的运用和直接机器的相关性分为两类:
- 系统虚拟机,提供一个可以运行完整操作系统的完整系统平台。
- 程序虚拟机,运行单个计算机程序设计,这意谓它支持单个进程。
JavaScript引擎就是一种程序虚拟机。
正在开发的JavaScript引擎有哪些?
V8
,用C++编写,开放源代码,由Google丹麦开发,是Google Chrome
的一部分,也用于Node.js
。JavaScriptCore
,开放源代码,用于webkit型浏览器,如Safari
,2008年实现了编译器和字节码解释器,升级为了SquirrelFish
。苹果内部代号为“Nitro”的JavaScript引擎也是基于JavaScriptCore引擎的。Rhino
,由Mozilla基金会管理,开放源代码,完全以Java编写,用于HTMLUnit
SpiderMonkey
,第一款JavaScript引擎,早期用于Netscape Navigator,现时用于Mozilla Firefox
。Chakra
(JScript引擎),用于Internet Explorer[11]
。Chakra
(JavaScript引擎),用于Microsoft Edge
。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引擎?