Python vs Cpython

447

Co to za zamieszanie w Python i CPython (Jython, IronPython) , nie rozumiem:

python.org wspomina, że ​​CPython to:

„Tradycyjna” implementacja Pythona (pseudonim CPython)

jeszcze jedno pytanie przepełnienia stosu wspomina, że:

CPython to domyślny interpreter bajt-kodu Pythona, napisany w C.

Szczerze mówiąc, nie rozumiem, co właściwie oznaczają oba te wyjaśnienia, ale pomyślałem, że jeśli użyję CPython, oznacza to, że po uruchomieniu przykładowego kodu python kompiluje go do języka C, a następnie wykonuje tak, jakby to był C kod

Czym dokładnie jest CPython i czym różni się w porównaniu z Pythonem i czy powinienem prawdopodobnie używać CPython w porównaniu do Pythona, a jeśli tak, jakie są jego zalety?

K DawG
źródło

Odpowiedzi:

689

Czym jest CPython?

CPython jest oryginalną implementacją języka Python. Jest to implementacja pobrana z Python.org. Ludzie nazywają to CPython, aby odróżnić go od innych, późniejszych implementacji języka Python i odróżnić implementację silnika językowego od samego języka programowania Python .

Druga część jest źródłem twojego zamieszania; musisz trzymać język Python oddzielnie od wszystkiego, co uruchamia kod Python.

CPython zdarza być realizowane w C. To właśnie szczegółów wdrażania, naprawdę. CPython kompiluje kod Pythona do kodu bajtowego (transparentnie) i interpretuje ten kod bajtowy w pętli ewaluacyjnej.

CPython jest także pierwszym, który wdrożył nowe funkcje; Programowanie w języku Python używa CPython jako podstawy; następują inne implementacje.

Co z Jythonem itp.?

Jython , IronPython i PyPy to obecne „inne” implementacje języka programowania Python; są one zaimplementowane odpowiednio w Javie, C # i RPython (podzbiór Pythona). Jython kompiluje kod Pythona do kodu bajtowego Java , dzięki czemu kod Pythona może działać na JVM. IronPython pozwala uruchomić Python na Microsoft CLR . A PyPy, zaimplementowany w (podzbiorze) Pythona, pozwala uruchamiać kod w Pythonie szybciej niż CPython, co słusznie powinno zaskoczyć. :-)

Właściwie kompilacja do C.

Więc CPython nie tłumaczy twojego kodu Python sam na siebie. Zamiast tego uruchamia pętlę tłumacza. Jest to projekt, który ma tłumaczyć Python-owski kod do C, który jest nazywany Cython . Cython dodaje kilka rozszerzeń do języka Python i pozwala kompilować kod do rozszerzeń C, kodu podłączanego do interpretera CPython.

Martijn Pieters
źródło
93
Myślę, że warto wspomnieć, że teoretycznie skrypt w języku Python można uruchomić przy użyciu dowolnej implementacji, a wyniki uruchomienia skryptu powinny być takie same.
Douglas Mendizábal,
3
W rzeczywistości, w zależności od projektu, nad którym pracujesz, dobrym pomysłem może być przetestowanie i profilowanie kodu Pythona na kilku implementacjach. Pracując wcześniej nad projektami Java + Jython, możesz spotkać wiele niespodzianek, ponieważ deweloperzy nie przetestowali wystarczająco dużo bibliotek na tej platformie.
rahmu
9
Powiedzenie, że „PyPy jest szybszy niż CPython” jest nieco niebezpieczne. Tutaj jest bardzo dobra odpowiedź na dokładnie to pytanie: stackoverflow.com/questions/18946662/...
Max Leske,
Byłem podekscytowany IronPython ... dopóki nie zobaczyłem, że obsługuje on tylko Python 2.x.
Sean Anderson
@SeanAnderson: To samo dotyczy Jython (do 2015 roku oficjalne wydanie było kompatybilne tylko z wersją 2.5, co czyniło go dziewięć lat nieaktualnymi; w końcu otrzymali wersję 2.7 w 2015 roku, ale wciąż nie ma oznak wydania 3.x).
ShadowRanger
90

