Pourquoi Python est écrit en C et pas en C ++?

76

Dans le tutoriel de Python, on peut lire que l'implémentation originale de Python est en C;

D'autre part, l'implémentation Python, écrite en C, (...)

Je suis très curieux de savoir pourquoi Python a été écrit en C et non en C ++.

J'aimerais connaître le raisonnement derrière cette décision et la réponse devrait être étayée par des références historiques (et non basées sur des opinions).

Piotr Dobrogost
la source
10
Je ne sais pas pourquoi, mais je soupçonne un truc proche de ça: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu
13
@ Larry Coleman: Jamais vu Linus déclamer? Vous devez éviter les "internets" ...> _>>
Dr. Hannibal Lecter
18
@ Larry, j’ai vu ce discours et perdu presque tout respect pour Linus après l’avoir lu. Honte à lui.
Piotr Dobrogost
5
Eh bien, cela est une réponse à la diatribe de Linus, qu'en ceci: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi
6
Je ne vois pas l'intérêt de demander "pourquoi (programme populaire) est-il écrit en (langue X) et non (langue Y)?". Ou plutôt, la même question peut être inversée: pourquoi Y et pas X?
Andres F.

Réponses:

119

D'après tout ce que j'ai vu, c'est une combinaison de raisons pratiques et historiques. La raison (principalement) historique est que CPython 1.0 est sorti en 1989. À cette époque, C n’était que récemment normalisé. C ++ était presque inconnu et décidément non portable, car presque personne n'avait de compilateur C ++.

Bien que le C ++ soit beaucoup plus répandu et facilement disponible aujourd'hui, il faudrait encore beaucoup de travail pour réécrire CPython dans le sous-ensemble de C compatible avec C ++. En soi, ce travail apporterait peu ou pas d'avantages réels.

C'est un peu comme le blog de Joel sur le fait de recommencer et de réécrire complètement la pire erreur qu'une société de logiciels puisse commettre. Je contrerais cela en soulignant la conversion de Microsoft du noyau Windows 3.0 vers le noyau Windows NT et la conversion d'Apple de MacOS 9 à Mac OS / X. Aucune des deux n’a tué la société - mais c’était définitivement des projets de grande envergure, coûteux et à long terme. Les deux points soulignent également un élément essentiel à la réussite: maintenir les deux bases de code assez longtemps pour que la plupart des utilisateurs puissent passer à leur guise à la nouvelle base de code, en fonction des avantages (au moins perçus).

Pour une équipe de développement de la taille de Python, ce type de changement est beaucoup plus difficile. Même le passage de Python 2 à 3 a demandé pas mal de travail et a nécessité un chevauchement similaire. Au moins dans ce cas, toutefois, les modifications ont des avantages directs, mais une réécriture en C ++ (par elle-même) n’apporterait pas (du moins immédiatement).

Le discours de Linus Torvalds contre C ++ a été évoqué, je le mentionnerai donc également. Rien de ce que j'ai vu de Guido n'indique qu'il ait ce genre de sentiments négatifs et forts envers le C ++. Le pire que je l’ai vu dire est que l’ enseignement de C ++ est souvent un désastre - mais il a immédiatement ajouté que c’était en grande partie parce que les enseignants ne connaissaient pas / ne connaissaient pas le C ++.

Je pense également que s'il est possible de convertir beaucoup de code C en C ++ avec une relative relative facilité, obtenir de réels avantages du C ++ nécessite non seulement un peu plus de réécriture que cela, mais nécessite également une rééducation substantielle de la plupart des développeurs impliqués. Le C ++ le mieux écrit est très différent du C bien écrit pour faire les mêmes choses. Ce n’est pas seulement une question de changement mallocvers newet printfvers cout, par un effort d'imagination.

Jerry Coffin
la source
2
+1 Vous citez beaucoup; ils sont intéressants. Il semble que ce serait encore mieux si des liens pouvaient être ajoutés.
n611x007
1
Juste soumis une modification avec un lien vers le blog de Joel sur réécritures joelonsoftware.com/articles/fog0000000069.html~~V~~3rd
MarkJ
C'était une excellente réponse. J'ai beaucoup appris de ça.
Jeux Brainiac
1
+1 spécifiquement pour mentionner le c qui peut être porté en c ++ avec une relative facilité ne vaut probablement pas la peine d'être fait. Je le savais déjà depuis longtemps, mais la réponse a vraiment renforcé le point de vue et ajouté plusieurs dimensions.
Fkl
1
"La conversion d'Apple de MacOS 9 à Mac OS / X" indique que OS / X n'est pas une réécriture: il s'agissait plutôt d'un passage de MacOS9 à NeXTStep, amélioré et renommé pour Apple
Jivan
30

Je pense que la raison pour laquelle il a été écrit à l' origine dans la norme ANSI C89 est tout simplement parce qu'à l'époque, le C ++ n'était tout simplement pas un choix viable, avec des incompatibilités entre différents compilateurs et autres. Je veux dire, il a fallu attendre 2005 pour arriver à une spécification ABI permettant au code compilé avec un compilateur d'appeler du code compilé avec un compilateur différent.

