V8引擎的定义
1.V8是用C ++编写的Google开源高性能JavaScript和WebAssembly引擎,它用于Chrome和Node.js等
2.它实现ECMAScript和WebAssembly,并在Windows 7或更高版本,macOS 10.12+和使用x64,IA-32,ARM或MIPS处理器的Linux系统上运行
3.V8可以独立运行,也可以嵌入到任何C ++应用程序中
V8引擎的原理流程
v8引擎当我们的一段js代码需要进行执行时,
1.V8引擎首先会使用解析器(编译器)(Parse模块)经过词法分析 > 语法分析 这几步生成一颗抽象语法树(AST) ,由于解释器(Ignition模块)是不能直接认识js代码的所以需要经过编译器将js代码生成AST 。当需要进行代码转换时,例如es6,ts代码需要转换成es5的时候,可以访问AST树,将AST树转换为es5规定的代码,然后再生成新的AST树
parse的V8官方文档
2.抽象语法树在由解释器(Ignition模块)生成字节码(伪汇编代码),生成的字节码可以跨平台使用,在浏览器和node环境下都是可以用字节码直接生成所需要的的结果
Ignition的V8官方文档
3.字节码接着执行接下来的步骤真正的汇编代码 =>机器码 => cpu执行,这就是当你在调用相关的js函数时,V8引擎需要执行的步骤(上面三步主要由解释型语言实现的)
function sum(num1,num2){
return num1 + num2
}
4.如果一个函数被多次调用,那么就会被标记为热点函数,那么就会经过TurboFan转换成优化的机器码,不需要在经过步骤三就可以直接被CPU执行,提高代码的执行性能(这一步主要由C++实现),这里有一个需要注意的是:以上面的代码为例,多次调用sum函数,并且传入的参数类型都是相同类型时(列如number类型),这一步骤才会生效,如果我们这时改变一个参数的类型,之前优化的机器码并不能正确的处理运算,就会逆向的转换成字节码,这样做会让性能大打折扣,如果在使用typescript进行类型检测,是可以提高一定的性能
TurboFan的V8官方文档
网友评论