Co to jest CPython?

Najlepsza odpowiedź

CPython to referencyjna implementacja Pythona napisana w języku programowania C. Istnieje wiele innych implementacji, w tym kilka innych w C. Ale CPython jest najczęściej używany i porównywany jest ze wszystkimi innymi.

Python jest specyfikacją języka. Jeśli odniesie się do szczegółów implementacji, podając jakąkolwiek konkretną implementację, rozsądnym założeniem będzie, że jest to odniesienie do wersji CPython.

Możesz szukać implementacji, ale wyniki mogą być nieco zagmatwane. Nie wszystkie implementacje są kompletne ani nie wszystkie działają w „normalnych” systemach lub w konwencjonalnych środowiskach wykonywania programów (takich jak okno terminala lub konsola tekstowa).

Na przykład MicroPython to okrojona pochodna CPythona, przeznaczona dla mikrokontrolerów. Jython jest napisany w Javie i działa na JVM (Java Virtual Machine) i zawiera funkcje importowania natywnej Javy i współdziałania z nią (w tym introspekcji). IronPython jest napisany w języku C # firmy Microsoft i przeznaczony do uruchamiania w środowisku CLR (Common Language Runtime) platformy .NET. PyPy to wersja Pythona, która jest głównie napisana w Pythonie, ale jest otoczona rdzeniem, który implementuje ograniczony podzbiór języka i zapewnia JIT (Just-In- Kompilacja dynamiczna / uruchomieniowa). (Ten podzbiór nazywa się RPython i jest przeznaczony do obsługi nie tylko języka Python).

Widzisz, co mam na myśli, mówiąc o myleniu?

Istnieją co najmniej dwie różne implementacje Pythona, które są napisane w JavaScript i zaprojektowane do uruchamiania z poziomu normalnej przeglądarki (w DOM… lub Documenr Object Model… environment). To są Brython i Skulpt . Ponadto istnieje kilka różnych „transpilerów” lub kompilatorów Python do Javascript, w tym Transcrypt i pyjs – (formalnie Piżama), a może nawet RapydScript (chociaż to bardziej przypomina hybrydę Pythona z JS).

Jak widać , jeśli zagłębisz się dostatecznie w temat, coraz trudniej będzie sklasyfikować różne projekty i narzędzia jako „wdrożenia”.

Na przykład jest Cython , które jest narzędziem do pobierania specjalnie opatrzonego adnotacjami kodu podobnego do Pythona i kompilowania go do ładowalnych (binarnych / natywnych) modułów, które mogą być importowane do Pythona i używane jak każde inne natywnie skompilowane rozszerzenie interpretera. W rzeczywistości nie jest to „implementacja” języka Python, a raczej narzędzie do optymalizacji wybranych fragmentów kodu w języku Python do postaci binarnych rozszerzeń interpetera CPythona. (Jeśli pracujesz w Jythonie, możesz ponownie napisać części swojego kodu w Javie i użyć funkcji współdziałania i introspekcji Jythona, aby użyć tego kodu. Na zasadzie analogii).

Jest też Numba , które jest narzędziem do przejrzystego kompilowania podzbioru kodu Pythona i kodu NumPy w LLVM i integracja obsługi środowiska wykonawczego LLVM z działającym silnikiem interpretera języka Python. Opisuje się to bardziej jako JIT niż charakterystyczny paradygmat modułu / rozszerzenia Cythona. Nadal jest to raczej narzędzie niż „implementacja” całego języka.

Ale jeśli spojrzysz na Nuitka , zobaczysz ambitny projekt kompilacji całych programów w Pythonie. To może być bardziej implementacja.

Kolejny projekt (który wydaje się być projektem, nad którym pracował Guido van Rossum, twórca Pythona) to mypy – Python z opcjonalnym typowaniem statycznym i pewnym wnioskiem o typie lokalnym. To nie byłaby nowa implementacja. Wydaje się, że jest to rodzaj nakładki, która przetwarza Pythona (z opcjonalnymi adnotacjami typu) i paasuje (bez adnotacji) Python z powrotem do silnika wykonawczego CPython (interpretera).

