Python neden C dilinde değil, C ++ dilinde yazılmıştır?


76

In Python'un öğretici bir Python'un orijinal uygulama C olduğunu okuyabilir;

Öte yandan, Python uygulaması, C ile yazılmış, (...)

Python'un neden C ++ değil de C ++ ile yazıldığını merak ediyorum.

Bu kararın gerekçesini bilmek istiyorum ve cevap tarihsel referanslarla desteklenmeli (fikre dayalı değil).


10
Nedenini tanımıyorum, ama bu yakın bir şey şüpheli: thread.gmane.org/gmane.comp.version-control.git/57643/... :)
Matthieu

13
@Larry Coleman: Linus rantlarını hiç görmedim mi? "İnternetten" kaçınıyor olmalısın ...> _>
dr Hannibal Lecter

18
@Larry Bu rantu gördüm ve okuduktan sonra Linus'a olan saygımın neredeyse tamamını kaybettim. Ayıp ona.
Piotr Dobrogost

5
Peki, bu Linus'un rantına
avi

6
"Neden (popüler program) (X dili ile yazılmış) (Y dili ile değil?) Yazıldığını sorma noktasını göremiyorum. Veya daha doğrusu, aynı soru tersine çevrilebilir: neden Y değil X?
Andres F.

Yanıtlar:


119

Gördüğüm her şeyden, pratik ve tarihi sebeplerin bir birleşimi. (Çoğunlukla) tarihsel sebep, CPython 1.0’ın 1989’da piyasaya sürülmesidir. O zamanlar, C henüz yeni standartlaştırılmıştı. C ++ neredeyse bilinmiyordu ve kesinlikle taşınabilir değildi, çünkü neredeyse hiç kimse C ++ derleyicisine sahip değildi.

Her ne kadar C ++ bugün çok daha yaygın ve kolay erişilebilir olsa da, CPython'u C ++ ile uyumlu olan C altkümesine yeniden yazmak oldukça adil bir çalışma gerektirecektir. Tek başına, bu çalışma gerçek bir fayda sağlayacak veya çok az sağlayacaktır.

Biraz gibi Joel'in blog post üzerinde başlayan ve bir yazılım şirketi yapabileceğiniz en büyük hata olma komple yeniden yazma yapmayı. Microsoft'un Windows 3.0 çekirdeğinden Windows NT çekirdeğine dönüşümünü ve Apple'ın MacOS 9'dan Mac OS / X'e dönüşümünü işaret ederek karşı koyardım. İkisi de şirketi öldürmedi - ama ikisi de kesinlikle büyük, pahalı, uzun vadeli projelerdi. Her ikisi de, başarısı için çok önemli olan bir şeye işaret eder: Her iki kod tabanını da (çoğu) kullanıcıların (en azından algılanan) yararlarına dayanarak boş zamanlarında yeni kod tabanına geçebilecekleri kadar uzun süre tutmak .

Bir geliştirme ekibi için Python'un büyüklüğü bu tür bir değişimin çok daha zor. Python 2'den 3'e değişim bile oldukça fazla çalışma gerektirdi ve benzer bir örtüşme gerektirdi. Ancak en azından bu durumda, C ++ 'a yeniden yazmanın (en azından hemen) sağlayamayacağı değişikliklerin doğrudan faydaları var.

Linus Torvalds'ın C ++ 'a karşı rantı gündeme geldi, ben de bunu söyleyeceğim. Guido'dan gördüğüm hiçbir şey, C ++ 'a karşı böyle güçlü, olumsuz duygulara sahip olduğunu göstermez. Ona söylediklerimin en kötüsü hakkında C ++ öğretmenin genellikle bir felaket olduğu - ama bunun öğretmenlerin C ++ bilmediği / bilmediği için derhal devam ettiğini söyledi.

Ayrıca C ++ 'ı C ++' a göreceli olarak kolaylıkla dönüştürmenin mümkün olduğunu düşünürken , C ++ 'dan gerçek anlamda bir avantaj elde etmenin sadece bundan biraz daha fazla yeniden yazmayı gerektirdiğini değil, aynı zamanda katılan çoğu geliştiricinin de yeniden eğitilmesini gerektirdiğini düşünüyorum. En iyi yazılmış C ++, aynı şeyleri yapmak için iyi yazılmış C'den büyük ölçüde farklıdır. O var değil değişen meselesi mallociçin newve printfhiç couthayal herhangi bir streç tarafından.


2
+1 Çok fazla teklif veriyorsunuz; ilginçler. Bağlantıların eklenmesi daha iyi olur gibi görünüyor.
n611x007

1
Sadece yeniden yazar üzerinde Joel'in blog yayınına bağlantı içeren bir düzenlemeyi ibraz joelonsoftware.com/articles/fog0000000069.html
MarkJ

Bu mükemmel bir cevaptı. Ondan çok şey öğrendim.
Oyunlar Brainiac

1
C ++ 'a göreceli olarak kolaylıkla taşınabilecek c'den bahsetmek için +1 muhtemelen yapmaya değmez. Bunu zaten uzun zamandır biliyordum ama cevap, bakış açısını güçlendirdi ve buna bakmak için birkaç boyut ekledi.
fkl

1
"MacOS 9 Mac OS Apple'ın dönüşüm / X" OS / X sıfırdan bir yeniden yazma olmadığına dikkat: Bu, daha ziyade NeXTStep'in için MacOS9 bir değişimdi Apple için geliştirilmiş ve rebranded
Jivan

30

