Le principali differenze tra un compilatore AOT e un compilatore JIT sono risorse e informazioni .
Un compilatore AOT ha risorse infinite . Può utilizzare tutta la RAM che gli piace e impiegare tutto il tempo che vuole. (Si noti che questo è teoricamente vero.) Pragmaticamente, le persone non amano le compilazioni a lungo termine.Inoltre, i compilatori sono ora tipicamente incorporati in IDE, dove forniscono un feedback istantaneo mentre-you-type, in modo che almeno lexing, analisi, semantica analisi, tipo di inferenza, controllo del tipo, espansione delle macro, ecc., in pratica tutto, eccetto la generazione e l'ottimizzazione del codice reale devono avvenire molto velocemente e con un uso limitato della memoria.)
Un compilatore JIT OTOH deve "rubare" le sue risorse dall'applicazione in esecuzione. (Anche in teoria, pragmaticamente, il compilatore JIT deve lavorare più duramente, quando viene introdotto un sacco di nuovo codice nel sistema, in genere quando inizia l'applicazione, a quel punto il caricamento dei file di configurazione e l'impostazione dei grafici degli oggetti è il collo di bottiglia, non il compilatore JIT.)
Un compilatore JIT ha molte più informazioni disponibili di un compilatore AOT e non deve faticare per ottenerlo. Un compilatore AOT può solo ottenere informazioni statiche sul codice. Gli algoritmi di analisi statica sono solitamente molto costosi (spesso almeno O (n 2 ) in almeno uno spazio e tempo, a volte esponenziale) e non funzionano nemmeno in modo affidabile , perché molti di loro sono equivalenti a risolvere il problema di interruzione (Analisi della gerarchia di classe, Analisi di fuga, Eliminazione del codice morto, ad esempio).
Un compilatore JIT OTOH non si imbatte nel problema di interruzione, perché non esegue analisi statiche. E non è necessario eseguire algoritmi costosi: vuoi sapere se un metodo viene sovrascritto o meno in modo da poterlo potenzialmente integrare? Non è necessario eseguire Class Hierarchy Analysis, basta osservare le classi, sono tutte lì. O ancora meglio ancora: non preoccuparti nemmeno, solo in linea, comunque, e se si scopre che hai sbagliato su di esso non essere sovrascritto, di nuovo in-linea. Vuoi sapere se un riferimento sfugge a un ambito locale o no in modo da poterlo allocare potenzialmente nello stack? Non preoccuparti, basta allocarlo nello stack, taggarlo e quando il tag compare altrove, riassegnalo sull'heap. E poiché si compila il codice solo quando è in esecuzione, l'eliminazione dei codici morti è totalmente banale perché il codice non verrà mai eseguito e quindi non verrà mai compilato.
Quindi, la differenza fondamentale è che l'analisi in un compilatore JIT può essere più semplice, perché ha molte informazioni disponibili che un compilatore AOT non possiede e l'ottimizzazione e la generazione del codice deve essere più semplice, perché ha meno risorse disponibili. Si noti, tuttavia, che un compilatore JIT può comunque eseguire ottimizzazioni molto più aggressive di un compilatore AOT, poiché non deve necessariamente dimostrare che le ottimizzazioni sono corrette. Se risulta che l'ottimizzazione è sbagliata, può sempre de-ottimizzare di nuovo. (Non tutte le JIT lo fanno (il JIT CLR ad esempio, non è in grado di de-ottimizzare), ma ad esempio il JIT HotSpot nel JDK di Oracle.) L'Inlining speculativo è una tale ottimizzazione che è possibile solo in un JIT de-optimizing .
Una cosa peculiare delle JIT è che molto spesso i linguaggi che compilano sono progettati per essere facilmente compilabili da una macchina (ad es. bytecode JVM, bytecode CPython, bytecode Rubinius, IRL LLVM, CIL CLI, bytecode Dalvik), mentre lingue che una tipica compilazione di compilatori AOT è progettata per essere facilmente leggibile dagli esseri umani (es. Ruby, Python, Java). Ma ho capito che la tua domanda riguardava un AOT rispetto a un JIT per la stessa lingua , quindi niente di tutto questo. Ovviamente, se si confrontano i compilatori per lingue diverse, ci saranno molte differenze e molti di questi saranno totalmente estranei alla differenza tra JIT e AOT e più relativi alle differenze tra le due lingue.