JavaScript——引擎

356 阅读3分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第13天,点击查看活动详情

什么是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)。它们负责垃圾回收和收集引擎中的信息,帮助改善引擎的性能和功效。