Компилятор JIT (Just-In-Time) компилирует код во время выполнения, то есть во время работы программы. Поэтому стоимость компиляции является частью времени выполнения программы, и поэтому должна быть сведена к минимуму.
Противоположностью этому является опережающий (AOT) компилятор, который в основном синонимичен с "пакетным компилятором". Это преобразует исходный код в машинный код, а затем распространяется только машинный код. Следовательно, компилятор может быть очень медленным, поскольку он не влияет на время выполнения результирующей программы.
В наши дни, когда люди говорят «компилятор», они обычно имеют в виду компилятор AOT. Действительно, термин «компилятор AOT» стал действительно популярным сравнительно недавно, когда люди начали создавать компиляторы AOT для JIT-компилируемых языков, особенно JavaScript. Многие из этих языков, например C #, компилируются в промежуточный язык для виртуальной машины, который затем JIT компилируется в машинный код во время выполнения. Термин «AOT-компилятор» означает, что исходный код будет скомпилирован непосредственно в машинный код, поэтому во время выполнения не требуется никакой формы JIT-компиляции.
«Пакетный компилятор» - это немного архаичный термин. Реальным контрастом с пакетным компилятором, когда термин был популярен, был инкрементный компилятор . Инкрементная компиляция часто ассоциируется с такими языками, как Lisp, где у вас есть REPL, и вы можете в интерактивном режиме запросить реализацию языка для компиляции определенной функции. Если выполнялась функция, компиляция которой раньше не запрашивалась, она обычно интерпретируется. Пакетный компилятор, напротив, компилировал все функции одновременно, то есть в пакете.