JS引擎可以将JS代码编译为不同CPU(Intel、ARM以及MIPS等)对应的汇编代码
v8核心模块
Parser
负责将JavaScript源码转换成AST(Abstract Syntax Tree)
Ignition —> Interpreter
负责将AST转换成ByteCode,解释执行ByteCode
为什么要使用字节码?不直接转成机器码执行?
机器码所占内存远远大于字节码,使用字节码可以减少内存使用。
字节码介于AST与机器码之间。
TurboFan —> Compiler
编译器。将ByteCode转换成优化的机器码,下次无需转换ByteCode直接调用
Orinoco —> Garbage Collector
垃圾回收模块,回收不再需要的内存空间
图中的红线代表DeOptimization,Ignition收集的错误信息将不进行Optimization,DeOptimization成Bytecode执行
如果函数没有被调用,那么V8不会去编译它
Just-in-time complication (JIT)
TurboFan所做的也不只是根据类型信息来简化代码执行流程,它还会进行其他优化,比如减少冗余代码等更复杂的事情
强大的垃圾回收功能也是v8提高性能的关键之一。在避免js执行的情况下,同时回收内存空间,提高内存利用效率