当前位置: 首页 > 网络应用技术

我教你快速了解Google V8引擎

时间:2023-03-08 17:04:22 网络应用技术

  在分析它之前,我们提出以下问题:

  接下来,您可以详细描述上述问题。

  我们都知道JS是一种支持动态类型的解释语言(显然与诸如静态语言(例如Java),即,在命名变量时不需要声明变量的类型),弱类型,基于原型的语言,在支持类型的构建类型中构建的支持类型,JS在前端执行(直接影响界面),这需要能够快速响应用户。然后,可以快速解析和执行语言本身,并为此启动JS引擎。

  这里提到了解发行语言和静态语言(汇编语言),首先简要介绍两者:

  从上面的描述中,您可以看到JS根据源文件进行解释,然后执行,并且汇编类型仅需要一次编译一次。下次您可以直接运行可执行文件时,但这将导致交叉平台平台稳定性很差,因此每个平台稳定性都有其自己的优势和缺点。

  以及许多JS发动机(V8,JavascriptCore,Spidermonkey,Chakra等)是最好的。此外,它也用于当前最受欢迎的Google浏览器中,因此有必要了解和理解它。这是针对开发人员的。最好知道JS如何在浏览器中运行。

  让我们首先进行官方流程图:

  JS文件加载(未返回V8管):它可能来自网络请求,本地缓存或也可以来自服务工作者,这是V8操作的先决条件(仅解释和执行活动文件)。方法和V8优化:

  在V8 6.6版本中,进一步改进了代码缓存策略。简而言之,这是从缓存代码依赖性的模型更改为编译过程的模型,再到两个过程解耦并增加了缓存代码,大大提高了性能,并且具体的详细信息请参见V8 6.6进一步提高缓存性能。

  此过程是将上面获得的JS代码转换为AST(抽象语法树)。

  物种从左到右从左到右的源代码。通过分析,生成不同的标记。这里的标签称为令牌,代表源代码的最小单元。拆分单元,此过程称为词汇标记,该过程的乘积用于使用下面的语法分析链接。

  这是短语分析仪中常用的令牌标记的类型:

  上面提到的是从左到右扫描代码,然后进行分析,然后很明显将有两个方案。在扫描和分析(非正式处理)和扫描边缘分析(流处理)之后,只需为它们绘制它们。时间序列地图可以发现当前的处理效率要高得多。同时,分析过程中占据的内存也将发布,并且可以大大提高记忆效率。可以看出,处理了优化的细节。

  语法分析语法分析是指基于给定的形式语法(例如上一个阶段 - 托克斯族流的词素分析产物)组成的输入文本的过程,以分析和确定其语法结构,并最终产生它。(抽象语法树)。

  V8将将语法分析的过程分为两个阶段以执行:

  为什么要进行两次?如果只有一次,它只能是完整的,但是在这种情况下,大量未使用的代码会消耗大量解析时间,结合示例:可以通过记录覆盖范围的方法,可以分析。如下图所示,可以看出,最多75%尚未执行。

  但是 - 分析不是通用的,而是共存的损失,这很明显:该文件中的代码均已执行,这实际上是不必要的。Coursethis实际上是一种平衡,需要照顾大多数人以实现全面的绩效提高。

  给出以下示例:

  将上述代码复制到Web1和Web2可以直观地看到其令牌和AST结构(也可以自己编写一些代码体验)。

  此阶段是将上述生成的AST转换为字节码。

  添加字节码(中间产品)的好处是,它不是直接转换为机器代码,因为相应的CPU系统将不一致。当翻译成机器代码时,必要的复杂性将非常高。还有一个内存职业的问题,因为机器代码将存储在内存中,并且退出过程将存储在磁盘上。此外,该文件更大,这会导致严重的记忆职业问题。

  在执行字节码的过程中,V8使用常规寄存器和累积寄存器。功能参数和局部变量存储在常规寄存器中。如果您读取数据,它将比较程序执行的性能。使用寄存器的中间数据设计的设计可以大大提高CPU执行的速度。

  此过程主要是将字节代码通过V8的TurboFan编译器转换为机器代码的过程。

  与解释器和编译器的字节代码的技术设计可以称为JIT(即时编译技术)。Java虚拟机也是类似的技术。解释解释以执行字节代码时,将收集代码信息,并用一些热点标记一些热点。代码(即,一块代码多次反复执行),TurboFan将直接编译热点进入机器代码,缓存它,下一个调用直接运行相应的二进制机器代码以加快执行速度。

  在将字节码编译为Turbofan中的机器代码的过程中,还进行了简化的处理:恒定合并,强制还原和代数重新计算。

  例如:3 + 4-> 7,x + 1 + 2-> x + 3 ......

  在这一点上,我们开始执行上一阶段生产的机器代码。

  在执行JS期间,通常遇到的是对象属性的访问。作为动态语言,简单的属性访问可能包含复杂的语义,例如表单,这可能是对属性的直接访问,或可以称为的对象。这种不确定性和动态判断将浪费大量搜索时间,因此V8将将首次分析的结果放在缓存中。再次访问相同的属性时,将从缓存中取出来获取缓存。如果有缓存结果,将跳过搜索过程,从而大大提高其运行性能。

  除了优化读取对象属性的结果缓存外,V8还引入了(隐藏类别)的概念,该概念将记录某些对象的基本信息(例如每个属性的所有属性和属性,抵消该对象的数量。

  现在V8提出了一个隐藏的类(两个具有相同形状的对象将重复使用相同的隐藏类,什么是相同的形状?两个对象符合相同数字名称的相同数字和相同的属性顺序),然后wedevelopers也可以很好地使用:

  目前,V8完成了JS代码的阅读,分析,解释,汇编和执行。

  以上是从JS代码下载到V8引擎的最终实现的过程分析。可以发现,V8中实际上有许多实现的技术要点,例如流媒体处理,缓存中间产品,垃圾回收等。这将涉及很多细节,而且值得继续进行 - 深度研究。

  作者:TADM