Якраз у часі Пояснення компіляції

Своєчасна компіляція - це метод підвищення ефективності інтерпретованих програм. Під час виконання програма може бути скомпільована у власний код для поліпшення її продуктивності. Він також відомий як динамічна компіляція.

Динамічна компіляція має деякі переваги перед статичною компіляцією. Під час запуску програм Java або C # середовище виконання може профілювати програму під час її запуску. Це дозволяє генерувати більш оптимізований код. Якщо поведінка програми змінюється під час її роботи, середовище виконання може перекомпілювати код.

Деякі недоліки включають затримки запуску та накладні витрати на компіляцію під час виконання. Щоб обмежити накладні витрати, багато компіляторів JIT компілюють лише часто використовувані шляхи коду.

Огляд

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

Компіляція JIT намагається використовувати переваги обох. Поки виконується інтерпретована програма, компілятор JIT визначає найбільш часто використовуваний код і компілює його до машинного коду. Залежно від компілятора, це можна зробити з методом або меншим розділом коду.

Динамічна компіляція була вперше описана в роботі Дж. Маккарті на темі LISP у 1960 році.

Just In Time Compilation, JIT, або Dynamic Translation - це компіляція, яка виконується під час виконання програми. Значення, під час виконання, на відміну від до виконання. Що відбувається, це переклад на машинний код. Переваги JIT обумовлені тим, що, оскільки компіляція відбувається під час виконання, компілятор JIT має доступ до динамічної інформації про час виконання, що дозволяє йому краще оптимізувати (наприклад, вбудовувати функції).

Що важливо зрозуміти про компіляцію JIT, це те, що вона скомпілює байт-код в інструкції машинного коду запущеної машини. Це означає, що отриманий машинний код оптимізований для архітектури процесора запущеної машини.

Деякі приклади компіляторів JIT - це JVM (Java Virtual Machine) на Java та CLR (Common Language Runtime), на C #.

Історія

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

У певний момент еволюції мов компілятори компілюють мову високого рівня в псевдокод, який потім інтерпретується (інтерпретатором) для запуску вашої програми. Це усунуло об’єктний код та виконувані файли та дозволило переносити ці мови на кілька операційних систем та апаратних платформ. Паскаль (який складений до P-Code) був одним із перших; Java і C # - більш пізні приклади. Зрештою термін P-Code був замінений байт-кодом, оскільки більшість псевдооперацій мають довжину в байти.

Компілятор Just-In-Time (JIT) - це особливість інтерпретатора часу виконання, який замість інтерпретації байт-коду кожного разу, коли викликається метод, компілює байт-код в інструкції машинного коду запущеної машини, а потім викликає це замість цього об’єктний код. В ідеалі ефективність запуску об’єктного коду подолає неефективність перекомпіляції програми кожного разу, коли вона запускається.

Типовий сценарій

Вихідний код повністю перетворюється на машинний код

Сценарій JIT

Вихідний код буде перетворений на структуру, подібну до мови асемблера [для колишнього IL (проміжна мова) для C #, ByteCode для java].

Проміжний код перетворюється на машинну мову лише тоді, коли програмі потрібні необхідні коди, перетворюються лише на машинний код.

Порівняння JIT проти Non-JIT

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

Деякі приклади JIT:

  • Java: JVM (віртуальна машина Java)
  • C #: CLR (Common Language Runtime)
  • Android: DVM (віртуальна машина Dalvik) або ART (Android RunTime) у новіших версіях

Віртуальна машина Java (JVM) виконує байт-код і веде підрахунок, скільки разів виконується функція. Якщо цей підрахунок перевищує заздалегідь визначений ліміт, JIT компілює код машинною мовою, який може бути безпосередньо виконаний процесором (на відміну від звичайного випадку, коли javac компілює код у байт-код, а потім Java, інтерпретатор інтерпретує цей рядок байт-коду за рядком, перетворює його в машинний код і виконує).

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