JVM - це компілятор чи інтерпретатор?


83

У мене дуже основне запитання про JVM: компілятор чи інтерпретатор?

Якщо це інтерпретатор, то як щодо компілятора JIT, який існує всередині JVM?
Якщо ні, то що саме являє собою JVM? (Я не хочу базового визначення jVM перетворення байтового коду в машинний код тощо)


16
JVM - це віртуальна машина. Bytcode заходить, спостерігаються ефекти програми. Все інше - деталь реалізації.

1
Так, не існує "" JVM, є кілька реалізацій специфікації.
paxdiablo

@delnan, будь ласка, напиши це як відповідь. Я б дуже хотів підтримати таку відповідь.
aioobe

@aioobe: Не буду. Я не думаю, що це відповідає на поставлене тут запитання - це дуже корисна перспектива, але питання (чітко зазначене в заголовку та дописі) прямо вимагає цих деталей реалізації.

Справедливо. Я б сказав, що це відповідь на "Якщо ні, то що саме JVM?" частина все ж. (Оскільки віртуальна машина Java є скоріше специфікацією, ніж реалізацією.)
aioobe

Відповіді:


170

По-перше, давайте чітко уявляти наступні терміни

Javacє Java Compiler - Компілює ваш код Java у байт-код

JVMє віртуальна машина Java - запускає / інтерпретує / перекладає байт-код у власний машинний код

JITis Just In Time Compiler - Компілює задану послідовність команд байт-кодів до машинного коду під час виконання перед тим, як виконувати його власним чином. Основна мета - зробити важку оптимізацію продуктивності.

Отже, давайте знайдемо відповіді на ваші запитання ..

1) JVM: is it a compiler or an interpreter? - Відповідь: Перекладач

2) what about JIT compiler that exist inside the JVM? - Відповідь: Якщо ви повністю прочитали цю відповідь, ви, мабуть, знаєте це зараз

3) what exactly is the JVM? - відповіді :

  • JVM - це віртуальна платформа, яка розміщена у вашій оперативній пам'яті
  • Його компонент, завантажувач класів, завантажує .classфайл в оперативну пам'ять
  • Компонент перевірки байтового коду в JVM перевіряє, чи є у вашому коді будь-які порушення обмеження доступу. (Це одна з основних причин, чому Java безпечна)
  • Далі компонент Execution Engine перетворює байт-код у виконуваний машинний код

Сподіваюся, це допомогло вам ..


Ви кажете, що JVM перекладає байт-код у власний машинний код. Я не впевнений, чи правильний тут термін "переклад".
Корай Тугай

Високо оцінений. Ви майже очистили мій сумнів у різниці між компіляцією та інтерпретацією, байт-кодом та кодом m / c. Ваша відповідь сказала мені, що байт-код перетворюється в машинний код інтерпретатором, а компілятор перетворює вихідний код у байт-код.
Harsimer

2
Чи можете ви також сказати мені, що таке власний код? Це означає машинний код? Я намагаюся вивчити весь цей процес складання та інтерпретації, але ці проміжні терміни дуже заплутані.
Harsimer

6
Отже, як JVM, так і JIT перетворюють байтовий код у специфічний для платформи машинний код. То що ж між ними різниться? Ви можете пояснити це широко?
Адітя

6
"Запуск / інтерпретація / переклад байт-коду у власний машинний код" - нісенітниця. Він або "запускає / інтерпретує", або "перекладає байт-код у власний машинний код". Не обидва одночасно.
Маркіз Лорнський,

32

Це трохи і того, і іншого, але ні в традиційному розумінні.

Сучасні JVM беруть байт-код і компілюють його у власний код за потреби. "JIT" у цьому контексті означає "точно вчасно". Він виступає як інтерпретатор іззовні, але насправді за лаштунками він компілюється у машинний код.

JVM не слід плутати з компілятором Java, який компілює вихідний код у байт-код. Тож не корисно вважати його "компілятором", а скоріше знати, що у фоновому режимі він виконує деяку компіляцію.


8
@NaeemShah: Мені підлещує, що ця відповідь вам сподобалась, щоб скопіювати її майже від слова до слова у допис у блозі під вашим іменем. І ви маєте на це право, але за схемою ліцензування StackOverflow ви юридично зобов’язані надати атрибуцію сюди, і ви повинні ліцензувати свою публікацію в блозі за тією ж ліцензією. Дивіться нижній колонтитул цього веб-сайту, який посилається на таку ліцензію: creativecommons.org/licenses/by-sa/3.0 . Дивіться також цю публікацію в блозі: blog.stackoverflow.com/2009/06/attribution-required
Марк Пітерс

8

Як і @delnan, який уже зазначався в розділі коментарів, це ні те, ні інше .

JVM - це абстрактна машина, на якій запущений байт-код Java .

JVM має кілька реалізацій:

  • HotSpot (перекладач + компілятор JIT )
  • Dalvik (перекладач + компілятор JIT)
  • ART ( компілятор AOT + компілятор JIT)
  • GCJ (компілятор AOT)
  • JamVM (перекладач)

... та багато інших .

Більшість інших відповідей, коли говорять про JVM, стосуються або HotSpot, або якоїсь суміші вищевказаних підходів до реалізації JVM.


1
ART також є інтерпретатором: "Android може насправді запускати .dexкод безпосередньо за допомогою інтерпретації або компіляції Just-In-Time (JIT) ..." ( source.android.com/devices/tech/ota/ab/… )
Ірфан Латіф

5

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


Ви, мабуть, маєте на увазі HotSpot
cubuspl42

5

Це обидва. Він може інтерпретувати байт-код і скомпілювати його до власного коду.


0

Як казали інші, це і те, і інше! Якщо ви хочете докладно вказати його, ніж ви можете побачити: Цей опис IBM


0

Javac - компілятор, але не традиційний компілятор. Компілятор, як правило, перетворює вихідний код на мову машинного рівня для виконання, і це робиться одним пострілом, тобто весь код береться і перетворюється на мову машинного рівня ОДИН раз. (докладніше про це нижче). Поки JavaC перетворює його у байт-код замість мови машинного рівня.

JIT є компілятором Java, але також виконує роль інтерпретатора. Типовий компілятор перетворює весь код відразу з вихідного коду на мову машинного рівня. Натомість JIT переходить рядок за рядком (виконання рядків за рядком є ​​особливістю інтерпретаторів) і перетворює байт-код, сформований JavaC, у мову машинного рівня та виконує його. JVM, який містить JIT, має кілька реалізацій. Точка доступу - одна з основних для програмування на Java. Реалізація точки доступу змушує JIT оптимізувати виконання, перетворюючи відрізки коду, які повторюються, на мову машинного рівня одночасно (як компілятор, як згадано вище), щоб їх можна було виконати швидше, замість перетворення кожного рядка коду 1 на 1. Отже, відповідь не є чорно-білою щодо типових визначень Компілятора та Інтерпретатора.

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


-5

JVM має як компілятор, так і інтерпретатор. Оскільки компілятор компілює код і генерує байт-код. Після цього інтерпретатор перетворює байт-код в машинозрозумілий код.

Приклад: Напишіть і скомпілюйте програму, і вона працює в Windows. Перенесіть файл .class в іншу ОС (Unix), і він буде працювати через інтерпретатор, який перетворює байт-код в машинозрозумілий код.


1
Ви забули вимкнути Caps :)
Олексій Васинов

7
Неправильно, ви спочатку компілюєте вихідний код в байт-код (не має нічого спільного з JVM), потім JVM інтерпретує байт-код і компілює його до власного коду (але, можливо, не кожної частини).
The_Fox
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.