Sanırım aslında ANSI C89'da yazılmış olmasının sebebi oldukça basit çünkü o zamanlar, C ++ farklı bir derleyiciler ve bunun arasındaki uyumsuzluklarla ilgili olarak uygulanabilir bir seçenek değildi. Yani, bir derleyiciyle derlenmiş kodun farklı bir derleyiciyle derlenmiş kodu çağırmasına izin verecek bir ABI belirtimi ile gelmesi 2005 yılına kadar sürdü.

Daha ilginç olan soru neden hala C89'da yazılmış olduğu.

Ve şaşırtıcı bir cevap var: çünkü insanlar aslında Python'u C ++ ve C99 derleyicileri olmayan platformlarda kullanıyorlar! Dördüncü ilham kodlu kodlama tercümanı optimizasyonları birleştirildiğinde, bu konuda büyük bir tartışma yapıldı, çünkü kullanılan kod (zorunlu olarak) gotoC89'un bir parçası olmayan bilgisayar kullandı . Bu özelliğin Python'un şu anda üzerinde kullanıldığı bazı platformlarda bulunmayabileceği konusunda gerçek korkular vardı.

Aynı şey, C ++ ile yazılmış LLVM'yi kullanan Unladen Swallow için de oldu. Unladen Swallow'u CPython ile birleştirmek için bir gereksinimin, JIT derleyicisi olmadan derleyebilmeniz gerektiği, çünkü Python'u çalıştıran platformlar olmadığı için C ++ derleyicisi bulunmadığı çok açıktı.

Tabii ki, bugünlerde, CPython artık tek Python uygulaması değil. RPython (statik olarak yazılmış bir Python alt kümesi), Java'da Jython, C # 'da IronPython, NQP'de Pynie ve PIR ile yazılmış PyPy vardır.


3
Bunu yargılamak için istekliyim ama C ++ derleyicisinin olmadığı bir platform bilmiyorum (Özellikle Comeau C ++ 'nın C
derlenmesiyle

1
ABI'den bahsettiğiniz için +1
jk.

3
@Abdul: Hayır, Python hiç bir yazılım değildir. Bu bir şartname. Bu şartnamenin birden fazla dilde yazılmış birden fazla uygulaması vardır. IronPython C♯, Java’daki Jython, RPython’daki PyPy, NQP’deki Pynie, PIR ve Perl6, C ++’daki Pyston, C’deki CPython ile yazılmıştır. Python bir yazılım değildir. Bu bir şartname. Herhangi bir programlama dilinde değil, İngilizce olarak yazılmıştır. "Java, C'nin bir türevidir" temelde yanlıştır. Java, Objective-C'den esinlenmiştir ancak C bölümlerinin çoğundan kurtulur ve çoğunlukla Smalltalk bölümlerini alır.
Jörg W Mittag

3
@MilesRout: Belirtimin CPython'dan saptığı birçok durum var. Örneğin: Python şartnamesi deterministik sonlandırmayı garanti etmez, ancak CPython en azından dairesel olmayan referanslar için yapar. Ancak CPython, döngüsel olmayan referanslar için deterministik bir sonlandırma garantisi vermesine rağmen, bu gerçeğe dayanan yazma kodu , şartnamenin bir parçası olmadığı için bozuldu . (Teklifi şu anda bulamıyorum, ancak GvR açıkça belirleyici sonuçlandırma ve referans sayımının CPython'un özel iç uygulama ayrıntıları olduğunu söyledi.)
Jörg W Mittag

2
Benzer şekilde, CPython, iki Python iş parçacığının paralel olarak yürütülemeyeceğini garanti eder, ancak bu aynı zamanda, CPython'un özel bir iç uygulama detayıdır ve dil belirtimi tarafından garanti edilmez. Söylediğiniz doğruysa, başka hiçbir uygulama olamazdı, çünkü alternatif bir uygulama mutlaka CPython ile aynı şekilde davranmalı ve dolayısıyla mutlaka aynı olmalıdır. (Gözlenebilir davranışları değiştirmeyen Modulo refactorings.)
Jörg W Mittag

10

Daha iyi bir soru olabilir: "Python neden Python'da yazılmıyor?"

Dahası, Python sınıfları ve objeleri için yeterli ilkeler C'ye yazıldığında, bunlar yorumlayıcının geri kalanını yazmak için kullanılabilir, böylece C ++ 'ı kullanarak hiçbir şey elde edemezsiniz.


1
Cevabımdaki ilk bağlantıyı takip ederseniz, Python'da bir Python uygulamasına bir referans göreceksiniz. Bu henüz üretime hazır değil. Bu AB tarafından finanse edilmektedir. codespeak.net/pypy/dist/pypy/doc cevabımı bulmak zor ise bağlantıdır.
vpit3833

2
Bu aslında oldukça derin bir cevap. Guido'nun Python'u kelimenin tam anlamıyla Python'da yazıldığından değil, C'deki düşük seviyeli yapıların daha yüksek seviyeli olanları yazmak için kullanıldığı söylenebilir.
Jeremy

1
Tercümanın hangi dilde yazıldığını (tercüman üzerinde çalışan kişiler için) oldukça farklı olduğu için noktayı kaçırdığınızı düşünüyorum. Dil, bu ilkellerin nasıl göründüğünü ve birbirleriyle nasıl etkileşime girdiklerini etkiler . Mesela şimdi, Python'un C uygulamasında, kişi referans sayımını manuel olarak arttırıp azaltmayı hatırlamak zorunda iken, bunun için C ++ 'da akıllı işaretçiler kullanmak mümkün olabilir.
Piotr Dobrogost

Şimdi PyPy kullanılabilir ve bazen CPython'u ilginç şekilde geride bırakıyor, bence bu harika bir fikir olurdu.
Sai Kumar Battinoju
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.