Mengapa Python ditulis dalam C dan bukan dalam C ++?

76

Dalam tutorial Python kita dapat membaca bahwa implementasi asli Python adalah dalam C;

Di sisi lain, implementasi Python, ditulis dalam C, (...)

Saya sangat ingin tahu mengapa Python ditulis dalam C dan bukan C ++?

Saya ingin tahu alasan di balik keputusan ini dan jawabannya harus didukung oleh referensi sejarah (dan bukan berdasarkan pendapat).

Piotr Dobrogost
sumber
10
Saya tidak tahu mengapa, tetapi saya menduga ada sesuatu yang dekat dengan ini: thread.gmane.org/gmane.comp.version-control.git/57643/... :)
Matthieu
13
@Larry Coleman: Belum pernah melihat Linus rants? Anda harus menghindari "internet" ...> _>
dr Hannibal Lecter
18
@Larry Saya melihat kata-kata kasar ini dan kehilangan hampir semua rasa hormat terhadap Linus setelah membacanya. Malu padanya.
Piotr Dobrogost
5
Nah, ini adalah tanggapan terhadap kata-kata kasar Linus, bagaimana dengan ini: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi
6
Saya gagal melihat titik menanyakan "mengapa (program populer) ditulis dalam (bahasa X) dan bukan (bahasa Y)?". Atau lebih tepatnya, pertanyaan yang sama dapat dibalik: mengapa Y dan bukan X?
Andres F.

Jawaban:

119

Dari semua yang saya lihat, ini adalah kombinasi dari alasan praktis dan historis. Alasan (sebagian besar) historis adalah bahwa CPython 1.0 dirilis pada tahun 1989. Pada saat itu, C baru-baru ini distandarisasi. C ++ hampir tidak dikenal dan jelas non-portable, karena hampir tidak ada yang memiliki kompiler C ++.

Meskipun C ++ jauh lebih luas dan mudah tersedia saat ini, masih diperlukan banyak pekerjaan untuk menulis ulang CPython ke dalam subset C yang kompatibel dengan C ++. Dengan sendirinya, pekerjaan itu akan memberikan sedikit atau tidak ada manfaat nyata.

Agak mirip dengan posting blog Joel tentang memulai kembali dan melakukan penulisan ulang lengkap sebagai kesalahan terburuk yang bisa dilakukan oleh perusahaan perangkat lunak. Saya akan mengatasinya dengan menunjuk konversi Microsoft dari inti Windows 3.0 ke inti Windows NT, dan konversi Apple dari MacOS 9 ke Mac OS / X. Tidak ada yang membunuh perusahaan - tetapi keduanya pasti proyek besar, mahal, jangka panjang. Keduanya juga menunjuk pada sesuatu yang penting untuk kesuksesan: mempertahankan kedua basis kode cukup lama sehingga (sebagian besar) pengguna dapat beralih ke basis kode baru di waktu luang mereka, berdasarkan pada manfaat (setidaknya dirasakan).

Namun, untuk tim pengembangan sebesar Python, perubahan semacam itu jauh lebih sulit. Bahkan perubahan dari Python 2 ke 3 telah mengambil cukup banyak pekerjaan, dan membutuhkan tumpang tindih yang serupa. Setidaknya dalam kasus itu, bagaimanapun, ada manfaat langsung untuk perubahan, yang menulis ulang ke dalam C ++ (dengan sendirinya) tidak akan (setidaknya segera) menyediakan.

Kata-kata kasar Linus Torvalds terhadap C ++ diangkat, jadi saya akan menyebutkan itu juga. Tidak ada yang saya lihat dari Guido yang menunjukkan bahwa ia memiliki perasaan negatif dan kuat terhadap C ++. Tentang yang terburuk yang pernah saya lihat dia katakan adalah bahwa mengajar C ++ sering merupakan bencana - tetapi dia langsung mengatakan bahwa ini sebagian besar karena para guru tidak / tidak tahu C ++.

