Що конкретно робить компілятор JIT на відміну від компілятора, який не є JIT? Чи може хтось дати короткий і простий для розуміння опис?
Що конкретно робить компілятор JIT на відміну від компілятора, який не є JIT? Чи може хтось дати короткий і простий для розуміння опис?
Відповіді:
Компілятор JIT запускається після запуску програми і компілює код (як правило, байт-код або якусь інструкцію VM) на льоту (або як раз вчасно, як його називають) у форму, яка, як правило, швидша, як правило, рідний процесор хостингу набір інструкцій JIT має доступ до інформації про динамічний час виконання, тоді як стандартний компілятор не робить і може зробити кращі оптимізації, такі як вбудовані функції, які часто використовуються.
Це на відміну від традиційного компілятора, який збирає весь код на машинну мову до першого запуску програми.
Якщо перефразовувати, звичайні компілятори будують всю програму як файл EXE перед тим, як запустити її. Для нових програм стилю створюється збірка з псевдокодом (p-кодом). Тільки ПІСЛЯ ви виконаєте програму в ОС (наприклад, двічі клацнувши на її значку), компілятор (JIT) запустить і генерує машинний код (m-код), який буде розбиратися процесором на базі Intel.
На початку компілятор відповідав за перетворення мови високого рівня (визначеного як вищий рівень, ніж асемблер), в об'єктний код (машинні інструкції), який потім буде пов'язаний (за допомогою лінкера) у виконуваний файл.
У один момент еволюції мов компілятори склали мову високого рівня в псевдо-код, який потім був би інтерпретований (інтерпретатором) для запуску вашої програми. Це усунуло об'єктний код та виконувані файли та дозволило переносити ці мови на кілька операційних систем та апаратних платформ. Паскаль (який складено до P-Code) був одним із перших; Java та C # - більш пізні приклади. Врешті-решт термін P-Code був замінений на байт-код, оскільки більшість псевдооперацій є байтовими.
Компілятор Just-In-Time (JIT) - це особливість інтерпретатора виконання, який замість інтерпретації байт-коду кожного разу, коли викликується метод, буде збирати байт-код в інструкції машинного коду запущеної машини, а потім викликати це об'єктний код замість цього. В ідеалі ефективність запущеного об'єктного коду подолає неефективність перекомпіляції програми кожного разу, коли вона запускається.
JIT - саме вчасно слово говорить саме тоді, коли це потрібно (на вимогу)
Вихідний код повністю перетворюється в машинний код
Вихідний код буде перетворений на мову складання, як структура [для колишнього IL (проміжна мова) для C #, ByteCode для Java].
Проміжний код перетворюється на машинну мову лише тоді, коли потрібні додатки, які необхідні коди перетворюються лише на машинний код.
У JIT не весь код перетворюється в машинний код, спочатку частина коду, яка необхідна, буде перетворена в машинний код, потім, якщо названий метод або функціональність не є в машині, то він буде перетворений на машинний код ... він зменшується тягар на процесор.
Оскільки машинний код буде генеруватися під час виконання .... компілятор JIT створить машинний код, оптимізований для роботи архітектури ЦП машини.
Як згадували інші
JIT означає Just-in-Time, що означає, що код збирається тоді, коли це потрібно, а не перед виконанням.
Просто, щоб додати крапку до вищезгаданого обговорення, JVM підтримує підрахунок, скільки разів виконується функція. Якщо ця кількість перевищує попередньо визначений ліміт, JIT компілює код на машинну мову, який може бути безпосередньо виконаний процесором (на відміну від звичайного випадку, коли javac компілює код у байт-код, а потім у java - інтерпретатор інтерпретує цей рядок байт-коду за рядком, перетворює його в машинний код і виконує).
Також наступного разу, коли ця функція обчислюється, знову складається такий же складений код на відміну від звичайної інтерпретації, в якій код інтерпретується знову за рядком. Це робить виконання швидшим.
Компілятор JIT компілює лише байт-код до еквівалентного нативного коду при першому виконанні. Після кожного наступного виконання JVM просто використовує вже складений нативний код для оптимізації продуктивності.
Без компілятора JIT інтерпретатор JVM перекладає байт-код рядок за рядком, щоб виглядати так, ніби виконується нативна програма.
JIT означає Just-in-Time, що означає, що код збирається тоді, коли це потрібно, а не перед виконанням.
Це вигідно, оскільки компілятор може генерувати код, оптимізований для вашої конкретної машини. Статичний компілятор, як і ваш середній компілятор С, буде компілювати весь код на виконуваний код на машині розробника. Отже, компілятор проведе оптимізацію на основі деяких припущень. Він може компілювати повільніше і робити більше оптимізацій, оскільки це не уповільнює виконання програми для користувача.
Після створення байтового коду (який є нейтральним для архітектури) компілятором Java, виконанням буде керуватися JVM (на Java). Код байта завантажується в JVM завантажувачем, після чого інтерпретується кожна байтна інструкція.
Коли нам потрібно викликати метод кілька разів, нам потрібно тлумачити один і той же код багато разів, і це може зайняти більше часу, ніж потрібно. Отже, у нас є компілятори JIT (щойно вчасно). Коли байт буде завантажений у JVM (його час запуску), весь код буде складений, а не інтерпретований, таким чином заощаджуючи час.
Компілятори JIT працюють тільки під час виконання, тому у нас немає жодного бінарного виводу.
Компілятор Just In Time (JIT):
він компілює байт-коди Java в машинні інструкції цього конкретного процесора.
Наприклад, якщо в нашому Java-коді є заява циклу:
while(i<10){
// ...
a=a+i;
// ...
}
Вищенаведений код циклу працює 10 разів, якщо значення i дорівнює 0.
Не потрібно збирати байт-код 10 разів знову і знову, оскільки та сама інструкція буде виконуватися 10 разів. У такому випадку потрібно скомпілювати цей код лише один раз, і значення можна змінити на необхідну кількість разів. Отже, компілятор Just In Time (JIT) відслідковує такі твердження та методи (як було сказано вище) і компілює такі фрагменти байтового коду в машинний код для кращої продуктивності.
Іншим подібним прикладом є пошук шаблону за допомогою "Regular Expression" у списку рядків / пропозицій.
Компілятор JIT не компілює весь код до машинного коду. Він компілює код, який має аналогічну схему під час виконання.
Дивіться цю документацію Oracle на Understand JIT, щоб прочитати більше.
У вас є код, сумісний з якоюсь ІЛ (проміжною мовою). Під час запуску програми комп'ютер не розуміє цього коду. Він розуміє лише нативний код. Тож компілятор JIT збирає ваш IL в нативний код на льоту. Це робиться на рівні методу.
Я знаю, що це стара тема, але оптимізація виконання - ще одна важлива частина компіляції JIT, яка, здається, не обговорюється тут. В основному компілятор JIT може контролювати програму під час її запуску для визначення шляхів покращення виконання. Тоді вони можуть внести ці зміни під час руху - під час виконання. Оптимізація Google JIT (у javaworld є досить гарна стаття про це. )
Щойно вчасно компілятор (JIT) - це програмне забезпечення, яке приймає отримує не виконаний вхід і повертає відповідний машинний код, який потрібно виконати. Наприклад:
Intermediate representation JIT Native machine code for the current CPU architecture
Java bytecode ---> machine code
Javascript (run with V8) ---> machine code
Наслідком цього є те, що для певної архітектури процесора повинен бути встановлений відповідний компілятор JIT.
Хоча в цілому можуть бути винятки, коли ми хочемо перетворити вихідний код у машинний код, ми можемо використовувати:
Jit означає щойно вчасно компілятор jit - це програма, яка перетворює Java-байт-код в інструкцію, яку можна направити безпосередньо на процесор.
Використання компілятора Java щойно (справді другий компілятор) на конкретній системній платформі відповідає байтовому коду до конкретного системного коду, після того як код буде перекомпільований компілятором jit, він, як правило, швидше працюватиме на комп'ютері.
Щойно вчасно компілятор постачається з віртуальною машиною і використовується необов'язково. Він компілює байтовий код у визначений для платформи код, який негайно виконується.
компіляція щойно вчасно (JIT) (також динамічний переклад або компіляція під час виконання ) - це спосіб виконання комп'ютерного коду, який передбачає компіляцію під час виконання програми - під час виконання програми - а не до її виконання .
ІТ-компіляція - це поєднання двох традиційних підходів до перекладу машинного коду - дострокової компіляції (AOT) та інтерпретації - та поєднує деякі переваги та недоліки обох. Компіляція JIT поєднує швидкість компільованого коду та гнучкість інтерпретації .
Розглянемо JIT, що використовується в JVM,
Наприклад, компілятори HotSpot JVM JIT генерують динамічні оптимізації. Іншими словами, вони приймають рішення щодо оптимізації під час роботи програми Java та генерують високоефективні інструкції з власної машини, орієнтовані на базову архітектуру системи.
Коли метод обраний для компіляції, JVM подає свій байт-код до компілятора Just-In-Time (JIT). JIT повинен зрозуміти семантику та синтаксис байт-коду, перш ніж він зможе правильно скомпілювати метод. Щоб допомогти компілятору JIT проаналізувати метод, його байт-код спочатку переформулюється у внутрішнє представлення, яке називається деревами слідів, яке нагадує машинний код ближче, ніж байт-код. Потім аналіз та оптимізація проводяться на деревах методу. Наприкінці дерева переводяться у рідний код.
Дерево слідів - це структура даних, яка використовується при компіляції коду програмування. Дерева слідів використовуються у типі "компілятора просто в часі", який відстежує код, який виконується під час гарячих точок, та компілює його. Зверніться до цього .
Посилання:
Компілятор, який не є JIT, приймає вихідний код і перетворює його в специфічний машинний байтний код під час компіляції. Компілятор JIT бере машинний агностичний байт-код, який був сформований під час компіляції та перетворює його в специфічний машинний байт-код під час виконання. Компілятор JIT, який використовує Java, - це те, що дозволяє одному бінарному файлу працювати на безлічі платформ без змін.
20% байтового коду використовується 80% часу. Компілятор JIT отримує ці статистичні дані і оптимізує цей 20% байтового коду для швидшого запуску шляхом додавання вбудованих методів, видалення невикористаних замків тощо, а також створення байтового коду, характерного для цієї машини. Цитую цю статтю, я виявив, що це зручно. http://java.dzone.com/articles/just-time-compiler-jit-hotspot
JIT посилається на механізм виконання у кількох реалізаціях JVM, той, який швидший, але вимагає більше пам’яті, - це щойно створений компілятор. У цій схемі байт-коди методу складаються до власного машинного коду при першому виклику методу. Після цього кешується нативний машинний код методу, тому він може бути використаний повторно наступного разу, коли буде використаний той самий метод.
JVM фактично виконує етапи компіляції під час виконання з міркувань продуктивності. Це означає, що у Java немає чистого розділення компіляції та виконання. Спочатку робиться так звана статична компіляція з вихідного коду Java в байт-код. Потім цей байт-код передається JVM для виконання. Але виконання байт-коду відбувається повільно, тому JVM вимірює, як часто виконується байт-код, і коли він виявляє "гарячу точку" коду, який запускається дуже часто, він виконує динамічну компіляцію від байт-коду до машинного коду "точки доступу" (hotspot profiler). Тож ефективно сьогодні програми Java управляються машинним кодом.
Для поліпшення продуктивності на Java використовується компілятор Just In Time, також відомий як компілятор JIT. Він включений за замовчуванням. Це компіляція, зроблена під час виконання досить раніше. Java популяризувала використання компілятора JIT, включивши його в JVM.