Python vs Cpython


447

Python ve CPython (Jython, IronPython) hakkında tüm bu yaygara nedir , anlamıyorum:

python.org , CPython'un :

Python'un (geleneksel CPython) "geleneksel" uygulaması

yine başka bir Stack Overflow sorusu şunları söylüyor:

CPython, C ile yazılmış Python'un varsayılan bayt kodu yorumlayıcısıdır.

Dürüst olmak gerekirse, bu açıklamaların her ikisinin de pratikte ne anlama geldiğini bilmiyorum, ancak CPython'u kullanırsam, örnek bir python kodu çalıştırdığımda bunun c diline derlendiğini ve C dilinde olduğu gibi yürüttüğünü düşündüm. kod

Peki CPython tam olarak nedir ve python ile karşılaştırıldığında nasıl farklıdır ve muhtemelen Python üzerinde CPython kullanmalıyım ve eğer öyleyse avantajları nelerdir?


Yanıtlar:


689

Peki CPython nedir?

CPython orijinal Python uygulamasıdır. Python.org'dan indirdiğiniz bir uygulamadır. İnsanlar onu daha sonra diğer Python uygulamalarından ayırmak ve dil motorunun uygulanmasını Python programlama dilinden ayırmak için CPython olarak adlandırıyor .

İkinci kısım, karışıklığınızın geldiği yerdir; dili Python'u Python kodunu çalıştırandan ayrı tutmanız gerekir .

CPython olur sayılmaz, sadece bir uygulama ayrıntıdır O C. uygulanacak. CPython, Python kodunuzu bayt kodunda (saydam olarak) derler ve bu bayt kodunu bir değerlendirme döngüsünde yorumlar.

CPython ayrıca yeni özellikleri ilk uygulayan; Python-the-language geliştirme temel olarak CPython kullanır; bunu diğer uygulamalar takip eder.

Jython vb. Ne olacak?

Jython , IronPython ve PyPy , Python programlama dilinin güncel "diğer" uygulamalarıdır; bunlar sırasıyla Java, C # ve RPython'da (Python'un bir alt kümesi) uygulanır. Jython, Python kodunuzu Java bayt koduna derler , böylece Python kodunuz JVM'de çalışabilir. IronPython, Python'u Microsoft CLR'de çalıştırmanıza izin verir . Ve PyPy, Python'da (bir alt kümesi) uygulanmakta, Python kodunu CPython'dan daha hızlı çalıştırmanıza izin verir, bu da haklı olarak aklınızı başınızdan almalıdır. :-)

Aslında C derleme

Yani CPython yok değil kendisi tarafından C'ye Python kodunuzu çevirmek. Bunun yerine bir tercüman döngüsü çalıştırır. Orada olan bir proje yapar C Python imsi kodunu çevirmek ve bu denir Cython . Cython Python dili için bir kaç uzantıları ekler ve, C uzantıları için kodunuzu derlemek kod olanak veren fişleri içine CPython tercüman.


93
Teorik olarak, bir python betiğinin herhangi bir uygulama kullanılarak çalıştırılabileceğini ve betiğin çalıştırılmasının sonuçlarının aynı olması gerektiğini belirtmek gerekir.
Douglas Mendizábal

3
Gerçekler olarak ve üzerinde çalıştığınız projeye bağlı olarak, Python kodunuzu çeşitli uygulamalarda test etmek ve profillemek iyi bir fikir olabilir. Daha önce Java + Jython projelerinde çalıştıktan sonra birçok sürprizle karşılaşabilirsiniz, çünkü geliştiriciler bu platformda kütüphanelerini yeterince test etmedi.
rahmu

9
"PyPy'nin CPython'dan daha hızlı" olduğunu söylemek biraz tehlikelidir. Burada tam olarak bu soruya çok iyi bir cevap var: stackoverflow.com/questions/18946662/…
Max Leske

IronPython hakkında heyecanlandım ... Sadece Python 2.x'i desteklediğini görene kadar.
Sean Anderson

