Warum ist Python in C und nicht in C ++ geschrieben?

76

In Pythons Tutorial kann man lesen, dass Pythons ursprüngliche Implementierung in C ist;

Auf der anderen Seite die Python-Implementierung, geschrieben in C, (...)

Ich bin sehr gespannt, warum Python in C und nicht in C ++ geschrieben wurde.

Ich möchte die Gründe für diese Entscheidung kennen und die Antwort sollte durch historische Referenzen (und nicht meinungsbasiert) gestützt werden.

Piotr Dobrogost
quelle
10
Ich weiß nicht warum, aber ich vermute etwas Ähnliches : thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu
13
@ Larry Coleman: Noch nie gesehen, wie Linus schimpft? Sie müssen "die Internets" meiden ...> _>
Dr. Hannibal Lecter
18
@ Larry Ich habe diese Beschimpfung gesehen und fast den ganzen Respekt für Linus verloren, nachdem ich sie gelesen hatte. Schande über ihn.
Piotr Dobrogost
5
Nun, dies ist eine Antwort auf Linus 'Rant, was ist damit: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi
6
Ich verstehe die Frage nicht, warum (populäres Programm) in (Sprache X) und nicht in (Sprache Y) geschrieben ist. Oder besser gesagt, die gleiche Frage kann umgekehrt werden: Warum Y und nicht X?
Andres F.

Antworten:

119

Nach allem, was ich gesehen habe, ist es eine Kombination aus praktischen und historischen Gründen. Der (meist) historische Grund ist, dass CPython 1.0 1989 veröffentlicht wurde. Damals wurde C erst kürzlich standardisiert. C ++ war fast unbekannt und definitiv nicht portierbar, da fast niemand einen C ++ - Compiler hatte.

Obwohl C ++ heutzutage weit verbreiteter und leichter verfügbar ist, würde es immer noch eine Menge Arbeit erfordern, CPython in eine Teilmenge von C umzuschreiben, die mit C ++ kompatibel ist. An sich würde diese Arbeit wenig oder gar keinen wirklichen Nutzen bringen.

Es ist ein bisschen wie in Joels Blog-Post, in dem es darum geht, von vorne zu beginnen und ein komplettes Rewrite durchzuführen, was der schlimmste Fehler ist, den ein Software-Unternehmen machen kann. Ich würde dem entgegenwirken, indem ich auf Microsofts Konvertierung von Windows 3.0 auf Windows NT und auf Apples Konvertierung von MacOS 9 auf Mac OS / X verweise. Keiner von beiden tötete die Firma - aber beide waren definitiv große, teure und langfristige Projekte. Beide weisen auch auf etwas Entscheidendes für den Erfolg hin: Beide Codebasen müssen so lange erhalten bleiben, dass (die meisten) Benutzer nach Belieben auf die neue Codebasis umsteigen können, basierend auf den (zumindest wahrgenommenen) Vorteilen.

Für ein Entwicklerteam der Größe von Python ist eine solche Änderung jedoch viel schwieriger. Sogar der Wechsel von Python 2 zu 3 hat viel Arbeit gekostet und eine ähnliche Überlappung erforderlich gemacht. Zumindest in diesem Fall ergeben sich jedoch direkte Vorteile für die Änderungen, die ein (eigenständiges) Umschreiben in C ++ (zumindest sofort) nicht bieten würde.

Linus Torvalds 'Schimpfwort gegen C ++ wurde zur Sprache gebracht, deshalb erwähne ich das auch. Nichts, was ich von Guido gesehen habe, deutet darauf hin, dass er solch starke negative Gefühle gegenüber C ++ hat. Das Schlimmste, was ich von ihm gehört habe, ist, dass das Unterrichten von C ++ oft eine Katastrophe ist - aber er fuhr sofort fort, dass dies größtenteils darauf zurückzuführen ist, dass die Lehrer C ++ nicht kannten / nicht kannten.

Ich denke auch, dass es zwar relativ einfach ist, eine Menge C-Code in C ++ umzuwandeln , dass es jedoch nicht nur ein bisschen mehr Umschreiben erfordert, sondern auch eine erhebliche Umschulung der meisten beteiligten Entwickler. Die meisten gut geschriebenen C ++ unterscheiden sich wesentlich von gut geschriebenen C, um die gleichen Dinge zu tun. Es ist nicht nur eine Frage des Wechsels malloczu newund printfzu coutvon einer Strecke der Phantasie.

Jerry Sarg
quelle
2
+1 Sie zitieren viel; Sie sind interessant. Es scheint sogar noch besser zu sein, wenn Links hinzugefügt werden könnten.
n611x007,
1
Habe
MarkJ 13.06.13
Dies war eine hervorragende Antwort. Ich habe viel daraus gelernt.
Spiele Brainiac
1
+1 speziell für die Erwähnung des c, das relativ einfach nach c ++ portiert werden kann, ist wahrscheinlich nicht wert. Ich wusste das schon lange, aber die Antwort hat den Standpunkt wirklich gestärkt und mehrere Dimensionen hinzugefügt, um es zu betrachten.
fkl
1
"Apples Umstellung von MacOS 9 auf Mac OS / X" merkt an, dass OS / X kein Neuschreiben von Grund auf ist: Es war eher ein Wechsel von MacOS9 zu NeXTStep, der für Apple verbessert und
Jivan
30

Ich denke, der Grund, warum es ursprünglich in ANSI C89 geschrieben wurde, ist ganz einfach, weil C ++ damals einfach keine praktikable Wahl war, was mit Inkompatibilitäten zwischen verschiedenen Compilern und dergleichen zu tun hat. Ich meine, es hat bis 2005 gedauert, um eine ABI-Spezifikation zu entwickeln, die es Code, der mit einem Compiler kompiliert wurde, ermöglicht, Code aufzurufen, der mit einem anderen Compiler kompiliert wurde.

