Sogar ich hatte das gleiche Problem zu verstehen, wie sich CPython, JPython, IronPython und PyPy voneinander unterscheiden.
Ich bin also bereit, drei Dinge zu klären, bevor ich anfange zu erklären:
- 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.
- Implementierung : Es geht darum, wie der Dolmetscher geschrieben wurde, insbesondere in welcher Sprache und was er letztendlich tut .
- 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 des Python-Codes einen Bytecode zu erstellen (CPython erzeugt jedoch).
Wenn Sie sich den Bytecode von CPython ansehen möchten, können Sie dies tun. 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)
5 >> 20 LOAD_GLOBAL 0 (print)
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 'dis'-Modul, 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-Bytecode wie Jython portabel ist, ich vermute nicht. Der in der CPython-Implementierung erzeugte Bytecode war spezifisch für diesen Interpreter, um die weitere Ausführung von Code zu vereinfachen (ich vermute auch, dass eine solche Zwischen-Bytecode-Produktion nur zur Erleichterung der Verarbeitung in vielen anderen Interpreten durchgeführt wird).
Wenn Sie in Jython Ihren Python-Code kompilieren, erhalten Sie Java-Bytecode, der auf einer JVM ausgeführt werden kann.
In ähnlicher Weise kompiliert IronPython (in C # -Sprache geschrieben) Ihren Python-Code in Common Language Runtime (CLR), eine ähnliche Technologie im Vergleich zu JVM, die von Microsoft entwickelt wurde.