Um compilador JIT (Just-In-Time) compila código em tempo de execução, ou seja, enquanto o programa está sendo executado. Portanto, o custo da compilação faz parte do tempo de execução do programa e, portanto, deve ser minimizado.
O oposto disso é um compilador antecipado (AOT), que é basicamente sinônimo de "compilador de lote". Isso converte o código fonte em código de máquina e, em seguida, apenas o código de máquina é distribuído. Portanto, o compilador pode ser muito lento, pois não afeta o tempo de execução do programa resultante.
Atualmente, quando as pessoas dizem "compilador", normalmente significam um compilador AOT. De fato, o termo "compilador AOT" só começou a se popularizar recentemente, quando as pessoas começaram a criar compiladores AOT para linguagens compiladas JIT, principalmente JavaScript. Muitas dessas linguagens, por exemplo, C #, compilam em uma linguagem intermediária para uma VM que é então compilada pelo JIT no código da máquina em tempo de execução. O termo "compilador AOT" tem a conotação de que o código-fonte será compilado diretamente no código da máquina, portanto, nenhuma forma de compilação JIT é necessária em tempo de execução.
"Compilador de lotes" é um termo um pouco arcaico neste momento. O contraste real com um compilador em lote quando o termo era popular era um compilador incremental . A compilação incremental é frequentemente associada a linguagens como Lisp, nas quais você teve um REPL e pode solicitar interativamente a implementação da linguagem para compilar uma função específica. Se uma função fosse executada cuja compilação não havia sido solicitada anteriormente, ela normalmente seria interpretada. Um compilador de lote, por outro lado, compilou todas as funções de uma só vez, ou seja, em um lote.