Tydzień człowiek na urlopie, a aż zasypało nas ciekawymi informacjami, które aż proszą się o podsumowanie – szczególnie Release Radar jest dzisiaj wyjątkowo bogaty.
1. JVM i transpiler bytecode w Rust: Learning-by-Doing na poziomie mistrzowskim
Nie bez kozery mówi się o tym, że nie ma lepszej nauki niż taka poprzez praktykę. Niektórzy biorą to sobie mocno do serca mocniej niż inni. Przykładowo, Andrea Bergia, Principal Software Engineer w lastminute.com, postanowił na przykład nauczyć się JVM poprzez napisanie jego uproszczonej implementacji. Dodatkowo, jak możecie się domyśleć mówimy tutaj o 10x developerze, więc ten zrobił to… w Rust.
Projekt, nazwany rjvm, choć nie obsługuje on niektórych funkcji, takich jak generyki, wątki, refleksje, adnotacje, I/O, czy kompilację JIT, to autor z powodzeniem zaimplementował kilka nietrywialnych komponentów, w tym instrukcje sterujące, tworzenie obiektów i prymitywów, wsparcie metod wirtualnych i statycznych, wyjątki, garbage collector oraz możliwość zaczytywania klas z zewnętrznych pliku .jar. Żeby zaś dopiąć już robiącą wrażenie całość, autor opracował zestaw testów ilustrujących działanie rjvm w oparciu o prawdziwy plik rt.jar z pochodzący z OpenJDK 7.
Autor podzielił się swoimi doświadczeniami w ramach dwuczęściowego (przynajmniej na razie) postu blogowego I have written a JVM in Rust. Andrea, że najbardziej dumny, jest z zaimplementowania działającego garbage collectora, nawet jeśli w stosunkowo prostej wersji. Zgodnie z jego zapowiedziami możemy spodziewać się kolejnych publikacji, badających dogłębne aspekty działania rjvm.
To jednak nie koniec edukacyjnych, około-jvmowych projektów edukacyjnych napisanych w Rust. Jtcpp to program napisany w języku Rust, który konwertuje bytecode JVM na C++ (teraz to już mamy prawdziwe kombo). Umożliwia to kompilację programów napisanych w takich językach jak Java i Kotlin do natywnych instrukcji, co w niektórych przypadkach poprawia ponoć wydajność, aczkolwiek wyniki nie zachęcają do produkcyjnego użycia (autor podaje bowiem, że z jego eksperymentów można spodziewać się od 3x przyspieszenia do 50x spowolnienia działania programów). Całość sama w sobie jest ponoć dość kompletny pod względem funkcji języka, ale implementacja standardowej biblioteki Java w C++ jest bardzo ograniczona – zaimplementowane klasy to String, Object, System oraz PrintStream. Całość więc nadaje się w zasadzie do tworzenia prostych algorytmów i aplikacji konsolowych. Całość stanowi jednak bardzo interesujący eksperyment. A dlaczego powstał? Bo można. I to jest piękne.
Zainstaluj teraz i czytaj tylko dobre teksty!
2. Aktualizacja Roadmapy Kotlina
Ostatnio kiedy się widzieliśmy, mieliśmy edycje mocno kotlinową… ale okazało się, że to dalej nie koniec. Od tamtego czasu pojawiła się Roadmapa. I choć sama w sobie nie przynosi nic rewolucyjnego, to i tak wypada nią nią choćby rzucić okiem.
Główny nacisk położony jest na kilka kluczowych projektów, takich jak znany Wam z poprzedniej edycji kompilator K2, czyli przebudowa kompilatora Kotlin mająca na celu zwiększenie szybkości, unifikacji codebase, a to wszystko przy jednoczesnym wprowadzeniu nowych funkcji języka. Trwają również prace nad usprawnieniem Kotlinowego plugina do IntelliJ, która to dzięki migracji języka na K2 umożliwić ma szybsze uzupełnianie, podświetlanie i wyszukiwanie, a także bardziej stabilną analizę kodu. Kolejnym priorytetem jest produkcyjne wydanie Kotlin Multiplatform, która ma być osiągnięty dzięki poprawie stabilności i dokumentacji toolchaina oraz zapewnieniu gwarancji kompatybilności. Ulepszeniu mają ulec też funkcje, takie jak nowy menedżer pamięci Kotlin/Native, kompatybilność z klib
i możliwość eksportowania kodu Kotlin do Objective-C.
Za cel stawiana jest też poprawa doświadczenia autorów bibliotek Kotlinowych poprzez zapewnienie solidnej dokumentacji i narzędzi do konfigurowania, rozwijania i publikowania takowych. Programiści „przemysłowi” mają zaś otrzymać swoje własne zabawki obejmują lepsze raporty kompilacji Kotlin oraz ulepszone doświadczenie ze skryptami Kotlinowymi, a także .gradle.kts
. Ekosystem bibliotek doczeka się wydań takich jak kotlinx-io
, nowej bibliotece I/O, która ma zostać oparta o okio od Square. Doczekamy się też stabilizacji kotlinx-kover
(narzędzia Code Coverage) i kotlinx-metadata-jvm
(biblioteki do odczytu metadanych kompilatora Kotlina).
Zainstaluj teraz i czytaj tylko dobre teksty!
3. Release Radar
Dzisiaj na bogato!
Micronaut 4.0
Zaczniemy od zdecydowanie największej premiery ostatnich tygodni. Micronaut, pierwszy z nowej fali nowoczesnych frameworków Javowych, doczekał się bowiem nowego dużego wydania.
Micronaut Framework 4.0 porzuca wsparcie dla wersji Java starszych niż JDK 17, dzięki czemu mógł zrewidować API pod kątem użycia nowych składni języka, takich jak Java Records, Sealed Classes, Switch Expressions, Text Blocks czy Pattern Matching dla instanceof. Ponadto, nowa wersja Klienta HTTP Micronaut opartą została na wprowadzonym w JDK 11 kliencie HTTP Java. Porzucenie balastu starych wersji umożliwiło też uzyskanie lepszych wyników jeśli chodzi o wydajność.
Graeme Rocher, twórca Micronauta (a wcześniej Grails), od paru lat pracuje w Oracle, nie ma się więc co dziwić, że to właśnie ta firma stała się dużym kontrybutorem nowego wydania – co sprawia, że defacto macza palce w zarówno Micronaucie, jak i Helidonie. To dzięki ich wsparciu uzyskujemy mocno przerobioną integrację Micronauta z GraalVM w celu wykorzystania współdzielonych metadanych GraalVM, dzięki czemu kompilowanie aplikacji Micronaut zależnych od bibliotek innych firm za pomocą GraalVM Native Image stało się łatwiejsze. Micronaut Serialization jest teraz zaś modułem domyślnym, oferując nie używające refleksji, szybkie i bezpieczne interfejsy API serializacji/deserializacji JSON. Inne godne uwagi zmiany obejmują ulepszoną obsługę chmur (w tym Oracle Cloud) i jeszcze bardziej modułową architekturę, co umożliwia mikroserwisom być jeszcze bardziej mikro, umożliwiając usunięcie funkcjonalności, jeśli nie są one potrzebne. To ma oczywiście pozytywny wpływ na czas startu całości. Micronaut doczekał się też wczesnej wersji wsparcia dla VirtualThreads.
Jeśli chodzi o zależności, Micronaut 4.0 nie zależy już bezpośrednio od SnakeYAML i Micronaut Jackson Databind, co umożliwi danie programistom wyboru korzystania z Micronaut Serialization lub Micronaut Jackson Databind. Ponadto ukończono aktualizację pakietów javax
do pakietów jakarta
.
Arrow 1.2
Z perspektywy programistów Javy z pewnością Kotlin jawi się jako język nieco bardziej funkcyjny, ale w dalszym ciągu do takiej Scali mu daleko. Kotlin Arrow to biblioteka programowania funkcyjnego próbująca nieco tą sytuacje poprawić, dostarczając typy danych, klasy typów i rozszerzenia, które ułatwiają. Teraz zaś wypuszczono jej najnowszą wersję, Arrow 1.20.
Wydanie to zawiera kilka godnych uwagi funkcji. Moduł Typed errors to nowe podejście do zarządzania typami błędów, oferując alternatywę dla wcześniej używanych bloków obliczeniowych i typów Effect/EagerEffect
. Ponadto moduł resilience
obejmuje teraz obsługę tak zwanych Sag (kto wie ten wie). Wszystko zostało zaś okraszone nową stroną, zawierającą również poprawioną dokumentacje i przykłady.
W ramach przygotowań do wydania Arrow 2.0 niektóre funkcje i typy przeznaczone do usunięcia zostały oznaczone jako @Deprecated
. Arrow 1.2.x ma na celu utorowanie drogi dla nadchodzącej wersji 2.0 poprzez sfinalizowanie interfejsów API, uwzględniając sugestii społeczności. Arrow 2.0 jest planowany tak, aby zbiegł się w czasie z wydaniem Kotlin 2.0, co pomogłoby zapewnić kompatybilność binarną (Arrow generuje spore ilości kodu) i ułatwić przejście na nową wersje Kotlina.
Semantic Kernel for Java
Nie ma sprawy, panie Microsoft. Dopiero co wprawdzie mieliśmy edycje poświęconą LLM-om w Javie, ale nowa propozycja firmy jest na tyle ciekawa, że żal o niej nie wspomnieć.
Semantic Kernel (SK) to SDK umożliwiające integrację dużych modeli językowych AI (LLM) z konwencjonalnymi językami programowania. Rozszerzalny model programowania SK łączy język naturalny, tradycyjny kod i pamięć opartą o embeddingi.
Microsoft wydał pierwszą wersję Semantic Kernel for Java, biblioteki, która umożliwia programistom Java płynną integrację usług AI (jak Azure OpenAI) z ich aplikacjami, za pomocą modelu opartego o tak zwane skille. W praktyce wygląda to mniej więcej tak:
public class MyAppSkills {
@DefineSKFunction(name = "redactPassword", description = "Redacts passwords from a message")
public String redactPassword(@SKFunctionInputAttribute String input) {
System.out.println("[redactPassword] Redacting passwords from input: " + input);
return input.replaceAll("password.*", "******");
}
}
(...)
Kernel kernel = SKBuilders.kernel().withKernelConfig(config).build(); kernel.importSkill(new MyAppSkills(), "MyAppSkills");
Programiści następnie mogą wykorzystać bibliotekę do tworzenia inteligentnych planów przy użyciu tak zwanych Plannerów, łącząc umiejętności wykonywania złożonych działań z generatywną sztuczną inteligencją.
SequentialPlanner planner = new SequentialPlanner(kernel, null, null);
Plan plan = planner.createPlanAsync(
"For any input with passwords, redact the passwords and send redacted input to sysadmin@corp.net").block();
System.out.println(plan.toPlanString());
String message = "Password changed to password.db=123456abc";
String result = plan.invokeAsync(message).block().getResult();
System.out.println(" === Result of the plan === ");
System.out.println(result);
Semantic Kernel for Java w wersja alfa 0.2.6-alpha jest dostępna w Maven Central. by pomóc programistom w rozpoczęciu pracy i zrozumieniu potencjału Semantic Kernel for Java, udostępniono kolekcję przykładów
Microsoft Build of OpenJDK – July 2023 Release
A jak jesteśmy już w temacie Microsoftu, firma ogłosiła również wydanie comiesięcznego zbioru poprawek i aktualizacji zabezpieczeń dla Microsoft Build OpenJDK. Zwykle nie informuję o takich zmianach, jednak tym razem jednym ze znaczących ulepszeń jest poprawki escape analysis (analizy ucieczki), które osiągnęły na tyle stabilną wersje, że Microsoft zdecydował się je włączyć domyślnie. Dla tych którzy nie siedzą w temacie kompilatorów, analiza ucieczki w Javie to technika optymalizacji, która określa zakres dostępności obiektów w programie, aby potencjalnie przydzielić je na stosie, a nie na stercie. Jest to mechanizm o tyle istotny, że umożliwia również dodatkowe optymalizacje, takie jak skalaryzacja obiektów (zastępowanie ich zestaw indywidualnych zmiennych – skalarów) lub eliminacja synchronizacji wątków. Ulepszenie to już dziś wykorzystywane jest w systemach produkcyjnych w Microsoft i LinkedIn, dzięki czemu można je uznać za stabilne. Użytkownicy mogą wyłączyć jednak tę funkcję, jeśli napotkają regresję wydajności, używając flagi -XX:-ReduceAllocationMerges
.
Dla tych, którzy się martwią – nie jest to tylko ulepszenie specyficzne dla Microsoft JDK Build. Zmiana została już wmergowana w kod OpenJDK i jest dostępna we wczesnych wersjach JDK 22.
Spring Web Flow 3.0
Spring Web Flow to projekt Spring Framework, który został zaprojektowany, aby pomóc programistom w tworzeniu aplikacji internetowych zawierających złożone przejścia między stronami. Zapewnia strukturę do organizowania reguł nawigacji dzięki deklaratywnemu modelowi, który pozwala programistom zdefiniować (jak wskazuje nazwa) „przepływ” w aplikacji.
W ostatnim czasie wydano Spring Web Flow w wersji 3.0.0. Nowa wersja koncentruje się na kompatybilności ze Spring Framework 6 i Jakarta EE, zapewniając użytkownikom możliwość wykorzystania najnowszych aktualizacji i ulepszeń tych platform. Aktualizacja ta wymagała jednak usunięcia Apache Tiles (framework do templatingu), które nie został zmigrowany do Jakarta EE. Jako substytut, przykładowa aplikacja booking-mvc
wykorzystuje teraz Thymeleaf Layouts.
Scala Metals 1.0
Language Server Protocol (LSP) to otwarty protokół oparty na JSON-RPC, który ułatwia interakcję między edytorem IDE, a tak zwanym serwerem języka – narzędziem które zapewnia funkcje specyficzne dla języka, takie jak autouzupełnianie, przejście do definicji lub znalezienie wszystkich odniesień w ramach codebase. Dzięki LSP, jednorazowo stworzony serwer języka może być użyty z wieloma innymi narzędziami, dzięki czemu nie trzeba wielokrotnie wykonywać tej samej pracy.
Metals to dojrzały serwer językowy dla języka programowania Scala. Jego rozwój jest wspólnym wysiłkiem wielu członków społeczności Scala, a zespół Metals jest przekonany o gotowości narzędzia do użytku produkcyjnego, co potwierdza dzięki wydaniem wersji 1.0, o nazwie kodowej Silver. Oprócz podstawowych funkcji oferowanych przez Language Server Protocol, Metals 1.0 może pochwalić się kilkoma dodatkowymi funkcjami, takimi jak obsługa projektów z wieloma rootami, możliwość uruchamiania określonych reguł Scalafix i lepsze wsparcie dla Scala CLI.
Metals v1.0.0 obsługuje najnowsze wersje Scali (Scala 3.3.0, Scala 2.12.18 i Scala 2.13.11).