当前位置: 首页 > 科技观察

详细讲解JavaScript引擎的概念和工作原理

时间:2023-03-19 17:15:07 科技观察

【.com快译】各位小伙伴,在编译和执行代码的时候有没有考虑过JavaScript背后的引擎?作为一名程序员,我建议您使用这篇文章来了解JavaScript引擎的工作原理。这将帮助您编写更流畅、更高质量的JavaScript代码。什么是JavaScript引擎?JavaScript引擎遵循ECMAScript标准。这些标准定义了JavaScript引擎的工作机制和所有功能。因此,JavaScript引擎是一种帮助您将JavaScript代码转换为低级机器代码的程序。一般来说,JavaScript、FORTRAN等高级语言都是从机器语言中抽象出来的。JavaScript具有比C或C++更高的抽象级别。C和C++更接近硬件,所以运行效率会更高。编译(compilation)和解释(interpretation)编程语言通常通过编译(compilation)和解释(interpretation)来实现代码功能。除其他外,编译器可以定义为协助转换代码的程序。它可以将用任何编程语言(源语言)编写的代码转换成另一种目标语言代码。例如:将源代码从高级编程语言转换为低级编程语言(即机器语言)以执行给定的任务。解释器逐行、逐条指令分析源代码,直接在目标机器上执行相应的机器码,无需第三方的参与。尽管编译和解释是完成编程语言的两个方面,但在某些情况下两者之间存在交集,因为大多数使用解释的系统都需要编译器完成翻译。就JavaScript而言,其技术编译也属于解释的范畴。换句话说,当JavaScript编译器运行时,它会执行即时(JIT)编译。在这里,JavaScript引擎恰好可以像NodeJS一样连接到浏览器和Web服务器,以便用户有权在运行时编译和执行JavaScript代码。JavaScript引擎通过指定浏览器的JavaScript实现来剖析ECMA脚本,以便程序在每个浏览器中一致地运行。当然,每个浏览器都提供了一个JavaScript引擎来运行提交的JavaScript代码。例如:Netscape浏览器使用SpiderMonkeyJavaScript引擎。该引擎被定义为具有零优化的基本解释器。虽然它可以运行提交的JavaScript代码,但是需要很长时间。工作原理JavaScript引擎工作原理的基本工作流程是获取JavaScript源代码并使用CPU易于理解的二进制指令(机器代码)对其进行编译。JavaScript引擎主要由一个基线编译器组成,它以中间表示(IR)的形式编译代码。换句话说,它由字节码调用,然后提供给解释器。解释器获取字节码并将代码转换为适合在硬件上运行的机器码。其实这和Java的工作方式非常相似,只是字节码的生成是由程序员完成的,而且字节码可以全球共享。尽管基线编译器的任务是尽可能快地编译代码,但它仍然会生成未优化的字节码。在解释器中,这些字节码导致应用程序变慢。为此,MozillaFirefox浏览器嵌入了SpiderMonkeyJavaScript以优化和提高机器代码的效率。例如:JavaScript引擎会直观地了解变量的数据类型,进而更好地生成少量的机器码。此外,JavaScript引擎还可以根据代码的执行情况收集分析数据,找出代码运行缓慢的原因,进而给出优化和替换的建议。众所周知的JavaScript引擎有Firefox使用的SpiderMonkey引擎和InternetExplorer使用的Chakra引擎,而Google使用的是V8引擎。虽然他们使用不同的编译器,但他们遵循的优化结构是相似的。Google的V8:由LarkBa??k创建的Chromium项目开发了一个开源Javascript引擎。该项目为GoogleChrome和Chromium网络浏览器提供开发服务。Chrome的V8引擎几乎与第一版Chrome同时诞生(2008年9月2日)。V8很好地兼容了Node.js和MongoDB等服务器端技术。由于V8自带了Ignition解释器,可以通过底层字节码来解释执行。尽管这些低级字节码比机器码更小、更慢,但它们的编译时间更短。我们可以使用Full-Codegen编译器来生成未优化的代码。该编译器运行速度比其他编译器快一些。JIT编译器——Turbofan不仅可以编译代码,还可以密切关注代码在整个JavaScript执行过程中是否被多次使用。也就是说,它的垃圾收集器监视不再被引用的各种对象中的数据。而这些数据的收集是由收集器完成的。值得一提的是,在垃圾回收的循环过程中,V8引擎会自动停止程序的运行。CHAKRA:由Microsoft开发并用于MicrosoftEdgeWeb浏览器的ChakraJavaScript引擎。它是InternetExplorer中Jscript引擎的一个分支。我们可以简单理解为:Chakra提高了JavaScript在InternetExplorer中的执行质量。因为它由一个新的JavaScript编译器组成,Chakra可以帮助用户将JavaScript代码编译成高级机器代码。通过提供新的解释器,Chakra不仅可以在传统网页上执行脚本,还可以改进JavaScript运行时和各种库。SPIDERMONKEY:SpiderMonkey由NetscapeCommunications的BrendanEich用C和C++编写,最终作为开源JavaScript引擎发布。它目前在Mozilla公共许可证(2.0版)下的许多产品中使用,包括Firefox。它将类型推断与JIT编译器Jaegermonkey连接起来,以生成高效的代码。在结构上,SpiderMonkey由一个解释器、几个JIT编译器、一个反编译器和一个垃圾收集器组成。RHINO:由Mozilla基金会管理的RhinoJavaScript引擎是一个完全用Java编写的开源软件。它也可以在MozillaFirefox中使用。JavaScript运行时与其他编程语言的区别在于,JavaScript是一种单线程语言运行时(languageruntime),只能一次执行并完成程序代码。由于代码是顺序执行的,耗时较长的代码可能会阻塞后面要执行的其他代码。例如:当你在浏览器(如谷歌浏览器)上打开一个网站时,它会调用一个JavaScript的执行线程来处理诸如滚动网页、打印网页部分内容、监听DOM事件、以及执行操作等。但是,如果JavaScript停止执行,浏览器将自动停止所有操作。这意味着浏览器在完成某些操作之前不会响应任何其他内容。从概念上讲,JavaScript运行时是指JavaScript代码所在的环境或条件。所以当JavaScript在GoogleChrome上执行时,JavaScript运行时是v8;在Mozilla上,它是SpiderMonkey;在IE上,它是脉轮。JavaScript运行时API提供了一种执行桌面和服务器端应用程序的方法。由于这些API在Windows10和任何版本的Windows操作系统上都可用,因此Windows操作系统可以使用Chakra的相关标准为应用程序添加不同的脚本功能。当然,目标系统还需要安装InternetExplorer11。内联缓存内联缓存的概念源于经验观察。也就是说,通过直接在调用站点观察和记住这些相同方法的先前查找结果来加速运行时的方法绑定并提高查找性能。同时,为了简化这个过程,我们可以为调用点分配不同的状态。例如:将初始站点分配给“未初始化”状态。然后,当语言运行时到达未初始化的特定调用站点时,它会执行动态查找并将结果存储在调用站点中,将其状态更改为“单态”。稍后,如果语言运行时再次到达同一个调用站点,它会从现有存储中检索它并直接调用它,而无需再次执行任何额外的查找。此外,为了考虑到不同类型的对象可能出现在同一调用点的可能性,语言运行时还必须在代码中插入保护条件。至此,希望你对JavaScript引擎的相关概念和工作原理有所了解。希望你能更好地将它应用到项目编程中。原标题:HowJavaScriptEngineWorks?,作者:VyomSrivastava