JS是一门高级语言。当代码交给浏览器或nodejs时,是无法被底层CPU执行的。需要JS虚拟机执行。实现代码编译和执行。V8应用最为广泛,采用即时编译(JIT)的双轮驱动设计,混合了编译执行和解释执行两种模式编译器(Compiler)、解释器(InterPerter)、抽象语法树(AST)、字节码(Bytecode)、即时编译器(JIT)。因为机器无法直接理解我们写的代码,所以在执行程序之前,我们需要将我们写的代码“翻译”成机器可以理解的机器语言。用解释型语言编写的程序:程序每次运行时都需要由解释器动态解释执行。JavaScript是一种解释型语言。解释器在解释解释型语言的过程中,还会对源代码进行词法分析和语法分析,生成抽象语法树(AST),但是会根据抽象语法树生成字节码,最后根据word段代码执行程序并输出结果。生成抽象语法树和执行上下文。比如babel使用AST,先把ES6转AST,再把ES6AST转ES5AST,最后用ES5AST生成JS源码。生成AST有2个阶段:(1)分词(词法分析)将源代码分割成token。varmyName='认为不'。关键字var、标识符myName、赋值运算符=和字符串thinkornot都是标记。(2)解释(语法分析)根据语法规则将token转换成AST。AST生成过程:先分词再解释。有了AST,V8就可以成为这段代码的可执行上下文。生成字节码,有了AST和执行上下文,解释器Ignition会根据AST生成字节码并解释执行字节码。一开始V8直接将AST转为机器码,因为机器码执行效率高,但是占用内存,后来引入了字节码。字节码是介于AST和机器码之间的代码。字节码需要通过解释器转换成机器码才能执行。执行代码,第一次执行的字节码,解释器(Ignition)会一个一个解释执行。如果有代码被执行多次,编译器TurboFan会将这段代码编译成机器码,并保存编译后的机器码。再次执行这段代码时,只需要执行保存的机器码即可。执行效率提高,执行时间越长,重复执行的代码越多,编译后的机器码保存越多,不编译越快。叫做即时编译:字节码+解释器+编译器。varmyName='Segmentfault';functionfoo(){return23};myName='segmentfault';foo();编译后:
