Чому немає інших мов програмування, які компілюються в байт-код Python?


51

У Java є кілька мов, які компілюються в байт-код Java і можуть працювати на JVM - Clojure, Groovy і Scala - основні з яких я запам'ятаю вгорі голови.

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

Це лише тому, що ніхто не турбується, або є якесь вроджене обмеження чи бар'єр, який ускладнює це?


30
... тому що вони не хочуть мати справу з GIL? ;)
Мейсон Уілер

4
Інстинкти скажуть мені, що це має багато спільного з тим, наскільки зрілим є JVM, чітко визначений, і JVM є практично на всіх платформах або нерозумно легко придбати.
Ріг

4
Я підозрюю також, що більшість JVM набагато швидше, ніж інтерпретатори пітона.
Пітер Сміт

19
Орієнтуючись на байт-код Java, ви отримуєте всі функції JVM (безпека, продуктивність, портативність, масштабованість тощо). Націлення на байт-код Python не дуже отримує вас.
Девід Шварц

3
Пізніші версії інтерпретатора Python не розпізнаються. Як хто може реалізувати мову програмування, що компілюється в байт-код Python?
Гас

Відповіді:


77

Просто: останній раз, коли я перевіряв, Python не мав жодної формальної специфікації, включаючи його байт-код. CPython - це специфікація, а переносимість байт-коду - IIRC не потрібна. Таким чином, це рухома, недокументована ціль, розроблена для певної мови.


22
Насправді, деталі формату байт-коду часто змінюються між незначними версіями, і навіть 99% сумісний PyPy навіть не намагається (адже вони додають власні інструкції щодо байт-коду).

Примітка: Python - мова - має офіційну специфікацію (див. "PEPs"). "Віртуальна машина Python" не має. Це дійсно не схоже на (наприклад) Java, де вказано обидва.
Альберт

56

Існує кілька мов JVM, оскільки були талановиті люди, які хотіли написати код, який би працював з існуючим кодом Java, але вони не хотіли писати Java .

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

Ви можете подивитися на це двома способами: існують альтернативні мови для JVM, оскільки Java настільки поширений, або немає альтернативних мов для інтерпретатора байт-коду Python, оскільки Python не смокче.


7
Сподіваюся, ви не маєте на увазі, що Java смокче або Java смокче більше, ніж Python :-)
Giorgio

8
@Giorgio: Я маю на увазі, що творці Groovy, Scala, Clojure тощо вважали, що є багато можливостей для вдосконалення. Ви маєте на увазі, що Python смокче?
кевін клайн

8
Після роботи з python я б сказав, що "низький коефіцієнт смоктання" був би неточним. Це купує занадто багато загальноприйнятих речей, і вся ця «самостійна» вкрай контрпродуктивна. Насправді німий. Як метод класу не знає, куди він належить?
Ріг

6
@Rig Особисто я вважаю, що підхід Python є більш елегантним. OO органічно випливає із синтаксису, а не вимагає спеціального ключового слова, схожого на змінну. Що стосується того, чому методи класів не знають, де вони знаходяться, це тому, що визначення класів Python - це просто код, і цей код не є привабливим, оскільки він, можливо, знаходиться всередині визначення класу. Ви можете визначити методи де завгодно і додати їх до класу під час виконання. Насправді, ви можете взяти одну і ту ж функцію і використовувати її як метод у кількох класах - те, що насправді б не працювало з thisпарадигмою.
Сурма

6
Я думаю, що це справа віртуальних машин, а не мов. JVM - це ефективний VM з генераційним сміттєзбірником, JIT і т.д. Саме CPython висмоктується як платаформа. Btw hyhy існує.
PuercoPop

26

Є такі технічні недоліки, як GIL у CPython, але мало сприйнятих мовних недоліків, тому час виконання не є точкою продажу спільноти Python. З точністю до навпаки, є більше варіантів виконання запуск через незадоволення реалізацією GIL / CPython.

Мова Java набагато злісніше, ніж JVM (навіть у спільноті Java).

JVM досить добре розглядається в більшості кіл; таким чином, прагнення до іншого / кращого мовного фронту закінчується перевагами високооптимізованого заднього кінця JVM.


10

Я кажу, що Мейсон Вілер має рацію. Це здебільшого проблема глобального блоку інтерпретаторів, що робить паралельність дуже тернистою проблемою. Оскільки існують й інші віртуальні машини, які роблять сумісність дуже добре порівняно, є сенс розробити для них мови. Також останнім часом Python зазнав серйозних зрушень у мові, і багато бібліотек часом не сприйняли можливість сумісності бути легким кошмаром. Наприклад, оскільки я використовую PIL для роботи із зором, мені доведеться кодувати в Python 2.7 або нижче. Це не стосується налаштувань JVM чи CLI, які, особливо у випадку останнього, були розроблені з урахуванням мовного інтеропу.

Провели ще кілька досліджень і, мабуть, насправді є два GIL, не лише одна. Інші елементи контролю імпорту .


1
"GIL free" є однією з технічних причин, згаданих на "Причинах того, що програмісти CPython можуть бути зацікавлені у IronPython" у вікі Python .
янніс

1
@YannisRizos: Безумовно, доступ до .NET-рамки не зовсім невластивий. Звичайно, можливо, що користувачі CPython можуть бути абсолютно незацікавлені в цьому.
Роберт Харві

@RobertHarvey Ninja це відредагував. Хоча я не вважаю "доступ до фантазійних нових іграшок" технічною причиною (не те, що іграшки не великі), у вікі також зазначається, що IronPython легше розширити.
янніс

8

Інші відповіді мають багато сенсу, але насправді існують мови, які збираються на Python. Де є воля ...

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

Виходячи з коментарів, в даний час ми знаємо три альтернативні мови, які використовують Python VM (сміливо додайте сюди будь-які інші):

  • Мочі описує себе як динамічно типізовану мову програмування для функціонального програмування та програмування в акторському стилі .
  • Hy : Охарактеризує себе як діалект Ліспа, вбудований у Python .
  • dg : Описує себе як (технічно) просту мову, яка компілюється в байт-код CPython .

2
Також варто згадати HyLang
ideaman42

1
І дг .
hakatashi

6

Інша причина полягає в тому, що СВМ є високооптимізованою, розвиненою та надзвичайно повною екосистемою. Сам по собі він надзвичайно добре конкурує з будь-якою з інших складених мов. (Я не скажу, що це найкращий VM загального призначення там, але я, безумовно, заробив свою кар’єру на цьому.) Тож отримання доступу до JVM, не маючи написання байт-коду, бажано саме по собі.

Однак, Python VM хороший, але (нічого проти Python) не має серйозних недоліків. Навколишнє середовище виконання Python добре відповідає динамічному характеру мови, але може насправді здивувати вас, коли ви ознайомитесь із його використанням пам'яті, глобальним блокуванням або нарізкою.

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

Я люблю Python, я справді це роблю, і ненавиджу це говорити, але іноді вистава просто кидає мені в зуби - інакше чому б критичні бібліотеки Python, як numpy або scipy, повинні повернутися до коду С?

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

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