¿Por qué Python está escrito en C y no en C ++?

76

En el tutorial de Python se puede leer que la implementación original de Python está en C;

Por otro lado, la implementación de Python, escrita en C, (...)

Tengo mucha curiosidad por qué Python se escribió en C y no en C ++.

Me gustaría saber el razonamiento detrás de esta decisión y la respuesta debe estar respaldada por referencias históricas (y no basadas en opiniones).

Piotr Dobrogost
fuente
10
No sé por qué, pero sospecho algo parecido a esto: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu
13
@Larry Coleman: ¿Nunca viste diatribas de Linus? Debes estar evitando "los internet" ...> _>
Dr. Hannibal Lecter
18
@Larry Vi esta queja y perdí casi todo el respeto por Linus después de leerlo. La culpa es de él.
Piotr Dobrogost el
55
Bueno, esta es una respuesta a la queja de Linus, ¿qué pasa con esto: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi
66
No veo el punto de preguntar "¿por qué (el programa popular) está escrito en (idioma X) y no (idioma Y)?". O más bien, la misma pregunta se puede revertir: ¿por qué Y y no X?
Andres F.

Respuestas:

119

Por todo lo que he visto, es una combinación de razones prácticas e históricas. La razón (principalmente) histórica es que CPython 1.0 se lanzó en 1989. En ese momento, C se estandarizó recientemente. C ++ era casi desconocido y decididamente no portátil, porque casi nadie tenía un compilador de C ++.

Aunque C ++ está mucho más extendido y es más fácil de obtener hoy en día, aún requeriría una gran cantidad de trabajo reescribir CPython en el subconjunto de C que es compatible con C ++. Por sí mismo, ese trabajo proporcionaría poco o ningún beneficio real.

Es un poco como la publicación del blog de Joel sobre volver a escribir y hacer una reescritura completa como el peor error que puede cometer una empresa de software. Contrarrestaría eso señalando la conversión de Microsoft del núcleo de Windows 3.0 al núcleo de Windows NT, y la conversión de Apple de MacOS 9 a Mac OS / X. Ninguno de los dos mató a la empresa, pero ambos fueron definitivamente proyectos grandes, caros y a largo plazo. Ambos también apuntan a algo que es crucial para el éxito: mantener ambas bases de código durante el tiempo suficiente para que (la mayoría) de los usuarios puedan cambiar a la nueva base de código a su gusto, en función de los beneficios (al menos percibidos).

Sin embargo, para un equipo de desarrollo del tamaño de Python, ese tipo de cambio es mucho más difícil. Incluso el cambio de Python 2 a 3 requirió bastante trabajo y requirió una superposición similar. Sin embargo, al menos en ese caso, hay beneficios directos a los cambios, que la reescritura en C ++ (por sí sola) no proporcionaría (al menos de inmediato).

El discurso de Linus Torvalds contra C ++ fue mencionado, así que lo mencionaré también. Nada de lo que he visto de Guido indica que tenga ese tipo de sentimientos fuertes y negativos hacia C ++. Lo peor que le he visto decir es que enseñar C ++ a menudo es un desastre , pero inmediatamente continuó diciendo que esto se debe principalmente a que los maestros no sabían / ​​no sabían C ++.

También creo que, si bien es posible convertir una gran cantidad de código C a C ++ con relativa facilidad, obtener mucha ventaja real de C ++ requiere no solo un poco más de reescritura que eso, sino que también requiere una reeducación sustancial de la mayoría de los desarrolladores involucrados. La mayoría de C ++ bien escrito es sustancialmente diferente de C bien escrito para hacer lo mismo. Es no sólo una cuestión de cambiar malloca newy printfa cout, por cualquier tramo de la imaginación.

Jerry Coffin
fuente
2
+1 Citas mucho; son interesantes Parece que sería aún mejor si se pudieran agregar enlaces.
n611x007
1
Acabo de enviar una edición con un enlace a la publicación del blog de Joel en reescribe joelonsoftware.com/articles/fog0000000069.html
MarkJ
Esta fue una excelente respuesta. Aprendí mucho de eso.
Juegos Brainiac
1
Probablemente no valga la pena hacer +1 específicamente por mencionar el c que puede portarse a c ++ con relativa facilidad. Lo supe desde hace mucho tiempo, pero la respuesta realmente fortaleció el punto de vista y agregó varias dimensiones para verlo.
fkl
1
"La conversión de Apple de MacOS 9 a Mac OS / X" nota que OS / X no es una reescritura desde cero: fue más bien un cambio de MacOS9 a NeXTStep, mejorado y renombrado para Apple
Jivan
30

