待整理:https://zhuanlan.zhihu.com/p/27628685
https://blog.csdn.net/wang516038746/article/details/105776802
https://www.cnblogs.com/bluespot/p/3334165.html

JavaScript引擎

一、CPU并不认识我们的js代码,而不同的CPU只认识自己对应的指令集,JavaScript引擎将js代码编译成CPU认识的指令集,当然除了编译之外还要负责执行以及内存的管理。
二、js是解释型语言,由引擎直接读取源码,一边编译一边执行,这样效率相对较低,而编译型语言(如c++)是把源码直接编译成可直接执行的代码,执行效率更高。
image.png

V8引擎

一、V8引擎的目的就是为了提高性能。
1、解释型语言java的运行过程。
image.png
2、v8
image.png
(1)整个过程和java的编译执行过程非常像,将javascript代码编译成抽象语法树再转化成字节码,通过解释器来执行,并通过JIT工具将部分字节码转化成可直接执行的本地代码。而java是分两个阶段完成,在编译节点尽可能地生成高效的字节码。V8更加直接地将抽象语法树通过JIT技术转换成本地代码,放弃了在字节码阶段可以进行的一些优化,但保证了执行速度。虽然少了生成字节码这一阶段的性能优化,但极大减少了转换时间。

V8编译运行过程

编译过程

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

Script类:表示是JavaScript代码,既包含源代码,又包含编译之后生成的本地代码,所以它既是编译入口,又是运行入口;
Compiler类:编译器类,辅助Script类来编译生成代码,它主要起一个协调者的作用,会调用解释器(Parser)来生成抽象语法树和全代码生成器,来为抽象语法树生成本地代码;
Parser类:将源代码解释并构建成抽象语法树,使用AstNode类来创建它们,并使用Zone类来分配内存;
AstNode类:抽象语法树节点类,是其他所有节点的基类,它包含非常多的子类,后面会针对不同的子类生成不同的本地代码;
AstVisitor类:抽象语法树的访问者类,主要用来遍历抽象语法树;
FullCodeGenerator:AstVisitor类的子类,通过遍历抽象语法树来为JavaScrit生成本地代码;
image.png

原始图片来源:《WebKit技术内幕》
(红色标注为笔者自己理解,如果有偏差或者错误,欢迎指出和讨论)
运行过程

Script表示JavaScript代码,即包含源代码,又包含编译之后生成的本地代码,即是编译入口,又是运行入口;
Execution:运行代码的辅组类,包含一些重要函数,如Call函数,它辅组进入和执行Script代码;
JSFunction:需要执行的JavaScript函数表示类;
Runtime:运行这些本地代码的辅组类,主要提供运行时所需的辅组函数,如:属性访问、类型转换、编译、算术、位操作、比较、正则表达式等;
Heap:运行本地代码需要使用的内存堆类;
MarkCompactCollector:垃圾回收机制的主要实现类,用来标记、清除和整理等基本的垃圾回收过程;
SweeperThread:负责垃圾回收的线程。
执行过程如下:
image.png
原始图片来源:《WebKit技术内幕》
(红色标注为笔者自己理解,如果有偏差或者错误,欢迎指出和讨论)
编译和执行的整体过程如下:
image.png