>_ DevTrendspl

Język

Strona główna

Języki

Sekcje

Frontend Backend Mobilne DevOps AI / ML GameDev Blockchain Systemy wbudowane Bezpieczeństwo
Java

Jeandle JDK, czyli dlaczego deweloperzy doczepiają LLVM do Java Virtual Machine

Zanurzanie się w bebechy kompilatora C2 w HotSpot JVM nie jest dla osób o słabych nerwach. Kod C++ kompilatora C2 był pisany przez dziesięciolecia. Zgromadził ogromną liczbę specyficznych optymalizacji, ale jego utrzymanie z roku na rok staje się coraz trudniejsze. W pewnym momencie zespół inżynierów Oracle próbował ułatwić sobie życie projektem Graal, przepisując kompilator JIT w samym Javie. Twórcy projektu Jeandle poszli inną drogą: postanowili wziąć istniejący framework LLVM i uczynić go silnikiem kompilacji dla OpenJDK.

Logo Jeandle

Czym jest Jeandle i dlaczego potrzebuje LLVM

Jeandle to eksperymentalny kompilator JIT dla Javy zbudowany bezpośrednio na bazie OpenJDK. Zamiast polegać na wbudowanych kompilatorach C1 lub C2, przechwytuje wykonywanie gorącego kodu bajtowego i przekazuje go do generatora kodu LLVM.

Dlaczego w ogóle wprowadzać LLVM do Java Virtual Machine?

Główną zaletą LLVM jest ogromna kolekcja niskopoziomowych optymalizacji stworzonych przez globalną społeczność dla C, C++ i Rust. Automatyczna wektoryzacja instrukcji, głęboka analiza pętli oraz optymalizacje dostosowane do specyficznych funkcji procesorów są już obecne w LLVM i regularnie otrzymują aktualizacje.

W tradycyjnym C2 każda nowa optymalizacja lub wsparcie dla nowej architektury procesora (jak RISC-V) musi być implementowana ręcznie. Łącząc OpenJDK z LLVM, autorzy Jeandle mają na celu uzyskanie potężnego generatora kodu maszynowego bez przepisywania optymalizatorów od zera.

Jak to działa pod maską

Przetwarzanie kodu w Jeandle podzielono na kilka etapów:

  1. Maszyna wirtualna śledzi często wywoływane metody aplikacji.
  2. Gdy kod bajtowy metody zostanie uznany za wystarczająco gorący, Jeandle tłumaczy go na LLVM IR.
  3. Optymalizacje LLVM są stosowane do powstałego kodu IR.
  4. LLVM kompiluje IR do natywnego kodu maszynowego dla docelowej platformy (x86_64, AArch64, itp.).
  5. JVM podmienia referencję metody, a wykonywanie kontynuuje się z skompilowanym kodem maszynowym.

Repozytorium projektu zawiera szczegółową dokumentację. Katalog guides zawiera opisy architektury systemu, instrukcje budowania oraz osobny dokument konfiguracji debugowania.

Deweloperzy udostępnili kontrolę nad zachowaniem kompilatora poprzez dedykowane flagi JVM. Flagi te pozwalają dostosować poziomy optymalizacji oraz żądać zrzutów pośredniej reprezentacji LLVM IR podczas działania aplikacji.

Główne wyzwanie z JIT opartym na LLVM

Idea używania LLVM w kompilatorach JIT nie jest nowa. Podobne próby były wcześniej podejmowane w projekcie Shark dla OpenJDK oraz projekcie Falcon w Azul. Główną przeszkodą na tej drodze jest sama szybkość kompilacji.

LLVM został pierwotnie zaprojektowany do kompilacji z wyprzedzeniem (AOT). W statycznych kompilatorach jak Clang proces może trwać minuty — priorytetem jest, aby wynikowy plik binarny działał jak najszybciej. W trybie JIT czas kompilacji jest krytyczny. Jeśli LLVM zacznie spędzać dużo czasu i skrupulatnie optymalizować każdą metodę, aplikacja po prostu zamrze podczas fazy rozgrzewki.

Ponadto twórcy Jeandle stają przed złożonym zadaniem integracji z środowiskiem wykonawczym Javy. Kompilator musi poprawnie obsługiwać punkty bezpieczne dla garbage collectora, pracować z barierami pamięci oraz wspierać dynamiczne ładowanie klas.

Aktualny stan i perspektywy na przyszłość

Obecnie Jeandle znajduje się w aktywnej fazie prototypowania. Repozytorium zgromadziło około 460 gwiazdek i ponad 60 otwartych zgłoszeń. Kod nie jest jeszcze gotowy do użytku produkcyjnego, a autorzy tego nie ukrywają.

Mimo to projekt będzie interesujący dla kilku kategorii inżynierów:

  • Osób studiujących wnętrza JVM i chcących zrozumieć, jak działa JIT na realnym przykładzie.
  • Deweloperów kompilatorów poszukujących praktycznych przypadków użycia integracji LLVM IR.
  • Badaczy tworzących niestandardowe profile optymalizacji dla specyficznych architektur procesorów.

Kod źródłowy jest otwarty na licencji GPL v2.0. Jeśli chcesz zrozumieć, jak połączyć Java Virtual Machine z natywnym kompilatorem, zapoznaj się z dokumentacją projektu — obejmuje ona proces budowania oraz decyzje architektoniczne w szczegółach.

Powiązane projekty