Warum gibt es keine anderen Programmiersprachen, die Python-Bytecode kompilieren?

51

In Java gibt es mehrere Sprachen, die sich zu Java-Bytecode kompilieren lassen und auf der JVM ausgeführt werden können - Clojure, Groovy und Scala sind die wichtigsten Sprachen, an die ich mich aus nächster Nähe erinnern kann.

Python wird jedoch auch in Bytecode (.pyc-Dateien) umgewandelt, bevor es vom Python-Interpreter ausgeführt wird. Ich mag nur unwissend sein, aber warum gibt es keine anderen Programmiersprachen, die sich zu Python-Bytecode kompilieren lassen?

Ist es nur so, dass sich niemand darum gekümmert hat, oder gibt es eine Art von inhärenter Einschränkung oder Barriere, die es so schwierig macht, dies zu tun?

Michael0x2a
quelle
30
... weil sie sich nicht mit der GIL auseinandersetzen wollen? ;)
Mason Wheeler
4
Instinkte würden mir sagen, dass es viel damit zu tun hat, wie ausgereift die JVM ist, wie gut spezifiziert und die JVM auf praktisch allen Plattformen oder dumm einfach zu erwerben ist.
Rig
4
Ich vermute auch, dass die meisten JVMs viel schneller sind als Pythons Interpreter.
Peter Smith
19
Durch die Ausrichtung auf Java-Bytecode erhalten Sie alle Funktionen einer JVM (Sicherheit, Leistung, Portabilität, Skalierbarkeit usw.). Das Targeting von Python-Bytecode bringt Ihnen nicht viel.
David Schwartz
3
Python-Bytecode wird von späteren Versionen des Python-Interpreters nicht erkannt. Wie kann jemand eine Programmiersprache implementieren, die mit Python-Bytecode kompiliert wird?
Gus

Antworten:

77

Einfach - als ich das letzte Mal nachgesehen habe, hatte Python keine formale Spezifikation, einschließlich des Bytecodes. CPython ist die Spezifikation, und für die Bytecode-Portabilität ist IIRC nicht erforderlich. Somit ist es ein bewegliches, undokumentiertes Ziel, das für eine bestimmte Sprache entwickelt wurde.

p_l
quelle
22
Tatsächlich ändern sich die Details des Bytecode-Formats häufig zwischen den Nebenversionen, und selbst der zu 99% kompatible PyPy versucht es nicht einmal (tatsächlich fügen sie ihre eigenen Bytecode-Anweisungen hinzu).
Hinweis: Python - die Sprache - hat eine formale Spezifikation (siehe "PEPs"). Die 'Python Virtual Machine' hat nicht. Dies ist in der Tat anders als bei (z. B.) Java, wo beide angegeben sind.
Albert
56

Es gibt mehrere JVM-Sprachen, da es talentierte Leute gab, die Code schreiben wollten, der mit vorhandenem Java-Code funktioniert, aber kein Java schreiben wollten .

Anscheinend gibt es keine Programmierer, die mit vorhandenem Python-Code arbeiten wollen, aber Python hassen, um eine andere Sprache auf den Python-Bytecode-Interpreter zu portieren.

Sie können dies auf zwei Arten betrachten: Es gibt alternative Sprachen für die JVM, weil Java so weit verbreitet ist, oder es gibt keine alternativen Sprachen für den Python-Bytecode-Interpreter, weil Python nicht nervt.

Kevin Cline
quelle
7
Ich hoffe, Sie implizieren nicht, dass Java saugt oder Java mehr als Python saugt :-)
Giorgio
8
@ Giorgio: Ich gehe davon aus, dass die Macher von Groovy, Scala, Clojure usw. der Meinung waren, dass es erheblichen Verbesserungsbedarf gibt. Wollen Sie damit andeuten, dass Python scheiße ist?
Kevin Cline
8
Nach der Arbeit mit Python würde ich sagen, dass "niedriger Saugfaktor" ungenau wäre. Es gibt zu viel für gewöhnlich akzeptiertes Zeug und dieses ganze 'Selbst'-Ding ist extrem kontraproduktiv. In der Tat dumm. Woher weiß eine Klassenmethode nicht, wo sie hingehört?
Rig
6
Persönlich finde ich Pythons Ansatz eleganter. Das OO folgt organisch aus der Syntax, anstatt ein spezielles Schlüsselwort zu benötigen, das wie eine Variable aussieht. Warum Klassenmethoden nicht wissen, wo sie sich befinden, liegt daran, dass es sich bei Python-Klassendefinitionen nur um Code handelt. Dieser Code ist nicht privilegiert, da er sich zufällig in einer Klassendefinition befindet. Sie können Methoden überall definieren und zur Laufzeit einer Klasse hinzufügen. Tatsächlich können Sie dieselbe Funktion als Methode in mehreren Klassen verwenden, was mit dem thisParadigma nicht wirklich funktioniert .
Antimon
6
Ich denke, es geht um VMs, nicht um Sprachen. Die JVM ist eine performante VM mit einem generationsübergreifenden Garbage Collector, JIT usw. Während CPython die Referenzzählung verwendet und ein Interpreter ist. Es ist CPython, das als Plattform scheiße ist. Übrigens existiert.
PuercoPop
26

