编译器和解释器
机器不能直接理解我们所写的代码,所以在执⾏程序之前,需要将我们 所写的代码“翻译”成机器能读懂的机器语⾔。按语⾔的执⾏流程,可以把语⾔划分为编译型语⾔和解释型 语⾔。
编译型语⾔在程序执⾏之前,需要经过编译器的编译过程,并且编译之后会直接保留机器能读懂的⼆进制⽂件(c、c++)
解释型语⾔编写的程序,在每次运⾏时都需要通过解释器对程序进⾏动态解释和执⾏(js,py)
编译器和解释器是如何“翻译”代码流程

V8是如何执⾏⼀段JavaScript代码的

V8在执⾏过程中既有解释器Ignition,⼜有编译器TurboFan
⽣成抽象语法树(AST)和执⾏上下⽂
将源代码转换为抽象语法树,并⽣成执⾏上下⽂
什么是AST?
var myName = "极客时间"
function foo(){
return 23;
}
myName = "geektime"
foo()
⽣成的AST结构如下

AST是⾮常重要的⼀种数据结构,在很多项⽬中有着⼴泛的应⽤。其中最著名的⼀个项⽬是Babel。Babel是 ⼀个被⼴泛使⽤的代码转码器,可以将ES6代码转为ES5代码
⽣成AST需 要经过两个阶段。
第⼀阶段是分词(tokenize),⼜称为词法分析
第⼆阶段是解析(parse),⼜称为语法分析
将上⼀步⽣成的数据,根据语法规则转为 AST。如果源码符合语法规则,这⼀步就会顺利完成。但如果源码存在语法错误,这⼀步就会终⽌,并抛出 ⼀个“语法错误”。
⽣成字节码
有了AST和执⾏上下⽂后,那接下来的第⼆步,解释器Ignition就登场了,它会根据AST⽣成字节码,并解释 执⾏字节码。
字节码是介于AST和机器码之间的⼀种代码。但是与特定类型的机器码⽆关,字节码需要通过解释器将其 转换为机器码后才能执⾏。

执⾏代码
⽣成字节码之后,接下来就要进⼊执⾏阶段了
在执⾏字节码的过程中,如果发 现有热点代码(HotSpot),⽐如⼀段代码被重复执⾏多次,这种就称为热点代码,那么后台的编译器 TurboFan就会把该段热点的字节码编译为⾼效的机器码,然后当再次执⾏这段被优化的代码时,只需要执 ⾏编译后的机器码就可以了,这样就⼤⼤提升了代码的执⾏效率。