Musisz odróżnić język od implementacji. Python to język,

Według Wikipedii „Język programowania jest zapisem do pisania programów, które są specyfikacjami obliczeń lub algorytmów”. Oznacza to, że są to po prostu reguły i składnia pisania kodu. Osobno mamy implementację języka programowania, która w większości przypadków jest faktycznym tłumaczem lub kompilatorem.

Python jest językiem. CPython to implementacja Pythona w C. Jython to implementacja w Javie i tak dalej.

Podsumowując: Używasz już CPython (jeśli pobierałeś stąd ).

jamylak
źródło
2
Powinieneś przeczytać post Martijna Pietersa: „CPython nie tłumaczy twojego kodu Pythona sam w sobie. Zamiast tego uruchamia pętlę interpretera. Istnieje projekt, który tłumaczy kod Pythona na C, i nazywa się Cython”
Raymond Chenon
2
dlaczego tak wiele podkreśla się w Cpython. tzn. nie słyszymy Cc ++, CJava ani nawet CSwift. A może coś mi brakuje?
Suhaib
3
@ Suhaib: tak, w świecie Java ludzie mają np. HotSpot, OpenJDK, IBM J9 JDK, Azul. Zazwyczaj są bardziej precyzyjne, tzn. Tak naprawdę nie widzisz „zainstaluj Java”, ale „zainstaluj kompatybilny JDK Java 8, na przykład Oracle JDK 8”. W świecie JavaScript masz node.js, V8 itp. „Instalujesz node.js”, a nie „zainstaluj JavaScript”, prawda? Ale w świecie Python dość często mówi się „zainstaluj Python 3.6” i gotowe, odnosząc się do specyfikacji języka, a nie konkretnego środowiska uruchomieniowego.
Hendy Irawan,
37

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ć:

  1. Python : Jest to język, tylko określa / opisuje, w jaki sposób przekazać / wyrazić się interpreterowi (programowi, który akceptuje kod Pythona).
  2. Wdrożenie : Chodzi o to, jak napisano tłumacza, a konkretnie w jakim języku i co w końcu robi .
  3. 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.

Vijay Kumar
źródło
3
dzięki za szczegółowe wyjaśnienie !! Oznacza to, że CPython zajmuje się konwertowaniem kodu Python na kod bajtowy, a także interpretacją kodu bajtowego na kod maszynowy? W orzechowej powłoce CPython jest kompilatorem (dla kodu Pythona do kodu bajtowego) i maszyną wirtualną Pythona (dla kodu bajtowego do kodu maszynowego)? Porównując to samo z .Net, istnieje kompilator C # do konwersji C # na MSIL i CLR do konwersji z MSIL na kod maszynowy.
rahulaga_dev
30

W tym artykule dokładnie wyjaśniono różnicę między różnymi implementacjami języka Python. Jak ujął to artykuł:

Pierwszą rzeczą do zrozumienia jest to, że „Python” to interfejs. Istnieje specyfikacja tego, co powinien zrobić Python i jak powinien się zachowywać (jak w przypadku każdego interfejsu). Istnieje wiele implementacji (jak w każdym interfejsie).

Drugą rzeczą do zrealizowania jest to, że „interpretowane” i „skompilowane” są właściwościami implementacji, a nie interfejsu.

Shaktimaan
źródło
20

Python to język: zestaw reguł, których można używać do pisania programów. Istnieje kilka implementacji tego języka.

Bez względu na to, jaką implementację wykonujesz, robią one prawie to samo: weź tekst swojego programu i zinterpretuj go, wykonując jego instrukcje. Żaden z nich nie kompiluje twojego kodu do C lub innego języka.

CPython to oryginalna implementacja napisana w C. (Część „C” w „CPython” odnosi się do języka, który został użyty do napisania samego interpretera Pythona).

Jython to ten sam język (Python), ale zaimplementowany w Javie.