La question la plus intéressante est de savoir pourquoi il est toujours écrit en C89.

Et il y a une réponse surprenante: parce que les gens utilisent réellement Python sur des plates-formes pour lesquelles il n'existe ni compilateur C ++ ni C99! Lorsque les optimisations interpréteur-code threadé Forth inspirés ont été fusionnés, il y avait une énorme discussion à ce sujet, parce que le code (nécessairement) utilisé calculé gotoqui ne fait pas partie de C89. Apparemment, il était à craindre que cette fonctionnalité ne soit pas disponible sur certaines des plateformes sur lesquelles Python est actuellement utilisé.

La même chose s’est produite avec Unladen Swallow, qui utilise LLVM, qui est écrit en C ++. Il a été clairement expliqué que la fusion de Unladen Swallow dans CPython impliquerait de pouvoir le compiler sans le compilateur JIT, car certaines plates-formes sur lesquelles les utilisateurs exécutent Python ne sont pas compilées par C ++.

Bien sûr, de nos jours, CPython n’est plus la seule implémentation de Python. Il existe PyPy, qui est écrit en RPython (un sous-ensemble de types statiques de Python), Jython en Java, IronPython en C #, Pynie en NQP et PIR, etc.

Jörg W Mittag
la source
3
Je suis à moitié tenté d'améliorer cela, mais je ne connais aucune plateforme de ce type où un compilateur C ++ n'existe pas (d'autant plus que Comeau C ++ est compilé en C)
Billy ONeal,
1
+1 pour avoir mentionné le ABI
jk.
3
@Abdul: Non, Python n'est pas du tout un logiciel. C'est une spécification. Il existe plusieurs implémentations de cette spécification, écrites dans plusieurs langues. IronPython est écrit en C, Jython en Java, PyPy en RPython, Pynie en NQP, PIR et Perl6, Pyston en C ++, CPython en C. L'instruction "Python est écrit en C" n'a pas de sens. Python n'est pas un logiciel. C'est une spécification. Il est écrit en anglais et non dans un langage de programmation. "Java est un dérivé de C" est principalement faux. Java est inspiré d'Objective-C, mais il supprime la plupart des parties C et prend principalement les parties Smalltalk.
Jörg W Mittag
3
@MilesRout: il existe plusieurs cas où la spécification diffère de CPython. Par exemple: la spécification Python ne garantit pas la finalisation déterministe, contrairement à CPython, du moins pour les références non circulaires. Mais même si CPython garantit la finalisation déterministe pour les références non circulaires, l'écriture de code reposant sur ce fait est rompue , car elle ne fait pas partie des spécifications. (Je ne trouve pas la citation en ce moment, mais GvR a explicitement dit que la finalisation déterministe et comptage de référence sont des détails de mise en œuvre internes privées de CPython.)
Jörg W Mittag
2
De même, CPython garantit que deux threads Python ne peuvent pas s'exécuter en parallèle, mais il s'agit également d'un détail d'implémentation interne privé de CPython et non garanti par la spécification de langage. Si ce que vous dites était vrai, il ne pourrait y avoir aucune autre implémentation, car toute implémentation alternative doit nécessairement se comporter de manière identique à CPython, et doit donc nécessairement être identique. (Refactorisations Modulo qui ne changent pas le comportement observable.)
Jörg W Mittag
10

Une meilleure question pourrait être: "Pourquoi Python n'est-il pas écrit en Python?"

Plus précisément, une fois que suffisamment de primitives pour les classes et les objets Python sont écrites en C, celles-ci peuvent être utilisées pour écrire le reste de l'interpréteur, vous ne gagnerez donc rien en utilisant C ++.

Larry Coleman
la source
1
Si vous suivez le premier lien dans ma réponse, vous verrez une référence à une implémentation de Python en Python. Ce n'est pas encore prêt pour la production. C'est financé par l'UE. codespeak.net/pypy/dist/pypy/doc est le lien s'il est difficile de savoir à partir de ma réponse.
vpit3833
2
C'est en fait une réponse assez profonde. Non pas que Python de Guido soit littéralement écrit en Python, mais que les structures de bas niveau en C servent à écrire celles de niveau supérieur.
Jeremy
1
Je pense que vous ne comprenez pas le problème car il existe une différence considérable (pour les personnes travaillant sur l'interprète lui-même) dans la langue dans laquelle l'interprète est écrit. La langue influence l' apparence de ces primitives et la manière dont elles interagissent. Par exemple, maintenant, dans l'implémentation C de Python, il faut se rappeler d'incrémenter et de décrémenter les comptes de références manuellement, alors qu'il pourrait être possible d'utiliser des pointeurs intelligents en C ++ pour cela.
Piotr Dobrogost Le
Maintenant que PyPy est disponible et qu’il est parfois plus performant que CPython, c’était une excellente idée, à mon avis.
Sai Kumar Battinoju