V8如何执行一段js代码?

一些概念

  • 编译器(Compiler),对源码进行词法分析、语法分析,生成抽象语法树,然后优化代码,生成能被处理器理解的机器码(可执行的二级制文件)
  • 编译器 (Interpreter),对源码进行词法分析、语法分析,生成抽象语法树,在基于AST生成字节码,再根据字节码来执行程序
    compiler_interpreter
  • 抽象语法树 (AST), 是源代码语法结构的一种抽象表示,它以树状的形式来表现编程语言的语法结构,树上的每个节点都表示源代码中的一种结构。javascript-ast。生成AST需要2个阶段:
    • 分词,词法分析(tokenize), 将一行行源码拆解成一个个token
    • 解析,语法分析(parse), 将token数据,根据语法规则转为AST
  • 字节码(Bytecode), 介于AST和机器码之间,但与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。
  • 即使编译器(JIT),字节码配合解释器和编译器来执行代码。工作流程如下图
    JIT

V8 如何执行一段JS代码?

V8

    1. 生成抽象语法树(AST)和执行上下文
    1. 生成字节码,解释器(Ignition)根据AST生成字节码,并解释执行字节码
    1. 执行代码 , 解释器除了负责生成字节码外,还会解释并执行字节码,过程中,如果发现有热点代码(HotSpot,被重复执行多次的代码),编译器(TurboFan)会把该段热点代码编译为高效的机器码,当再次执行时,会执行编译后的机器码,以此来提高执行效率。