V8 如何执行一段JS代码?

计算机执行高级语言的两种方式

在这里插入图片描述

在这里插入图片描述

V8 如何执行一段JS代码?

1.生成 AST

生成 AST 分为两步——词法分析和语法分析

  • 词法分析

词法分析即分词,它的工作就是将一行行的代码分解成一个个token。

//比如下面一行代码:
let name = 'sanyuan'

在这里插入图片描述

即解析成了四个token,这就是词法分析的作用。

  • 语法分析

接下来语法分析阶段,将生成的这些 token 数据,根据一定的语法规则转化为AST。举个例子:

let name = 'sanyuan'
console.log(name)

在这里插入图片描述

2. 生成字节码

字节码是介于AST 和 机器码之间的一种代码,但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码然后执行。

字节码仍然需要转换为机器码,但和原来不同的是,现在不用一次性将全部的字节码都转换成机器码,而是通过解释器来逐行执行字节码,省去了生成二进制文件的操作,这样就大大降低了内存的压力。

3. 执行代码

在执行字节码的过程中,如果发现某一部分代码重复出现,那么 V8 将它记做热点代码(HotSpot),然后将这么代码编译成机器码保存起来,这个用来编译的工具就是V8的编译器(也叫做TurboFan) , 因此在这样的机制下,代码执行的时间越久,那么执行效率会越来越高,因为有越来越多的字节码被标记为热点代码,遇到它们时直接执行相应的机器码,不用再次将转换为机器码。

总结

其实当你听到有人说 JS 就是一门解释器语言的时候,其实这个说法是有问题的。因为字节码不仅配合了解释器,而且还和编译器打交道,所以 JS 并不是完全的解释型语言。而编译器和解释器的 根本区别在于前者会编译生成二进制文件但后者不会。并且,这种字节码跟编译器和解释器结合的技术,我们称之为即时编译, 也就是我们经常听到的JIT。
在这里插入图片描述

参考: 神三元:描述一下 V8 执行一段JS代码的过程?

猜你喜欢

转载自blog.csdn.net/HZ___ZH/article/details/115430124