"PyPy adalah implementasi ulang Python dengan Python" adalah cara yang agak menyesatkan untuk menggambarkan PyPy, IMHO, meskipun secara teknis itu benar.
Ada dua bagian utama PyPy.
- Kerangka terjemahan
- Penerjemah
Kerangka terjemahan adalah kompiler. Itu mengkompilasi kode RPython ke C (atau target lainnya), secara otomatis menambahkan dalam aspek-aspek seperti pengumpulan sampah dan kompiler JIT. Itu tidak dapat menangani kode Python sewenang-wenang, hanya RPython.
RPython adalah bagian dari Python normal; semua kode RPython adalah kode Python, tetapi tidak sebaliknya. Tidak ada definisi formal dari RPython, karena RPython pada dasarnya hanyalah "himpunan bagian dari Python yang dapat diterjemahkan oleh kerangka kerja terjemahan Pypy". Tetapi untuk diterjemahkan, kode RPython harus diketik secara statis (jenisnya disimpulkan, Anda tidak mendeklarasikannya, tetapi masih satu jenis per variabel), dan Anda tidak dapat melakukan hal-hal seperti mendeklarasikan / memodifikasi fungsi / kelas saat runtime juga.
Penerjemah kemudian adalah juru bahasa Python normal yang ditulis dalam RPython.
Karena kode RPython adalah kode Python normal, Anda dapat menjalankannya pada penerjemah Python apa pun. Tapi tidak ada klaim kecepatan PyPy yang datang dari menjalankannya seperti itu; ini hanya untuk siklus tes cepat, karena menerjemahkan penerjemah membutuhkan waktu lama .
Dengan memahami itu, harus segera jelas bahwa spekulasi tentang PyPyPy atau PyPyPyPy sebenarnya tidak masuk akal. Anda memiliki juru bahasa yang ditulis dalam RPython. Anda menerjemahkannya ke kode C yang mengeksekusi Python dengan cepat. Di sana proses berhenti; tidak ada lagi RPython untuk mempercepat dengan memprosesnya lagi.
Jadi "Bagaimana mungkin PyPy lebih cepat dari CPython" juga menjadi cukup jelas. PyPy memiliki implementasi yang lebih baik, termasuk kompiler JIT (umumnya tidak secepat tanpa kompiler JIT, saya percaya, yang berarti PyPy hanya lebih cepat untuk program yang rentan terhadap kompilasi JIT). CPython tidak pernah dirancang untuk menjadi implementasi yang sangat optimal dari bahasa Python (meskipun mereka mencoba membuatnya menjadi implementasi yang sangat optimal , jika Anda mengikuti perbedaannya).
Bagian proyek PyPy yang benar-benar inovatif adalah bahwa mereka tidak menulis skema GC canggih atau kompiler JIT dengan tangan. Mereka menulis interpreter relatif mudah dalam RPython, dan untuk semua RPython adalah tingkat yang lebih rendah daripada Python itu masih merupakan bahasa pengumpulan sampah berorientasi objek, tingkat yang jauh lebih tinggi daripada C. Kemudian kerangka terjemahan secara otomatis menambahkan hal-hal seperti GC dan JIT. Jadi kerangka terjemahannya sangat besarupaya, tetapi itu berlaku sama baiknya untuk juru bahasa python PyPy namun mereka mengubah implementasi mereka, memungkinkan untuk lebih banyak kebebasan dalam percobaan untuk meningkatkan kinerja (tanpa khawatir tentang memperkenalkan bug GC atau memperbarui kompiler JIT untuk mengatasi perubahan). Ini juga berarti ketika mereka berusaha menerapkan juru bahasa Python3, itu akan secara otomatis mendapatkan manfaat yang sama. Dan penterjemah lain yang ditulis dengan kerangka PyPy (yang ada sejumlah pada berbagai tahap polandia). Dan semua penerjemah yang menggunakan kerangka PyPy secara otomatis mendukung semua platform yang didukung oleh kerangka tersebut.
Jadi manfaat sebenarnya dari proyek PyPy adalah memisahkan (sebanyak mungkin) semua bagian dari penerapan juru bahasa independen platform yang efisien untuk bahasa yang dinamis. Dan kemudian muncul dengan satu implementasi yang baik dari mereka di satu tempat, yang dapat digunakan kembali di banyak penerjemah. Itu bukan kemenangan langsung seperti "program Python saya berjalan lebih cepat sekarang", tapi ini prospek yang bagus untuk masa depan.
Dan itu dapat menjalankan program Python Anda lebih cepat (mungkin).