Python vs Cpython

447

Apa semua keributan tentang Python dan CPython ini (Jython, IronPython) , saya tidak mengerti:

python.org menyebutkan bahwa CPython adalah:

Implementasi "tradisional" dari Python (dijuluki CPython)

pertanyaan Stack Overflow lainnya menyebutkan bahwa:

CPython adalah interpreter byte-code default Python, yang ditulis dalam C.

Sejujurnya saya tidak mengerti arti dari kedua penjelasan tersebut secara praktis, tetapi apa yang saya pikirkan adalah, jika saya menggunakan CPython apakah artinya ketika saya menjalankan contoh kode python, ia mengkompilasinya ke bahasa C dan kemudian mengeksekusi seolah-olah itu adalah C kode

Jadi apa sebenarnya CPython dan bagaimana perbedaannya jika dibandingkan dengan python dan haruskah saya menggunakan CPython dibandingkan Python dan jika demikian apa kelebihannya?

K DawG
sumber

Jawaban:

689

Jadi apa itu CPython?

CPython adalah implementasi Python asli . Ini adalah implementasi yang Anda unduh dari Python.org. Orang menyebutnya CPython untuk membedakannya dari yang lain, kemudian, implementasi Python, dan untuk membedakan implementasi mesin bahasa dari bahasa pemrograman Python itu sendiri.

Bagian terakhir adalah dari mana kebingungan Anda berasal; Anda harus memisahkan Python-the-language dari apa pun yang menjalankan kode Python.

CPython kebetulan diimplementasikan dalam C. Itu hanya detail implementasi, sungguh. CPython mengkompilasi kode Python Anda menjadi bytecode (transparan) dan menginterpretasikan bytecode itu dalam loop evaluasi.

CPython juga yang pertama mengimplementasikan fitur baru; Pengembangan python-the-language menggunakan CPython sebagai basis; implementasi lainnya mengikuti.

Bagaimana dengan Jython, dll?

Jython , IronPython dan PyPy adalah implementasi "lainnya" saat ini dari bahasa pemrograman Python; ini diimplementasikan dalam Java, C # dan RPython (subset dari Python), masing-masing. Jython mengkompilasi kode Python Anda ke bytecode Java , sehingga kode Python Anda dapat berjalan di JVM. IronPython memungkinkan Anda menjalankan Python di Microsoft CLR . Dan PyPy, yang diimplementasikan dalam (subset dari) Python, memungkinkan Anda menjalankan kode Python lebih cepat dari CPython, yang seharusnya benar-benar meledakkan pikiran Anda. :-)

Sebenarnya kompilasi ke C

Jadi CPython tidak menerjemahkan kode Python Anda ke C dengan sendirinya. Alih-alih, ia menjalankan loop juru bahasa. Ada adalah sebuah proyek yang tidak menerjemahkan kode Python-ish ke C, dan yang disebut Cython . Cython menambahkan beberapa ekstensi ke bahasa Python, dan memungkinkan Anda mengkompilasi kode Anda ke ekstensi C, kode yang dihubungkan ke juru bahasa CPython.

Martijn Pieters
sumber
93
Saya pikir itu layak menyebutkan bahwa, dalam teori, skrip python dapat dijalankan menggunakan salah satu implementasi, dan hasil menjalankan skrip harus sama.
Douglas Mendizábal
3
Sebenarnya, dan tergantung pada proyek yang sedang Anda kerjakan, mungkin ide yang baik untuk menguji dan membuat profil kode Python Anda pada beberapa implementasi. Setelah bekerja pada proyek Java + Jython sebelumnya, Anda dapat mengalami banyak kejutan karena devs belum cukup menguji lib mereka di platform ini.
rahmu
9
Mengatakan bahwa "PyPy lebih cepat dari CPython" agak berbahaya menurut saya. Ada jawaban yang sangat bagus untuk pertanyaan itu di sini: stackoverflow.com/questions/18946662/…
Max Leske
Menjadi bersemangat tentang IronPython ... sampai saya melihat bahwa itu hanya mendukung Python 2.x.
Sean Anderson
@SeanAnderson: Sama berlaku untuk Jython (hingga 2015 rilis resmi hanya 2,5 kompatibel, menjadikannya sembilan tahun kedaluwarsa; mereka akhirnya mendapatkan 2,7 rilis di tahun 2015, tetapi masih belum ada tanda rilis 3.x).
ShadowRanger
90

