首页 > 编程知识 正文

大众v8发动机,通用v8发动机

时间:2023-05-06 02:03:41 阅读:175629 作者:751

背景在现有的javascript引擎中,V8引擎绝对是其中的佼佼者。 chrome和node的基础使用的是V8发动机,其中chrome的市场占有率达到70%。 node是前端工程化和边界扩展的中心支柱,V8引擎对前端开发工程师的重要性可想而知。 大多数javascript开发人员可能没有机会自己开发javascript引擎,但学习V8引擎是提高技术能力的重要方法。 因此,让我们调查学习各种各样的书和报道,总结一系列的报道一起学习进步吧。 (本文是系列文章的第一篇)

V8引擎在了解什么是javascript引擎之前,必须了解什么是javascript引擎。 简单地说,虽然CPU不识别我们的js代码,但是有些CPU只识别了与自己对应的指令集。 javascript引擎将js代码编译为CPU识别的指令集。 当然除了编译外,还负责执行和内存管理。

众所周知,js是一种解释型语言,直接从引擎中读取源代码并在编译的同时执行相对效率较低,而C等编译型语言将源代码编译为可直接执行的代码效率更高。

(图转载于https://砖局域网. zhi Hu.com/p/27628685 )

v8引擎随着技术的发展,对JavaScript性能的要求越来越高,这是为了更快地分析和执行JavaScript代码,v8引擎就是在此背景下应运而生,以提高性能。

为了提高性能,v8从许多并行解释语言的前辈那里学到了很多经验,所以我们先来看看同一解释语言的java的运行过程。

见文章:

什么是JIT:https://blog.csdn.net/QQ _ 36042506/article/details/82976586

看看V8是怎么做的

整个过程非常类似于java的编译执行过程。 将javascript代码编译为抽象语法树,然后将其转换为字节码,由解释器执行,再由JIT工具将部分字节码转换为可直接执行的本地代码。 java在两个阶段完成,在编译阶段生成尽可能高效的字节码。 虽然通过使用JIT技术将抽象语法树直接转换为本地代码,放弃了在字节码阶段可能的一些性能优化,但运行速度是有保证的。 在生成字节码的阶段性能优化较少,但转换时间会大大缩短。

V8编译执行流程接下来,我们来看看V8的编译流程和执行流程

在编译过程中,首先了解编译运行时使用的几个类

Script类:帮助Compiler类: Script类,它既是编译的入口,也是执行的入口,因为它指示JavaScript代码同时包含源代码和编译后生成的本地代码主要通过调用解释器(Parser )生成抽象语法树和完整代码生成器,从而生成抽象语法树的本地代码。 Parser类: AstNode类,用于解释源代码并构建抽象语法树,使用AstNode类创建它们,然后使用Zone类分配内存:抽象语法树节点类是所有其他节点的基类AstVisitor类:抽象语法树的访问者类。 主要用于遍历抽象语法树; fullcodegenerator:ast visitor类的子类,用于遍历抽象语法树并为JavaScrit生成本地代码

原始图像来源: 《WebKit技术内幕》

(红色的表述是笔者自己理解的,如果有偏差和错误,欢迎指出和讨论)

执行过程脚本时,会显示JavaScript代码(即源代码)和编译后生成的本地代码(即编译入口和执行入口)。 Execution :执行代码的子组的类。 包含访问和执行脚本代码的重要函数,如Call函数。 JSFunction :必须执行的JavaScript函数表示类; Runtime :执行这些本地代码的子组的类。 主要提供运行时所需的子组函数,包括属性访问、类型转换、编译、算术、位操作、比较和正则表达式。 Heap :用于执行本地代码的内存堆栈类; MarkCompactCollector :垃圾回收机制的主要实现类,用于标记、清洁、整理等基本垃圾回收流程; SweeperThread :负责垃圾回收的线程。 执行步骤如下:

原始图像来源: 《WebKit技术内幕》

(红色的表述是笔者自己理解的,如果有偏差和错误,欢迎指出和讨论)

编译和执行的总体过程如下。

原始图像来源: 《WebKit技术内幕》

(红色的表述是笔者自己理解的,如果有偏差和错误,欢迎指出和讨论)

虽然本文从宏观角度介绍了V8引擎编辑和运行的过程,但为了真正理解V8,我们将了解许多运行的细节,包括事件循环系统、内存管理、延迟分析、隐藏类和内联缓存下一篇文章将逐一学习,敬请期待。

参见文章《WebKit技术内幕》

关于V8引擎: https://Zhan.zhi Hu.com/p/27628685

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。