Jeśli chcesz zagłębić się w jeszcze więcej implementacji a linki patrzą na: PythonImplementations – Python Wiki .

Uwaga Omówiłem tutaj wiele z nich i próbowałem wyjaśnić ich związek do tego stopnia. Ta strona wiki jest raczej woreczkiem, z mniejszą ekspozycją i kilkoma linkami do martwych lub nieobsługiwanych projektów.

Odpowiedź

Nawet ja miałem ten sam problem ze zrozumieniem, jak są CPython, JPython , IronPython i PyPy różnią się od siebie.

Dlatego chcę wyjaśnić trzy rzeczy, zanim zacznę wyjaśniać:

  1. Python : Jest to język, określa tylko / opisuje, jak przekazać / wyrazić siebie interpreterowi (programowi, który akceptuje Twój kod Pythona).
  2. Implementacja : chodzi o to, jak interpreter został napisany, a konkretnie o w jaki język i co ostatecznie robi .
  3. Kod bajtowy : Jest to kod przetwarzany przez program, zwykle nazywany maszyną wirtualną, a nie „prawdziwą” maszyną komputerową, czyli procesorem sprzętowym.

CPython to implementacja, która została napisana w języku C. Kończy się tworzeniem kodu bajtowego (zestawu instrukcji opartego na stosie), który jest specyficzny dla Pythona, a następnie wykonuje go. Powodem konwertowania kodu Pythona na kod bajtowy jest to, że łatwiej jest zaimplementować interpreter, jeśli wygląda jak instrukcje maszynowe. Jednak nie jest konieczne tworzenie jakiegoś kodu bajtowego przed wykonaniem (ale CPython daje).

Jeśli chcesz przyjrzeć się kodowi bajtowemu CPythona, możesz to zrobić. 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)

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

Spójrzmy teraz na powyższy kod. Wiersze od 1 do 6 to definicja funkcji. W linii 8 importujemy moduł „dis”, który może być użyty do wyświetlenia pośredniego kodu bajtowego Pythona (lub możesz powiedzieć, disasemblera dla 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

Jest jeszcze Jython, który jest napisany w Javie i ostatecznie tworzy kod bajtowy Java. Kod bajtowy Java działa w środowisku Java Runtime Environment, które jest implementacją wirtualnej maszyny języka Java (JVM). Jeśli jest to mylące, podejrzewam, że nie masz pojęcia, jak działa Java. Mówiąc prościej, kod Java (język, a nie kompilator) jest pobierany przez kompilator Java i generuje plik (który jest kodem bajtowym Java), który można uruchomić tylko przy użyciu środowiska JRE. Odbywa się to w taki sposób, ż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 środowisko JRE. Jeśli nadal jest to mylące, możesz rzucić okiem na tę stronę internetową .

Tutaj możesz zapytać, czy CPython ” s jest przenośny jak Jython, podejrzewam, że nie. Kod bajtowy utworzony w implementacji CPythona był specyficzny dla tego interpretera, aby ułatwić dalsze wykonywanie kodu (ja też podejrzewasz, że taka pośrednia produkcja kodu bajtowego, tylko dla ułatwienia przetwarzania jest wykonywana w wielu innych interpreterach) .Jeśli teraz zastanawiasz się, jak łatwo jest uruchomić kod bajtowy, jak pokazano powyżej w kodzie (po linii 9 do końca ), pomyśl o tym. Mamy stos (strukturę danych) i każda linia w kodzie bajtowym wykonuje jakąś operację stosu, odpowiednio modyfikując stos.Ten zmodyfikowany stos jest używany przez CPython (interpreter) do generowania końcowego wyniku kodu .

Więc w Jythonie, kiedy kompilujesz swój kod Pythona, otrzymujesz kod bajtowy Java, który można uruchomić na JVM.

Podobnie IronPyt hon (napisany w języku C #) kompiluje Twój kod Pythona do Common Language Runtime (CLR), która jest technologią podobną do JVM opracowanej przez Microsoft.

Dodaj komentarz

Twój adres email nie zostanie opublikowany. Pola, których wypełnienie jest wymagane, są oznaczone symbolem *