Saya juga berpikir bahwa walaupun mungkin untuk mengubah banyak kode C ke C ++ dengan relatif mudah, bahwa mendapatkan banyak keuntungan nyata dari C ++ tidak hanya membutuhkan penulisan ulang yang lebih dari itu, tetapi juga membutuhkan pendidikan ulang yang substansial dari sebagian besar pengembang yang terlibat. Kebanyakan C ++ yang ditulis dengan baik sangat berbeda dari C yang ditulis dengan baik untuk melakukan hal yang sama. Ini bukan hanya masalah perubahan mallocke newdan printfke cout, oleh imajinasi.

Jerry Coffin
sumber
2
+1 Anda banyak mengutip; mereka menarik. Tampaknya akan lebih baik lagi jika tautan dapat ditambahkan.
n611x007
1
Baru saja mengirimkan hasil edit dengan tautan ke posting blog Joel di rewrites joelonsoftware.com/articles/fog0000000069.html
MarkJ
Ini jawaban yang sangat bagus. Saya belajar banyak dari hal itu.
Game Brainiac
1
+1 khusus untuk menyebutkan c yang dapat porting ke c ++ dengan relatif mudah mungkin tidak layak dilakukan. Saya sudah tahu ini sejak lama, tetapi jawabannya benar-benar menguatkan sudut pandang ditambah beberapa dimensi untuk melihatnya.
fkl
1
"Konversi Apple dari MacOS 9 ke Mac OS / X" perhatikan bahwa OS / X bukan penulisan ulang dari awal: ini lebih merupakan pergantian dari MacOS9 ke NeXTStep, ditingkatkan dan diganti merek untuk Apple
Jivan
30

Saya pikir alasan mengapa ini awalnya ditulis dalam ANSI C89 cukup sederhana karena saat itu, C + + hanya bukan pilihan yang bisa diterapkan apa dengan ketidakcocokan antara kompiler yang berbeda dan semacamnya. Maksud saya, butuh sampai, apa itu, 2005, untuk datang dengan spesifikasi ABI yang akan memungkinkan kode dikompilasi dengan satu kompiler untuk memanggil kode dikompilasi dengan kompiler yang berbeda?

Pertanyaan yang lebih menarik adalah mengapa masih ditulis dalam C89.

Dan ada jawaban yang mengejutkan: karena orang benar-benar menggunakan Python pada platform yang tidak ada C ++ dan tidak ada kompiler C99! Ketika optimasi interpreter threaded-code yang diinspirasi digabungkan, ada diskusi besar tentang hal itu, karena kode (tentu saja) yang digunakan dihitung gotoyang bukan merupakan bagian dari C89. Tampaknya ada ketakutan nyata bahwa fitur ini mungkin tidak tersedia di beberapa platform yang saat ini digunakan Python.

Hal yang sama terjadi dengan Unladen Swallow, yang menggunakan LLVM, yang ditulis dalam C ++. Itu dibuat sangat jelas bahwa persyaratan untuk menggabungkan Unladen Swallow ke CPython adalah bahwa Anda dapat mengkompilasinya tanpa kompiler JIT, karena ada platform tempat orang menjalankan Python, yang tidak ada kompiler C ++.

Tentu saja, saat ini, CPython tidak lagi menjadi satu-satunya implementasi Python. Ada PyPy, yang ditulis dalam RPython (subset yang diketik secara statis dari Python), Jython di Jawa, IronPython di C #, Pynie di NQP dan PIR dan seterusnya.

