我们了解了javascript的执行顺序以及常见的浏览器引擎之后,我们来了解一下什么是v8引擎以及v8引擎的执行原理是什么样的。
什么是v8引擎?
V8引擎是用c++编写谷歌开源的高性能Javascript和WebAssembly引擎。他用于Chrome和Node.js等。他实现了ECMAScript和WebAssembly,并在Windows 7或者更高版本,并且在苹果系统和Liunx系统上稳定运行。
当然V8引擎可以独立运行也可以嵌入到任何C++程序中去。
下面我们更详细的了解一下,v8引擎是如何工作的。
Javascript代码是如何运行的,V8引擎如何解析Javascript代码?
1.解析(parse)
代码首先被解析器处理,解析成抽象语法树(AST),这是代码执行的初步阶段,然后进一步通过该结构进一步加工成v8可以运行的格式。
2.AST
AST抽象语法树用于表示程序的结构,然后会进一步被解析成字节码。
3.Ignition
Ignition是v8的解释器,是他将AST进一步转换为字节码,字节码是低级的更抽象的机器码,他可以快速执行,但比直接的机器码慢。
4. 字节码(Bytecode)
字节码介于源代码和机器码之间,为后续的优化提供了更标准的形式,字节码由Ignition生成,可以直接解释运行,同时也是优化编辑器TurboFan的输入。
5. TurboFan
TurboFan是V8引擎的优化编辑器,他接受Ignition的字节码进行进一步优化。
比如一个函数如果多次被调用会标记为热点函数,然后就会经过TurboFan转化为优化的机器码,提高执行效率。
当然也有其他优化手法,例如消除死代码Dead Code Elimination等,达到优化代码执行效率的效果。
6. 机器码
字节码经过TurboFan之后,转换为机器码,就是直接可以在机器上运行的低级代码机器码。
这一步就是将Javascript代码转换为CPU可以直接执行的代码,大大提高了运行效率。
7. 运行时优化
在代码执行的情况中,V8引擎会持续监控代码的执行情况。
如果发现之前做的优化不再有效或者有更高效率的执行路径,就会出发去优化Deoptimization.
去优化指的就是将代码由优化后的机器码回滚到优化较少的字节码状态,然后重新编译适应新的运行状态。
最后大家如果有不理解的,请多观看下面这张图。

感谢大家观看。
评论(0)