近日,JRuby 专家 Charles Oliver Nutter 开始参与 Rhino 项目(JavaScript 的 Java 实现)以提升 Rhino JavaScript 运行时的速度,进而实现与 V8 的竞争。虽然 Rhino 拥有可靠的实现,但在性能上却无法与其他的 JavaScript 运行时相提并论。Nutter 认为 Rhino 可以通过 Invokedynamic 与其他优化手段扭转颓势。这可以使 Rhino 达到与 V8 相同的水准,至少也能与 V8 展开竞争。
InfoQ 有幸采访到了 Nutter 以了解他与 Rhino 团队现在正在从事的工作。Nutter 打算使用 JVM 的 Invokedynamic 将 Rhino 的派发机制直接连接到 JVM 的优化编译器上。总的来说,这么做可以降低或消除调用期方法查找、参数装箱的代价,并且可以通过内联与优化实现JavaScript 对JavaScript 以及JavaScript 对Java 的调用。Nutter 说到使用invokedynamic 的另一个好处在于如果使用了Java 6,那么Rhino 的调用逻辑会变得更简单。
InfoQ 又向 Nutter 问到,随着 JavaScript 变得越来越重要,让 JVM 拥有更快的 JavaScript 实现是不是变得很重要了。Nutter 回答到:
我个人认为对 JavaScript 的大肆宣传有些过分了。对于浏览器来说它是一门优秀的语言,但主要原因是所有浏览器都支持它,而并不是说这门语言要比其他语言更好。 在服务器端,它变得流行的原因在于现在的运行时很不错,现有的面向客户端的众多库也适用于服务器端。
然而,考虑到最近 JavaScript 在端到端应用的日渐流行,那么再来一个 JVM 版也是自然而然的事情了。但尴尬的是最快的托管运行时——JVM——运行 JavaScript 的速度却无法与当前的竞争者相抗衡。我觉得是时候改变了。
最后,我们问 Nutter 从实现的角度来看,Rhino 与 JRuby 相比如何。Nutter 回答到:
Rhino 在很多方面都是更简单的一个目标,因为它并不具备 Ruby 的一些特性。然而,它代表了一种有趣的挑战,因为其基于原型的对象模型无法存储方法表缓存,而 Ruby 则可以做到。V8 所用的技术与 John Rose 的“DavinciMonkey”(基于 invokedynamic 的 Rhino 的一个早期尝试)——如将生成的合成类作为原型已经进行了修改——它可以更容易地处理 Rhino 不固定的类型结构。
Chrome 所用的 V8 JavaScrip 引擎与 Rhino 之间存在巨大的性能上的鸿沟。Nutter 说诸如 invokedynamic 等 JVM 特性可以填平这个鸿沟,但 Rhino 需要不断改进自身的性能才行。虽然 Rhino 是个不错的实现,但我们还可以使用其他一些技术来提升速度,可以使用新的 JVM 特性如 invokedynamic,也可以不使用。
现在说 Rhino 到底能不能与那些专门针对 JavaScript 的 VM 抗衡还为时过早,但毫无疑问,Rhino 的速度将会得到极大的提升。
评论