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 (структурированной обработки исключений), и мы надеемся вскоре решить эту проблему. Другая проблема в том, что набор изменений затрагивает много чужого кода и может мешать общему коду. Мы работаем над тем, чтобы как можно скорее это исправить.