根据 Scala 2.10,与默认为 1.6 发出字节码相比,为 JVM 1.7 发出字节码有哪些优势(如果有)?
1 回答
以前的 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
用于在实验后端实现闭包目前比目前优化的闭包创建慢!)