>_ DevTrendsit

Lingua

Home

Linguaggi

Sezioni

Frontend Backend Mobile DevOps AI / ML GameDev Blockchain Embedded Sicurezza
Java

Jeandle JDK, ovvero perché gli sviluppatori agganciano LLVM alla Java Virtual Machine

Addentrarsi nelle viscere del compilatore C2 della HotSpot JVM non è per chi ha il cuore debole. Il codice C++ di C2 è stato scritto nel corso di decenni. Ha accumulato una miriade di ottimizzazioni specifiche, ma mantenerlo diventa sempre più difficile ogni anno. A un certo punto, il team di ingegneri di Oracle ha cercato di semplificarsi la vita con il progetto Graal, riscrivendo il compilatore JIT in Java. Gli sviluppatori del progetto Jeandle hanno adottato un approccio diverso: hanno deciso di prendere il framework LLVM esistente e farlo diventare il motore di compilazione per OpenJDK.

Logo Jeandle

Cos'è Jeandle e perché ha bisogno di LLVM

Jeandle è un compilatore JIT sperimentale per Java costruito direttamente sopra OpenJDK. Invece di affidarsi ai compilatori integrati C1 o C2, intercetta l'esecuzione del bytecode caldo e lo passa al generatore di codice di LLVM.

Perché portare LLVM nella Java Virtual Machine in primo luogo?

Il vantaggio principale di LLVM è la vasta collezione di ottimizzazioni di basso livello create dalla comunità globale per C, C++ e Rust. La vettorizzazione automatica delle istruzioni, l'analisi profonda dei cicli e le ottimizzazioni su misura per funzionalità specifiche del processore sono già presenti in LLVM e ricevono aggiornamenti regolari.

Nel C2 tradizionale, ogni nuova ottimizzazione o supporto per una nuova architettura di processore (come RISC-V) deve essere implementato manualmente. Combinando OpenJDK con LLVM, gli autori di Jeandle mirano a ottenere un potente generatore di codice macchina senza dover riscrivere gli ottimizzatori da zero.

Come funziona sotto il cofano

L'elaborazione del codice in Jeandle è suddivisa in diverse fasi:

  1. La macchina virtuale traccia i metodi dell'applicazione chiamati frequentemente.
  2. Quando il bytecode di un metodo viene considerato sufficientemente caldo, Jeandle lo traduce in IR LLVM.
  3. Le ottimizzazioni LLVM vengono applicate al codice IR risultante.
  4. LLVM compila l'IR in codice macchina nativo per la piattaforma target (x86_64, AArch64, ecc.).
  5. La JVM sostituisce il riferimento al metodo e l'esecuzione prosegue con il codice macchina compilato.

Il repository del progetto include una documentazione completa. La directory delle guide contiene descrizioni dell'architettura del sistema, istruzioni di compilazione e un documento separato sulla configurazione del debug.

Gli sviluppatori hanno esposto il controllo del comportamento del compilatore attraverso flag JVM dedicati. Questi flag consentono di regolare i livelli di ottimizzazione e richiedere dump della rappresentazione intermedia IR LLVM durante l'esecuzione dell'applicazione.

La sfida principale con JIT basato su LLVM

L'idea di usare LLVM nei compilatori JIT non è nuova. Tentativi simili sono stati fatti in precedenza nel progetto Shark per OpenJDK e nel progetto Falcon di Azul. Il principale ostacolo su questo percorso è la velocità di compilazione stessa.

LLVM è stato originariamente progettato per la compilazione ahead-of-time (AOT). Nei compilatori statici come Clang, il processo può richiedere minuti—la priorità è che il binario finale funzioni il più rapidamente possibile. In modalità JIT, il tempo di compilazione è critico. Se LLVM inizia a impiegare molto tempo e a ottimizzare meticolosamente ogni metodo, l'applicazione si bloccherà semplicemente durante la fase di warmup.

Inoltre, gli autori di Jeandle affrontano un compito complesso di integrazione con il runtime Java. Il compilatore deve gestire correttamente i safepoint per il garbage collector, lavorare con le memory barrier e supportare il caricamento dinamico delle classi.

Stato attuale e prospettive future

Attualmente, Jeandle è nella fase di prototipazione attiva. Il repository ha accumulato circa 460 stelle e oltre 60 issue aperte. Il codice non è ancora pronto per l'uso in produzione e gli autori non lo nascondono.

Tuttavia, il progetto sarà di interesse per diverse categorie di ingegneri:

  • Coloro che stanno studiando i meccanismi interni della JVM e vogliono capire come funziona un JIT con un esempio reale.
  • Sviluppatori di compilatori alla ricerca di casi d'uso pratici di integrazione con LLVM IR.
  • Ricercatori che creano profili di ottimizzazione personalizzati per architetture di processori specifiche.

Il codice sorgente è aperto sotto licenza GPL v2.0. Se volete capire come combinare una Java Virtual Machine con un compilatore nativo, consultate la documentazione del progetto—copre il processo di build e le decisioni architetturali in dettaglio.

Progetti correlati