Anda perlu membedakan antara bahasa dan implementasi. Python adalah bahasa,

Menurut Wikipedia , "Bahasa pemrograman adalah notasi untuk program penulisan, yang merupakan spesifikasi komputasi atau algoritma". Ini berarti bahwa itu hanyalah aturan dan sintaks untuk menulis kode. Secara terpisah kami memiliki implementasi bahasa pemrograman yang dalam kebanyakan kasus, adalah penerjemah atau kompiler yang sebenarnya.

Python adalah bahasa. CPython adalah implementasi dari Python di C. Jython adalah implementasi di Java, dan sebagainya.

Singkatnya: Anda sudah menggunakan CPython (jika Anda mengunduh dari sini ).

jamylak
sumber
2
Anda harus membaca posting Martijn Pieters "CPython tidak menerjemahkan kode Python Anda ke C dengan sendirinya. Ini malah menjalankan loop juru bahasa. Ada proyek yang menerjemahkan kode Python-ish ke C, dan itu disebut Cython"
Raymond Chenon
2
mengapa ada begitu banyak penindasan tentang Cpython. yaitu: kita tidak mendengar Cc ++ atau CJava atau bahkan CSwift. Atau apakah saya melewatkan sesuatu?
Suhaib
3
@ Suhaib: benar, di dunia Jawa orang-orang memiliki misalnya HotSpot, OpenJDK, IBM J9 JDK, Azul. Mereka biasanya lebih tepat, yaitu Anda tidak benar-benar melihat "instal Java" melainkan "instal Java 8 JDK yang kompatibel, misalnya Oracle JDK 8". Di dunia JavaScript Anda memiliki node.js, V8, dll. Anda "menginstal node.js", bukan "menginstal JavaScript", kan? Tapi di dunia Python itu cukup umum untuk hanya mengatakan "instal Python 3.6" dan selesai, mengacu pada spesifikasi bahasa, bukan runtime tertentu.
Hendy Irawan
37

Bahkan saya memiliki masalah yang sama dalam memahami bagaimana CPython, JPython, IronPython, PyPy berbeda satu sama lain.

Jadi, saya bersedia untuk membersihkan tiga hal sebelum saya mulai menjelaskan:

  1. Python : Ini adalah bahasa, hanya menyatakan / menjelaskan cara menyampaikan / mengekspresikan diri kepada penerjemah (program yang menerima kode python Anda).
  2. Implementasi : Ini semua tentang bagaimana penerjemah ditulis, khususnya, dalam bahasa apa dan apa yang akhirnya dilakukan .
  3. Bytecode : Ini adalah kode yang diproses oleh suatu program, biasanya disebut sebagai mesin virtual, bukan oleh mesin komputer "nyata", prosesor perangkat keras.

CPython adalah implementasinya, yang ditulis dalam bahasa C. Itu akhirnya menghasilkan bytecode (set instruksi berbasis stack-machine) yang spesifik Python dan kemudian mengeksekusinya. Alasan untuk mengkonversi kode Python ke bytecode adalah karena lebih mudah untuk mengimplementasikan juru bahasa jika itu terlihat seperti instruksi mesin. Tapi, tidak perlu menghasilkan bytecode sebelum eksekusi kode Python (tapi CPython menghasilkan).

Jika Anda ingin melihat bytecode CPython maka Anda bisa. Begini caranya:

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

Sekarang, mari kita lihat kode di atas. Baris 1 hingga 6 adalah definisi fungsi. Pada baris 8, kita mengimpor modul 'dis' yang dapat digunakan untuk melihat bytecode Python perantara (atau Anda dapat mengatakan, disassembler untuk bytecode Python) yang dihasilkan oleh CPython (interpreter).