@SeanAnderson: Aynı şey Jython için de geçerli (2015 yılına kadar resmi sürüm sadece 2.5 uyumluydu, dokuz yıl güncel değil; nihayet 2015'te 2,7 sürümüne sahiplerdi, ancak yine de 3.x sürümü belirtisi yok).
ShadowRanger

90

Bir dil ve bir uygulama arasında ayrım yapmanız gerekir. Python bir dildir,

Wikipedia'ya göre , "Bir programlama dili, bir hesaplama veya algoritmanın özellikleri olan programlar yazmak için bir gösterimdir". Bu, kod yazmak için kurallar ve sözdizimi olduğu anlamına gelir. Ayrı olarak , çoğu durumda asıl tercüman veya derleyici olan bir programlama dili uygulamamız vardır.

Python bir dildir. CPython C'deki Python uygulamasıdır. Jython Java'daki uygulamasıdır.

Özetlemek gerekirse: Zaten CPython kullanıyorsunuz ( buradan indirdiyseniz ).


2
Sen 'CPython kendiliğinden C Python kodunuzu çevirmez yerine bir tercüman döngü çalışır Orada C Python imsi kodunu çevirmek olmayan bir proje olduğunu ve Cython denir..' Martijn Pieters'ın ın yazıyı okumalısınız
Raymond Chenon

2
Cpython hakkında neden bu kadar çok vurgu var? yani: Cc ++, CJava ve hatta CSwift'i duymuyoruz. Yoksa bir şey mi kaçırıyorum?
Suhaib

3
@Suhaib: Java dünyasında insanlar HotSpot, OpenJDK, IBM J9 JDK, Azul gibi. Genellikle daha hassastırlar, yani "Java'yı yükle" yi gerçekten görmezsiniz, daha çok "uyumlu bir Java 8 JDK, örneğin Oracle JDK 8 yükleyin" ifadesini görürsünüz. JavaScript dünyasında node.js, V8 vb. Var. Siz "install node.js" değil, "JavaScript'i yükleyin" değil mi? Ancak Python dünyasında sadece "Python 3.6'yı yükle" demek ve belirli bir çalışma zamanına değil, bir dil özelliğine atıfta bulunmak oldukça yaygındır.
Hendy Irawan

37

Ben bile CPython, JPython, IronPython, PyPy birbirinden nasıl farklı olduğunu anlamak aynı sorun vardı.

Bu yüzden, açıklamaya başlamadan önce üç şeyi temizlemeye hazırım:

  1. Python : Bu bir dildir, yalnızca yorumlayıcıya (python kodunuzu kabul eden program) nasıl aktarılacağını / ifade edileceğini belirtir / açıklar.
  2. Uygulama : Her şey, tercümanın özellikle hangi dilde ve sonuçta ne şekilde yazıldığı ile ilgilidir .
  3. Bayt kodu: "Gerçek" bilgisayar makinesi, donanım işlemcisi yerine genellikle sanal makine olarak adlandırılan bir program tarafından işlenen koddur.

CPython C dilinde yazılmış bir uygulamadır. Python'a özgü bytecode (yığın-makine tabanlı talimat seti) üretir ve bunu yürütür. Python kodunu bir bayt koduna dönüştürmenin nedeni, makine talimatları gibi görünüyorsa bir tercüman uygulamanın daha kolay olmasıdır. Ancak, Python kodunun yürütülmesinden önce bir bayt kodu üretmek gerekli değildir (ancak CPython üretir).

CPython'un bayt koduna bakmak isterseniz, bunu yapabilirsiniz. Bunu nasıl yapabileceğiniz aşağıda açıklanmıştır:

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

Şimdi yukarıdaki koda bir göz atalım. 1'den 6'ya kadar olan hatlar bir fonksiyon tanımıdır. 8. satırda, CPython (yorumlayıcı) tarafından oluşturulan ara Python bayt kodunu (veya Python bayt kodu için sökücü) görüntüleyebileceğiniz 'dis' modülünü içe aktarıyoruz.

NOT : Bu kodun bağlantısını #python IRC kanalından aldım: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Ve sonra, Java ile yazılmış ve Java bayt kodu üreten Nython var. Java bayt kodu, Java Sanal Makinesi'nin (JVM) bir uygulaması olan Java Runtime Environment üzerinde çalışır. Bu kafa karıştırıcı ise, Java'nın nasıl çalıştığı hakkında hiçbir fikriniz olmadığından şüpheleniyorum. Layman terimleriyle, Java (derleyici değil dil) kodu Java derleyicisi tarafından alınır ve yalnızca JRE kullanılarak çalıştırılabilen bir dosya (Java bayt kodu) çıkarır. Bu, Java kodu derlendikten sonra, yalnızca JRE tarafından çalıştırılabilen Java bayt kodu biçimindeki diğer makinelere taşınabilir. Bu hala kafa karıştırıcıysa, buna bir göz atmak isteyebilirsiniz web sayfasına .

Burada, CPython'un bayt kodunun Jython gibi taşınabilir olup olmadığını sorabilirsiniz, sanmıyorum. CPython uygulanmasında üretilen bayt kodu daha sonraki kod yürütülmesi için kolay bunu yapmak için o tercüman özgü idi (Ben de işleme diğer birçok tercüman yapılır sadece kolaylığı için, bu tür ara baytkodu üretimini şüpheli).

Yani, Jython'da, Python kodunuzu derlediğinizde, bir JVM'de çalıştırılabilen Java bayt kodu ile sonuçlanırsınız.

Benzer şekilde, IronPython (C # dilinde yazılmış), Python kodunuzu Microsoft tarafından geliştirilen JVM ile karşılaştırıldığında benzer bir teknoloji olan Ortak Dil Çalışma Zamanı'na (CLR) derler.


3
detaylı açıklama için teşekkürler !! Bu, CPython'un Python kodunu Bayt Koduna dönüştürmeyi ve bayt kodunu makine koduna yorumlamasını sağlar. Somun kabuk CPython Derleyici (Python Bayt Kodu için) ve Python Sanal Makine (Bayt kodu Makine kodu için) nedir? Net ile karşılaştırıldığında, C # MSIL dönüştürmek için C # Derleyici ve MSIL Makine kodu dönüştürmek için CLR vardır.
rahulaga_dev

30

Bu makale , Python'un farklı uygulamaları arasındaki farkı ayrıntılı olarak açıklamaktadır. Makalenin koyduğu gibi:

Farkına varılacak ilk şey 'Python'un bir arayüz olduğudur. Python'un ne yapması ve nasıl davranması gerektiğine dair bir spesifikasyon vardır (herhangi bir arayüzde olduğu gibi). Ve birden fazla uygulama var (herhangi bir arayüzde olduğu gibi).

Gerçekleştirilmesi gereken ikinci şey, 'yorumlanmış' ve 'derlenmiş' bir uygulamanın değil, bir uygulamanın özellikleridir.


20

Python bir dildir: program yazmak için kullanılabilecek bir dizi kural. Bu dilin birkaç uygulaması vardır.

Hangi uygulamayı alırsanız alın, hemen hemen aynı şeyi yaparlar: programınızın metnini alın ve yorumlayın, talimatlarını yürütün. Hiçbiri kodunuzu C veya başka bir dilde derlemez.

CPython, C ile yazılmış orijinal uygulamadır. ("CPython" daki "C" kısmı, Python yorumlayıcısının kendisini yazmak için kullanılan dili ifade eder.)

Jython aynı dildir (Python), ancak Java kullanılarak uygulanır.

IronPython yorumlayıcısı C # ile yazılmıştı.

Python'da yazılmış bir Python yorumlayıcısı olan PyPy de var. Seçiminizi yapın :)


8

implementationpython Kodunun nasıl uygulanacağını değil, Python'u uygulamak için hangi dilin kullanıldığı anlamına gelir. CPython kullanmanın avantajı, C Çalışma Süresinin kullanılabilirliği ve C / C ++ ile kolay entegrasyonudur.

Bu yüzden CPython başlangıçta kullanılarak uygulandı C. Orijinal uygulamada Python'un Java (JYthon) veya .NET Çalışma Zamanı'nı (IronPython) kaldırabilmesini sağlayan başka çatallar da vardı.

Hangi Uygulamayı kullandığınıza bağlı olarak, kitaplık kullanılabilirliği değişebilir, örneğin Ctypes Jython'da mevcut değildir , bu nedenle ctypes kullanan hiçbir kitaplık Jython'da çalışmaz. Benzer şekilde, bir Java Sınıfı kullanmak istiyorsanız, bunu doğrudan CPython'dan yapamazsınız. Ya bir yapıştırıcıya (JEPP) ihtiyacınız var ya da Jython'u (Python'un Java Uygulaması) kullanmanız gerekiyor


4

Küresel Tercüman Kilidi nedeniyle CPython'un çoklu iş parçacığını gerçekten desteklemediğini bilmelisiniz . Ayrıca özyineleme için bir Optimizasyon mekanizması yoktur ve diğer uygulamaların ve kütüphanelerin doldurmaya çalıştığı birçok kısıtlama vardır.

Python wiki'deki bu sayfaya bir göz atmalısınız .

Bu sayfadaki kod snippet'lerine bakın, size bir tercümanın ne olduğu hakkında iyi bir fikir verecektir.


17
CPython çoklu iş parçacığı kullanımını destekler, ancak GIL birden fazla çekirdekten veya CPU'lardan faydalanmayı zorlaştırır. Bu, çoklu iş parçacığını desteklememekle aynı şey değildir.
Martijn Pieters

0

Python'un orijinal ve standart uygulaması genellikle CPythondiğer seçeneklerle karşılaştırmak istediğinizde çağrılır ( ve aksi takdirde düz “Python” ). Bu isim, taşınabilir olarak kodlanmış olması gerçeğinden geliyorANSI C language code . Bu, http://www.python.org adresinden getirdiğiniz, ActivePython ve Enthought dağıtımlarıyla elde ettiğiniz ve çoğu Linux ve Mac OS X makinesinde otomatik olarak sahip olduğunuz Python'dur . Makinenizde önceden yüklenmiş bir Python sürümü bulduysanız, büyük olasılıkla CPythonşirketiniz veya kuruluşunuz Python'u daha özel bir şekilde kullanmıyorsa.

Python ile komut dosyası Javaveya .NETuygulamalar oluşturmak veya avantajlarını Stacklessveya PyPyzorlayıcı özelliklerini bulmak istemiyorsanız, muhtemelen standart CPythonsistemi kullanmak istersiniz . Dilin referans uygulaması olduğu için, alternatif sistemlerden daha hızlı, en eksiksiz ve daha güncel ve daha sağlam olma eğilimindedir.


3
Kaba olmak istemiyorum, ama CPython kesinlikle en hızlı koşmuyor.
Myles

0

Bir programlama dili uygulaması, bilgisayar programlarının yürütülmesi için bir sistemdir.

Programlama dilinin uygulanmasına yönelik iki genel yaklaşım vardır:

  • yorumlama : Bir tercüman, bir programa bir dilde girdi olarak girer ve o dilde yazılmış eylemleri bazı makinelerde gerçekleştirir.
  • Derleme : Bir derleyici bir programın girişini bir dilde alır ve bu programı başka bir dile çevirir ya da başka bir derleyiciye girdi olarak kullanılabilir.

Python , 1991 yılında Guido van Rossum tarafından oluşturulan, yorumlanmış, üst düzey bir programlama dilidir .

CPython , Guido van Rossum tarafından da oluşturulan C ile yazılmış Python bilgi işlem dilinin referans sürümüdür .

Diğer Python Uygulamaları listesi

Kaynak

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.