Un compilador JIT (Just-In-Time) compila el código en tiempo de ejecución, es decir, mientras el programa se está ejecutando. Por lo tanto, el costo de la compilación es parte del tiempo de ejecución del programa y, por lo tanto, debe minimizarse.
Lo opuesto a esto es un compilador anticipado (AOT) que es básicamente sinónimo de "compilador por lotes". Esto convierte el código fuente en código de máquina y luego solo se distribuye el código de máquina. Por lo tanto, el compilador puede ser muy lento ya que no afecta el tiempo de ejecución del programa resultante.
Hoy en día, cuando las personas dicen "compilador", generalmente se refieren a un compilador AOT. De hecho, el término "compilador AOT" solo comenzó a hacerse popular relativamente recientemente cuando la gente comenzó a hacer compiladores AOT para lenguajes compilados JIT, particularmente JavaScript. Muchos de estos lenguajes, por ejemplo, C #, se compilan en un lenguaje intermedio para una máquina virtual que luego se compila JIT al código de máquina en tiempo de ejecución. El término "compilador AOT" tiene la connotación de que el código fuente se compilará directamente al código de la máquina, por lo que no se requiere ninguna forma de compilación JIT en tiempo de ejecución.
"Compilador por lotes" es un término arcaico en este momento. El verdadero contraste con un compilador por lotes cuando el término era popular era un compilador incremental . La compilación incremental a menudo se asocia con lenguajes como Lisp donde tenía un REPL y podía solicitar interactivamente la implementación del lenguaje para compilar una función específica. Si se ejecutó una función cuya compilación no se había solicitado antes, normalmente se interpretaría. Un compilador por lotes, por el contrario, compiló todas las funciones a la vez, es decir, en un lote.