33

Scala 2.10によると、1.6のデフォルトの発行と比較した場合、JVM 1.7のバイトコードを発行することの利点(ある場合)は何ですか?

4

1 に答える 1

35

以前のScalaバージョンは、Java 5に対応するバージョン49.0のバイトコードを発行しました。Scala2.10バージョンでは、デフォルトがバージョン50.0に変更され、Java 6に対応し、そのバージョンで導入されたより高速なベリファイアをアクティブ化するという主な利点があります。実行時のパフォーマンスが(わずかに)向上するはずです。

お気づきのとおり、2.10では、Java 7に対応するバージョン51.0バイトコードを出力できるようになりました。バージョン50.0とバージョン51.0の間にはいくつかの違いがあります。最大のものは、invokedynamic命令が含まれていることと、それに伴う配管が含まれていることです。 (詳細については、クラスファイル形式の定義を参照してください)。

Scalaでの51.0バイトコードの使用に関する限り、技術的な部分は整っていても、この機能を使用する作業はまだ実験段階にあると私は理解しています。このEPFLプレゼンテーションと、チームがJava7への依存関係を導入することなくメソッドハンドルのパフォーマンス上の利点を得ることに取り組んでいることを示すこのスレッドを参照してください。

Scala 2.11は、バージョン50.0バイトコードを発行するデフォルトを維持していましたが、公式の計画では、Scala2.12を使用してJava8バイトコードに直接ジャンプする予定です。それまでの間、Scala 2.11で利用可能な新しいバックエンドがあり、Scala 2.12でプロトタイプ化されている機能の一部を試すことができ、 Scala2.12でデフォルトのバックエンドになります。

とにかく、待望の提案された利点はすべて、invokedynamicバイトコード(およびそれに関連するMethodHandle構造)を使用することから得られます。それらが含まれます:

(ネタバレ:MethodHandles実験的なバックエンドでクロージャを実装するために使用することは、現在の最適化されたクロージャの作成よりも現在遅いです!)

于 2013-01-15T17:55:21.900 に答える