Dlaczego Python jest napisany w C, a nie w C ++?

76

W samouczku Pythona można przeczytać, że oryginalna implementacja Pythona jest w C;

Z drugiej strony implementacja Pythona, napisana w C, (...)

Jestem bardzo ciekawy, dlaczego Python został napisany w C, a nie w C ++?

Chciałbym poznać uzasadnienie tej decyzji, a odpowiedź powinna być poparta odniesieniami historycznymi (a nie opartymi na opiniach).

Piotr Dobrogost
źródło
10
Nie wiem dlaczego, ale podejrzewam coś podobnego : thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu
13
@Larry Coleman: Nigdy nie widziałeś Linusów? Musisz unikać „internetów” ...> _>
dr Hannibal Lecter
18
@ Larry Widziałem ten nakaz i straciłem prawie cały szacunek dla Linusa po jego przeczytaniu. Powinien się wstydzić.
Piotr Dobrogost
5
Cóż, to odpowiedź na rant Linusa, a co z tym: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi
6
Nie widzę sensu pytać „dlaczego (popularny program) jest napisany w (język X), a nie (język Y)?”. A raczej to samo pytanie można odwrócić: dlaczego Y, a nie X?
Andres F.,

Odpowiedzi:

119

Ze wszystkiego, co widziałem, jest to połączenie praktycznych i historycznych powodów. (Głównie) historycznym powodem jest to, że CPython 1.0 został wydany w 1989 roku. W tym czasie C został niedawno ustandaryzowany. C ++ był prawie nieznany i zdecydowanie nieprzenośny, ponieważ prawie nikt nie miał kompilatora C ++.

Chociaż C ++ jest dziś znacznie bardziej rozpowszechniony i łatwo dostępny, nadal trzeba by dużo pracy, aby przepisać CPython do podzbioru C, który jest kompatybilny z C ++. Praca sama w sobie przyniosłaby niewielką lub żadną rzeczywistą korzyść.

To trochę tak, jak na blogu Joela o rozpoczęciu od nowa i całkowitym przepisaniu, co jest najgorszym błędem, jaki może popełnić firma programistyczna. Odrzuciłbym to, wskazując na konwersję Microsoftu z rdzenia Windows 3.0 na rdzeń Windows NT oraz konwersję Apple z MacOS 9 na Mac OS / X. Żaden z nich nie zabił firmy - ale oba były zdecydowanie dużymi, drogimi, długoterminowymi projektami. Oba wskazują również na coś, co ma kluczowe znaczenie dla sukcesu: utrzymanie obu baz kodu wystarczająco długo, aby (większość) użytkownicy mogli swobodnie przełączać się na nową bazę kodu w oparciu o (przynajmniej dostrzegane) korzyści.

Jednak dla zespołu programistów wielkości Pythona taka zmiana jest znacznie trudniejsza. Nawet zmiana z Pythona 2 na 3 zajęła sporo pracy i wymagała podobnego nakładania się. Przynajmniej w takim przypadku zmiany mają jednak bezpośrednie zalety, których przepisanie do C ++ (samo w sobie) nie zapewniłoby (przynajmniej natychmiast).

Poruszenie Linusa Torvaldsa przeciwko C ++ zostało podniesione, więc też o tym wspomnę. Nic, co widziałem od Guido, nie wskazuje na to, że ma on takie silne, negatywne uczucia wobec C ++. Najgorsze, jak go widziałem, to to, że nauczanie C ++ jest często katastrofą - ale od razu powiedział, że dzieje się tak głównie dlatego, że nauczyciele nie znają / nie znają C ++.

Myślę również, że chociaż można stosunkowo łatwo przekonwertować wiele kodu C na C ++ , uzyskanie realnej przewagi z C ++ wymaga nie tylko nieco więcej przepisywania niż to, ale także wymaga znacznej reedukacji większości zaangażowanych programistów. Większość dobrze napisanego C ++ zasadniczo różni się od dobrze napisanego C, aby robić te same rzeczy. To nie tylko kwestia zmieniających mallocsię newi printfdo cout, przez odcinku wyobraźni.

Jerry Coffin
źródło
2
+1 Cytujesz dużo; są interesujące. Wydaje się, że byłoby jeszcze lepiej, gdyby można było dodać linki.
n611x007
1
Właśnie przesłałem edycję z linkiem do posta na blogu Joela w przepisaniu joelonsoftware.com/articles/fog0000000069.html
MarkJ
To była doskonała odpowiedź. Wiele się z tego nauczyłem.
Games Brainiac
1
+1 za wspomnienie o c, które można stosunkowo łatwo przenieść do c ++, prawdopodobnie nie jest warte zrobienia. Wiedziałem o tym już od dłuższego czasu, ale odpowiedź naprawdę wzmocniła punkt widzenia i dodała kilka wymiarów, aby na to spojrzeć.
fkl
1
„Konwersja Apple'a z MacOS 9 na Mac OS / X” zauważa, że ​​OS / X nie jest przepisywaniem od zera: była to raczej zmiana z MacOS9 na NeXTStep, ulepszona i zmieniona na Apple
Jivan
30

Myślę, że powód, dla którego pierwotnie został napisany w ANSI C89, jest po prostu dlatego, że wtedy C ++ nie był po prostu praktycznym wyborem, co przy niezgodności różnych kompilatorów i tym podobnych. To znaczy, minęło do 2005 roku, aby opracować specyfikację ABI, która pozwoliłaby kodowi skompilowanemu z jednym kompilatorem wywoływać kod skompilowany z innym kompilatorem?

