2021/01/30 - v8引擎执行js代码的过程简析
lxinr opened this issue · 0 comments
lxinr commented
分析过程:
- 通过词法分析和语法分析生成 AST(抽象语法树)
- 将 AST 转换为字节码
- 由解释器逐行执行字节码,遇到热点代码启动编译器进行编译,生成对应的机器码, 以优化执行效率
1、生成AST
1、词法分析
词法分析即分词,意思就是将一行行的代码分解成一个个token
const msg = '词词词'
// 词法分析将该语句分成四个部分
// const -> 关键字 msg -> 变量名 = -> 赋值 '词词词' -> 字符串2、语法分析
语法分析阶段,将生成的这些 token 数据,根据一定的语法规则转化为AST
babel的工作原理就是将es6+的代码解析成es6的AST,再将es6的AST转成es5的AST,最后再将es5的AST反解析成es5的代码
2、生成字节码
字节码是介于AST 和 机器码之间的一种代码,但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码然后执行
3、执行代码
在执行过程中,如果发现有某一部分代码重复出现,那么V8会将其记做热点代码,然后将其编译成机器码保存下来,这个用来编译的工具就是V8的编译器(也叫做TurboFan), 因此,假如代码执行时间越久,效率就会越高,因为会有越来越多的字节码被标记,然后直接使用其对应的机器码,不需要再执行转换过程。
这种字节码跟编译器和解释器结合的技术,我们称之为即时编译, 也就是我们经常听到的JIT