PyPy
# PyPy

PyPy ist ein Just-in-time-Compiler für die Programmiersprache Python, der selbst in Python geschrieben ist. Da die Programmierer mit einer Python-Implementierung in Python selbst (und nicht in C, wie dies bei der Referenzimplementierung CPython der Fall ist) experimentieren können, macht PyPy es einfacher, Bereiche zu finden, in denen die Python-Implementierung verbessert werden kann. Darüber hinaus erlaubt PyPy den Entwicklern durch seine Flexibilität, mit mehreren Implementierungen eines speziellen Features zu experimentieren. Eines der Ziele des Projektes war es, einen Python-Interpreter zu entwickeln, der schneller als CPython ist, was im März 2008 erstmals gelang. Mittlerweile ist PyPy in einer überwiegenden Zahl von Benchmarks schneller als CPython – und in Sonderfällen sogar schneller als C.

Streng genommen akzeptiert PyPy keine Programme in Python, sondern eine reduzierte Sprache namens RPython. Während alle RPython-Programme ohne Umwandlungen als Python-Programme lauffähig sind, ist dies umgekehrt nicht immer der Fall. Die Reduktion auf RPython wurde notwendig, damit PyPy eine statische Typisierung von Python-Objekten durchführen kann. PyPy ist von Vorteil, wenn die Laufzeit von Python-Programmen reduziert werden soll. Nachteilig ist, dass nicht alle für Python entwickelten Programmbibliotheken unterstützt werden. So gibt es etwa von NumPy eine RPython-Variante, die etwa 80 % der Geschwindigkeit des in C implementierten Originals erreicht, aber nicht voll kompatibel ist, und die Alternative, das Original über eine Zwischenschicht zu nutzen, was aber sehr langsam ist.

## Komponenten

PyPy besteht aus zwei Hauptkomponenten:

* dem Standard Interpreter, einer Implementierung eines Python-Interpreters in einer beschränkten Untermenge von Python.
* einer RPython-Toolchain, die in der Lage ist, die oben erwähnte Untermenge von Python in Assembler-Code zu übersetzen. Dieser Code wird dann direkt auf dem Prozessor ausgeführt, anstelle in einer Software.

### RPython

Der PyPy-Interpreter selbst ist in einer eingeschränkten Teilmenge von Python namens RPython (Restricted Python) geschrieben. RPython erlegt der Python-Sprache einige Einschränkungen auf, sodass der Typ einer Variablen zur Kompilierzeit abgeleitet werden kann.

Das PyPy-Projekt hat eine Toolchain entwickelt, die RPython-Code analysiert und in eine Form von Byte-Code übersetzt, der in C abgesenkt werden kann. Früher gab es neben C noch andere Backends: Java, CSharp und JavaScript, aber diese litten unter bit rot und wurden entfernt. Somit ist das rekursive Logo von PyPy eine Schlange, die sich selbst verschluckt, da das RPython von einem Python-Interpreter übersetzt wird. Der Code kann zu Test- und Analysezwecken auch unübersetzt ausgeführt werden, was eine gute Testumgebung für die Erforschung dynamischer Sprachen bietet.

## Entwicklungsgeschichte

Von Version 1.2 an gibt es einen JIT-Compiler, der hauptsächlich aus Integerarithmetik bestehenden Code teilweise deutlich schneller ausführt als Psyco.

PyPy wurde von der Europäischen Union in einem Forschungsrahmenprogramm gefördert. Die Förderung lief im ersten Quartal 2007 nach 28 Monaten aus.

Während Version 1.0 hauptsächlich die Ergebnisse des EU-Forschungsprojektes bündelte, konzentriert sich Version 1.1 auf Kompatibilität mit CPython 2.5 sowie Stabilität und Fehlerfreiheit. Version 1.5 wiederum ist kompatibel zu Python 2.7. Version 1.5 soll um 25 % schneller als die Vorgängerversion sein.

Von der Version 2.1 an lässt sich die Software auf der ARM-Architektur ausführen.

Ab Version 2.3 unterstützt PyPy das Betriebssystem OpenBSD, ab Version 2.3.1 unterstützt PyPy auch Python 3 und ab Version 2.4 wird Python 2.7.8 als Standardbibliothek unterstützt.

Um sich von den aktuellen Versionen des Python-Interpreters CPython besser zu unterscheiden, sprang PyPy nach dem Release der Version 2.4 auf die Version 4.0. Diese Version brachte als wichtigste Neuerung Unterstützung für SIMD mit sich.

Version 6.0 lieferte 2018 zwei Versionen, die kompatibel sind mit CPython 2.7 bzw. 3.5, und ermöglichte es Entwicklern, mithilfe von Hooks einen Einblick in die Rechenleistung der automatischen Speicherbereinigung zu bekommen.

Versionen 7.0.0, 7.3.2, 7.3.6 und 7.3.8 (2022) brachten Kompatibilität mit CPython 3.6, 3.7, 3.8 bzw. 3.9, und ab 7.3.4 wurde Windows-64 unterstützt.

