Was ist CPython?

Beste Antwort

CPython ist die Referenzimplementierung von Python, die in der Programmiersprache C geschrieben ist. Es gibt eine Reihe anderer Implementierungen, sogar einige andere in C. CPython wird jedoch am häufigsten verwendet und mit allen anderen verglichen.

Python ist eine Sprachspezifikation. Wenn man sich bei der Angabe einer bestimmten Implementierung auf Implementierungsdetails bezieht, wird davon ausgegangen, dass es sich um die CPython-Version handelt.

Sie können nach Implementierungen suchen, aber die Ergebnisse sind wahrscheinlich etwas verwirrend. Nicht alle Implementierungen sind vollständig und werden auch nicht auf „normalen“ Systemen oder in herkömmlichen Programmausführungsumgebungen (wie einem Terminalfenster oder einer Textkonsole) ausgeführt.

Zum Beispiel MicroPython ist ein abgespecktes Derivat von CPython, das für Mikrocontroller bestimmt ist. Jython ist in Java geschrieben und wird in der JVM (Java Virtual Machine) ausgeführt. Es enthält Funktionen zum Importieren von nativem Java und zur Interaktion mit diesem (einschließlich Selbstbeobachtung). IronPython ist in Microsoft C # geschrieben und soll innerhalb der CLR (Common Language Runtime) des .NET Frameworks ausgeführt werden. PyPy ist eine Version von Python, die hauptsächlich in Python geschrieben ist, jedoch um einen Kern gewickelt ist, der eine eingeschränkte Teilmenge der Sprache implementiert und JIT (Just-In-) bereitstellt. Time Dymanic / Runtime Compilation). (Diese Teilmenge heißt RPython und soll mehr als nur Python unterstützen.)

Sehen Sie, was ich mit Verwirrung meine? P. >

Es gibt mindestens zwei verschiedene Implementierungen von Python, die in JavaScript geschrieben sind und für die Ausführung in einem normalen Browser (im DOM… oder in Documenr) ausgelegt sind Objektmodell… Umgebung). Dies sind Brython und Skulpt . Darüber hinaus gibt es verschiedene „Transpiler“ oder Python-zu-Javascript-Compiler, darunter Transcrypt und pyjs – (formal Pyjamas) und vielleicht sogar RapydScript (obwohl dies eher eine Mischung aus Python mit JS ist).

Wie Sie sehen können Wenn Sie sich tief genug mit dem Thema befassen, wird es immer schwieriger, verschiedene Projekte und Tools als „Implementierungen“ zu kategorisieren.

Zum Beispiel gibt es Cython ist ein Tool, mit dem Sie speziell kommentierten Python-ähnlichen Code in ladbare (binäre / native) Module kompilieren können, die in Python importiert und wie jede andere nativ kompilierte Erweiterung des Interpreters verwendet werden können. Es wird nicht wirklich als „Implementierung“ von Python angesehen, sondern vielmehr als Werkzeug zum Optimieren ausgewählter Ausschnitte von Python-Code in binäre Erweiterungen des CPython-Interpeters. (Wenn Sie in Jython gearbeitet haben, können Sie Teile Ihres Codes in Java neu schreiben und die Interoperations- und Introspektionsfunktionen von Jython verwenden, um diesen Code zu verwenden. Nur analog).

Es gibt auch Numba ist ein Tool zum transparenten Kompilieren einer Teilmenge von Python und NumPy -Code in LLVM und Integration der LLVM-Laufzeitunterstützung in die laufende Engine des Python-Interpretators. Dies wird eher als JIT beschrieben als als Cythons charakteristisches Modul- / Erweiterungsparadigma. Trotzdem ist es eher ein Werkzeug als eine „Implementierung“ der gesamten Sprache.

Wenn Sie sich jedoch Nuitka ansehen, sehen Sie eine ehrgeiziges Projekt zur Kompilierung ganzer Python-Programme. Das könnte also eher eine Implementierung sein.

Ein weiteres Projekt (an dem Guido van Rossum, der Schöpfer von Python, anscheinend gearbeitet hat) ist mypy – Python mit optionaler statischer Typisierung und lokaler Typinferenz. Dies wäre keine neue Implementierung. Es scheint eine Art Frontend zu sein, das Python (mit optionalen Typanmerkungen) verarbeitet und das (nicht kommentierte) Python zurück in die CPython-Laufzeit-Engine (Interpreter) überträgt.

Wenn Sie in noch mehr Implementierungen eintauchen möchten und Links sehen sich an: PythonImplementations – Python Wiki .

Hinweis Ich habe viele davon hier behandelt und versucht zu erklären, wie sie zusammenhängen bis zu diesem Grad. Diese Wiki-Seite ist eher eine Wundertüte mit weniger Exposition und ein paar Links zu toten oder nicht gepflegten Projekten.

Antwort

Selbst ich hatte das gleiche Problem, zu verstehen, wie CPython, JPython sind , IronPython und PyPy unterscheiden sich voneinander.

