根据Scala 2.10,与1.6版本的默认值相比,JVM 1.7发出字节码有什么优势(如果有的话)?
答案 0 :(得分:35)
以前的Scala版本发布了49.0版本的字节代码,对应于Java 5.使用Scala 2.10版本the default was changed to version 50.0,对应于Java 6,其主要优点是激活该版本引入的更快的验证器,所以它应该导致(稍微)更好的运行时性能。
正如您所说,使用2.10可以发出版本51.0字节的代码,这对应于Java 7.版本50.0和版本51.0之间存在一些差异:最大的是包含invokedynamic
指令,随着它的管道(见the class file format definition的血腥细节)。
就Scala对51.0字节代码的使用情况而言,即使技术部分已经到位,我仍然理解使用此功能的工作仍处于试验阶段。请参阅this EPFL presentation和this thread,其中显示团队正在努力获得方法句柄的性能优势,而不必引入对Java 7的依赖。
Scala 2.11维护了发布版本50.0字节码的默认值,但official plan现在用Scala 2.12直接跳转到Java 8字节码。在此期间,Scala 2.11可以使用new back-end,它可以让你试用为Scala 2.12原型的some of the features,它将成为Scala 2.12的默认后端。
无论如何,期待已久的建议好处都来自于使用invokedynamic
字节码(及其相关的MethodHandle结构)。它们包括:
(Spoiler:使用MethodHandles
在实验后端实现闭包目前比当前优化闭包创建的速度慢!)