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


51

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

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

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


30
... потому что они не хотят иметь дело с GIL? ;)
— Мейсон Уилер

4
Инстинкты сказали бы мне, что это во многом зависит от того, насколько зрелой является JVM, она хорошо определена, и JVM работает практически на всех платформах или глупо легко приобрести.
— Рог

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

19
Ориентируясь на байт-код Java, вы получаете все функции JVM (безопасность, производительность, переносимость, масштабируемость и т. Д.). Ориентация на байт-код Python вас не сильно устраивает.
— Дэвид Шварц

3
Байт-код Python не распознается более поздними версиями интерпретатора Python. Как можно реализовать язык программирования, который компилируется в байт-код Python?
— Гас

Ответы:


77

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


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


6

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

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

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

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

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

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.