Що таке компілятор пакетів?


28

У мене є така пропозиція з курсу мого компілятора (в контексті розфарбовування графіків):

Оскільки це повільно, забарвлення графіків, як правило, використовується в компіляторах пакетів, тоді як лінійне сканування, як правило, використовується в компіляторах JIT.

Я не зміг знайти чіткого визначення в Інтернеті. Отже, що робить компілятор пакетним компілятором?


Це питання тут поза темою. softwareengineering.stackexchange.com - це краще місце для запитання
Basile Starynkevitch

Відповіді:


42

Компілятор JIT (Just-In-Time) компілює код під час виконання, тобто під час роботи програми. Тому вартість компіляції є частиною часу виконання програми, і тому її слід мінімізувати.

Протилежністю цьому є компілятор випередження (AOT), який в основному є синонімом "компілятора пакетів". Це перетворює вихідний код у машинний код, а потім просто розподіляється машинний код. Тому компілятор може бути дуже повільним, оскільки це не впливає на час виконання результуючої програми.

Сьогодні, коли люди кажуть "компілятор", вони зазвичай означають компілятор AOT. Дійсно, термін "компілятор AOT" став популярним порівняно недавно, коли люди почали робити компілятори AOT для мов компільованого JIT, зокрема JavaScript. Багато з цих мов, наприклад C #, компілюються в проміжну мову для VM, яка потім JIT компілюється для машинного коду під час виконання. Термін "компілятор AOT" має зауваження, що вихідний код буде скомпільований безпосередньо до машинного коду, тому жодна форма компіляції JIT не потрібна під час виконання.

"Компілятор пакетів" є трохи архаїчним терміном на даний момент. Справжній контраст із компілятором пакетів, коли термін користувався популярністю, був поступовим компілятором . Інкрементальна компіляція часто асоціюється з такими мовами, як Lisp, де у вас був REPL, і ви могли інтерактивно вимагати мовної реалізації для складання певної функції. Якщо виконувалася функція, компіляція якої раніше не запитувалася, вона зазвичай інтерпретується. Компілятор партії, навпаки, компілював всі функції одразу, тобто в пакетній.


1
А ще в минулі часи компілятори, де взагалі не працювали в інтерактивному режимі, вам довелося подати завдання до чергової серії, щоб скласти свою програму
Neuromancer

І деякі мовні реалізації (awk, cpython GNU тощо) складають весь вхід до внутрішнього представлення як перший крок під час виконання, який змішує деякі описані тут властивості.
dmckee

1
@dmckee більшість, якщо не всі мовні реалізації, насправді
user253751

Ще одна неоднозначність: інструменти, звані компілятори пакетних пакетів, існували для операційних систем MSDOS, ці компільовані пакетні файли у виконувані файли ....
rackandboneman

Звичайно, завжди є внутрішнє представництво. Але іноді це мова сама по собі, як у Gcc, Llvm чи .Net. Це пов’язано з архітектурою front / end / back-end, перехідною формою, що перетворює мову (C, C ++, Java, fortran ..) на загальну мову нижчого рівня, потім запускаються алгоритми оптимізації, і нарешті, цей оптимізований код у загальній мові перетворюється заднім числом в байт-код або асемблер, виконуваний або статичну або динамічну бібліотеку.
reuns

11

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

Компілятор пакетів - це компіляція, коли користувач не чекає результату компіляції. Ми сказали б, використовуючи більш сучасну термінологію, зроблену на задньому плані.

Це зворот JIT (Just-In-Time), який робиться "в прямому ефірі" в той час, коли це потрібно, без розкоші витрачати зайвий час на більш ретельну обробку.

Повільна швидкість складання партії може бути проілюстрована цим:

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

Джерело: https://xkcd.com/303/

Або навіть це:

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

Джерело: http://dilbert.com/strip/2013-06-22

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.