Nawet ja miałem ten sam problem ze zrozumieniem, w jaki sposób CPython, JPython, IronPython, PyPy różnią się od siebie.
Tak więc jestem gotów wyjaśnić trzy rzeczy, zanim zacznę wyjaśniać:
- Python : Jest to język, tylko określa / opisuje, w jaki sposób przekazać / wyrazić się interpreterowi (programowi, który akceptuje kod Pythona).
- Wdrożenie : Chodzi o to, jak napisano tłumacza, a konkretnie w jakim języku i co w końcu robi .
- Kod bajtowy : jest to kod przetwarzany przez program, zwykle nazywany maszyną wirtualną, a nie przez „prawdziwą” maszynę komputerową, procesor sprzętowy.
CPython to implementacja napisana w języku C. W końcu produkuje bajtecode (zestaw instrukcji oparty na maszynie stosowej), który jest specyficzny dla Pythona, a następnie wykonuje go. Powodem konwersji kodu Pythona na kod bajtowy jest to, że łatwiej jest zaimplementować interpreter, jeśli wygląda jak instrukcja maszynowa. Ale nie jest konieczne generowanie kodu bajtowego przed wykonaniem kodu Pythona (ale CPython produkuje).
Jeśli chcesz spojrzeć na kod bajtowy CPython, możesz. Oto jak możesz:
>>> 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
Teraz spójrzmy na powyższy kod. Linie od 1 do 6 są definicją funkcji. W linii 8 importujemy moduł „dis”, którego można użyć do wyświetlenia pośredniego kodu bajtowego Pythona (lub można powiedzieć, dezasemblera kodu bajtowego Pythona), który jest generowany przez CPython (interpreter).
UWAGA : Mam link do tego kodu z kanału #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c
A potem jest Jython, który jest napisany w Javie i ostatecznie wytwarza kod bajtowy Java. Kod bajtu Java działa w środowisku Java Runtime Environment, które jest implementacją wirtualnej maszyny Java (JVM). Jeśli jest to mylące, podejrzewam, że nie masz pojęcia, jak działa Java. Mówiąc ogólnie, kod Java (język, a nie kompilator) jest pobierany przez kompilator Java i generuje plik (który jest kodem bajtu Java), który można uruchomić tylko przy użyciu środowiska JRE. Odbywa się to tak, że po skompilowaniu kodu Java można go przenieść na inne maszyny w formacie kodu bajtowego Java, który może być uruchamiany tylko przez JRE. Jeśli nadal jest to mylące, możesz rzucić okiem na tę stronę internetową .
Tutaj możesz zapytać, czy kod bajtowy CPython jest przenośny jak Jython, podejrzewam, że nie. Kod bajtowy wytworzony w implementacji CPython był specyficzny dla tego interpretera, aby ułatwić dalsze wykonywanie kodu (podejrzewam również, że taka pośrednia produkcja kodu bajtowego, dla ułatwienia przetwarzania odbywa się w wielu innych interpretatorach).
Tak więc w Jython, podczas kompilacji kodu Python, powstaje bajtowy kod Java, który można uruchomić na JVM.
Podobnie, IronPython (napisany w języku C #) kompiluje kod Pythona do Common Language Runtime (CLR), który jest technologią podobną do JVM opracowanej przez Microsoft.