Как Jack (набор компиляторов Java для Android) повлияет на разработчиков Scala

Теперь с объявлением Jack Google разъяснил обозримое будущее Java в отношении Android. Но каковы последствия для Scala и других разработчиков на основе JVM-языков. В частности:

  • Scala делает это магией из-за собственного компилятора, который создает байт-код Java. Но Jack toolchain не занимается байт-кодом. Будет ли генерируемый байт-код получить какие-либо преимущества оптимизации обработки Джека?
  • Начиная с Scala 12 поддерживается только Java 8+. То есть сгенерированный байт-код - это Java 8+. Может ли Джек использовать байт-код Java 8 (без ограничений или с ограничениями)?
  • Могут ли новые поддерживаемые функции Java 8 использоваться для разработки для более старых версий Android (minSdkVersion < 'N') или я должен поддерживать отдельную ветвь для каждой версии Java? (это не ясно из документации).

Все эти вопросы сводятся к одному: может ли Scala использоваться для разработки Android в будущем, не жертвуя преимуществами новых функций Scala и новой цепочки инструментов Android?

Связанное чтение:

поделитесь ссылкой в ​​комментариях или ответах

Похожие вопросы:

по теме:

Пожалуйста, проголосуйте за запрос функции инструмента Jack:


EDIT:

Я пытаюсь рассуждать (не отвечать) на мой вопрос, надеясь, что эксперты исправит меня, если я ошибаюсь.

Ниже приведен гипотетический поток Jack build с некоторыми дополнительными блоками, которые были добавлены на основе моей логики и того, что я узнал из доступных документов.

Базовое предположение заключается в том, что Dalvik поддерживает инструкции по байт-коду Java 7. Если это правильно, Java 8-инструкции не могут быть напрямую переданы Dalvik, их каким-то образом следует преобразовать в Java 7. (Может быть, что-то похожее на то, что компилятор Scala всегда делает).

Чем вопрос, где происходит это преобразование? Кажется, что Jill не может обрабатывать байт-код Java 8, так как это возможно в блоке (3) гипотетического потока. Если это правильно, то только файлы исходных проектов Java могут быть преобразованы, а ответ на 2-й вопрос - Нет. Классы Java 8 из библиотек не могут использоваться до тех пор, пока Джилл не сможет это сделать (если вообще возможно). То есть мы не можем использовать Scala 12 +.

Если вся оптимизация кода выполняется в блоке (6), чем ответ на 1-й вопрос - Да. Scala код, преобразованный в библиотеку .jar, может выиграть от оптимизации Джека. Но предварительно он должен быть преобразован в .jayce(AST-подобное представление), которое увеличит время сборки.

И, наконец, Джек выпускает байт-код .dex Dalvik для поддержания совместимости со старыми временами работы Dalvik (ART также использует байт-код Dalvik). Таким образом, ответ на 3-й вопрос: Да, могут использоваться функции Java 8. Но только в проектных Java-источниках. Приложение по-прежнему совместимо с любым временем выполнения. Но преимущества Java 8 снижаются из-за перехода на Java 7 (байт-код Dalvik).


введите описание изображения здесь

Ответ 1

Важно понять, что есть 2 tool:

  • Jack: новый компилятор для замены сложной javac + proguard + dx

  • Jill: библиотечный компоновщик, который сможет связать в настоящее время скомпилированные библиотеки (.class) и многое другое.
    См. http://tools.android.com/tech-docs/jackandjill

Итак, похоже, что здесь 2 отдельной проблемы:

  • Scala совместимость:
    Scala не будет поддерживаться Джеком, поскольку Джек компилирует исходный код Java.
    Однако Scala 2.11 компилируется в байт-код Java 1.6, и поэтому Jill сможет выбрать этот код и преобразовать в файлы-разъемы для компиляции Jack. См. Android N Java 8 (компилятор Jack) и Kotlin interop (Kotlin - та же проблема, что и Scala как язык JVM)

  • Java 8, и поэтому Scala 2.12+, совместимость:
    Эта часть находится в разработке, если Jack/Jill поддерживает Java 8, то она также будет поддерживать Scala 2.12+ (через Jill). Если нет, разработчики Java 8 находятся на той же лодке, что и разработчики Scala 2.12.
    В случае, когда Джек поддерживает Java 8, но не Jill, разработчики библиотек Java 8 будут в той же лодке, что и разработчики Scala 2.12.
    См. https://www.guardsquare.com/blog/DroidconLondon2015

Ответ 2

Джоан прав, но я думаю, что у Джилл будет поддержка Java 8 в какой-то момент, в противном случае будет невозможно использовать Java 8 в андроидных библиотеках, которые будут использоваться приложениями для Android, поскольку они упаковывают свой код в банку файлы внутри aar, и я не вижу, чтобы это изменение формата происходило в ближайшее время. В любом случае мы можем только догадываться, поскольку Google в настоящее время является черным ящиком в отношении тех видов изменений.

Ответ 3

Google только что объявил о том, что Jack toolchain будет обесценивать инструментальную цепочку Jack, и Android добавляет "поддержку функций языка Java 8 непосредственно в текущий набор инструментов javac и dx"

Источник: https://android-developers.googleblog.com/2017/03/future-of-java-8-language-feature.html

Мы знаем, насколько наше сообщество разработчиков Android заботится о хорошей поддержке функций языка Java 8, и мы меняем способ их поддержки.

и

Мы решили добавить поддержку языковых функций Java 8 непосредственно в текущий набор инструментов javac и dx и осудить инструментальную цепочку Jack.