web-dev-qa-db-fra.com

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

Dans 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 écrit en C et non en C++?

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

79
Piotr Dobrogost

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

Bien que 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 n'apporterait que peu ou pas d'avantages réels.

C'est un peu comme le blog de Joel à propos de tout recommencer et de faire une réécriture complète étant la pire erreur qu'une entreprise de logiciels puisse faire. Je contrerais cela en pointant 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. Aucun des deux n'a tué l'entreprise - mais les deux étaient définitivement des projets de grande envergure, coûteux et à long terme. Les deux pointent également vers quelque chose qui est crucial pour le succès: maintenir les deux bases de code assez longtemps pour que (la plupart) des utilisateurs puissent passer à la nouvelle base de code à leur guise , sur la base des avantages (au moins perçus).

Pour une équipe de développement de la taille de Python, cependant, ce type de changement est beaucoup plus difficile. Même le changement de Python 2 à 3 a pris un peu de travail et a nécessité un chevauchement similaire. Au moins dans ce cas, cependant, il y a des avantages directs aux changements, qui réécrivant dans C++ (en soi) ne fournirait pas (au moins immédiatement).

La diatribe de Linus Torvalds contre C++ a été évoquée, donc je le mentionnerai également. Rien de ce que j'ai vu de Guido n'indique qu'il a ce genre de sentiments forts et négatifs envers le C++. Le pire que je l'ai vu dire est que enseigner le C++ est souvent un désastre - mais il a immédiatement continué en disant que c'était en grande partie parce que les professeurs 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 facilité relative , obtenir un réel avantage du C++ nécessite non seulement une réécriture un peu plus que cela, mais nécessite également une rééducation substantielle de la plupart des développeurs impliqués. La plupart des C++ bien écrits sont sensiblement différents des C bien écrits pour faire les mêmes choses. Ce n'est pas juste une question de changer malloc en new et printf en cout, par tout effort d'imagination.

122
Jerry Coffin

Je pense que la raison pour laquelle il était à l'origine écrit en ANSI C89 est tout simplement parce qu'à l'époque, 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 jusqu'à 2005 pour trouver une spécification ABI qui permettrait au code compilé avec un compilateur d'appeler du code compilé avec un compilateur différent?

La question la plus intéressante est pourquoi il est encore écrit en C89.

Et il y a une réponse surprenante: parce que les gens utilisent réellement Python sur les plates-formes pour lesquelles aucun compilateur C++ et C99 n'existe! Lorsque les optimisations de l'interpréteur de code fileté inspiré de Forth ont été fusionnées, il y avait un - énorme discussion à ce sujet, car le code utilisait (nécessairement) calculé goto qui ne fait pas partie de C89. Il y avait apparemment de réelles craintes que cette fonctionnalité ne soit pas disponible sur certaines plates-formes que Python est actuellement utilisé sur.

La même chose s'est produite avec Unladen Swallow, qui utilise LLVM, qui est écrit en C++. Il est apparu très clairement qu'une exigence pour la fusion de Unladen Swallow dans CPython serait que vous puissiez le compiler sans le compilateur JIT, car il existe des plates-formes que les gens exécutent Python on, pour lequel aucun compilateur C++ n'existe .

Bien sûr, de nos jours, CPython n'est plus le seul Python implémentation. Il y a PyPy, qui est écrit en RPython (un sous-ensemble statiquement typé de Python), Jython en Java, IronPython en C #, Pynie dans NQP et PIR et ainsi de suite.

30
Jörg W Mittag

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

Plus précisément, une fois suffisamment de primitives pour Python sont écrits en C, ceux-ci peuvent être utilisés pour écrire le reste de l'interpréteur, donc vous ne gagnerez rien en utilisant C++ à la place .

10
Larry Coleman