JavaScriptCore引擎是WebKit中默认的JavaScript引擎,也是苹果开源的一个项目,应用较为广泛。最初,性能不是很好,从2008年开始了一系列的优化,重新实现了编译器和字节码解释器,使得引擎的性能有较大的提升。随后内嵌缓存、基于正则表达式的JIT、简单的JIT及字节码解释器等技术引入进来,JavaScriptCore引擎也在不断的迭代和发展。
V8引擎自诞生之日起就以性能优化作为目标,引入了众多新技术,极大了带动了整个业界JavaScript引擎性能的快速发展。总的来说,V8引擎较为激进,青睐可以提高性能的新技术,而JavaScriptCore引擎较为稳健,渐进式的改变着自己的性能。总的来说JavaScript引擎工作流程(包含v8和JavaScriptCore)如下所示:
JavaScriptCore 的大致流程为:源代码-→抽象语法树-→字节码-→JIT-→本地代码。JavaScriptCore与V8有一些不同之处,其中最大的不同就是新增了字节码的中间表示,并加入了多层JIT编译器(如:简单JIT编译器、DFG JIT编译器、LLVM等)优化性能,不停的对本地代码进行优化。(在 V8 的 5.9 版本中,新增了一个 Ignition 字节码解释器,TurboFan 和 Ignition 结合起来共同完成JavaScript的编译,此后 V8 将与 JavaScriptCore 有大致相同的流程,Node 8.0中 V8 版本为 5.8)
还有就是在数据表示方面,V8在不同的机器上使用与机器位数相匹配的数据表示,而在JavaScriptCore中句柄都是使用64位表示,其可以表示更大范围的数字,所以即使在32位机器上,浮点类型同样可以保存在句柄中,不再需要访问堆中的数据,当也会占用更多的空间。
v8曾经有两个编译器(v5.9之前)
full-codegen — 一个简单且速度非常快的编译器,可以生成简单且相对较慢的机器码
Crankshaft — 一个更复杂的(Just-In-Time)优化编译器,生成高度优化的代码
5.9以后如下的方式:
新的管道是由解释器(Ignition)和编译器(TurboFan)组成
Ignition设计之初是为了减少移动设备的内存占用。以前通过Full-codegen基准编译器生成的代码几乎要占用Chrome浏览器三分之一的堆内存。这样为应用的实际数据留下的内存空间就很少。当在限制RAM的Android设备上启用Chrome M53的Ignition时,未优化的基准Javascript代码在ARM64的移动设备上的内存占用下降了九倍。
TurboFan在2013发起初只是为了弥补Crankshaft仅仅可以优化Javascript一部分语言的短板。例如,它并没有通过结构化的异常处理来设计代码,即代码块不能通过try、catch、finally等关键字划分。另外由于为每一个新的特性Crankshaft都将要做九套不同的框架代码适应不同的平台,因此在适配新的Javascript语言特性也很困难。
TurboFan在起初设计的时不仅是为了适配ES5标准的特性,同时也是为了优化ES2015及以后的规范的新语言特性。在TurboFan通过清楚区分高质量和低质量优化编译的分层编译器,实现在不修改架构代码的情况下优化新的语言特性。同时由于在TurboFan增加明确的指令选择编译阶段,可以为每个支持的平台编写少得多的体系结构代码。在这个新的阶段中,体系结构代码只需要编写一次,而且很少需要更改。这些变化为V8提供了更容易维护和可扩展的特性。
chrome55内核V8的步骤:源代码》抽象语法树》JIT》本地代码
联系客服