Creo que la razón por la que se escribió originalmente en ANSI C89 es simplemente porque en aquel entonces, C ++ simplemente no era una opción viable, con incompatibilidades entre diferentes compiladores y demás. Quiero decir, me tomó hasta, ¿qué fue, 2005, llegar a una especificación ABI que permitiera que el código compilado con un compilador llame al código compilado con un compilador diferente?

La pregunta más interesante es por qué todavía está escrito en C89.

Y hay una respuesta sorprendente: ¡porque la gente realmente usa Python en plataformas para las que no existe un compilador C ++ ni C99! Cuando se fusionaron las optimizaciones del intérprete de código roscado inspiradas en Forth, hubo una gran discusión al respecto, porque el código (necesariamente) se usaba computado gotoque no forma parte de C89. Aparentemente, existían temores reales de que esta característica podría no estar disponible en algunas de las plataformas en las que Python se usa actualmente.

Lo mismo sucedió con Unladen Swallow, que usa LLVM, que está escrito en C ++. Se dejó muy claro que un requisito para fusionar Unladen Swallow en CPython sería que puede compilarlo sin el compilador JIT, ya que hay plataformas en las que las personas ejecutan Python, para las cuales no existe un compilador C ++.

Por supuesto, hoy en día, CPython ya no es la única implementación de Python. Hay PyPy, que está escrito en RPython (un subconjunto estático de Python), Jython en Java, IronPython en C #, Pynie en NQP y PIR, etc.

Jörg W Mittag
fuente
3
Estoy medio tentado a votar esto, pero no conozco ninguna plataforma en la que no exista un compilador de C ++ (Particularmente dado que Comeau C ++ compila a C)
Billy ONeal
1
+1 por mencionar el ABI
jk.
3
@Abdul: No, Python no es un software en absoluto. Es una especificación. Hay múltiples implementaciones de esa especificación, escritas en múltiples idiomas. IronPython está escrito en C♯, Jython en Java, PyPy en RPython, Pynie en NQP, PIR y Perl6, Pyston en C ++, CPython en C. La afirmación "Python está escrito en C" no tiene sentido. Python no es un software. Es una especificación. Está escrito en inglés, no en ningún lenguaje de programación. "Java es un derivado de C" es principalmente erróneo. Java está inspirado en Objective-C, pero elimina la mayoría de las partes C y toma principalmente las partes Smalltalk.
Jörg W Mittag
3
@MilesRout: hay varios casos en los que la especificación se desvía de CPython. Por ejemplo: la especificación de Python no garantiza la finalización determinista, pero CPython sí, al menos para referencias no circulares. Pero a pesar de que CPython garantiza la finalización determinista para referencias no circulares, escribir código que se basa en ese hecho está roto , ya que no es parte de la especificación. (No puedo encontrar la cita en este momento, pero GvR ha dicho explícitamente que la finalización determinista y el recuento de referencias son detalles privados de implementación interna de CPython.)
Jörg W Mittag
2
Del mismo modo, CPython garantiza que dos subprocesos de Python no pueden ejecutarse en paralelo, pero eso también es un detalle de implementación interna privada de CPython y no está garantizado por la especificación del lenguaje. Si lo que usted dice es cierto, no podría haber ninguna otra implementación, ya que cualquier implementación alternativa debe comportarse necesariamente de manera idéntica a CPython y, por lo tanto, debe ser necesariamente idéntica. (Refactorizaciones de módulos que no cambian el comportamiento observable.)
Jörg W Mittag
10

Una mejor pregunta podría ser: "¿Por qué Python no está escrito en Python?"

Más concretamente, una vez que se escriben suficientes primitivas para las clases y los objetos de Python en C, se pueden usar para escribir el resto del intérprete, por lo que no ganaría nada usando C ++ en su lugar.

Larry Coleman
fuente
1
Si sigue el primer enlace en mi respuesta, verá una referencia a una implementación de Python en Python. Eso no está listo para la producción todavía. Eso es financiado por la UE. codespeak.net/pypy/dist/pypy/doc es el enlace si es difícil de averiguar a partir de mi respuesta.
vpit3833 el
2
Esta es en realidad una respuesta bastante profunda. No es que Python de Guido esté literalmente escrito en Python, sino que las estructuras de bajo nivel en C se usan para escribir las de nivel superior.
Jeremy
1
Creo que se pierde el punto, ya que hay una gran diferencia (para las personas que trabajan en el intérprete) en qué idioma está escrito el intérprete. El idioma influye en cómo se ven estos primitivos y cómo interactúan entre sí. Por ejemplo, ahora, en la implementación de Python en C, uno debe recordar aumentar y disminuir los recuentos de referencias manualmente, mientras que podría ser posible utilizar punteros inteligentes en C ++ para esto.
Piotr Dobrogost
Ahora que PyPy está disponible y curiosamente supera a CPython a veces, creo que habría sido una gran idea.
Sai Kumar Battinoju