Почему нет других языков программирования, которые компилируются в байт-код Python?

51

В Java есть несколько языков, которые компилируются в байт-код Java и могут работать на JVM - Clojure, Groovy и Scala - основные из них, которые я помню из головы.

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

Это просто потому, что никто не беспокоился, или есть какое-то внутреннее ограничение или барьер, который делает это трудным?

Michael0x2a
источник
30
... потому что они не хотят иметь дело с GIL? ;)
Мейсон Уилер
4
Инстинкты сказали бы мне, что это во многом зависит от того, насколько зрелой является JVM, она хорошо определена, и JVM работает практически на всех платформах или глупо легко приобрести.
Рог
4
Я также подозреваю, что большинство JVM намного быстрее, чем интерпретаторы Python.
Питер Смит
19
Ориентируясь на байт-код Java, вы получаете все функции JVM (безопасность, производительность, переносимость, масштабируемость и т. Д.). Ориентация на байт-код Python вас не сильно устраивает.
Дэвид Шварц
3
Байт-код Python не распознается более поздними версиями интерпретатора Python. Как можно реализовать язык программирования, который компилируется в байт-код Python?
Гас

Ответы:

77

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

P_L
источник
22
Фактически, детали формата байт-кода часто меняются между второстепенными версиями, и даже 99% -ный PyPy-совместимый даже не пытается (фактически, они добавляют свои собственные инструкции байт-кода).
Примечание: Python - язык - имеет формальную спецификацию (см. «PEP»). Виртуальная машина Python не имеет. Это действительно отличается от (например, Java), где указаны оба.
Альберт
56

Существует несколько языков JVM, потому что были талантливые люди, которые хотели написать код, который бы работал с существующим кодом Java, но они не хотели писать Java .

Очевидно, что нет программистов, которые хотят работать с существующим кодом Python, но ненавидят Python достаточно, чтобы портировать другой язык в интерпретатор байт-кода Python.

Вы можете взглянуть на это двумя способами: есть альтернативные языки для JVM, потому что Java так широко распространен, или нет альтернативных языков для интерпретатора байт-кода Python, потому что Python не сосет.

Кевин Клайн
источник
7
Я надеюсь, что вы не подразумеваете, что Java отстой или Java отстой больше, чем Python :-)
Джорджио
8
@ Джорджио: Я подразумеваю, что создатели Groovy, Scala, Clojure и т. Д. Думали, что есть значительные возможности для улучшения. Вы намекаете, что Python отстой?
Кевин Клайн
8
После работы с питоном я бы сказал, что «низкий коэффициент сосания» будет неточным. Это слишком много общепринятых вещей, и все это «я» чрезвычайно контрпродуктивно. На самом деле тупой. Как метод класса не знает, где он принадлежит?
Rig
6
@Rig Лично я думаю, что подход Python более элегантный. OO органично следует из синтаксиса, а не требует специального ключевого слова, которое выглядит как переменная. Относительно того, почему методы класса не знают, где они находятся, это потому, что определения классов Python - это просто код, и этот код не является привилегированным, потому что он находится внутри определения класса. Вы можете определять методы где угодно и добавлять их в класс во время выполнения. Фактически, вы можете взять одну и ту же функцию и использовать ее в качестве метода в нескольких классах, что не очень подходит для этой thisпарадигмы.
Сурьма
6
Я думаю, что это вопрос виртуальных машин, а не языков. JVM является производительной виртуальной машиной со сборщиком мусора поколений, JIT и т. Д. В то время как CPython использует подсчет ссылок и является интерпретатором. Это CPython, который сосет как платформа. Кстати, хыы существует.
PuercoPop
26

Существуют технические недостатки, такие как GIL в CPython, но мало кто воспринимает языковые недостатки, поэтому среда выполнения не является преимуществом сообщества Python. Как раз наоборот, есть и другие варианты среды выполнения из-за неудовлетворенности реализацией GIL / CPython.

