Java 9 jest tutaj: wszystko, co musisz wiedzieć

Java 9 - formalnie Java Platform Standard Edition w wersji 9 - jest wreszcie dostępna, a jej zestaw Java Development Kit (JDK) jest dostępny dla programistów do pobrania.

Ma kilka ważnych, choć kontrowersyjnych nowych funkcji, ale jest też ostatnią z linii starego stylu dostarczania Java.

Skąd pobrać Java 9 JDK

Firma Oracle opublikowała pakiet Java SE 9 JDK i dokumentację do pobrania przez programistów.

Najważniejsze nowe funkcje Java 9

Debiutująca prawie trzy lata po Java SE 8, Java SE 9 zawiera kilka kluczowych zmian architektonicznych, a także szereg ulepszeń.

Modułowość Java 9 zmienia zasady gry

Nowe, kontrowersyjne możliwości modułowości, oparte na Project Jigsaw, z pewnością wzbudzą zainteresowanie najnowocześniejszych sklepów Java, które chcą zobaczyć, co ma do zaoferowania JDK 9, nawet jeśli bardziej konserwatywne sklepy zdecydują się poczekać na dojrzałość modułowości.

Modułowość - w postaci Java Platform Module System - dzieli JDK na zestaw modułów do łączenia podczas uruchamiania, kompilacji lub kompilacji. Modularność została nazwana zmianą „przechodnią”, umożliwiającą zrozumienie zależności między modułami.

Modułowość Java 9 ma umożliwić programistom łatwiejszy montaż i obsługę wyrafinowanych aplikacji. Powinno to również sprawić, że Java będzie mogła lepiej skalować się w dół do mniejszych urządzeń, jednocześnie poprawiając bezpieczeństwo i wydajność.

Aspekty modułowości Java 9 obejmują tworzenie pakietów aplikacji, modularyzację samego JDK i reorganizację kodu źródłowego w moduły. System kompilacji został ulepszony, aby kompilować moduły i wymuszać granice modułów w czasie kompilacji. Obrazy JDK i Java Runtime Environment (JRE) zostały przebudowane w celu obsługi modułów. Ponadto elementy sterujące interfejsu użytkownika JavaFX i interfejsy API CSS są teraz dostępne w celu zapewnienia modułowości.

Obsługiwanych jest wiele konfiguracji; w rezultacie należy poprawić skalowalność, bezpieczeństwo i wydajność aplikacji. Łatwiejsze skalowanie Java do małych urządzeń jest kluczowym czynnikiem wpływającym na modułowość.

Dzięki modułowości programiści będą mogli lepiej konstruować i utrzymywać biblioteki i duże aplikacje zarówno dla Java SE (Standard Edition), jak i Java EE (Enterprise Edition). Ale podczas rozwoju Java 9 Oracle, IBM, Red Hat i inni mieli duże spory co do tego, jak dokładnie dokonać tak radykalnej zmiany w platformie. Sam system modułowy został odrzucony w maju i po osiągnięciu postępów został zatwierdzony w drugim głosowaniu w czerwcu.

Nawet przy porozumieniu między głównymi dostawcami oprogramowania Java, nadal istnieją kontrowersje co do tego, czy modułowość przyniesie programistom Java wiele dobrego. Niektórzy eksperci mówią tak, a inni nie. Niezależnie od tego Java 9 jest teraz zmodularyzowana.

Aby ułatwić migrację do zmodularyzowanej wersji Java 9, Java 9 umożliwia nielegalny, refleksyjny dostęp do kodu na ścieżce klas, używanej przez środowisko JRE do wyszukiwania klas i plików zasobów. Ta funkcja będzie niedostępna po wersji Java 9.

Ulepszenia kompilatora dla kodu Java 9

Aktualizacja Java 9 zawiera kilka nowych możliwości kompilowania kodu, z których najważniejszą jest kompilacja z wyprzedzeniem (AoT). Ta funkcja, znajdująca się jeszcze w fazie eksperymentalnej, umożliwia kompilację klas Java do kodu natywnego przed uruchomieniem na maszynie wirtualnej. Ta funkcja ma na celu skrócenie czasu uruchamiania zarówno małych, jak i dużych aplikacji, przy ograniczonym wpływie na szczytową wydajność.

Kompilatory just-in-time (JIT) są szybkie, ale programy Java stały się tak duże, że pełne rozgrzanie JIT zajmuje dużo czasu, pozostawiając niektóre metody Java nieskompilowane i osłabiając wydajność. Kompilacja z wyprzedzeniem ma na celu rozwiązanie tych problemów.

Jednak Dmitry Leskov, dyrektor marketingu w firmie Excelsior, dostawcy technologii Java, martwi się, że technologia kompilacji z wyprzedzeniem nie jest wystarczająco dojrzała, i żałuje, że Oracle nie czekało, aż Java 10 będzie bardziej solidna.

