Подтвердить что ты не робот

Преимущества Scala испускания байт-кода для JVM 1.7

Согласно Scala 2.10, каковы преимущества (если таковые имеются) испускания байт-кода для JVM 1.7 по сравнению со значением по умолчанию для испускания для 1.6?

4b9b3361

Ответ 1

Предыдущая версия Scala, выпущенная версия 49.0 байтового кода, соответствующая Java 5. С Scala 2.10 version значение по умолчанию было изменено на версию 50.0, соответствует Java 6 и имеет главное преимущество активации более быстрого верификатора, введенного с этой версией, поэтому это должно привести к (немного) улучшению производительности во время выполнения.

Как вы заметили, с 2.10 стало возможным испускать код версии 51.0 байт, что соответствует Java 7. Есть несколько отличий между версией 50.0 и версией 51.0: самым большим является включение инструкции invokedynamic, с связанная с ним (см. определение формата файла класса для деталей gory).

Что касается использования Scala использования кода в 51,0 байт, хотя технические части на месте, я понимаю, что работа все еще находится на экспериментальной стадии использования этой функции. См. эту презентацию EPFL и этот поток, который показывает, что команда работает над получением преимуществ производительности обработчиков методов без необходимости вводить зависимость от Java 7.

Scala 2.11 поддерживал по умолчанию байт-код с выпуском версии 50.0, но официальный план теперь должен перейти прямо к байт-коду Java 8 с помощью Scala 2.12. Тем временем, существует новый back-end для Scala 2.11, который позволит вам попробовать некоторые из функции, которые прототипируются для Scala 2.12, и которые станут исходными по умолчанию с Scala 2.12.

В любом случае долгожданные предлагаемые преимущества исходят из использования байт-кода invokedynamic (и связанных с ним структур MethodHandle). К ним относятся:

(Спойлер: использование MethodHandles для реализации замыканий в экспериментальном бэкэнде в настоящее время медленнее, чем настоящее оптимизированное создание замыкания!)