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?
python
virtual-machine
virtual-machine-languages
Michael0x2a
quelle
quelle
Antworten:
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.
quelle
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.
quelle
this
Paradigma nicht wirklich funktioniert .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
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 .
quelle
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):
quelle
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.
quelle