前言什么是V8?JavaScript的幕后发生了什么?如果你是JS开发者或语言的学生,你很有可能会遇到“V8”这两个字母的单词。在这篇文章中,我将给大家简单介绍一下不同的JS引擎,并深入探讨V8引擎的工作机制。文章的第二部分涵盖内存管理概念,将很快发布。这篇文章是由Bit(GitHub)带给你的。作为组件共享平台,Bit帮助大家构建模块化的JavaScript应用程序,在项目和团队之间轻松共享组件,同时构建得更好更快。尝试一下。1.编程语言是如何工作的?在开始讲解JavaScript之前,我们首先要了解任何一种编程语言的基本工作方式。计算机由微处理器组成,我们编写代码来控制这台小巧但功能强大的机器。但是微处理器可以理解哪些语言呢?他们无法理解Java、Python等语言,只能理解机器码。用机器语言或汇编语言编写企业级代码是行不通的,所以我们需要像Java、Python这样的高级语言,加上解释器或编译器,将其转换成机器码。1.1编译器和解释器编译器/解释器可以用它处理的语言或任何其他语言编写。口译员:逐行快速阅读和翻译文件。这就是JavaScript最初的工作方式。编译器:编译器提前运行并创建一个文件,其中包含输入文件的机器代码翻译。有两种方法可以将JavaScript代码转换为机器代码。编译代码时,机器可以更好地了解代码开始运行之前会发生什么,从而加快以后的执行速度。但是,在该过程之前需要时间。另一方面,当代码被解释时,立即执行,因此速度更快,但缺乏优化使其在大型应用程序下变慢。创建ECMAScript引擎的人很聪明,他们结合了两个世界的优点来开发JIT(即时)编译器。JavaScript既被编译又被解释,但实际的实现和顺序取决于引擎。V8团队采取什么策略,我们拭目以待。2.从JavaScript到机器码就JavaScript而言,有一个引擎可以将它转换成机器码。和其他语言一样,引擎可以用任何语言开发,所以这样的引擎不止一个。V8是Google的Chorme浏览器引擎实现。SpiderMonkey是为Netscape浏览器开发的第一个引擎,现在为FireFox提供支持。JavaScriptCore是Apple用于Safari浏览器的引擎。还有更多,如果您想了解InternetExplorer背后的引擎,请查看此维基百科页面。2.1ECMAScript面对这么多的引擎,你可能会问:我可以开发自己的引擎吗?可以,只要它遵循ECMAScript标准。如果我们要成为一名翻译,那么我们必须知道这两种语言的有效词汇。我们已经知道在机器语言中什么是有效的,但是对于JavaScript这需要标准化。JavaScript的标准化工作由Ecma国际组织负责,相关规范称为ECMAScript或ES。因此,当您看到一篇文章/视频提到“ES7中有哪些新功能?”时,您就知道它指的是添加到ECMAScript标准的新JS功能。3.V8引擎3.1部分历史Google为浏览器开发了GoogleMaps,这对浏览器的处理能力提出了很高的要求。当时的JavaScript实现还不够快,无法快速运行地图。谷歌希望吸引更多的用户使用该服务,从而进行广告销售并赚钱。因此,服务必须快速且稳定。所以谷歌用C++开发了自己的V8引擎,并在2008年启用了它,它很快,或者像一些人说的那样,它是最快的。3.2解析和构建树一旦JavaScript文件进入引擎,解析器就会进行词法分析,将代码分解为标记以确定它们的含义。这些标记构成了AST(抽象语法树)。编译器在语义分析期间验证语言元素和关键字的正确使用,而AST在此过程中起着重要作用。之后,AST用于生成实际的字节码或机器码。3.3引擎核心正如我们前面提到的,JavaScript由Ignition解释器解释,由TurboFanJIT优化编译器编译。首先,将前面步骤生成的AST传递给解释器,解释器会快速生成未优化的机器代码,并且其执行是无延迟的。Profiler会在代码运行时对其进行监视,以找出可以进行优化的地方。例如,“for”循环运行100次,但每次迭代都会产生相同的结果。使用此分析器,任何未优化的代码都将传递给编译器进行优化,编译器生成机器代码,最终替换解释器先前生成的未优化代码中的对应代码。随着分析器和编译器不断更改字节码,JavaScript执行性能会随着时间的推移而提高。3.4更多历史在V85.9版本之前,它使用了两个优化编译器和一个基线编译器。基线编译器full-codegen可快速生成未优化的机器代码。使用两个优化编译器Crankshaft和TurboFan来优化代码。随着JavaScript添加新功能,架构的复杂性增加,维护相同的管道对V8团队来说变得更加困难。如果您想了解更多有关旧方法的信息以及转向新管道的原因,可以访问他们的网站。3.5展望未来随着更多研究进一步提高性能,未来V8发动机的工作机制可能会发生变化。此外,随着Webassembly的形成,可能会在管道中添加额外的步骤。4.结束语ECMAScript引擎的实现有很多,其中以Google的V8最为著名。希望本文的简要概述不仅能帮助您了解JavaScript的工作原理,还能帮助您了解编程语言的一般工作原理。如果你想知道V8团队的未来计划或引擎的详细信息,这里有一篇不错的博客。关于本文译者:@Chorer译者:https://chorer.github.io//2019/05/10/Trs-Javascript是如何工作的?(第1部分)/作者:@PriyeshPatel原文:https://blog.bitsrc.io/how-does-javascript-really-work-part-1-7681dd54a36d