Java 9 oferuje również drugą fazę wdrażania inteligentnej kompilacji Oracle. Ta funkcja obejmuje poprawę  s javac stabilności i przenośności narzędzia, dzięki czemu można go domyślnie używać w JVM (wirtualnej maszynie języka Java). Narzędzie zostanie również uogólnione, dzięki czemu będzie można go używać do dużych projektów poza JDK. JDK 9 zaktualizował również  javac kompilator, dzięki czemu może kompilować programy Java 9 do uruchamiania na niektórych starszych wersjach Javy.

Inną nową - ale eksperymentalną - funkcją kompilacji jest interfejs kompilatora JVM na poziomie Java (JVMCI). Ten interfejs umożliwia użycie kompilatora napisanego w języku Java jako kompilatora dynamicznego przez maszynę JVM. API JVMCI zapewnia mechanizmy dostępu do struktur maszyn wirtualnych, instalowania skompilowanego kodu i podłączania do systemu kompilacji JVM.

Napisanie kompilatora JVM w Javie powinno pozwolić na wysokiej jakości kompilator, który jest łatwiejszy w utrzymaniu i ulepszaniu niż istniejące kompilatory napisane w C lub C ++. W rezultacie kompilatory napisane w samej Javie powinny być łatwiejsze w utrzymaniu i ulepszaniu. Inne istniejące wysiłki mające na celu włączenie kompilatorów w Javie obejmują Graal Project i Project Metropolis.

Nowa funkcja kontroli kompilatora ma na celu zapewnienie precyzyjnej i zależnej od kontekstu metody kontroli kompilatorów JVM, umożliwiając programistom zmianę opcji kontroli kompilatora w czasie wykonywania bez pogorszenia wydajności. Narzędzie umożliwia również obejścia błędów kompilatora JVM.

REPL w końcu dociera do Java 9

Java 9 zawiera narzędzie REPL (read-eval-print loop) - kolejny długoterminowy cel Java, który staje się realny w tej wersji, po latach rozwoju w ramach Projektu Kulia.

Nazywana jShell, Java 9's REPL interaktywnie ocenia deklaratywne instrukcje i wyrażenia. Programiści mogą uzyskać informacje zwrotne na temat programów przed kompilacją, po prostu wprowadzając kilka wierszy kodu.

Możliwości narzędzia wiersza poleceń obejmują uzupełnianie tabulatorów i automatyczne dodawanie potrzebnych średników terminala. Interfejs API jShell udostępnia funkcjonalność jShell w IDE i innych narzędziach, chociaż samo narzędzie nie jest IDE.

Brak REPL został przytoczony jako powód odejścia szkół od języka Java. (Języki takie jak Python i Scala od dawna mają REPL.) Ale założyciel języka Scala, Martin Odersky, kwestionuje użyteczność REPL w Javie, mówiąc, że Java jest zorientowana na polecenia, podczas gdy REPL są zorientowane na wyrażenia.

Udoskonalenia interfejsu Streams API w Javie 9

Strumienie w języku Java umożliwiają programistom wyrażanie obliczeń, dzięki czemu można efektywnie wykorzystywać równoległość danych. Funkcja Stream w Javie 8 służy do przetwarzania danych w sposób deklaratywny z wykorzystaniem architektur wielordzeniowych.

W Javie 9 interfejs Streams API dodaje metody warunkowego pobierania i upuszczania elementów Stream, iteracji po elementach Stream i tworzenia strumienia z wartości zerowej, jednocześnie rozszerzając zestaw API Java SE, które mogą służyć jako źródła strumieni.

Pamięć podręczną kodu można podzielić w Javie 9

JDK 9 umożliwia podzielenie pamięci podręcznej kodu na segmenty w celu poprawy wydajności i umożliwienia rozszerzeń, takich jak precyzyjne blokowanie. W wyniku należy skrócić czas wobulacji dzięki wyspecjalizowanym iteratorom pomijającym kod niebędący metodą; oddzielanie kodu niemetodowego, profilowanego i nieprofilowanego; i skrócenie czasu wykonywania niektórych testów. 

Lepsze tworzenie kopii zapasowych JavaScript w Javie 9 za pośrednictwem Project Nashorn

Projekt Nashorn, który zapewnia lekkie środowisko uruchomieniowe JavaScript dla Javy, jest ulepszany w JDK 9. Projekt Nashorn był próbą zaimplementowania wydajnego, ale lekkiego środowiska wykonawczego JavaScript w Javie, kontynuując projekt Rhino, który rozpoczął się w Netscape. Projekt Nashorn miał za zadanie umożliwić osadzanie JavaScript w aplikacjach Java. Dostarczył Javie silnik JavaScript w JDK 8.

JDK 9 zawiera parser API dla drzewa składni ECMAScript firmy Nashorn. API umożliwia analizę kodu ECMAScript przez IDE i frameworki po stronie serwera bez uzależnienia od wewnętrznych klas implementacji Project Nashorn.

Interfejs API klienta HTTP / 2 jest dostępny w Javie 9