Die interessantere Frage ist, warum es immer noch in C89 geschrieben ist.

Und es gibt eine überraschende Antwort: Weil die Leute Python tatsächlich auf Plattformen verwenden, für die es keinen C ++ - und keinen C99-Compiler gibt! Als die Forth-inspirierten Threaded-Code-Interpreter-Optimierungen zusammengeführt wurden, gab es eine große Diskussion darüber, da der (notwendigerweise) verwendete Code berechnet wurde, gotoder nicht Teil von C89 ist. Es gab anscheinend echte Befürchtungen, dass diese Funktion auf einigen der Plattformen, auf denen Python derzeit verwendet wird, nicht verfügbar sein könnte.

Dasselbe geschah mit Unladen Swallow, das LLVM verwendet, das in C ++ geschrieben ist. Es wurde sehr deutlich gemacht, dass eine Voraussetzung für das Zusammenführen von Unladen Swallow zu CPython darin besteht, dass Sie es ohne den JIT-Compiler kompilieren können, da es Plattformen gibt, auf denen Python ausgeführt wird und für die kein C ++ - Compiler existiert.

Natürlich ist CPython heutzutage nicht mehr die einzige Python-Implementierung. Es gibt PyPy, das in RPython (einer statisch typisierten Teilmenge von Python), Jython in Java, IronPython in C #, Pynie in NQP und PIR usw. geschrieben ist.

Jörg W. Mittag
quelle
3
Ich bin halb versucht, dies zu unterstützen, aber ich kenne keine solche Plattform, auf der es keinen C ++ - Compiler gibt (insbesondere, da Comeau C ++ in C kompiliert)
Billy ONeal
1
+1 für die Erwähnung des ABI
jk.
3
@Abdul: Nein, Python ist überhaupt keine Software. Es ist eine Spezifikation. Es gibt mehrere Implementierungen dieser Spezifikation, die in mehreren Sprachen geschrieben sind. IronPython ist in C♯ geschrieben, Jython in Java, PyPy in RPython, Pynie in NQP, PIR und Perl6, Pyston in C ++, CPython in C. Die Anweisung "Python ist in C geschrieben" ist nicht sinnvoll. Python ist keine Software. Es ist eine Spezifikation. Es ist in Englisch geschrieben, nicht in einer Programmiersprache. "Java ist eine Ableitung von C" ist hauptsächlich falsch. Java ist von Objective-C inspiriert, beseitigt jedoch die meisten C-Teile und übernimmt hauptsächlich die Smalltalk-Teile.
Jörg W Mittag
3
@MilesRout: Es gibt mehrere Fälle, in denen die Spezifikation von CPython abweicht. Beispiel: Die Python-Spezifikation garantiert keine deterministische Finalisierung, CPython jedoch zumindest für nicht zirkuläre Verweise. Obwohl CPython eine deterministische Finalisierung für nicht zirkuläre Verweise garantiert, ist das Schreiben von Code, der auf dieser Tatsache beruht, fehlerhaft , da er nicht Teil der Spezifikation ist. (Ich kann das Zitat derzeit nicht finden, aber GvR hat ausdrücklich gesagt, dass deterministische Finalisierung und Referenzzählung private interne Implementierungsdetails von CPython sind.)
Jörg W Mittag,
2
In ähnlicher Weise garantiert CPython, dass zwei Python-Threads nicht gleichzeitig ausgeführt werden können, aber auch dies ist ein privates internes Implementierungsdetail von CPython und wird von der Sprachspezifikation nicht garantiert. Wenn das, was Sie sagen, wahr wäre, könnte es möglicherweise keine anderen Implementierungen geben, da jede alternative Implementierung sich notwendigerweise identisch mit CPython verhalten muss und daher notwendigerweise identisch sein muss. (Modulo-Refactorings, die das beobachtbare Verhalten nicht ändern.)
Jörg W Mittag
10

Eine bessere Frage könnte sein: "Warum ist Python nicht in Python geschrieben?"

Genauer gesagt, sobald in C genügend Grundelemente für Python-Klassen und -Objekte geschrieben sind, können diese zum Schreiben des restlichen Interpreters verwendet werden, sodass Sie durch die Verwendung von C ++ nichts gewinnen würden.

Larry Coleman
quelle
1
Wenn Sie dem ersten Link in meiner Antwort folgen, wird ein Verweis auf eine Implementierung von Python in Python angezeigt. Das ist noch nicht serienreif. Das wird von der EU finanziert. codespeak.net/pypy/dist/pypy/doc ist der Link, wenn es schwierig ist, aus meiner Antwort herauszufinden.
vpit3833
2
Dies ist eigentlich eine ziemlich tiefe Antwort. Nicht, dass Guidos Python buchstäblich in Python geschrieben ist, sondern dass die Low-Level-Strukturen in C verwendet werden, um übergeordnete zu schreiben.
Jeremy
1
Ich denke, Sie verpassen den Punkt, da es einen ziemlichen Unterschied gibt (für Leute, die am Dolmetscher selbst arbeiten), in welcher Sprache der Dolmetscher geschrieben ist. Die Sprache beeinflusst, wie diese Grundelemente aussehen und wie sie miteinander interagieren. Zum Beispiel muss man jetzt in der C-Implementierung von Python daran denken, die Referenzzähler manuell zu erhöhen und zu verringern, während es in C ++ möglich sein könnte, dafür intelligente Zeiger zu verwenden.
Piotr Dobrogost
Jetzt, wo PyPy verfügbar ist und CPython manchmal auf interessante Weise übertrifft, wäre es meiner Meinung nach eine großartige Idee gewesen.
Sai Kumar Battinoju