Язык Java гораздо более злобен, чем JVM (даже в сообществе Java).

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


источник
10

Я говорю, что Мейсон Уилер прав. Это в основном проблема с Global Interpreter Lock, которая делает параллелизм очень сложной проблемой. Так как есть другие виртуальные машины, которые сравнительно хорошо выполняют параллелизм, имеет смысл разрабатывать языки для них. Кроме того, в Python в последнее время произошел значительный сдвиг в языке, и многие из библиотек не успели сделать совместимость легким кошмаром время от времени. Например, потому что я использую PIL для работы со зрением, я должен писать код на Python 2.7 или ниже. Это не относится к установкам JVM или CLI, которые, в частности, в последнем случае были разработаны с учетом взаимодействия языков.

Провел еще какое-то исследование и, по-видимому, на самом деле есть два GIL, а не один. Другие элементы управления Imports .

Мировой инженер
источник
1
«GIL free» - одна из технических причин, упомянутых в разделе «Причины, по которым программисты CPython могут интересоваться IronPython» в вики Python .
Яннис
1
@YannisRizos: Конечно, доступ к .NET Framework не совсем несущественен. Конечно, вполне возможно, что пользователи CPython могут быть совершенно не заинтересованы в этом.
Роберт Харви
@RobertHarvey Ninja редактировал это. Хотя я не думаю, что «доступ к модным новым игрушкам» является технической причиной (не то, что игрушки не очень хороши), вики также упоминает, что IronPython легче расширять.
Яннис
8

Другие ответы имеют большой смысл, но сейчас есть языки, которые компилируются в Python. Где есть воля ...

Я ничего не знаю об этих языках, но они, кажется, работают, передавая их исходный код в Python AST и позволяя Python компилировать деревья в байт-код, избегая проблем, упомянутых в других ответах.

Основываясь на комментариях, мы в настоящее время знаем о трех альтернативных языках, которые используют Python VM (не стесняйтесь добавлять любые другие здесь):

  • Mochi Описывает себя как динамически типизированный язык программирования для функционального программирования и программирования в стиле актера .
  • Hy : Описывает себя как диалект Lisp, который встроен в Python .
  • dg : описывает себя как (технически) простой язык, который компилируется в байт-код CPython .
Карл Смит
источник
2
Также стоит упомянуть HyLang
ideasman42
1
И дг .
Хакаташи
6

Другая причина заключается в том, что JVM является высоко оптимизированной, хорошо развитой и чрезвычайно полной экосистемой. Сам по себе он очень хорошо конкурирует с любым другим компилируемым языком. (Я не скажу, что это лучшая виртуальная машина общего назначения, но я определенно положил на это свою карьеру.) Поэтому получение доступа к JVM, за исключением написания байт-кода, само по себе желательно.

Тем не менее, Python VM хорош, но (ничего против Python) имеет ряд серьезных недостатков. Среда выполнения Python хорошо подходит для динамической природы языка, но может по-настоящему удивить вас, когда вы познакомитесь с его использованием памяти, глобальной блокировкой или моделью потоков.

При непосредственном сравнении JVM обычно в два раза быстрее виртуальной машины Python. JVM (удивительно) даже неплохо конкурирует с нативно скомпилированным кодом, основанным на «горячих» оптимизациях, которые он выполняет. И это даже не считая более сложной обработки потоков и т. Д.

Я люблю Python, правда, и мне неприятно это говорить, но иногда производительность просто бьет меня по зубам - в противном случае, почему критические библиотеки Python, такие как numpy или scipy, должны вернуться в C-код?

Другими словами, люди, которые тяготеют к Python, делают это, потому что им нравится язык . Но если вы хотите написать новый язык в соответствии с вашими предпочтениями, вам гораздо лучше компилировать в JVM, потому что ваш новый идиосинкразический язык будет начинаться в одной из лучших (субъективно, возможно, лучших) доступных операционных сред.

обкрадывать
источник