Java 9 уже здесь: все, что вам нужно знать

Java 9 - формально Java Platform Standard Edition версии 9 - наконец-то здесь, и ее Java Development Kit (JDK) доступен для загрузки разработчиками.

В нем есть несколько важных, но спорных новых функций, но он также является последним в линейке старого стиля доставки Java.

Где скачать Java 9 JDK

Oracle опубликовала Java SE 9 JDK и документацию для загрузки разработчиками.

Ключевые новые функции в Java 9

Дебютировав почти через три года после Java SE 8, Java SE 9 имеет несколько ключевых архитектурных изменений, а также множество улучшений.

Модульность Java 9 меняет правила игры

Новые противоречивые возможности модульности, основанные на Project Jigsaw, наверняка вызовут интерес у передовых Java-магазинов, которые хотят увидеть, что JDK 9 может предложить сейчас, даже если более консервативные магазины решат дождаться, пока модульность созреет.

Модульность - в форме системы модулей платформы Java - делит JDK на набор модулей для объединения во время выполнения, компиляции или сборки. Модульность получила название «переходного» изменения, позволяющего понять зависимости между модулями.

Модульность Java 9 призвана упростить разработчикам сборку и поддержку сложных приложений. Кроме того, это должно улучшить возможность масштабирования Java до устройств меньшего размера, в то же время повышая безопасность и производительность.

Аспекты модульности Java 9 включают упаковку приложений, разбиение на модули самого JDK и реорганизацию исходного кода в модули. Система сборки расширена для компиляции модулей и обеспечения соблюдения границ модуля во время сборки. Образы JDK и Java Runtime Environment (JRE) реструктурированы для обработки модулей. Кроме того, элементы управления пользовательского интерфейса JavaFX и API-интерфейсы CSS теперь доступны для модульности.

Поддерживается множество конфигураций; в результате должны быть улучшены масштабируемость, безопасность и производительность приложений. Более легкое масштабирование Java до небольших устройств - ключевой фактор модульной работы.

Благодаря модульности разработчики смогут лучше создавать и поддерживать библиотеки и большие приложения как для Java SE (Standard Edition), так и для Java EE (Enterprise Edition). Но во время разработки Java 9 у Oracle, IBM, Red Hat и других были большие разногласия по поводу того, как именно произвести такие радикальные изменения в платформе. Сама модульная система была отклонена в мае и одобрена вторым голосованием в июне после того, как был достигнут прогресс.

Даже при наличии согласия между основными поставщиками Java, остается спор о том, принесет ли модульность Java-разработчикам много пользы: одни эксперты говорят «да», а другие - нет. Тем не менее, Java 9 теперь разбита на модули.

Чтобы упростить переход на модульную Java 9, Java 9 допускает незаконный доступ с отражением для кода на пути к классам, который используется JRE для поиска классов и файлов ресурсов. Эта возможность будет запрещена после выхода Java 9.

Улучшения компилятора для кода Java 9

Обновление Java 9 включает несколько новых возможностей для компиляции кода, главная из которых - предварительная компиляция (AoT). Эта возможность все еще находится на экспериментальной стадии и позволяет компилировать классы Java в машинный код перед запуском на виртуальной машине. Эта функция предназначена для сокращения времени запуска как малых, так и больших приложений с ограниченным влиянием на пиковую производительность.

Компиляторы JIT работают быстро, но программы Java стали настолько большими, что для полного разогрева JIT требуется много времени, в результате чего некоторые методы Java остаются некомпилированными и снижается производительность. Опережающая компиляция предназначена для решения этих проблем.

Но Дмитрий Лесков, директор по маркетингу компании Excelsior, поставщика технологий Java, обеспокоен тем, что опережающая технология компиляции еще недостаточно развита, и хотел бы, чтобы Oracle дождалась более надежной версии Java 10.

Java 9 также предлагает второй этап развертывания интеллектуальной компиляции Oracle. Эта функция включает повышение  s javac стабильности и переносимости инструмента, чтобы его можно было использовать в JVM (виртуальной машине Java) по умолчанию. Инструмент также будет обобщен, чтобы его можно было использовать для больших проектов за пределами JDK. JDK 9 также обновил  javac компилятор, чтобы он мог компилировать программы Java 9 для работы в некоторых более старых версиях Java.

Еще одна новая, но экспериментальная функция компиляции - это интерфейс компилятора JVM уровня Java (JVMCI). Этот интерфейс позволяет компилятору, написанному на Java, использоваться JVM в качестве динамического компилятора. API JVMCI предоставляет механизмы для доступа к структурам виртуальных машин, установки скомпилированного кода и подключения к системе компиляции JVM.

Написание компилятора JVM на Java должно позволить создать высококачественный компилятор, который легче поддерживать и улучшать, чем существующие компиляторы, написанные на C или C ++. В результате компиляторы, написанные на самой Java, должны быть проще в обслуживании и улучшении. К другим существующим усилиям по включению компиляторов в Java относятся Graal Project и Project Metropolis.

Новая возможность управления компилятором предназначена для обеспечения детального и контекстно-зависимого управления компиляторами JVM, позволяя разработчикам изменять параметры управления компилятором во время выполнения без снижения производительности. Инструмент также позволяет обходные пути для ошибок компилятора JVM.

REPL наконец-то появился в Java 9

В Java 9 есть инструмент цикла чтения-оценки-печати (REPL) - еще одна долгосрочная цель Java, которая становится реальной в этой версии после многих лет разработки в рамках Project Kulia.

REPL Java 9, называемый jShell, интерактивно оценивает декларативные операторы и выражения. Разработчики могут получить отзывы о программах перед компиляцией, просто введя несколько строк кода.