Bardziej interesujące pytanie brzmi: dlaczego wciąż jest napisane w C89.

I jest zaskakująca odpowiedź: ponieważ ludzie faktycznie używają Pythona na platformach, dla których nie istnieje kompilator C ++ i C99! Kiedy zainspirowane przez Forth optymalizacje interpretera kodu wątkowego zostały połączone, odbyła się wielka dyskusja na ten temat, ponieważ kod (koniecznie) używał obliczeń, gotoktóre nie są częścią C89. Najwyraźniej istniały obawy, że ta funkcja może nie być dostępna na niektórych platformach, na których obecnie używany jest Python.

To samo stało się z Unladen Swallow, który używa LLVM, który jest napisany w C ++. Wyjaśniono bardzo wyraźnie, że warunkiem połączenia Unladen Swallow z CPython będzie możliwość skompilowania go bez kompilatora JIT, ponieważ istnieją platformy, na których ludzie uruchamiają Python, dla których nie istnieje kompilator C ++.

Oczywiście w dzisiejszych czasach CPython nie jest już jedyną implementacją Pythona. Istnieje PyPy, który jest napisany w RPython (statycznie typowany podzbiór Pythona), Jython w Javie, IronPython w C #, Pynie w NQP i PIR i tak dalej.

Jörg W Mittag
źródło
3
Mam pokusę, by to zagłosować, ale nie znam takiej platformy, w której kompilator C ++ nie istnieje (szczególnie biorąc pod uwagę, że Comeau C ++ kompiluje się do C)
Billy ONeal
1
+1 za wzmiankę o ABI
jk.
3
@Abdul: Nie, Python wcale nie jest oprogramowaniem. To specyfikacja. Istnieje wiele implementacji tej specyfikacji, napisanych w wielu językach. IronPython jest napisany w C♯, Jython w Javie, PyPy w RPython, Pynie w NQP, PIR i Perl6, Pyston w C ++, CPython w C. Wyrażenie „Python jest napisany w C” nie ma sensu. Python nie jest oprogramowaniem. To specyfikacja. Jest napisany w języku angielskim, a nie w żadnym języku programowania. „Java jest pochodną C” jest głównie błędna. Java jest inspirowana Objective-C, ale pozbywa się większości części C i zajmuje głównie części Smalltalk.
Jörg W Mittag
3
@MilesRout: Istnieje wiele przypadków, w których specyfikacja odbiega od CPython. Na przykład: specyfikacja Pythona nie gwarantuje deterministycznej finalizacji, ale CPython, przynajmniej w przypadku odniesień nieokrągłych. Ale chociaż CPython gwarantuje deterministyczną finalizację odwołań nieokrągłych, pisanie kodu opartego na tym fakcie jest zepsute , ponieważ nie jest to częścią specyfikacji. (Nie mogę teraz znaleźć cytatu, ale GvR wyraźnie powiedział, że deterministyczne finalizowanie i liczenie referencji są prywatnymi wewnętrznymi szczegółami implementacyjnymi CPython.)
Jörg W Mittag
2
Podobnie, CPython gwarantuje, że dwa wątki Pythona nie mogą być wykonywane równolegle, ale jest to również prywatny wewnętrzny szczegół implementacji CPython i nie jest gwarantowany przez specyfikację języka. Jeśli to, co mówisz, jest prawdą, nie może być żadnych innych implementacji, ponieważ każda alternatywna implementacja musi koniecznie zachowywać się identycznie jak CPython, a zatem musi być koniecznie identyczna. (Refaktoryzacje modulo, które nie zmieniają obserwowalnego zachowania.)
Jörg W Mittag
10

Lepszym pytaniem może być: „Dlaczego Python nie jest napisany w Pythonie?”

Co więcej, gdy tylko prymityw dla klas i obiektów Pythona zostanie napisany w C, można ich użyć do napisania reszty interpretera, więc nie zyskasz nic, używając C ++ zamiast tego.

Larry Coleman
źródło
1
Jeśli podążysz za pierwszym linkiem w mojej odpowiedzi, zobaczysz odniesienie do implementacji Pythona w Pythonie. To jeszcze nie jest gotowe do produkcji. To jest finansowane przez UE. codespeak.net/pypy/dist/pypy/doc to link, jeśli trudno jest znaleźć moją odpowiedź.
vpit3833,
2
To jest naprawdę dość głęboka odpowiedź. Nie dlatego, że Python Guido jest dosłownie napisany w Pythonie, ale że struktury niskiego poziomu w C są używane do pisania struktur wyższego poziomu.
Jeremy
1
Myślę, że nie rozumiesz sedna sprawy, ponieważ istnieje znaczna różnica (dla osób pracujących nad samym tłumaczem) w jakim języku jest napisany tłumacz. Język wpływa na to, jak wyglądają te prymitywy i jak się ze sobą komunikują. Na przykład teraz, w implementacji języka Python w języku C, należy pamiętać o ręcznym zwiększaniu i zmniejszaniu liczby odwołań, podczas gdy możliwe jest do tego użycie inteligentnych wskaźników w C ++.
Piotr Dobrogost
Teraz, gdy PyPy jest dostępny i co ciekawe czasami przewyższa CPython, myślę, że byłby to świetny pomysł.
Sai Kumar Battinoju