Por que o Python é escrito em C e não em C ++?


76

No tutorial do Python, pode-se ler que a implementação original do Python está em C;

Por outro lado, a implementação do Python, escrita em C, (...)

Estou muito curioso por que o Python foi escrito em C e não em C ++?

Eu gostaria de saber o raciocínio por trás dessa decisão e a resposta deve ser apoiada por referências históricas (e não baseadas em opiniões).


10
Eu não sei o porquê, mas suspeito que algo próximo disso: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu

13
@ Larry Coleman: Nunca vi Linus reclamar? Você deve evitar "os internets" ...> _>
dr Hannibal Lecter

18
@ Larry Eu vi esse discurso retórico e perdi quase todo o respeito por Linus depois de lê-lo. Que vergonha para ele.
Piotr Dobrogost

5
Bem, esta é uma resposta ao discurso Linus', o que sobre isso: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi

6
Não vejo o sentido de perguntar "por que (programa popular) está escrito em (idioma X) e não (idioma Y)?". Ou melhor, a mesma pergunta pode ser revertida: por que Y e não X?
18713 Andres F.Julho

Respostas:


119

De tudo o que vi, é uma combinação de razões práticas e históricas. A razão histórica (principalmente) é que o CPython 1.0 foi lançado em 1989. Naquela época, C era padronizado recentemente. C ++ era quase desconhecido e decididamente não portátil, porque quase ninguém tinha um compilador C ++.

Embora o C ++ seja muito mais difundido e facilmente disponível hoje, ainda seria necessário bastante trabalho para reescrever o CPython no subconjunto de C compatível com C ++. Por si só, esse trabalho traria pouco ou nenhum benefício real.

É um pouco como o post de Joel sobre começar de novo e reescrever completamente, sendo o pior erro que uma empresa de software pode cometer. Eu diria isso apontando para a conversão da Microsoft do núcleo do Windows 3.0 para o núcleo do Windows NT e a conversão da Apple do MacOS 9 para o Mac OS / X. Nenhum deles matou a empresa - mas ambos eram definitivamente grandes, caros e projetos de longo prazo. Ambos também apontam para algo crucial para o sucesso: manter as duas bases de código por tempo suficiente para que (a maioria) os usuários possam mudar para a nova base de código à vontade, com base nos benefícios (pelo menos percebidos).

Para uma equipe de desenvolvimento do tamanho do Python, esse tipo de mudança é muito mais difícil. Até a mudança de Python 2 para 3 exigiu bastante trabalho e exigiu uma sobreposição semelhante. Pelo menos nesse caso, no entanto, existem benefícios diretos para as alterações que a reescrita no C ++ (por si só) não forneceria (pelo menos imediatamente).

O discurso de Linus Torvalds contra C ++ foi levantado, então vou mencionar isso também. Nada que eu tenha visto de Guido indica que ele tem esse tipo de sentimentos negativos e fortes em relação ao C ++. O pior que o vi dizer é que o ensino de C ++ geralmente é um desastre - mas ele imediatamente disse que isso ocorre principalmente porque os professores não conhecem / não conhecem C ++.

Eu também acho que, embora seja possível converter muito código C em C ++ com relativa facilidade, obter uma grande vantagem real do C ++ requer não apenas um pouco mais de reescrita quanto isso, mas também requer uma reeducação substancial da maioria dos desenvolvedores envolvidos. A maioria dos C ++ bem escritos é substancialmente diferente do C bem escrito para fazer as mesmas coisas. É não apenas uma questão de mudar mallocpara newe printfde cout, por qualquer trecho da imaginação.


2
+1 Você cita muito; Eles são interessantes. Parece que seria ainda melhor se links pudessem ser adicionados.
N611x007

11
Apenas apresentou uma edição com um link para o post de Joel em regravações joelonsoftware.com/articles/fog0000000069.html
MarkJ

Essa foi uma excelente resposta. Eu aprendi muito com isso.
Brainiac

11
+1 especificamente para mencionar o c que pode ser portado para c ++ com relativa facilidade provavelmente não vale a pena fazer. Eu já sabia disso há muito tempo, mas a resposta realmente fortaleceu o ponto de vista e acrescentou várias dimensões para analisá-lo.
Fkl

11
"A conversão da Apple do MacOS 9 para o Mac OS / X" observa que o OS / X não é uma reescrita do zero: foi uma mudança do MacOS9 para o NeXTStep, aprimorado e renomeado para a Apple
Jivan 29/14

30

