Что такое пакетный компилятор?

28

У меня есть следующая цитата из курса моего компилятора (в контексте раскраски графа):

Поскольку это медленно, раскраска графа имеет тенденцию использоваться в пакетных компиляторах, в то время как линейное сканирование имеет тенденцию использоваться в компиляторах JIT.

Я не мог найти четкое определение в Интернете. Итак, что делает компилятор пакетным компилятором?

Родриго
источник
Этот вопрос здесь не по теме. softwareengineering.stackexchange.com это лучшее место , чтобы спросить
Basile Starynkevitch

Ответы:

42

Компилятор JIT (Just-In-Time) компилирует код во время выполнения, то есть во время работы программы. Поэтому стоимость компиляции является частью времени выполнения программы, и поэтому должна быть сведена к минимуму.

Противоположностью этому является опережающий (AOT) компилятор, который в основном синонимичен с "пакетным компилятором". Это преобразует исходный код в машинный код, а затем распространяется только машинный код. Следовательно, компилятор может быть очень медленным, поскольку он не влияет на время выполнения результирующей программы.

В наши дни, когда люди говорят «компилятор», они обычно имеют в виду компилятор AOT. Действительно, термин «компилятор AOT» стал действительно популярным сравнительно недавно, когда люди начали создавать компиляторы AOT для JIT-компилируемых языков, особенно JavaScript. Многие из этих языков, например C #, компилируются в промежуточный язык для виртуальной машины, который затем JIT компилируется в машинный код во время выполнения. Термин «AOT-компилятор» означает, что исходный код будет скомпилирован непосредственно в машинный код, поэтому во время выполнения не требуется никакой формы JIT-компиляции.

«Пакетный компилятор» - это немного архаичный термин. Реальным контрастом с пакетным компилятором, когда термин был популярен, был инкрементный компилятор . Инкрементная компиляция часто ассоциируется с такими языками, как Lisp, где у вас есть REPL, и вы можете в интерактивном режиме запросить реализацию языка для компиляции определенной функции. Если выполнялась функция, компиляция которой раньше не запрашивалась, она обычно интерпретируется. Пакетный компилятор, напротив, компилировал все функции одновременно, то есть в пакете.

Дерек Элкинс
источник
1
И в старые времена, когда компиляторы вообще не работали в интерактивном режиме, вы должны были отправить задание в очередь
Neuromancer
А некоторые языковые реализации (GNU awk, cpython и т. Д.) Компилируют весь ввод во внутреннее представление в качестве первого шага во время выполнения, который смешивает некоторые из свойств, описанных здесь.
dmckee
1
@dmckee большинство, если не все языковые реализации, на самом деле
user253751
Другая двусмысленность: для операционных систем MSDOS существовали инструменты, называемые пакетными компиляторами, эти скомпилированные пакетные файлы в исполняемые файлы ....
rackandboneman
Конечно, всегда есть внутреннее представление. Но иногда это сам по себе язык, как в Gcc, Llvm или .Net. Это связано с архитектурой front-end / middle / back-end, интерфейсом, преобразующим язык (C, C ++, Java, fortran ..) в общий язык более низкого уровня, затем запускаются алгоритмы оптимизации и наконец, этот оптимизированный код на общем языке преобразуется серверной частью в байт-код или ассемблер, исполняемую или статическую или динамическую библиотеку.
восходит
11

Смысл подразумевается в цитате, которую вы даете! Он вытекает из вычислительного термина пакетной обработки, который используется, когда задача не выполняется в режиме реального времени, но он запланирован для последующего выполнения операционной системой, когда нагрузка (часто для операций в реальном времени) меньше.

Пакетный компилятор - это тот, который выполняет компиляцию, когда пользователь не ожидает результата компиляции. Это тот, который мы бы сказали, используя более современную терминологию, сделанную на заднем плане.

Это противоположность JIT (Just-In-Time), который выполняется «вживую» в то время, когда это необходимо, без роскоши тратить дополнительное время на более тщательную обработку.

Более медленная скорость пакетной компиляции может быть проиллюстрирована этим:

введите описание изображения здесь

Источник: https://xkcd.com/303/

Или даже это:

введите описание изображения здесь

Источник: http://dilbert.com/strip/2013-06-22

Брайан Томпсетт - 汤 莱恩
источник