14|V8是如何执行一段JavaScript代码的?

JavaScript 属于解释型语言,解释型语言编写的程序,在每次运行时都需要通过解释器对程序进行动态解释和执行。

  1. 解释器对源代码进行词法分析、语法分析,并生成抽象语法树(AST)和执行上下文。
  2. 根据 AST 生成字节码,并解释执行字节码。
  3. 生成字节码之后,接下来就要进入执行阶段了。

生成抽象语法树(AST)和执行上下文

什么是 AST

AST是能被编译器或者解释器理解的语言,AST 的结构和代码的结构非常相似,可以把 AST 看成代码的结构化的表示。

AST 的一些应用

Babel 的工作原理就是先将 ES6 源码转换为 AST,然后再将 ES6 语法的 AST 转换为 ES5 语法的 AST,最后利用 ES5 的 AST 生成 JavaScript 源代码。

ESLint 是一个用来检查 JavaScript 编写规范的插件,其检测流程也是需要将源码转换为 AST,然后再利用 AST 来检查代码规范化的问题。

AST 的生成过程是怎样的

先分词,再解析。

分词(tokenize),又称为词法分析。将一行行的源码拆解成一个个 token。所谓 token,指的是语法上不可能再分的、最小的单个字符或字符串。

解析(parse),又称为语法分析。其作用是将上一步生成的 token 数据,根据语法规则转为 AST。如果源码符合语法规则,这一步就会顺利完成。但如果源码存在语法错误,这一步就会终止,并抛出一个“语法错误”。

生成字节码

解释器 Ignition 就登场了,它会根据 AST 生成字节码,并解释执行字节码。字节码就是介于 AST 和机器码之间的一种代码。但是与特定类型的机器码无关,字节码需要通过解释器将其转换为机器码后才能执行。

执行代码

在 Ignition 执行字节码的过程中,如果发现有热点代码(HotSpot),比如一段代码被重复执行多次,这种就称为热点代码,那么后台的编译器 TurboFan 就会把该段热点的字节码编译为高效的机器码,然后当再次执行这段被优化的代码时,只需要执行编译后的机器码就可以了,这样就大大提升了代码的执行效率。

这种字节码配合解释器和编译器的技术叫做即时编译(JIT)

 

posted @ 2023-01-03 21:19  哥哦狗子  阅读(51)  评论(0编辑  收藏  举报