改进Scala的JVM
对JVM进行哪些更改将最有利于Scala编译器和运行时?
dynamic语言在引入计划到达JVM 7的InvokeDynamic
字节代码的性能方面将会大大受益,而且Scala可能会受益于尾recursion(不确定是否会出现在JVM 8或更高版本中)。
还有什么其他的改变,Scala能够从JVM中受益? 这些变化是否在地平线上?
具体来说,是否有更改的JVM,将提高性能与闭包和函数作为对象?
基本上,约翰·罗斯一直在为之奋斗的一切:)
-
Fixnums – 消除装箱/拆箱原语的成本。
-
方法处理 – 将加速高阶函数,并允许JVM更有效地优化它们。 SAMtypes有时可能需要在单形态和超大型variables呼叫站点之间进行笨拙的翻转/放弃,以防止内联。
-
Continuations – 支持asynchronous/并发devise,按照node.js
-
接口注入 – 简化mixin的组合和angular色的实现,以及消除在许多情况下不需要生成一些中间类和使结构types成为可能的情况。
-
尾巴呼叫优化 – 应该是一个没有头绪的:)
物化经常被引用为有利于Scala模式匹配的东西,但是考虑到两种语言使用不同的方差scheme,这在互操作方面会花费很高的代价。 在这一点上,我认为物化实际上可能会造成更多的伤害。
我也认为期待任何会破坏Java向后兼容性的东西是不合理的。 这只是不会发生。
有一些Scala的function可以在JVM中更好地实现,例如:
-
generics可以在运行时访问。 目前,scalac将generics的types保存为隐藏字段(如果所讨论的类是案例类)。 这使generics在不必要的昂贵的情况下。
-
声明网站的变化。 Scala指定了定义站点的types参数的变化,而Java则在调用站点处这样做。 这是不太可能得到解决,因为它会打破所有现有的Java通用代码。
-
尾巴呼叫优化。 Scalac可以自己做一些尾部调用优化,但只能在最简单的(自recursion)情况下进行。 任何其他的尾部调用将像使用JVM一样使用堆栈空间。
-
删除空指针。 Scala已经可以使用Option [A]处理空引用,但是由于在JVM上,引用该选项本身可能是null,或者它的参数可能为null。 所以你不能像Haskell那样得到非null的保证。
编辑:添加声明网站差异列表。
值types将有助于元组和案例类的相当多的性能。 转义分析有助于减less对这些对象的堆分配,但是目前JVM不能内插一些方法调用,因此不能消除这些小的不可变对象的堆分配。 这导致堆垃圾和3-4倍的执行时间。
值types也有助于增加数据的局部性并减less内存使用量。 例如,在一个简单的数组[(Int,Int)]中,每个数组条目将有一个指针+对象头的开销。 使用值types,这个开销可以完全消除。
人们经常关注InvokeDynamic,即使MH提供的方法引用从不dynamic调用,也不会意识到MethodHandles框架有很多其他优点。
MethodHandles几乎就像一个“reflection做对”的performanceforms。
任何大量使用reflection的语言都可以从语言运行时中使用MethodHandles中获益。