Interfejs API klienta HTTP / 2 w wersji beta pojawił się w JDK 9, implementując w Javie uaktualnienie do podstawowego protokołu HTTP w sieci. WebSocket jest również obsługiwany przez API.

Interfejs API HTTP / 2 może zastąpić interfejs API HttpURLConnection, który miał problemy, w tym był projektowany z niedziałającymi już protokołami, wyprzedzał HTTP / 1, był zbyt abstrakcyjny i trudny w użyciu.

Ulepszona obsługa HTML5 i Unicode w Javie 9

W JDK 9 narzędzie dokumentacji Javadoc zostało ulepszone w celu generowania znaczników HTML5. Obsługiwany jest również standard kodowania Unicode 8.0 - który dodaje 8 000 znaków, 10 bloków i sześć skryptów.

API bezpieczeństwa DTLS zostało dodane do Java 9

Ze względów bezpieczeństwa Java 9 dodaje API dla DTLS (Datagram Transport Layer Security). Protokół został zaprojektowany w celu zapobiegania podsłuchiwaniu, manipulowaniu i fałszowaniu wiadomości w komunikacji klient / serwer. Zapewniono implementację zarówno dla trybu klienta, jak i serwera.

Co Java 9 jest przestarzałe i usuwa

Java 9 wycofuje się lub usuwa kilka funkcji, które nie są już modne. Najważniejszym z nich jest Applet API, który jest przestarzały. Wyszło z mody teraz, gdy świadomi bezpieczeństwa twórcy przeglądarek wycofali obsługę wtyczek Java do przeglądarek. Pojawienie się HTML5 również pomogło w ich upadku. Programiści są teraz prowadzeni do alternatyw, takich jak Java Web Start, do uruchamiania aplikacji z przeglądarki lub aplikacji do zainstalowania. 

Narzędzie appletviewer również jest przestarzałe.

Java 9 również wycofuje moduł odśmiecania pamięci Concurrent Mark Sweep (CMS), którego obsługa zostanie wstrzymana w przyszłej wersji. Celem jest przyspieszenie rozwoju innych garbage collectorów na maszynie wirtualnej HotSpot. Moduł odśmiecania G1 z niską przerwą ma być długoterminowym zamiennikiem CMS.

W międzyczasie, kombinacje czyszczenia pamięci, które wcześniej były przestarzałe w JDK 8, są usuwane w JDK 9. Obejmują one rzadko używane kombinacje, takie jak Incremental CMS, ParNew + SerialOld i DefNew + CMS, które dodały dodatkową złożoność do podstawy kodu modułu odśmiecania pamięci.

Java 9 eliminuje również ostrzeżenia Java w instrukcjach importu, aby pomóc w oczyszczeniu dużych baz kodu z ostrzeżeń kłaczków. W przypadku tych baz kodu przestarzałe funkcje często muszą być obsługiwane przez jakiś czas, ale zaimportowanie przestarzałej konstrukcji nie gwarantuje wyświetlenia komunikatu ostrzegawczego, jeśli użycie konstrukcji jest celowe i jest pomijane.

W Javie 9 usunięto również możliwość wybrania środowiska JRE podczas uruchamiania za pomocą funkcji Multiple JRE (mJRE). Ta możliwość była rzadko używana, skomplikowała implementację programu uruchamiającego Java i nigdy nie została w pełni udokumentowana, gdy zadebiutowała w JDK 5.

Firma Oracle usunęła agenta JVM TI (Tool Interface) hprof (Heap Profiling), który został zastąpiony w JVM. Narzędzie jhat zostało również usunięte, ponieważ stało się przestarzałe przez doskonałe wizualizatory i analizatory sterty.

Java 9 jest końcem swojej linii, gdy zaczyna się nowa linia Java 9

Można powiedzieć, że Java 9 wychodzi z hukiem, z wszystkimi nowymi możliwościami. Oracle niedawno ujawniło, że Java 9 jest ostatnią w swoim rodzaju, jeśli chodzi o jej oznaczenie i czas, jaki upłynął między głównymi wydaniami.

Odtąd Java ma mieć sześciomiesięczny cykl wydawania, a następna główna wersja ma nosić nazwę Java 18.3 w marcu 2018 r., A sześć miesięcy później Java 18.9.

Kadencja nowego wydania Java oznacza również, że JDK 9 nie zostanie wyznaczony jako długoterminowa wersja wsparcia. Zamiast tego następną długoterminową wersją będzie Java 18.9.

Szybszy czas wydawania Javy oznacza, że ​​programiści nie będą musieli czekać tak długo na główne wydania. Może to również oznaczać, że programiści pominą Java 9 i jej „niedojrzałe” funkcje modułowości i będą czekać sześć miesięcy na nową wersję, co prawdopodobnie wyeliminowałoby każdą „kinks”, powiedział Simon Maple, dyrektor ds. wsparcia języka Java u dostawcy narzędzi Java ZeroTurnaround.