对于V8引擎的理解?

2020-07-08 09:59发布

2条回答
HUANG
2020-07-08 14:35

在现有的javascript引擎中,V8引擎绝对是其中的佼佼者,chrome和node底层都使用了V8引擎,其中chrome的市场占有率已经达到70%,而node更是前端工程化以及扩展边界的核心支柱,V8引擎对于一个前端开发工程师来说重要程度可想而知。我们大部分javascript开发者也许没有机会自己开发一个javascript引擎,但是学习V8引擎绝对是我们提升技术能力的重要途径,

javascript引擎

了解V8引擎之前我们先要知道什么是javascript引擎。简单来说,CPU并不认识我们的js代码,而不同的CPU只认识自己对应的指令集,javascript引擎将js代码编译成CPU认识的指令集,当然除了编译之外还要负责执行以及内存的管理。

大家都知道js是解释形语言,由引擎直接读取源码,一边编译一边执行,这样效率相对较低,而编译形语言(如c++)是把源码直接编译成可直接执行的代码执行效率更高。

随着技术的发展,对JavaScript性能的要求越来越高,这就更快速的解析和执行JavaScript代码,V8引擎就是在此背景下产生的,它产生的目的就是为了提高性能。

v8引擎

将javascript代码编译成抽象语法树再转化成字节码,通过解释器来执行,并通过JIT工具将部分字节码转化成可直接执行的本地代码。而java是分两个阶段完成,在编译阶段尽可能的生成高效的字节码。V8更加直接的将抽象语法树通过JIT技术转换成本地代码,放弃了在字节码阶段可以进行的一些性能优化,但保证了执行速度。虽然少了生成字节码这一阶段的性能优化,但极大减少了转换时间。

V8编译运行过程

接下来我们来了解一下v8的编译过程和运行过程

编译过程

首先我们要了解一下在执行编译运行过程中所用到的几个类

Script类:表示是JavaScript代码,既包含源代码,又包含编译之后生成的本地代码,所以它既是编译入口,又是运行入口;

Compiler类:编译器类,辅助Script类来编译生成代码,它主要起一个协调者的作用,会调用解释器(Parser)来生成抽象语法树和全代码生成器,来为抽象语法树生成本地代码;

Parser类:将源代码解释并构建成抽象语法树,使用AstNode类来创建它们,并使用Zone类来分配内存;

AstNode类:抽象语法树节点类,是其他所有节点的基类,它包含非常多的子类,后面会针对不同的子类生成不同的本地代码;

AstVisitor类:抽象语法树的访问者类,主要用来遍历抽象语法树;

FullCodeGenerator:AstVisitor类的子类,通过遍历抽象语法树来为JavaScrit生成本地代码;

运行过程

Script表示JavaScript代码,即包含源代码,又包含编译之后生成的本地代码,即是编译入口,又是运行入口;

Execution:运行代码的辅组类,包含一些重要函数,如Call函数,它辅组进入和执行Script代码;

JSFunction:需要执行的JavaScript函数表示类;

Runtime:运行这些本地代码的辅组类,主要提供运行时所需的辅组函数,如:属性访问、类型转换、编译、算术、位操作、比较、正则表达式等;

Heap:运行本地代码需要使用的内存堆类;

MarkCompactCollector:垃圾回收机制的主要实现类,用来标记、清除和整理等基本的垃圾回收过程;

SweeperThread:负责垃圾回收的线程。



一周热门 更多>