V8 javascript引擎的演化

V8引擎大致的工作流程

image.png

V8中涉及优化流程的演化图

  • 最初的样子,相对于其他的js引擎(主要就是指的javascriptCore啦)解析AST,生成机器码,然后优化,妥妥的compiler 课程教出来的非常一致。 相比于jsCore来说,还是有了很大的进度,直接生成机器码,妥妥的效率提升呐。
2008 pipline

时间长了 发现有哪儿不对劲,Codegen 完全生成机器码,会导致初始化启动一个js的时候变慢,这个效率特别的需要提升。这个时候V8的早期的第一个大杀器出场了,Crankshaft。 主要作用就是V8自己的profile筛选出热点代码,交给Crankshaft来优化这段机器码。


2010pipline

所以,你细细品,首先需要Full-Codegen这个过程会比较漫长,所以启动自然就慢。其次Crankshaft本身对于try catch finnaly这些优化做的并不好。所以这期间做了一系列的优化改进。。。
然后就有下面这个方式。

2016pipline

不同的目标平台有不同的生成方式,部分沿用原来的Full-codegen 然后Crankshaft方式。还有部分,Ignition,生成字节码,然后交给Turbofan来优化并且生成机器码。

WTF(此处不做过多解释),这个图就够乱的了,还增加了Ignition & Turbofan,这又是个什么玩意呢?关键是怎么又开始有了jsCore的老路了,还要通过Ignition生成字节码? Why??

关键还是效率、效率、效率,重要的事情说三遍。 V8干的事情就是 效率。
Full-codegen方式直接生成机器码,执行效率提升了不少,不过消耗内存实在是有点大,这个内存消耗多了,其他地方可用的内存自然就少了。尤其是移动设备上,内存有限啊,一个应开启之后,这活就消耗一大半的内存也是不行滴。 所以,就用到Iginition这样的大杀器,用它来生成字节码,生成字节码的话,效率就提升一大截了。这样生成字节码给后续提供了结构更为清晰更好维护的baseline。
So,

  • 提升基线(baseline)的性能
  • 让性能可预测
  • 减少页面加载时间
  • 减少内存使用
  • 减少复杂性

过渡时期的结构总是显得有点杂乱无章,当然,然后,然后就干净多了,下面这个图基本就是现在的了。

2017piline

前面的js代码机械生成AST作为编译前端部分,这个和大部分的词法分析 语法分析比较一致。暂时不做进一步探讨。在编译后端的部分中,其中两个步骤比较关键 Ignition 将AST转为字节码,turboFan将字节码优化并转为机器码来执行,并且从之前的baseline 到直接的Interpreted。 待续。

你可能感兴趣的:(V8 javascript引擎的演化)