😘前言:要了解 JavaScript 引擎,你必须了解当我们编译和执行代码时它的内容。一旦你完全阅读了这篇文章,你就可以写出一段优秀的代码。这篇文章是关于JavaScript引擎的,它将帮助你了解JavaScript引擎的性能及其最有价值的功能,嘎嘎嘎,看下面😍。

一、什么是 JavaScript 引擎?🧐

JavaScript引擎是一个程序,有助于将JavaScript代码转换为较低级别的代码或机器代码。ECMAScript 标准被 JavaScript 引擎所遵循。这些标准的工作是给出一个定义,JavaScript引擎应该如何工作。它还告诉它应该具有的所有功能。🥰

如果我们笼统地说,JavaScript,C,FORTRAN等高级语言已经从机器语言中抽象出来。与 C 或 C++ 相比,JavaScript 的抽象程度要离机器级别更远。C 和 C++ 更接近硬件,以及其他使其更快的原因。

编译和解释✔

编译和解释是通常用于编程语言实现代码的几种方法。

编译器可以定义为帮助转换代码的程序。此转换针对已用任何编程语言(源语言)编写的代码执行,转换为你作为目标的另一种编程语言。他们通过将源代码从高级编程语言翻译成低级编程语言(即机器语言)来执行此任务。

解释器逐行分析你的源代码,逐条指令分析你的源代码,然后直接在目标机器上执行相应的机器代码,而无需任何第三方参与。

尽管编译和解释是完成编程语言实现的两个原则,但在某些情况下它们也是相互关联的。这种关系之所以出现,是因为大多数使用口译的系统确实执行了一些翻译工作。翻译工作也由编译器完成。

如果我们谈论JavaScript的类别,那么它属于解释类别,即使它已经在技术上编译了。今天的现代 JavaScript 编译器执行运行时发生的即时 (JIT) 编译。

JavaScript引擎连接到浏览器和Web服务器,例如Node JS,因此你应该具有运行时编译和执行JavaScript代码的权限。

二、JavaScript 引擎剖析🧐

ECMA 脚本指定了浏览器应实现 JavaScript 的过程,以便该程序在每个浏览器中都运行相同。它没有指定JavaScript应该如何在这些浏览器中运行。这取决于供应商的浏览器来决定这一点。每个浏览器都为你提供一个运行JavaScript代码的JavaScript引擎。

Spider Monkey JavaScript引擎正在被Netscape浏览器使用。该引擎被定义为零优化的基本解释器。如果你在这个引擎上运行你的JavaScript代码,它将运行和工作,但需要更多时间。😓

它是如何工作的?✔

JavaScript引擎的工作是获取JavaScript源代码。然后编译为 CPU 易于理解的二进制指令(机器代码)。

有限的JavaScript引擎由一个基线编译器组成,其工作是以中间表示(IR)的形式编译代码,换句话说,它被称为字节码,然后将字节码提供给解释器。

此外,解释器获取此字节码,然后转换为机器码。此机器代码将进一步在机器的硬件上运行此代码。

“它与Java的工作方式非常相似,但字节码的生成是由程序员完成的,字节码已经普遍共享,而不是源代码。

基线编译器的工作是尽可能快地执行代码的编译。它还生成不太优化的字节代码。与解释器一样,它没有优化的字节码来使用,那么应用程序的速度将非常慢。另一方面,申请的时间会非常少。

Spider Monkey JavaScript 已被嵌入到一个复杂的机器中。这样做是为了提高高度优化的机器代码的效率。它目前正在Mozilla Firefox浏览器中使用。

如果我们可以选择制作一个高度动态和交互式的 Web 应用程序,那么开发人员在执行 JavaScript 时会遇到问题。这是谷歌的Chrome浏览器在网络平台上显示谷歌地图时面临的问题。为了提高JavaScript的性能,他们提供了一个更好的解决方案,我们将在本文后面讨论。

如果缺少JavaScript中的系统,那么JavaScript引擎将产生非常少的机器代码。因此,基于已经提到的值,JavaScript引擎可以直观地了解变量的数据类型,并生成更好的代码。

JavaScript引擎还可以执行代码执行的分析数据的收集。它还分析运行速度非常慢的代码。此代码通常称为“热”代码,因为它在 CPU 中被烧毁。我们可以选择进一步优化和替换已经优化的机器代码。

考虑到这些事情以及由全代码生成和曲轴引起的其他问题,V8 团队从头开始创建新版本的 V8 发动机。创建的新版本于2017年推出。

三、其他 JavaScript 引擎呢?🧐

我们已经研究了 V8 的工作原理,我们将在本文后面详细讨论。与此非常相似,其他一些浏览器供应商正在遵循另一种模型,例如Firefox中使用的Spider Monkey引擎和Internet Explorer中使用的Chakra引擎。

在查看一些 JavaScript 引擎时,由于它们的多个基线和编译器的优化,它可能看起来很复杂,但简而言之,它们确实遵循相同的优化现象结构。

四、知名的JavaScript引擎🧐

1. 谷歌的V8:✔

