openjdk.ruOpenJDK на русском

JEP 199: Smart Java Compilation, Phase Two

интеллектуальная компиляция Java, второй этап

ОтветственныйAndreas Lundblad
ТипFeature
ОбластьJDK
СтатусClosed / Delivered
Выпуск9
Компонентtools / javac
Обсуждениеcompiler dash dev at openjdk dot java dot net
ТрудоёмкостьL
ДлительностьL
РецензентыBrian Goetz
ОдобренBrian Goetz
Создан2014/05/16 11:43
Обновлён2016/07/12 22:08
Задача8043311

Аннотация

Доработать инструмент sjavac так, чтобы его можно было использовать по умолчанию при сборке JDK, и обобщить его так, чтобы с его помощью можно было собирать и другие крупные проекты, помимо JDK.

Цели

Из-за ряда проблем со стабильностью и переносимостью sjavac по умолчанию не используется в сценариях сборки JDK. Первая цель этого JEP — устранить эти проблемы. Для этого нужно добиться, чтобы инструмент всегда давал надёжные результаты на всех программных и аппаратных конфигурациях.

Общая цель — повысить качество sjavac до уровня, на котором он сможет служить универсальной обёрткой над javac, способной компилировать крупные произвольные Java-проекты.

В рамках последующего проекта будет изучено, как и нужно ли вообще включать sjavac в набор инструментов JDK. Это может быть отдельный поддерживаемый самостоятельный инструмент, неподдерживаемый самостоятельный инструмент, интеграция с javac или что-то иное.

Что не является целью

Целью этого JEP не является добавление новых возможностей, которых сейчас нет, которые не требуются нашим собственным сценариям сборки и не способствуют созданию универсальной обёртки над javac. Переписывать обёртку заново не предполагается. Текущая функциональность, которая хорошо работает, будет сохранена без изменений.

Включение sjavac в продукт, если это будет сочтено нужным, станет предметом отдельного JEP.

Мотивация

Текущая реализация оказалась полезной и действительно ускоряет сборку и позволяет выполнять инкрементные сборки. Однако качество кода и стабильность инструмента в целом неудовлетворительны, и он определённо не готов к публичному выпуску.

Описание

Эта работа опирается на ранее поставленную реализацию, описанную в JEP 139. Работа, описанная в этом JEP, будет выполняться постепенно: инкрементные исправления к существующей реализации будут писаться, тестироваться и фиксироваться в репозитории.

Сначала работа будет сосредоточена на устранении проблем, связанных со сборкой JDK. В том числе нужно решить следующие задачи:

  • JDK-8014510 Исправить sjavac на всех платформах в JPRT
  • JDK-8019239 Как следует привести в порядок эвристики sjavac

Кроме того, будут решены следующие задачи:

  • Переработать протокол, возможно, с использованием RMI
  • Сделать имена и синтаксис параметров более согласованными с параметрами javac
  • Заменить журналирование в System.{out,err} более подходящим механизмом
  • Повысить степень параллелизма за счёт более широкого совместного использования ресурсов в javac, где это возможно

Задачи, которые предстоит решить в дальнейшем, включают, помимо прочего:

  • Интернационализацию
  • Поддержку Jigsaw

Потребуется определённым образом адаптировать javac. Прежде всего, javac придётся переработать так, чтобы несколько одновременных компиляций могли совместно использовать общие структуры данных; это позволит сильнее ускорить работу и лучше загрузить процессор на многоядерных машинах.

Тестирование

Помимо обычных обязательных модульных тестов, sjavac будет тщательно протестирован на всех платформах, поскольку часть инструмента связана с особенностями конкретных платформ, например с путями к файлам и запуском фоновых процессов.

Кроме того, sjavac будет подвергнут нагрузочному тестированию с учётом конкурентности, поскольку клиент-серверная архитектура по своей природе параллельна.

Зависимости

Работа, предлагаемая в этом JEP, опирается на результаты JEP 139: Enhance javac to Improve Build Speed.