字节码和机器码
- 字节码
- 是一种包含执行程序,由数值常量、引用、指令等构成的序列组成的二进制文件; 字节码是一种中间码,它比机器码更抽象,需要直译器转译后才能成为机器码的中间代码。
- 优点: 1. 不针对特定CPU架构 2. 比原始的高级语言转换成机器语言更快
- 机器码: 学名机器语言指令,有时也被称为原生码,是电脑的CPU可直接解读的数据。
AST(抽象语法树)
AST: 它是源代码语法结构的一种抽象表示。它以树状的形式表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。 执行过程:源码 –> 词法分析 (Token) –> 语法分析 (AST)
js在v8引擎中执行
1. 初期V8引擎架构
- 第一步: 将js源码转化成AST(抽象语法树)
- 第二步: 通过引擎编译AST变成机器码二进制文件, 然后直接运行机器码二进制文件
- 第三步: 在执行第二步过程中,标记重复执行的函数,将标记的代码生成更加高效的二进制代码(缓存在内存和硬盘中), 节省了重复编译的时间。
2. 现在V8引擎架构
- 第一步: 将js源码转化为AST(抽象语法树)
- 第二步: 通过解释器将AST编译成字节码, 开始逐句对字节码解释成二进制机器码并执行
- 第三步: 在解释过程中,标记重复执行代码,将标记的代码通过引擎进行编译生成高效的二进制机器码, 再次运行到这个函数时只执行二进制机器码, 不用再解释字节码
3. 现在V8引擎引入字节码的好处
- 启动时间缩短。 启动时只需编码字节码, 编译字节码速度远快于二进制机器码
- 内存空间变小。 字节码空间小于二进制机器码
- 代码复杂度降低。 引入字节码大大降低V8适配不同的CPU所需要的代码复杂程度
js代码在现在V8引擎运行
js源码 –> AST –> 字节码 –> 解释器执行 –> 机器码 –> 输出结果
[文章来源](https://juejin.cn/post/6844904152745639949#heading-6)