Ich bin also bereit, drei Dinge zu klären, bevor ich mit der Erklärung beginne:

  1. Python : Es ist eine Sprache, die nur angibt / beschreibt, wie Sie sich dem Interpreter (dem Programm, das Ihren Python-Code akzeptiert) vermitteln / ausdrücken können.
  2. Implementierung : Es geht darum, wie der Interpreter geschrieben wurde, insbesondere in welche Sprache und was es letztendlich tut .
  3. Bytecode : Dies ist der Code, der von einem Programm verarbeitet wird, das normalerweise als virtuelle Maschine bezeichnet wird, und nicht von der „realen“ Computermaschine, dem Hardwareprozessor.

CPython ist die Implementierung, die in C-Sprache geschrieben wurde. Am Ende wird Bytecode (stapelmaschinenbasierter Befehlssatz) erzeugt, der Python-spezifisch ist, und dann ausgeführt. Der Grund für die Konvertierung von Python-Code in einen Bytecode liegt darin, dass es einfacher ist, einen Interpreter zu implementieren, wenn er wie Maschinenanweisungen aussieht. Es ist jedoch nicht erforderlich, vor der Ausführung einen Bytecode zu erstellen (CPython erzeugt jedoch). P. >

Wenn Sie sich den Bytecode von CPython ansehen möchten, können Sie dies. So können Sie:

>>> def f(x, y): # line 1

... print("Hello") # line 2

... if x: # line 3

... y += x # line 4

... print(x, y) # line 5

... return x+y # line 6

... # line 7

>>> import dis # line 8

>>> dis.dis(f) # line 9

2 0 LOAD\_GLOBAL 0 (print)

2 LOAD\_CONST 1 ("Hello")

4 CALL\_FUNCTION 1

6 POP\_TOP

3 8 LOAD\_FAST 0 (x)

10 POP\_JUMP\_IF\_FALSE 20

4 12 LOAD\_FAST 1 (y)

14 LOAD\_FAST 0 (x)

16 INPLACE\_ADD

18 STORE\_FAST 1 (y)

22 LOAD\_FAST 0 (x)

24 LOAD\_FAST 1 (y)

26 CALL\_FUNCTION 2

28 POP\_TOP

6 30 LOAD\_FAST 0 (x)

32 LOAD\_FAST 1 (y)

34 BINARY\_ADD

36 RETURN\_VALUE

Schauen wir uns nun den obigen Code an. Die Zeilen 1 bis 6 sind eine Funktionsdefinition. In Zeile 8 importieren wir das Modul „dis“, mit dem der von CPython (Interpreter) generierte Python-Bytecode (oder Disassembler für Python-Bytecode) angezeigt werden kann.

HINWEIS : Ich habe den Link zu diesem Code vom # Python-IRC-Kanal erhalten: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Und dann gibt es Jython, das in Java geschrieben ist und am Ende Java-Bytecode erzeugt. Der Java-Bytecode wird in der Java Runtime Environment ausgeführt, einer Implementierung von Java Virtual Machine (JVM). Wenn dies verwirrend ist, vermute ich, dass Sie keine Ahnung haben, wie Java funktioniert. Für Laien wird Java-Code (die Sprache, nicht der Compiler) vom Java-Compiler verwendet und gibt eine Datei (Java-Bytecode) aus, die nur mit einer JRE ausgeführt werden kann. Dies geschieht, damit der Java-Code nach dem Kompilieren im Java-Bytecode-Format, das nur von JRE ausgeführt werden kann, auf andere Computer portiert werden kann. Wenn dies immer noch verwirrend ist, sollten Sie sich diese Webseite ansehen.

Hier können Sie fragen, ob der CPython “ s Bytecode ist wie Jython portabel, vermute ich nicht. Der in der CPython-Implementierung erzeugte Bytecode war spezifisch für diesen Interpreter, um die weitere Ausführung von Code zu vereinfachen (ich auch vermuten, dass eine solche Zwischen-Bytecode-Produktion nur zur Vereinfachung der Verarbeitung in vielen anderen Interpreten erfolgt). Wenn Sie sich jetzt fragen, wie einfach es ist, den Bytecode wie oben im Code gezeigt auszuführen (nach der Zeile 9 bis zum Ende) Denken Sie daran. Wir haben einen Stapel (Datenstruktur) und jede Zeile im Bytecode führt eine Stapeloperation aus, die den Stapel entsprechend modifiziert. Dieser modifizierte Stapel wird von CPython (dem Interpreter) verwendet, um die endgültige Ausgabe des Codes zu erzeugen

Wenn Sie also in Jython Ihren Python-Code kompilieren, erhalten Sie Java-Bytecode, der auf einer JVM ausgeführt werden kann.

Ähnlich wie IronPyt hon (in C # -Sprache geschrieben) kompiliert Ihren Python-Code in Common Language Runtime (CLR), eine ähnliche Technologie wie JVM, die von Microsoft entwickelt wurde.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.