Es gibt technische Mängel wie die GIL in CPython, aber nur wenige wahrgenommen Sprache Mangel, so dass die Laufzeit ist nicht das Verkaufsargument der Python - Community. Im Gegenteil, aufgrund der Unzufriedenheit mit der GIL / CPython-Implementierung gibt es mehr Backend-Laufzeitoptionen.

Die Java-Sprache ist viel bösartiger als die JVM (auch in der Java-Community).

Die JVM wird in den meisten Kreisen sehr geschätzt. Daher der Wunsch nach verschiedenen / besseren Sprach-Frontends mit den Vorteilen der hochoptimierten Backend-JVM.


quelle
10

Ich sage, dass Mason Wheeler Recht hat. Es handelt sich meistens um ein Problem mit der globalen Interpreter-Sperre, was die Parallelität zu einem sehr heiklen Problem macht. Da es andere VMs gibt, die vergleichsweise wirklich sehr gut parallel arbeiten, ist es sinnvoll, Sprachen für diese zu entwickeln. Auch Python hat in letzter Zeit eine große Sprachverschiebung hinter sich und viele Bibliotheken haben es nicht geschafft, Kompatibilität zu einem leichten Albtraum zu machen. Da ich beispielsweise PIL für die Bildverarbeitung verwende, muss ich in Python 2.7 oder niedriger programmieren. Dies ist bei den JVM- oder CLI-Setups nicht der Fall, die insbesondere im letzteren Fall unter Berücksichtigung von Sprachinterop entwickelt wurden.

Habe noch etwas recherchiert und anscheinend gibt es tatsächlich zwei GILs, nicht nur die eine. Der andere steuert Importe .

Weltingenieur
quelle
1
"GIL-frei" ist einer der technischen Gründe, die unter "Gründe, aus denen sich CPython-Programmierer für IronPython interessieren" im Python-Wiki genannt werden .
Yannis
1
@YannisRizos: Der Zugriff auf das .NET-Framework ist sicherlich nicht ganz ohne Belang. Natürlich ist es möglich, dass CPython-Benutzer daran überhaupt nicht interessiert sind.
Robert Harvey
@RobertHarvey Ninja hat das bearbeitet. Obwohl ich den "Zugang zu schickem neuem Spielzeug" nicht als technischen Grund betrachte (nicht, dass das Spielzeug nicht großartig ist), erwähnt das Wiki auch, dass IronPython einfacher zu erweitern ist.
Yannis
8

Die anderen Antworten sind sehr sinnvoll, aber es gibt tatsächlich Sprachen, die jetzt in Python kompiliert werden. Wo ein Wille ist...

Ich weiß nichts über diese Sprachen, aber sie scheinen zu funktionieren, indem sie ihren Quellcode in Python-ASTs transpilieren und Python die Bäume zu Bytecode kompilieren lassen, um die in anderen Antworten genannten Probleme zu vermeiden.

Basierend auf den Kommentaren kennen wir derzeit drei alternative Sprachen, die die Python-VM verwenden (Sie können hier weitere hinzufügen):

  • Mochi beschreibt sich selbst als dynamisch getippte Programmiersprache für funktionale Programmierung und schauspielerische Programmierung .
  • Hy : Beschreibt sich selbst als einen in Python eingebetteten Lisp-Dialekt .
  • dg : Beschreibt sich selbst als (technisch) einfache Sprache, die sich zu CPython-Bytecode kompilieren lässt .
Carl Smith
quelle
2
Erwähnenswert ist auch HyLang
ideasman42
1
Und dg .
Hakatashi
6

Ein weiterer Grund ist, dass die JVM ein hochoptimiertes, gut entwickeltes und äußerst vollständiges Ökosystem ist. Es ist für sich genommen äußerst konkurrenzfähig zu allen anderen kompilierten Sprachen. (Ich werde nicht sagen, dass es die beste Universal-VM ist, aber ich habe meine Karriere auf jeden Fall darauf gesetzt.) Der Zugriff auf die JVM, abgesehen vom Schreiben von Bytecode, ist an sich wünschenswert.

Die Python-VM ist zwar gut, hat aber (nichts gegen Python) einige gravierende Mängel. Die Python-Laufzeitumgebung passt gut zur Dynamik der Sprache, kann Sie jedoch wirklich überraschen, wenn Sie sich mit der Speichernutzung, dem globalen Sperren oder dem Threading-Modell vertraut machen.

Bei direkten Vergleichen ist die JVM in der Regel doppelt so schnell wie die Python-VM. Die JVM kann (überraschenderweise) sogar mit nativ kompiliertem Code mithalten, basierend auf den "heißen" Optimierungen, die sie durchführt. Und dazu zählt nicht einmal das ausgefeiltere Thread-Handling usw.

Ich liebe Python, das tue ich wirklich und hasse es, es zu sagen, aber manchmal geht mir die Leistung einfach in die Quere - andernfalls müssten kritische Python-Bibliotheken wie numpy oder scipy auf C-Code zurückgreifen?

Mit anderen Worten, Menschen, die sich für Python interessieren, tun dies, weil sie die Sprache mögen . Wenn Sie jedoch eine brandneue Sprache schreiben möchten, die Ihren Präferenzen entspricht, sollten Sie die JVM besser kompilieren, da Ihre neue eigenwillige Sprache in einer der besten (subjektiv vielleicht besten) verfügbaren Betriebsumgebungen gestartet wird.

rauben
quelle