Я можу зрозуміти той факт, що Java потребує і компілятора, і інтерпретатора.
Це не так. У специфікації мови Java нічого не сказано, що Java повинен мати компілятор. Також у специфікації мови Java немає нічого, що б сказало, що Java повинен мати перекладача.
Чи використовувати інтерпретатор, компілятор чи їх комбінацію, повністю залишається на розсуд виконавця.
Насправді є реалізація Java, яка компілює безпосередньо машинний код, наприклад компілятор GNU для Java gcj
. Технічно кажучи, компілятор Java Oracle OpenJDK також компілює машинний код, зокрема байт-код JVM. Тепер, ви можете сказати, почекайте хвилинку, це не машинний код! Але існують програмні інтерпретатори для машинного коду x86, і є апаратні процесори, які можуть виконувати байт-код JVM, так що робить одне "рідним", а інше - ні?
Зауважте, що байт-код JVM знаходиться поза специфікацією мови Java, як і машинний код x86.
а потім віртуальна машина (в Windows, Linux, Android тощо) переводить цей байт-код у машинний код для поточної архітектури.
Знову ж, це залежить лише від виконавця.
Оригінальний Sun JVM ніколи не перекладав, він завжди тлумачив. Поточний інтерфейс Oracle OpenJDK JVM інтерпретує, і часто складаються лише ті частини, які виконуються. Maxine Research VM завжди компілює JIT. Реалізація Excelsior.JET збирається один раз, достроково. IKVM.NET JVM компілює в байт код CIL. Android Runtime збирає заздалегідь один раз під час встановлення. (Крім того, Android Runtime не розуміє байтовий код JVM, він використовує байт-код Dalvik, який є зовсім іншою мовою.)
Але чому Python потрібен і компілятор, і інтерпретатор?
Знову ж таки, це не так. У специфікації мови Python немає нічого, що говорить про те, що Python повинен мати компілятор. Також у специфікації мови Python немає нічого, що говорить про те, що Python повинен мати перекладача.
Зауважте, що насправді Python ніколи не трактується. Усі існуючі реалізації Python завжди компілюють Python на іншій мові. Ця мова може, а може і не, тоді, в свою чергу, тлумачиться, але ця мова є іншою мовою від Python. Python не трактується.
чому б не просто використовувати інтерпретацію?
Тому що Python не розроблений так, щоб його легко інтерпретувати машинами. Він призначений для легкого тлумачення людьми. Ото, CPython байт - код, буде розроблений , щоб бути легко інтерпретувати з допомогою машин. Отже, має сенс писати код мовою, призначеною для людей, і інтерпретувати мовою, призначеною для машин, і для того, щоб дістатися від однієї до іншої, потрібно скласти.
Наскільки я знаю, ви не можете виконати програму Python (компільовану для байтового коду) на будь-якій машині Windows чи Linux без змін.
Так, ти можеш. CPython VM доступний як для Windows, так і для Linux, як і PyPy, Jython та IronPython.
Мови не потрібно складати чи тлумачити. Мови просто є . Насправді мова може ідеально існувати, не маючи жодного перекладача чи компілятора! Наприклад, Планкалкюль Конрада Зузе, який він розробив у 1930-х роках, ніколи не реалізовувався за життя. Ви ще можете писати в них програми, ви могли аналізувати ці програми, міркувати про них, доводити властивості щодо них ... ви просто не могли їх виконати. (Ну, насправді, навіть це неправильно: ви, звичайно, можете запустити їх у голові або ручкою та папером.)
Тепер будь-яка конкретна реалізація мови може використовувати компілятор (або навіть декілька компіляторів), інтерпретатор або будь-яку комбінацію. Але це особливість реалізації , а не мова. Кожна мова може бути реалізована за допомогою компілятора, а кожна мова може бути реалізована за допомогою перекладача.
Зауважте, що ви не можете запустити програму без перекладача. Компілятор просто перекладає програму з однієї мови на іншу. Але це все. Тепер у вас є та сама програма, лише іншою мовою. Тільки спосіб дійсно отримати результат цієї програми полягає в інтерпретації його. Іноді мова є надзвичайно простою бінарною машинною мовою, і інтерпретатор насправді жорстко закодований у силікон (і ми називаємо це "процесор"), але це все ще інтерпретація.
Можливо, вас зацікавить і моя відповідь, яка пояснює відмінності та різні способи комбінування перекладачів, компіляторів JIT та компіляторів AOT, і ця відповідь стосується відмінностей між компілятором AOT та компілятором JIT .