"PyPy ist eine Neuimplementierung von Python in Python" ist eine ziemlich irreführende Art, PyPy zu beschreiben, IMHO, obwohl es technisch wahr ist.
Es gibt zwei Hauptteile von PyPy.
- Der Übersetzungsrahmen
- Der Dolmetscher
Das Übersetzungsframework ist ein Compiler. Es kompiliert RPython- Code bis auf C (oder andere Ziele) und fügt automatisch Aspekte wie die Garbage Collection und einen JIT-Compiler hinzu. Es kann keinen beliebigen Python-Code verarbeiten, nur RPython.
RPython ist eine Teilmenge von normalem Python. Der gesamte RPython-Code ist Python-Code, aber nicht umgekehrt. Es gibt keine formale Definition von RPython, da RPython im Grunde nur "die Teilmenge von Python ist, die vom PyPy-Übersetzungsframework übersetzt werden kann". Um übersetzt zu werden, muss RPython-Code statisch typisiert sein (die Typen werden abgeleitet, Sie deklarieren sie nicht, aber es ist immer noch nur ein Typ pro Variable), und Sie können keine Funktionen wie das Deklarieren / Ändern von Funktionen ausführen. Klassen auch zur Laufzeit.
Der Interpreter ist dann ein normaler Python-Interpreter, der in RPython geschrieben ist.
Da RPython-Code normaler Python-Code ist, können Sie ihn auf jedem Python-Interpreter ausführen. Aber keiner der Geschwindigkeitsansprüche von PyPy beruht darauf, dass es so läuft. Dies ist nur für einen schnellen Testzyklus gedacht, da die Übersetzung des Dolmetschers lange dauert .
Vor diesem Hintergrund sollte sofort klar sein, dass Spekulationen über PyPyPy oder PyPyPyPy eigentlich keinen Sinn ergeben. Sie haben einen in RPython geschriebenen Interpreter. Sie übersetzen es in C-Code, der Python schnell ausführt. Dort stoppt der Prozess; Es gibt kein RPython mehr, das durch erneutes Verarbeiten beschleunigt werden könnte.
"Wie ist es möglich, dass PyPy schneller als CPython ist?" Wird auch ziemlich offensichtlich. PyPy hat eine bessere Implementierung, einschließlich eines JIT-Compilers (ohne den JIT-Compiler ist es meiner Meinung nach im Allgemeinen nicht ganz so schnell, was bedeutet, dass PyPy nur für Programme schneller ist, die für die JIT-Kompilierung anfällig sind). CPython wurde nie als hochoptimierende Implementierung der Python-Sprache entwickelt (obwohl sie versuchen, sie zu einer hochoptimierten Implementierung zu machen , wenn Sie dem Unterschied folgen).
Das wirklich Innovative am PyPy-Projekt ist, dass sie keine ausgeklügelten GC-Schemata oder JIT-Compiler von Hand schreiben. Sie schreiben den Interpreter relativ einfach in RPython, und für alle RPython-Versionen ist es eine niedrigere Ebene als Python. Es ist immer noch eine objektorientierte, durch Müll gesammelte Sprache, viel höher als C. Dann fügt das Übersetzungs-Framework automatisch Dinge wie GC und JIT hinzu. Das Übersetzungs-Framework ist also riesigDies gilt jedoch auch für den PyPy-Python-Interpreter. Er ändert jedoch seine Implementierung und ermöglicht so viel mehr Freiheit beim Experimentieren, um die Leistung zu verbessern (ohne sich Gedanken über die Einführung von GC-Fehlern oder die Aktualisierung des JIT-Compilers zu machen, um mit den Änderungen fertig zu werden). Dies bedeutet auch, dass bei der Implementierung eines Python3-Interpreters automatisch dieselben Vorteile erzielt werden. Und alle anderen Interpreten, die mit dem PyPy-Framework geschrieben wurden (von denen es eine Reihe in verschiedenen Phasen der Politur gibt). Alle Interpreter, die das PyPy-Framework verwenden, unterstützen automatisch alle vom Framework unterstützten Plattformen.
Der wahre Vorteil des PyPy-Projekts besteht also darin, alle Teile der Implementierung eines effizienten plattformunabhängigen Interpreters für eine dynamische Sprache (so weit wie möglich) zu trennen. Und dann finden Sie eine gute Implementierung an einem Ort, die von vielen Dolmetschern wiederverwendet werden kann. Das ist kein sofortiger Gewinn wie "Mein Python-Programm läuft jetzt schneller", aber es ist eine großartige Perspektive für die Zukunft.
Und es kann Ihr Python-Programm (vielleicht) schneller ausführen.