CATATAN : Saya mendapatkan tautan ke kode ini dari saluran #python IRC: https://gist.github.com/nedbat/e89fa710db0edfb9057dc8d18d979f9c

Dan kemudian, ada Jython, yang ditulis dalam Java dan akhirnya menghasilkan kode byte Java. Kode byte Java berjalan pada Java Runtime Environment, yang merupakan implementasi dari Java Virtual Machine (JVM). Jika ini membingungkan maka saya curiga Anda tidak tahu bagaimana Java bekerja. Dalam istilah awam, kode Java (bahasa, bukan kompiler) diambil oleh kompiler Java dan menghasilkan file (yang merupakan kode byte Java) yang dapat dijalankan hanya menggunakan JRE. Hal ini dilakukan agar, begitu kode Java dikompilasi, maka kode itu dapat di-porting ke komputer lain dalam format kode byte Java, yang hanya dapat dijalankan oleh JRE. Jika ini masih membingungkan maka Anda mungkin ingin melihat halaman web ini .

Di sini, Anda mungkin bertanya apakah bytecode CPython portable seperti Jython, saya kira tidak. The bytecode yang dihasilkan dalam pelaksanaan CPython adalah khusus untuk yang interpreter untuk membuatnya mudah untuk eksekusi kode selanjutnya (Saya juga menduga bahwa, produksi bytecode menengah seperti, hanya untuk kemudahan dalam pengolahan dilakukan di banyak penafsir lainnya).

Jadi, dalam Jython, ketika Anda mengkompilasi kode Python Anda, Anda berakhir dengan kode byte Java, yang dapat dijalankan pada JVM.

Demikian pula, IronPython (ditulis dalam bahasa C #) mengkompilasi kode Python Anda ke Common Language Runtime (CLR), yang merupakan teknologi serupa dibandingkan dengan JVM, yang dikembangkan oleh Microsoft.

Vijay Kumar
sumber
3
thx untuk penjelasan terperinci !! Ini berarti CPython menangani konversi kode Python ke Kode Byte dan juga menafsirkan kode byte ke kode mesin? Dalam kacang shell CPython adalah Compiler (untuk Python ke Kode Byte) dan Mesin Virtual Python (untuk kode Byte ke kode Mesin)? Membandingkan sama dengan. Net, ada C # Compiler untuk Mengkonversi C # ke MSIL dan CLR untuk mengkonversi dari MSIL ke kode mesin.
rahulaga_dev
30

Artikel ini menjelaskan secara menyeluruh perbedaan antara implementasi Python yang berbeda. Seperti artikel katakan:

Hal pertama yang disadari adalah 'Python' adalah sebuah antarmuka. Ada spesifikasi tentang apa yang harus dilakukan oleh Python dan bagaimana seharusnya berperilaku (seperti halnya antarmuka apa pun). Dan ada beberapa implementasi (seperti halnya antarmuka apa pun).

Hal kedua yang harus disadari adalah bahwa 'ditafsirkan' dan 'dikompilasi' adalah properti dari implementasi, bukan antarmuka.

shaktimaan
sumber
20

Python adalah bahasa: seperangkat aturan yang dapat digunakan untuk menulis program. Ada beberapa implementasi bahasa ini.

Apa pun implementasi yang Anda lakukan, mereka melakukan hal yang hampir sama: mengambil teks program Anda dan menafsirkannya, menjalankan instruksinya. Tak satu pun dari mereka mengkompilasi kode Anda ke dalam C atau bahasa lain.

CPython adalah implementasi asli, ditulis dalam C. (Bagian "C" dalam "CPython" mengacu pada bahasa yang digunakan untuk menulis interpreter Python itu sendiri.)

Jython adalah bahasa yang sama (Python), tetapi diimplementasikan menggunakan Java.

Penerjemah IronPython ditulis dalam bahasa C #.

Ada juga PyPy - interpreter Python yang ditulis dengan Python. Buat pilihan Anda :)

