Компілятор JIT (Just-In-Time) компілює код під час виконання, тобто під час роботи програми. Тому вартість компіляції є частиною часу виконання програми, і тому її слід мінімізувати.
Протилежністю цьому є компілятор випередження (AOT), який в основному є синонімом "компілятора пакетів". Це перетворює вихідний код у машинний код, а потім просто розподіляється машинний код. Тому компілятор може бути дуже повільним, оскільки це не впливає на час виконання результуючої програми.
Сьогодні, коли люди кажуть "компілятор", вони зазвичай означають компілятор AOT. Дійсно, термін "компілятор AOT" став популярним порівняно недавно, коли люди почали робити компілятори AOT для мов компільованого JIT, зокрема JavaScript. Багато з цих мов, наприклад C #, компілюються в проміжну мову для VM, яка потім JIT компілюється для машинного коду під час виконання. Термін "компілятор AOT" має зауваження, що вихідний код буде скомпільований безпосередньо до машинного коду, тому жодна форма компіляції JIT не потрібна під час виконання.
"Компілятор пакетів" є трохи архаїчним терміном на даний момент. Справжній контраст із компілятором пакетів, коли термін користувався популярністю, був поступовим компілятором . Інкрементальна компіляція часто асоціюється з такими мовами, як Lisp, де у вас був REPL, і ви могли інтерактивно вимагати мовної реалізації для складання певної функції. Якщо виконувалася функція, компіляція якої раніше не запитувалася, вона зазвичай інтерпретується. Компілятор партії, навпаки, компілював всі функції одразу, тобто в пакетній.