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

JEP draft: Windows/gcc Port

Порт для Windows/gcc

АвторJulian Waters
ТипInfrastructure
ОбластьJDK
СтатусDraft
Выпускtbd
Компонентinfrastructure / build
Создан2022/06/13 05:44
Обновлён2025/04/24 05:51
Задача8288293

Аннотация

ВНИМАНИЕ: ЭТОТ JEP ПОКА ЯВЛЯЕТСЯ ЧЕРНОВИКОМ И НОСИТ СУГУБО ЭКСПЕРИМЕНТАЛЬНЫЙ ХАРАКТЕР

Портировать JDK на Windows/MSYS2 UCRT64 с компилятором gcc в качестве основного компилятора.

Цели

Поддержка компиляции JDK вне среды MSYS2 не является основной целью, но мы также надеемся, что автономные компиляторы gcc в других средах, например в Windows Subsystem for Linux 2 (WSL2), тоже смогут компилировать JDK для использования в своих средах, если компилятор gcc удовлетворяет всем перечисленным ниже требованиям.

Критерии успеха

JDK для Windows можно скомпилировать с помощью gcc без регрессий на других платформах и в стандартном JDK для Windows, да ещё и с высокой производительностью. Одна из целей этого JEP — минимально затронуть код JDK в целом.

Мотивация

MSYS2 — широко используемый дистрибутив программного обеспечения и среда разработки для Windows с множеством подсистем для дистрибутивов программ, скомпилированных и скомпонованных с самыми разными библиотеками времени выполнения. MINGW64, исходная подсистема, на которой основан этот проект, тоже доступна как подсистема, хотя этот JEP посвящён не ей. Многие программные проекты, которые в этой среде могли бы быть доступны в виде пакетов, сильно зависят от работающего JDK, а его нет ни в одной из подсистем MSYS2, потому что JDK нельзя скомпилировать доступным в MSYS2 компилятором с сохранением двоичной совместимости. Компиляция JDK для Windows с помощью gcc, основного компилятора среды MSYS2, сейчас не поддерживается. Учитывая широкое распространение MSYS2 и её подсистем, возможность компилировать JDK хотя бы для одной из них была бы полезна. Кроме того, gcc широко известен как оптимизирующий компилятор, который создаёт крайне производительный рабочий код, и это ещё один, второстепенный, довод в пользу порта.

Описание

Разные подсистемы среды MSYS2 на самом деле компонуются с очень разными вариантами библиотек времени выполнения Windows. Нужно решить, какие из них JDK будет принимать, поскольку поддержка некоторых старых и устаревших вариантов создаёт значительный риск для совместимости и требует усилий по сопровождению.

Порт Windows/UCRT64 будет поддерживать только вариант gcc и подсистему MSYS2, скомпонованные с ucrt, то есть напрямую компонуемые с библиотекой времени выполнения Windows ucrt. Поддержка других подсистем gcc или gcc, распространяемого вместе с Cygwin, рассматриваться никогда не будет, поскольку они компонуются либо со слоями эмуляции, либо с устаревшей библиотекой времени выполнения msvcrt. К таким неподдерживаемым подсистемам относятся MINGW32, MINGW64 и сама подсистема MSYS2. Поддержка clang, второго компилятора в MSYS2, который компонуется с ucrt, в рамки этого JEP не входит.

Порт будет поддерживать следующие подсистемы HotSpot:

  • шаблонный интерпретатор,
  • JIT-компилятор C1 (клиентский),
  • JIT-компилятор C2 (серверный) и
  • все сборщики мусора, которые сейчас есть в основной ветке, включая ZGC и Shenandoah.

Этот JEP посвящён необходимой работе по портированию, а также возможной интеграции порта в основной репозиторий JDK, поскольку на момент написания эта работа ещё остаётся экспериментальной.

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

Также внесены изменения в систему сборки JDK, чтобы при компиляции JDK для Windows она могла работать с компилятором, отличным от инструментария Microsoft. Чтобы сократить объём необходимых изменений в исходном коде, изменениям в системе сборки отдавалось предпочтение перед изменениями в исходном коде JDK.

Текущий diff между основной веткой JDK и портом UCRT64 можно получить так:

$ git clone https://github.com/TheShermanTanker/jdk compiler
$ cd jdk
$ git diff master..compiler

Кроме того, удобный для чтения diff доступен здесь.

Обратите внимание, что ветка находится не в самом аккуратном состоянии из-за постоянного перебазирования в один коммит, а также потому, что работа носит сугубо экспериментальный характер. Поэтому код порта не окончательный и может меняться. Работа над тем, чтобы сделать код порта чище и приемлемее, продолжается.

Помимо портирования JDK для компиляции с помощью gcc, мы также работаем над улучшением среды выполнения mingw-w64, чтобы она лучше поддерживала JDK, и отправляем улучшения в gcc, чтобы он лучше компилировал JDK под Windows.

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

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

Риски и допущения

Есть несколько проблем, связанных с совместимостью компиляторов gcc и Microsoft: в первом нет ряда важных возможностей второго, на которые опирается JDK. Один из таких примеров — поддержка Structured Exception Handling (структурированной обработки исключений), и мы надеемся вскоре решить эту проблему. Другая проблема в том, что набор изменений затрагивает много чужого кода и может мешать общему коду. Мы работаем над тем, чтобы как можно скорее это исправить.