orlenko
sumber
8

implementationberarti bahasa apa yang digunakan untuk mengimplementasikan Python dan bukan bagaimana Kode python akan diimplementasikan. Keuntungan menggunakan CPython adalah ketersediaan C Run-time serta integrasi yang mudah dengan C / C ++.

Jadi CPython awalnya diimplementasikan menggunakan C. Ada percabangan lain untuk implementasi asli yang memungkinkan Python untuk meningkatkan Java (JYthon) atau .NET Runtime (IronPython).

Berdasarkan Implementasi yang Anda gunakan, ketersediaan pustaka mungkin bervariasi, misalnya Ctypes tidak tersedia di Jython , sehingga pustaka yang menggunakan ctypes tidak akan berfungsi di Jython. Demikian pula, jika Anda ingin menggunakan Java Class, Anda tidak bisa langsung melakukannya dari CPython. Anda juga membutuhkan lem (JEPP) atau perlu menggunakan Jython (The Java Implementation of Python)

Abhijit
sumber
4

Anda harus tahu bahwa CPython tidak mendukung multithreading karena Global Interpreter Lock . Ia juga tidak memiliki mekanisme Optimasi untuk rekursi, dan memiliki banyak keterbatasan lain yang coba diisi oleh implementasi dan perpustakaan lain.

Anda harus melihat halaman ini di python wiki.

Lihatlah potongan kode di halaman ini , itu akan memberi Anda ide yang baik tentang apa itu penerjemah.

Oussama L.
sumber
17
CPython mendukung multithreading, tetapi GIL membuatnya sulit untuk mengambil keuntungan dari banyak core atau CPU. Itu tidak sama dengan tidak mendukung multithreading sama sekali.
Martijn Pieters
0

Implementasi asli, dan standar, Python biasanya dipanggil CPythonketika Anda ingin membandingkannya dengan opsi lain ( dan sekadar "Python" ). Nama ini berasal dari fakta bahwa ia dikodekan dalam portable ANSI C language code. Ini adalah Python yang Anda ambil dari http://www.python.org , dapatkan dengan distribusi ActivePython dan Enthought , dan telah secara otomatis di sebagian besar mesin Linux dan Mac OS X. Jika Anda telah menemukan versi Python yang sudah diinstal pada mesin Anda, itu mungkin CPython, kecuali perusahaan atau organisasi Anda menggunakan Python dengan cara yang lebih khusus.

Kecuali Anda ingin skrip Java atau .NETaplikasi dengan Python atau menemukan manfaat Stacklessatau PyPymenarik, Anda mungkin ingin menggunakan CPythonsistem standar . Karena ini adalah implementasi referensi bahasa, ia cenderung untuk menjalankan yang tercepat, menjadi yang paling lengkap, dan lebih mutakhir dan kuat daripada sistem alternatif.

Sushant Chaudhary
sumber
3
Saya tidak bermaksud kasar, tetapi CPython sama sekali tidak menjalankan yang tercepat.
Myles Hollowed
0

Implementasi bahasa pemrograman adalah sistem untuk menjalankan program komputer.

Ada dua pendekatan umum untuk implementasi bahasa pemrograman:

  • Penafsiran : Seorang juru bahasa mengambil input program dalam beberapa bahasa, dan melakukan tindakan yang ditulis dalam bahasa itu pada beberapa mesin.
  • Kompilasi : Kompiler mengambil sebagai input suatu program dalam beberapa bahasa, dan menerjemahkan program itu ke dalam bahasa lain, yang dapat berfungsi sebagai input ke penerjemah lain atau kompiler lain.

Python adalah bahasa pemrograman tingkat tinggi yang ditafsirkan yang dibuat oleh Guido van Rossum pada tahun 1991.

CPython adalah versi referensi dari bahasa komputasi Python, yang ditulis dalam C yang dibuat oleh Guido van Rossum juga.

Daftar lain dari Implementasi Python

Sumber

Premraj
sumber