JavaScript 属于解释型语言,解释型语言编写的程序,在每次运行时都需要通过解释器对程序进行动态解释和执行。
- 解释器对源代码进行词法分析、语法分析,并生成抽象语法树(AST)和执行上下文。
- 根据 AST 生成字节码,并解释执行字节码。
- 生成字节码之后,接下来就要进入执行阶段了。
生成抽象语法树(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)
标签:解释器,字节,AST,代码,JavaScript,生成,V8,执行 From: https://www.cnblogs.com/superlizhao/p/17023418.html