Eu acho que a razão pela qual ele foi originalmente escrito em ANSI C89 é simplesmente porque, naquela época, o C ++ não era uma opção viável, com incompatibilidades entre diferentes compiladores e outros. Quero dizer, demorou até, o que foi, em 2005, para chegar a uma especificação ABI que permitisse que o código compilado com um compilador chamasse o código compilado com um compilador diferente?

A questão mais interessante é por que ainda está escrita em C89.

E há uma resposta surpreendente: porque as pessoas realmente usam Python em plataformas para as quais não existe nenhum compilador C ++ e C99! Quando as otimizações do intérprete de código encadeado inspiradas na Forth foram mescladas, houve uma grande discussão sobre o assunto, porque o código (necessariamente) usado calculava o gotoque não faz parte do C89. Aparentemente, havia um medo real de que esse recurso não estivesse disponível em algumas das plataformas em que o Python está sendo usado atualmente.

O mesmo aconteceu com o Unladen Swallow, que usa o LLVM, escrito em C ++. Ficou muito claro que um requisito para mesclar o Unladen Swallow no CPython seria que você possa compilá-lo sem o compilador JIT, já que existem plataformas nas quais as pessoas executam o Python, para as quais não existe nenhum compilador C ++.

Certamente, atualmente, o CPython não é mais a única implementação em Python. Existe o PyPy, que é escrito em RPython (um subconjunto estatístico do Python), Jython em Java, IronPython em C #, Pynie no NQP e PIR e assim por diante.


3
Eu estou meio tentado a upvote isso, mas eu não conheço nenhum tal plataforma onde um compilador C ++ não existe (dado Particularmente que Comeau C ++ compila para C)
Billy ONeal

11
+1 por mencionar a ABI
jk.

3
@ Abdul: Não, o Python não é um software. É uma especificação. Existem várias implementações dessa especificação, escritas em vários idiomas. O IronPython é escrito em C♯, Jython em Java, PyPy em RPython, Pynie em NQP, PIR e Perl6, Pyston em C ++, CPython em C. A declaração "Python está escrito em C" não faz sentido. Python não é um software. É uma especificação. Está escrito em inglês, não em nenhuma linguagem de programação. "Java é um derivado de C" está principalmente errado. O Java é inspirado no Objective-C, mas se livra da maioria das partes C e ocupa principalmente as partes do Smalltalk.
Jörg W Mittag

3
@MilesRout: Existem vários casos em que a especificação se desvia do CPython. Por exemplo: a especificação Python não garante finalização determinística, mas o CPython, pelo menos para referências não circulares. Mas, embora o CPython garanta finalização determinística para referências não circulares, escrever código que se baseia nesse fato é quebrado , uma vez que não faz parte da especificação. (Eu não consigo encontrar a citação agora, mas GvR tem explicitamente disse que a finalização determinística e contagem de referência são detalhes de implementação internas privadas de CPython.)
Jörg W Mittag

2
Da mesma forma, o CPython garante que dois threads Python não podem ser executados em paralelo, mas também é um detalhe de implementação interna privada do CPython e não é garantido pelas especificações da linguagem. Se o que você diz é verdade, não pode haver outras implementações, pois qualquer implementação alternativa deve necessariamente se comportar idêntica ao CPython e, portanto, necessariamente ser idêntica. (Refatorações Modulo que não mudam o comportamento observável.)
Jörg W Mittag

10

Uma pergunta melhor pode ser: "Por que o Python não é escrito em Python?"

Mais precisamente, uma vez que primitivas suficientes para classes e objetos Python sejam escritas em C, elas podem ser usadas para escrever o restante do intérprete, para que você não ganhe nada usando C ++.


11
Se você seguir o primeiro link na minha resposta, verá uma referência a uma implementação do Python no Python. Ainda não está pronto para a produção. Isso é financiado pela UE. codespeak.net/pypy/dist/pypy/doc é o link se for difícil descobrir pela minha resposta.
vpit3833

2
Esta é realmente uma resposta bastante profunda. Não que o Python de Guido seja literalmente escrito em Python, mas que as estruturas de baixo nível em C sejam usadas para escrever as de nível superior.
Jeremy

11
Acho que você não entendeu o ponto, pois há uma grande diferença (para as pessoas que trabalham no intérprete) em qual idioma o intérprete está escrito. O idioma influencia a aparência dessas primitivas e como elas interagem umas com as outras. Por exemplo, agora, na implementação C do Python, é preciso lembrar de incrementar e decrementar as contagens de referência manualmente, embora possa ser possível usar ponteiros inteligentes em C ++ para isso.
Piotr Dobrogost

Agora que o PyPy está disponível e, às vezes, supera de maneira interessante o CPython, acho que seria uma ótima idéia.
Sai Kumar Battinoju
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.