La compilazione di alcuni bytecode è una vecchia tradizione. Il codice P di UCSD esisteva nel 1978 e aveva molti precursori. Oggi LLVM può essere visto come un bytecode, targato da Clang / LLVM suite di compilazione in anticipo e GCCJIT può essere visualizzato come JIT correlato a GCC (con GIMPLE sorta di bytecode interno .
(quindi, bytecode, JIT, ... ha un significato abbastanza sfumato oggi: il senso più ampio di JIT è la compilazione all'interno del processo che esegue il codice compilato.)
Il bytecode JVM era inizialmente implementato come interprete. Ma Java è diventato abbastanza popolare da ottenere le JIT basate su JVM (e Sun ha investito molto nella tecnologia JIT, quindi questo ha aiutato Java ad avere successo)
E il JIT esisteva molto tempo fa (nei primi anni '80, ad esempio nelle macchine Lisp, e persino nel 1960 su CAB 500 computer e altri), prima ancora che fosse usato il nome. Molte implementazioni Common Lisp o Smalltalk hanno compilatori JIT (e oggi SBCL è completamente JIT-ing).
Nella mia comprensione, Microsoft ha progettato il codice bytecode CLR per essere compilato JIT (quindi ha ottenuto diversi compromessi nel suo codice byte rispetto alla JVM). Ed ha recentemente pubblicato la sua implementazione come software open-source e portato su Linux (prima di questo, Mono esisteva su Linux).
Un bytecode è spesso più compatto degli eseguibili nativi binari , può essere reso portatile per diverse architetture (ad es. x86 32 bit e x86-64 e anche ARM 32 bit, ARM / Aarch64, ...) e potrebbero essere progettati per evitare (o almeno ammorbidire) inferni di dipendenza .
Un grande vantaggio della compilazione JIT è che la VM può ricompilare alcune parti del bytecode sulla base di informazioni contestuali dinamiche (ad es. profilazione, introspezione dello stack di chiamate , ...) un po 'di codice. Alcune infrastrutture JIT come libjit , asmjit , LLVM , GCCJIT , ... non farlo (tuttavia, l'implementazione che li utilizza potrebbe farlo ricorrendo all'infrastruttura JIT-ing), ma la maggior parte delle implementazioni JVM o CLR industriali lo fanno (e alcune persone chiamano solo JIT quella compilazione dinamica pigra su richiesta, per me JIT è solo una parola d'ordine per la compilazione dinamica in fase di runtime). Questo è difficile o impossibile con compilazione AOT (almeno richiede LTO ), ed è impossibile se vuoi fare profile- ottimizzazione guidata dinamicamente a runtime (come si dice la maggior parte delle implementazioni JIT JVM o CLR). Inoltre, una VM bytecode non ha bisogno di compilare JIT tutto il bytecode, ma solo le parti più utilizzate (come HotSpot fa) e continua a interpretare il codice freddo usato raramente.
Anche le implementazioni JIT possono cooperare molto di più (e meglio ...) con sofisticati garbage collector .
PS. Non so nulla di Windows. Non l'ho mai usato Sto usando Linux dal 1994 e Unix dal 1987.