33

根据 Scala 2.10,与默认为 1.6 发出字节码相比,为 JVM 1.7 发出字节码有哪些优势(如果有)?

4

1 回答 1

35

以前的 Scala 版本发出 49.0 版本的字节码,对应于 Java 5。在 Scala 2.10 版本中,默认值更改为 50.0 版本,对应于 Java 6,它的主要优点是激活该版本引入的更快的验证器,所以它应该会导致(稍微)更好的运行时性能。

正如您所注意到的,使用 2.10 可以发出版本 51.0 字节码,它对应于 Java 7。版本 50.0 和版本 51.0 之间存在一些差异:最大的是包含invokedynamic指令,以及随之而来的管道(有关血腥细节,请参阅类文件格式定义)。

就 Scala 对 51.0 字节码的使用而言,尽管技术部分已经到位,但我的理解是,使用此功能的工作仍处于实验阶段。请参阅此 EPFL 演示文稿此线程,这表明团队正在努力获得方法句柄的性能优势,而不必引入对 Java 7 的依赖。

Scala 2.11 保留了发出版本 50.0 字节码的默认设置,但现在官方计划使用 Scala 2.12 直接跳转到 Java 8 字节码。与此同时,Scala 2.11 提供了一个新的后端,可让您试用一些为 Scala 2.12 设计的原型功能,这些功能将成为 Scala 2.12 的默认后端。

无论如何,期待已久的提议的好处都来自使用invokedynamic字节码(及其相关的 MethodHandle 结构)。它们包括:

(剧透:MethodHandles用于在实验后端实现闭包目前比目前优化的闭包创建慢!

于 2013-01-15T17:55:21.900 回答