Возможности инструмента командной строки включают завершение табуляции и автоматическое добавление необходимых точек с запятой в терминале. API jShell позволяет использовать функции jShell в IDE и других инструментах, хотя сам инструмент не является IDE.

Отсутствие REPL было названо причиной отказа школ от Java. (Такие языки, как Python и Scala, уже давно имеют REPL.) Но основатель языка Scala Мартин Одерски сомневается в полезности REPL в Java, говоря, что Java ориентирована на операторы, тогда как REPL ориентированы на выражения.

Улучшения Streams API в Java 9

Потоки в Java позволяют разработчикам выражать вычисления, чтобы можно было эффективно использовать параллелизм данных. Возможности Stream в Java 8 предназначены для декларативной обработки данных с использованием многоядерных архитектур.

В Java 9 Streams API добавляет методы для условного приема и удаления элементов из Stream, перебора элементов Stream и создания потока из значения, допускающего значение NULL, при этом расширяется набор API Java SE, которые могут служить источниками Streams.

Кеш кода можно разделить в Java 9

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

Лучшая поддержка JavaScript в Java 9 через Project Nashorn

Project Nashorn, который обеспечивает облегченную среду выполнения JavaScript для Java, улучшается в JDK 9. Проект Nashorn был попыткой реализовать высокопроизводительную, но облегченную среду выполнения JavaScript на Java, продолжая проект Rhino, начатый в Netscape. Проект Nashorn отвечал за встраивание JavaScript в приложения Java. Он предоставил Java с движком JavaScript в JDK 8.

JDK 9 включает API синтаксического анализатора для синтаксического дерева ECMAScript Нэшорна. API позволяет анализировать код ECMAScript с помощью IDE и серверных фреймворков независимо от внутренних классов реализации Project Nashorn.

Клиентский API HTTP / 2 приходит в Java 9

Бета-версия клиентского API HTTP / 2 появилась в JDK 9, реализовав в Java обновление основного веб-протокола HTTP. WebSocket также поддерживается API.

HTTP / 2 API может заменить HttpURLConnection API, у которого были проблемы, в том числе он был разработан с использованием ныне несуществующих протоколов, предшествовал HTTP / 1, был слишком абстрактным и сложным в использовании.

Улучшенная поддержка HTML5 и Unicode в Java 9.

В JDK 9 инструмент документации Javadoc усовершенствован для создания разметки HTML5. Также поддерживается стандарт кодировки Unicode 8.0, который добавляет 8000 символов, 10 блоков и шесть скриптов.

В Java 9 добавлен API безопасности DTLS

В целях безопасности Java 9 добавляет API для DTLS (безопасность транспортного уровня дейтаграмм). Протокол был разработан для предотвращения подслушивания, взлома и подделки сообщений при обмене данными между клиентом и сервером. Предусмотрена реализация как для клиентского, так и для серверного режимов.

Что Java 9 осуждает и удаляет

Java 9 осуждает или удаляет некоторые функции, которые больше не являются модными. Главный из них - API апплета, который устарел. Это вышло из моды сейчас, когда производители браузеров, заботящиеся о безопасности, отказываются от поддержки подключаемых модулей браузера Java. Появление HTML5 также способствовало их кончине. Теперь разработчики могут выбрать альтернативы, такие как Java Web Start, для запуска приложений из браузера или устанавливаемые приложения. 

Инструмент appletviewer также устарел.

В Java 9 также не рекомендуется использовать сборщик мусора Concurrent Mark Sweep (CMS), поддержка которого будет прекращена в будущем выпуске. Цель состоит в том, чтобы ускорить разработку других сборщиков мусора на виртуальной машине HotSpot. Сборщик мусора G1 с малой паузой предназначен для долгосрочной замены CMS.

Между тем комбинации сборки мусора, ранее не рекомендованные в JDK 8, удалены в JDK 9. К ним относятся редко используемые комбинации, такие как Incremental CMS, ParNew + SerialOld и DefNew + CMS, которые добавили дополнительную сложность к базе кода сборщика мусора.

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

В Java 9 также удалена возможность выбора JRE во время запуска с помощью функции Multiple JRE (mJRE). Эта возможность использовалась редко, усложняла реализацию средства запуска Java и никогда не была полностью документирована, когда она дебютировала в JDK 5.

Oracle удалила агент JVM TI (Tool Interface) hprof (Heap Profiling), который был заменен в JVM. Инструмент jhat также был удален, поскольку он был устаревшим из-за улучшенных визуализаторов и анализаторов кучи.

Java 9 - это конец его линии, поскольку начинается новая линия Java 9

Можно сказать, что Java 9 выходит на ура со всеми новыми возможностями. Oracle недавно сообщила, что Java 9 - последняя в своем роде с точки зрения назначения и времени, прошедшего между основными выпусками.

С этого момента планируется, что выпуск Java будет длиться шесть месяцев, а следующая основная версия будет называться Java 18.3 в марте 2018 года, а через шесть месяцев появится Java 18.9.

Новая периодичность выпуска Java также означает, что JDK 9 не будет обозначаться как выпуск с долгосрочной поддержкой. Вместо этого следующей долгосрочной версией будет Java 18.9.

Более быстрая последовательность выпуска Java означает, что разработчикам не придется так долго ждать основных выпусков. Это также может означать, что разработчики пропустят Java 9 и ее «незрелые» функции модульности и будут ждать шесть месяцев для новой версии, что, вероятно, сгладит любые «перегибы», - сказал Саймон Мейпл, директор по защите интересов Java в компании ZeroTurnaround, разработчике инструментов Java.