JavaRush/Java блог/Random UA/Машинний код та байт код: якою мовою говорить ваша програ...

Машинний код та байт код: якою мовою говорить ваша програма?

Стаття з групи Random UA
учасників
У тих, хто тільки починає знайомитися з Java, часто виникає плутанина в поняттях машинний і байт код . Що вони являють собою? У чому різниця? У короткій нотатці ми постараємося дуже легко і зрозуміло розписати їх особливості, щоб раз і назавжди закрити це питання.
Машинний код та байт код: якою мовою говорить ваша програма?  - 1

Машинний код

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

Вроджена несумісність

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

CISC (Complex Instruction Set Computing) — концепція проектування процесорів, яка характеризується наступним набором властивостей:

  • багато команд, різних за довжиною;
  • багато режимів адресаації;
  • складне кодування інструкції.
RISC (Reduced Instruction Set Computing) – процесор зі скороченим набором команд. Команди одного формату, короткі, із простим кодуванням.
У нових поколіннях процесорів впроваджують додаткові набори інструкцій, які моделям старшого покоління просто невідомі. Через це програми, скомпільовані для однієї архітектури (або одного покоління процесорів) не можуть працювати на іншому апаратному забезпеченні. Усе це змушує займатися перекомпіляцією програм забезпечення їх роботи інших комп'ютерах. Втім, наново компілювати доводиться не лише через процесори, а й ще через відмінності у взаємодії програм та операційної системи. Саме через них неможливо запустити «виндову» програму під Linux, а «лінуксову» під Windows.

Байт-код

Байт-код багато в чому нагадує машинний код, тільки він використовує набір інструкцій не реального процесора, а віртуального. При цьому він може включати ділянки, орієнтовані на використання JIT-компілятора , що оптимізує виконання команд під реальний процесор, на якому запущена програма.
JIT-компіляція (англ. Just-in-time compilation, компіляція «на льоту») або динамічна компіляція (англ. dynamic translation) - це технологія збільшення продуктивності програмних систем, що використовують байт-код шляхом компіляції байт-коду в машинний код або до іншого формату безпосередньо під час роботи програми. "Офіційно" в Java до 9-ї версії був лише JIT-компілятор. У Java 9 виник ще один компілятор, причому компілює він з випередженням (AoT). Ця можливість дозволяє компілювати класи Java у нативний код перед запуском на віртуальній машині. Ця функція призначена для покращення часу запуску і малих, і великих програм, з обмеженим впливом на максимальну продуктивність.
Для CISC процесорів деякі інструкції можуть об'єднуватися у складніші конструкції, підтримувані процесором, а RISC – навпаки розбиватися більш прості послідовності команд.

Ще й віртуальна ОС

Втім, байт-код містить не тільки процесорні інструкції. У ньому також міститься логіка взаємодії з віртуальною операційною системою, яка робить поведінку програми незалежним від операційної системи, що використовується на комп'ютері. Це добре видно в JVM , де робота з системними викликами та GUI часто не залежать від ОС, на якій запущено програму. За великим рахунком, JVM емулює запуск процесу програми, на відміну від рішень на кшталт Virtual Box , які створюють лише віртуальну систему/залізо.

JVM одна така?

Безумовно ні. Той самий DotNet CLI це теж віртуальна машина, яку найчастіше використовують на комп'ютерах, що працюють під Windows з x86 сумісними процесорами. Втім існує її реалізація і під інші системи: програми під нього повинні працювати в Windows RT запущеної на ARM (RISC) сумісних процесорах, або можна запустити їх на Linux/OSX в середовищі Mono , що є сторонньою (і тому не повністю сумісною) реалізацією DotNet для цих платформ. Так що ця платформа, як і JVM , працює на різних процесорах та різних ОС. Існує ще безліч схожих рішень (як старих, так і нових): LLVM, Flash SWF та інші. Деякі мови програмування мають власні віртуальні машини. Наприклад, CPython компілює вихідні коди з PY в файли PYC – скомпільований (compiled) байт код який підготовлений до запуску в PVM . Або є набагато давніший приклад - Lisp можна компілювати у файли FASL (Fast Load). Фактично вони містять дерево AST , побудоване генератором з вихідного коду. Ці файли можуть бути прочитані та запущені інтерпретатором Lisp на різних платформах, або використані для створення машинного коду для апаратної архітектури, що використовується на даний момент.
Коментарі
  • популярні
  • нові
  • старі
Щоб залишити коментар, потрібно ввійти в систему
Для цієї сторінки немає коментарів.