Jörg W Mittag
sumber
3
Saya setengah tergoda untuk memperbaiki ini, tapi saya tahu tidak ada platform seperti itu di mana kompiler C ++ tidak ada (Terutama mengingat bahwa Comeau C ++ mengkompilasi ke C)
Billy ONeal
1
+1 untuk menyebutkan ABI
jk.
3
@Bdbd: Tidak, Python sama sekali bukan perangkat lunak. Ini adalah spesifikasi. Ada beberapa implementasi spesifikasi itu, yang ditulis dalam berbagai bahasa. IronPython ditulis dalam C♯, Jython di Jawa, PyPy dalam RPython, Pynie dalam NQP, PIR, dan Perl6, Pyston dalam C ++, CPython dalam C. Pernyataan "Python ditulis dalam C" tidak masuk akal. Python bukan perangkat lunak. Ini adalah spesifikasi. Itu ditulis dalam bahasa Inggris, bukan dalam bahasa pemrograman apa pun. "Java adalah turunan dari C" terutama salah. Java terinspirasi oleh Objective-C, tetapi ia menghilangkan sebagian besar bagian C dan mengambil sebagian besar bagian Smalltalk.
Jörg W Mittag
3
@MilesRout: Ada beberapa kasus di mana spesifikasi menyimpang dari CPython. Sebagai contoh: spesifikasi Python tidak menjamin finalisasi deterministik, tetapi CPython melakukannya, setidaknya untuk referensi non-lingkaran. Tetapi meskipun CPython menjamin finalisasi deterministik untuk referensi non-sirkuler, penulisan kode yang bergantung pada fakta itu rusak , karena itu bukan bagian dari spesifikasi. (Saya tidak dapat menemukan kutipan sekarang, tetapi GvR secara eksplisit mengatakan bahwa finalisasi deterministik dan penghitungan referensi adalah detail implementasi internal pribadi CPython.)
Jörg W Mittag
2
Demikian pula, CPython menjamin bahwa dua utas Python tidak dapat dieksekusi secara paralel, tetapi itu juga merupakan detail implementasi internal pribadi CPython dan tidak dijamin oleh spesifikasi bahasa. Jika apa yang Anda katakan itu benar, tidak mungkin ada implementasi lain, karena implementasi alternatif apa pun harus berperilaku identik dengan CPython, dan karenanya harus identik. (Modulo refactoring yang tidak mengubah perilaku yang dapat diamati.)
Jörg W Mittag
10

Pertanyaan yang lebih baik mungkin: "Mengapa Python tidak ditulis dengan Python?"

Lebih penting lagi, sekali cukup primitif untuk kelas dan objek Python ditulis dalam C, mereka dapat digunakan untuk menulis sisa juru bahasa, sehingga Anda tidak akan mendapatkan apa pun dengan menggunakan C ++ sebagai gantinya.

Larry Coleman
sumber
1
Jika Anda mengikuti tautan pertama dalam jawaban saya, Anda akan melihat referensi untuk implementasi Python di Python. Itu belum siap produksi. Itu didanai oleh UE. codespeak.net/pypy/dist/pypy/doc adalah tautannya jika sulit ditemukan dari jawaban saya.
vpit3833
2
Ini sebenarnya jawaban yang cukup dalam. Bukan berarti Guido's Python secara harfiah ditulis dalam Python tetapi bahwa struktur tingkat rendah dalam C digunakan untuk menulis yang tingkat yang lebih tinggi.
Jeremy
1
Saya pikir Anda melewatkan intinya karena ada perbedaan yang cukup besar (untuk orang-orang yang bekerja dengan penerjemah itu sendiri) bahasa apa yang ditulis oleh penerjemah. Bahasa mempengaruhi bagaimana orang primitif ini terlihat dan bagaimana mereka berinteraksi satu sama lain. Misalnya sekarang, dalam implementasi C dari Python, kita harus ingat untuk menambah dan mengurangi jumlah referensi secara manual sedangkan dimungkinkan untuk menggunakan pointer pintar di C ++ untuk ini.
Piotr Dobrogost
Sekarang PyPy tersedia dan menariknya mengungguli CPython kadang-kadang, saya pikir itu ide yang hebat.
Sai Kumar Battinoju