它是一个开源的Javascript引擎,由Chromium项目开发。它是为Google Chrome和Chromium网络浏览器开发的。这个项目是由Lark Bak介绍和创建的。当chrome的第一个版本发布时,即2年2008月8日。与此同时,Chrome V8引擎上的第一个版本应运而生。此版本在使用Node.js和MongoDB等服务器端技术时也兼容。

解释和执行是在低级字节码中完成的,因为它有一个点火解释器。尽管这些低级字节码比机器码更慢、更小,但它们需要的编译时间更少。要生成未优化的代码,可以使用全代码生成编译器,与其他编译器相比,它的运行速度更快。Turbofan,JIT编译器将编译代码,并且还会关注代码,如果在整个JavaScript执行过程中多次使用。

垃圾回收器观察其中的对象,包括不再引用的数据。此类数据的收集由该收集器完成。在执行垃圾回收周期时,V8 引擎会自动停止程序的执行。

2. Chakra:✔

Chakra JavaScript引擎由Microsoft开发,用于其Microsoft Edge网络浏览器。它可以说是Internet Explorer中使用的Jscript引擎的一个分支。如果我们用简单的话来说,Chakra 会改变 Internet Explorer 中 JavaScript 的执行质量。Chakra 由一个新的 JavaScript 编译器组成,可帮助你将 JavaScript 代码编译为高级机器代码。它为你提供了一个新的解释器,用于在传统网页上执行脚本,并改进了 JavaScript 运行时和库。

3. 蜘蛛猴:✔

这个名字是JavaScript引擎的代号,由Netscape Communications的Brendan Eich编写。然后它后来被发布为将其定义为开源。这目前正在由Mozilla基金会Spider Monkey维护,该Spider Monkey是用C和C++编程语言编写的。它被用于许多Mozilla产品,包括Firefox,这在Mozilla公共许可证版本2.0下可用。它将类型推断与 Jaegermonkey、JITcompiler 连接起来,以生成高效的代码。

Spider Monkey 由一个解释器、几个 JIT 编译器、一个反编译器和一个垃圾回收器组成。

4. Rhino:✔

Rhino JavaScript引擎完全是用Java编写的,它也由Mozilla基金会管理。这是作为开源软件管理的。如果我们将其与同样由Mozilla开发的SpiderMonkey JavaScript引擎进行比较,但是它是用C++编写的,并且正在Mozilla Firefox中使用。

五、JavaScript 运行时

如此多的开发人员对他们的工作充满热情。他们完全致力于前端或后端应用程序的工作,以保护JavaScript的真正含义。

如果我们将JavaScript与其他编程语言进行比较,它与它们并不相似。它在运行时是一种单线程语言。这意味着代码的执行已完成,但一次只能执行一段。由于代码是按顺序执行的,因此任何需要较长时间的代码都会像往常一样阻塞之后需要执行的其他代码的路径。因此,有时你会在使用谷歌浏览器时观察到以下屏幕。

当你在浏览器上打开任何网站时,它会使用JavaScript,一个单一的执行线程。该线程负责处理所有内容,例如滚动网页,在网页上打印某些内容,侦听DOM事件以及执行其他操作。

一旦 JavaScript 的执行停止,浏览器将自动停止执行这些操作。这意味着它将简单地在某一点停止,换句话说,在某一点冻结,并且在该任务完成之前不会响应任何内容。

JavaScript 运行时是指 JavaScript 代码所在的条件或环境。话虽如此,JavaScript 可以在 Google chrome 上执行,在这种情况下,你的 JavaScript 运行时是 v8,如果在 Mozilla 上 - 它是 Spider Monkey,如果是 IE - 那么它的脉轮,如果在节点上,它又是它的 v8。

JavaScript 运行时 API 为桌面和服务器端应用程序提供了一种执行方式。这在 Windows 操作系统上运行,该操作系统使用 Chakra 标准向应用程序添加脚本功能。这些 API 在 Windows 10 和任何版本的 Windows 操作系统上可用。这是在计算机上安装了 Internet Explorer 版本 11.0。

六、内联缓存🧐

内联缓存的概念基于经验观察。这意味着在特定调用站点上发生的对象通常属于同一类型。在这些情况下,通过将方法查找的结果“内联”(即直接存储在调用站点)可以大大提高性能。为了简化此过程,呼叫站点被分配了不同的状态。最初,呼叫站点被视为“未初始化”

一旦语言运行库到达特定的未初始化调用站点,它将执行动态查找,将结果存储在调用站点,并将其状态更改为“单态”。如果语言运行时再次到达同一调用站点。它从中检索调用并直接调用它,而无需执行任何更多查找。为了考虑不同类型的对象可能出现在同一调用站点的可能性,语言运行库还必须在代码中插入保护条件。

好了,今天就说到这里了,希望掘友们清楚JavaScript引擎是如何工作的。

感谢浏览本文🤞,若有更好的建议,欢迎评论区讨论哈🌹。

如果觉得这篇干货很有用,加个关关🥰,点个赞赞🥰,后面我会继续卷,分享更多干货!感谢支持!😍

本文参与了SegmentFault 思否写作挑战赛活动,欢迎正在阅读的你也加入。

月弦笙音
45 声望5 粉丝

前端开荒