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).
python
c++
history
implementations
Piotr Dobrogost
źródło
źródło
Odpowiedzi:
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
malloc
sięnew
iprintf
docout
, przez odcinku wyobraźni.źródło
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ń,
goto
któ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.
źródło
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.
źródło