Чому Python потрібен і компілятор, і інтерпретатор?


9

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

Але чому Python потрібен і компілятор, і інтерпретатор? Оскільки Python не є платформою незалежною, чому б не просто використовувати інтерпретацію? Наскільки я знаю, ви не можете виконати програму Python (компільовану для байтового коду) на будь-якій машині Windows чи Linux без змін. Або я помиляюся?


Ви можете помилитися. Якщо ви використовуєте Lua замість Python, ви помиляєтесь.
Базиль Старинкевич

Відповіді:


13

Наскільки я знаю, ви не можете виконати програму Python (компільована для байт-коду) на кожній машині, наприклад, на Windows або на Linux без змін.

Ви невірні. Байт-код пітона є крос-платформою. Див. Чи залежить байт-код python від версії? Чи залежить від платформи? на стеку переповнення. Однак він не сумісний у різних версіях. Python 2.6 не може виконувати файли Python 2.5. Тому, хоча крос-платформний, він, як правило, не корисний як формат розповсюдження.

Але чому Python потрібен і компілятор, і інтерпретатор?

Швидкість. Сувора інтерпретація повільна. Практично кожна "інтерпретована" мова фактично компілює вихідний код у якесь внутрішнє представлення, щоб не довелося повторно розбирати код. У випадку python він зберігає це внутрішнє представлення на диску, щоб він міг пропустити процес розбору / компіляції наступного разу, коли йому знадобиться код.


7

Я можу зрозуміти той факт, що 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 .


3
Відповіді, які проводять більшу частину свого часу педантично, замість того, щоб відповідати на запитання, викликають сумність.
Вінстон Еверт

3

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

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

Ці та інші чинники мають змогу зробити інтерпретаторів байт-кодів значно швидшими, ніж інші перекладачі.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.