v8执行js代码的过程

385 阅读1分钟

一、编译型语言和解释型语言

编译型语言的编译过程:

  • 对于代码进行词法分析、语法分析,生成AST树,然后进行代码优化,再生成处理器能处理的机器码。如果编译成功,则生成一个二进制文件,否则报错。

解释型语言的解释过程:

  • 对代码进行词法分析、语法分析,生成AST树,根据AST树生成字节码,根据字节码执行程序。

二、AST树

var myName = "极客时间"
function foo(){
  return 23;
}
myName = "geektime"
foo()

对于上面代码生成的AST树如下:

babel的原理就是将es6的代码转成es6的AST树,再根据es6的AST树生成es5的AST树,根据es5的AST树生成es5的js代码。

转成AST树的过程有两步:

  • 词法分析:将代码转成token。

  • 语法分析(解析):根据生成的token生成AST树。

三、执行

当生成字节码之后,解释器开始逐条执行字节码,如果有一段代码被多次执行(热点代码),那么编译器就会将这段代码转成高效的机器码,存在内存中,以便之后使用。

解释器的作用:

  • 将AST树转成字节码。

  • 执行字节码。

四、字节码和机器码

字节码相比机器码占用的内存更少。那为什么热点代码要转成机器码呢,因为机器码更高效。