Che cos'è la compilazione Just-In-Time (JIT)?

0
408

La compilazione Just-In-Time, o JIT, è una tecnica utilizzata da interpreti runtime per linguaggi come JavaScript, C# e Java per avvicinare le velocità di esecuzione alle prestazioni native offerte dai linguaggi binari precompilati come C++.

Compilatori vs. Interpreti

I computer non sanno come eseguire linguaggi di programmazione di alto livello come il C++, almeno non direttamente. Per tradurre il codice leggibile dall'uomo in qualcosa che la tua CPU può eseguire, deve essere convertito. Un computer di solito lo fa attraverso uno dei due metodi: compilazione o interpretazione.

La compilazione prevede l'esecuzione di un compilatore, un programma che prende il codice sorgente e lo converte in codice macchina binario, prima di eseguire l'applicazione. La compilazione avviene sul computer dello sviluppatore prima di essere impacchettata e spedita. La maggior parte degli eseguibili che scarichi sono compilati a un certo livello per essere eseguiti sulla tua macchina e il codice compilato è solitamente piuttosto veloce perché il compilatore può apportare ottimizzazioni per la tua macchina particolare.

Tuttavia, i compilatori hanno alcuni aspetti negativi. I programmi devono essere compilati per specifici set di istruzioni della CPU (come x86-64 o ARM). Inoltre, anche i sistemi operativi che condividono set di istruzioni (come Windows e Linux, entrambi eseguiti su CPU Intel) devono avere programmi compilati separatamente a causa delle molte differenze nel loro funzionamento.

Ciò significa che per qualcosa come JavaScript, che deve essere inviato su Internet ai client connessi, non può essere compilato in anticipo, perché il client potrebbe eseguire qualsiasi combinazione di set di istruzioni e sistema operativo.

Gli interpreti hanno un approccio diverso. Un interprete è fondamentalmente un robot software che prende il codice sorgente di un programma come uno script JavaScript o Python e gestisce l'esecuzione in fase di esecuzione. Essenzialmente funge da livello intermedio tra il codice sorgente e la macchina, in piedi dove un compilatore lo tradurrebbe direttamente.

Questo ha il grande vantaggio di non richiedere che il programma sia costruito per una macchina particolare; finché la macchina può eseguire l'interprete Python, può eseguire qualsiasi script Python.

Cosa fa JIT Compilation?

Sfortunatamente per gli interpreti, sono lenti. Un vero interprete deve tradurre e gestire ogni singola istruzione, essenzialmente facendo il lavoro di un compilatore per ogni esecuzione. Questo è un sacco di sovraccarico, quindi in realtà, la maggior parte degli interpreti come il motore JavaScript V8, la Java Virtual Machine (JVM) e il Common Language Runtime di .NET utilizzano la compilazione Just-In-Time per velocizzare alza l'interprete.

La compilazione Just-In-Time è essenzialmente un compilatore che procrastina e compila il codice per ogni funzione solo ogni volta che è necessario. Ogni volta che chiami una funzione, se il compilatore JIT non l'ha ancora visto, compilerà quella funzione (applicando eventuali ottimizzazioni per la macchina su cui è in esecuzione) e la eseguirà. La prossima volta che chiami la funzione, ha già il codice macchina a portata di mano, quindi deve solo cercarlo nella cache.

Just-In-Time si riferisce al fatto che l'interprete non 8217; non è necessario compilare l'intera app in una volta. Certamente potrebbe, ma per un'app di grandi dimensioni porterebbe a tempi di avvio molto elevati. È meglio per le prestazioni eseguire la compilazione solo quando è necessario (cioè appena in tempo).

La compilazione JIT ha un successo nelle prestazioni?

JIT è letteralmente solo un miglioramento delle prestazioni rispetto agli interpreti normali, quindi rispetto a non farlo affatto, è molto più veloce. Tuttavia, la compilazione del codice non è particolarmente veloce, quindi ovviamente la compilazione in fase di runtime comporta un calo delle prestazioni rispetto a quando è stato compilato direttamente in bytecode in anticipo.

Pubblicità

Tuttavia, perché la compilazione JIT di solito deve essere eseguito solo la prima volta che viene invocata una funzione, le funzioni comunemente usate vedranno davvero un calo di prestazioni solo alla prima chiamata. Puoi testarlo in C# con StopWatches—raccolgono .NET “rumore di fondo,” incluso il tempo impiegato per la compilazione JIT alla prima esecuzione di una funzione.

Il principale svantaggio delle applicazioni compilate JIT è un tempo di avvio a freddo elevato, poiché migliaia di funzioni chiamate all'avvio devono essere compilate proprio all'inizio . Alcune applicazioni Web ASP.NET possono richiedere più di un minuto per il bootstrap, in parte a causa dell'elevato stress sul compilatore JIT all'inizio.