Tłumacz języka IronPython został napisany w języku C #.

Istnieje również PyPy - interpreter języka Python napisany w języku Python. Wybierz swój wybór :)

orlenko
źródło
8

implementationoznacza, jakiego języka użyto do implementacji Pythona, a nie jak kod Pythona zostałby zaimplementowany. Zaletą korzystania z CPython jest dostępność czasu wykonania C, a także łatwa integracja z C / C ++.

CPython został pierwotnie zaimplementowany przy użyciu C. Były inne rozwidlenia oryginalnej implementacji, które umożliwiły Pythonowi wykorzystanie Java (JYthon) lub .NET Runtime (IronPython).

W zależności od używanej implementacji dostępność biblioteki może się różnić, na przykład Ctypes nie jest dostępna w Jython , więc żadna biblioteka, która używa ctypów, nie będzie działać w Jython. Podobnie, jeśli chcesz użyć klasy Java, nie możesz tego zrobić bezpośrednio z CPython. Potrzebujesz kleju (JEPP) lub musisz użyć Jython (Java Implementation of Python)

Abhijit
źródło
4

Powinieneś wiedzieć, że CPython tak naprawdę nie obsługuje wielowątkowości z powodu globalnej blokady interpretera . Nie ma również mechanizmów optymalizacji rekurencji i ma wiele innych ograniczeń, które inne implementacje i biblioteki starają się wypełnić.

Powinieneś spojrzeć na tę stronę na wiki python.

Spójrz na fragmenty kodu na tej stronie, da ci to dobre wyobrażenie o tym, czym jest tłumacz.

Oussama L.
źródło
17
CPython obsługuje wielowątkowość, ale GIL utrudnia korzystanie z wielu rdzeni lub procesorów. To nie do końca to samo, co brak obsługi wielowątkowości.
Martijn Pieters
0

Oryginalna i standardowa implementacja Pythona jest zwykle wywoływana, CPythongdy chcesz go kontrastować z innymi opcjami (w przeciwnym razie po prostu zwykłym „Pythonem” ). Ta nazwa pochodzi od tego, że jest zakodowana w urządzeniu przenośnym ANSI C language code. To jest Python, który pobrać z http://www.python.org , get z ActivePython i Enthought rozkładów, i automatycznie na większości komputerów z systemem Linux i Mac OS X. Jeśli znalazłeś preinstalowaną wersję Pythona na swoim komputerze, prawdopodobnie tak jest CPython, chyba że Twoja firma lub organizacja używa Pythona w bardziej wyspecjalizowany sposób.

O ile nie chcesz pisać skryptów Javalub .NETaplikacji za pomocą Pythona lub znaleźć korzyści Stacklesslub PyPyprzekonać, prawdopodobnie będziesz chciał użyć standardowego CPythonsystemu. Ponieważ jest to referencyjna implementacja języka, zazwyczaj działa on najszybciej, jest najbardziej kompletny oraz jest bardziej aktualny i niezawodny niż systemy alternatywne.

Sushant Chaudhary
źródło
3
Nie chcę być niegrzeczny, ale CPython absolutnie nie działa najszybciej.
Myles Hollowed
0

Implementacja języka programowania to system do wykonywania programów komputerowych.

Istnieją dwa ogólne podejścia do implementacji języka programowania:

  • Interpretacja : interpreter przyjmuje jako dane wejściowe program w pewnym języku i wykonuje czynności napisane w tym języku na niektórych komputerach.
  • Kompilacja : kompilator pobiera jako dane wejściowe program w pewnym języku i tłumaczy ten program na inny język, który może służyć jako dane wejściowe do innego interpretera lub innego kompilatora.

Python jest interpretowanym językiem programowania wysokiego poziomu stworzonym przez Guido van Rossuma w 1991 roku.

CPython to referencyjna wersja języka obliczeniowego Python, napisanego w C, również przez Guido van Rossuma .

Inna lista implementacji języka Python

Źródło

Premraj
źródło