Perché Python è scritto in C e non in C ++?


76

Nel tutorial di Python si può leggere che l'implementazione originale di Python è in C;

D'altra parte, l'implementazione di Python, scritta in C, (...)

Sono molto curioso perché Python è stato scritto in C e non in C ++?

Mi piacerebbe conoscere il ragionamento alla base di questa decisione e la risposta dovrebbe essere supportata da riferimenti storici (e non basati sull'opinione).


10
Non so perché, ma sospetto qualcosa di simile a questo: thread.gmane.org/gmane.comp.version-control.git/57643/… :)
Matthieu,

13
@Larry Coleman: non hai mai visto Linus? Devi evitare "internet" ...> _>
dr Hannibal Lecter,

18
@Larry Ho visto questo sfogo e ho perso quasi tutto il rispetto per Linus dopo averlo letto. Vergogna per lui.
Piotr Dobrogost,

5
Bene, questa è una risposta al rant di Linus, che dire di questo: warp.povusers.org/OpenLetters/ResponseToTorvalds.html
avi

6
Non riesco a vedere il punto di chiedere "perché il (programma popolare) è scritto in (lingua X) e non (lingua Y)?". O meglio, la stessa domanda può essere invertita: perché Y e non X?
Andres F.

Risposte:


119

Da tutto quello che ho visto, è una combinazione di ragioni pratiche e storiche. Il motivo (principalmente) storico è che CPython 1.0 è stato rilasciato nel 1989. A quel tempo, C era appena standardizzato. Il C ++ era quasi sconosciuto e decisamente non portatile, perché quasi nessuno aveva un compilatore C ++.

Sebbene C ++ sia molto più diffuso e facilmente disponibile oggi, ci vorrebbe comunque una discreta quantità di lavoro per riscrivere CPython nel sottoinsieme di C che è compatibile con C ++. Di per sé, quel lavoro fornirebbe poco o nessun beneficio reale.

È un po 'come il post sul blog di Joel su come ricominciare e fare una riscrittura completa come l'errore peggiore che un'azienda di software possa fare. Lo contrasterei indicando la conversione di Microsoft dal core di Windows 3.0 al core di Windows NT e la conversione di Apple da MacOS 9 a Mac OS / X. Nessuno dei due uccise la compagnia, ma entrambi furono sicuramente progetti grandi, costosi, a lungo termine. Entrambi indicano anche qualcosa che è cruciale per il successo: mantenere entrambe le basi di codice per un tempo sufficiente affinché (la maggior parte) gli utenti possano passare alla nuova base di codice a loro piacimento, sulla base di vantaggi (almeno percepiti).

Per un team di sviluppo delle dimensioni di Python, tuttavia, questo tipo di cambiamento è molto più difficile. Anche il passaggio da Python 2 a 3 ha richiesto parecchio lavoro e ha richiesto una sovrapposizione simile. Almeno in quel caso, tuttavia, ci sono vantaggi diretti per le modifiche, che la riscrittura in C ++ (da sola) non fornirebbe (almeno immediatamente).

L'eruzione di Linus Torvalds contro il C ++ è stata sollevata, quindi citerò anche questo. Nulla di ciò che ho visto da Guido indica che abbia quel tipo di sentimenti forti e negativi verso il C ++. Il peggio che l'ho visto dire è che insegnare il C ++ è spesso un disastro - ma ha continuato subito dicendo che questo è in gran parte dovuto al fatto che gli insegnanti non conoscevano / non conoscevano il C ++.

Penso anche che mentre è possibile convertire un sacco di codice C in C ++ con relativa facilità, che ottenere un grande vantaggio dal C ++ richiede non solo un po 'più di riscrittura di quello, ma richiede anche una rieducazione sostanziale della maggior parte degli sviluppatori coinvolti. La maggior parte del C ++ ben scritto è sostanzialmente diverso dal C ben scritto per fare le stesse cose. E ' non è solo una questione di cambiare mallocper newe printfda cout, con uno sforzo di immaginazione.


2
+1 Citi molto; sono interessanti. Sembra che sarebbe ancora meglio se si potessero aggiungere collegamenti.
n611x007,

1
Appena presentato una modifica con un link al post sul blog di Joel su riscrive joelonsoftware.com/articles/fog0000000069.html~~V~~3rd
MarkJ

Questa è stata una risposta eccellente. Ho imparato molto da questo.
Giochi Brainiac,

1
Il +1 specifico per menzionare il c che può essere portato su c ++ con relativa facilità probabilmente non vale la pena farlo. Lo sapevo già da molto tempo, ma la risposta ha davvero rafforzato il punto di vista e aggiunto diverse dimensioni per guardarlo.
fkl

1
"La conversione di Apple da MacOS 9 a Mac OS / X" nota che OS / X non è una riscrittura da zero: era piuttosto un passaggio da MacOS9 a NeXTStep, migliorato e rinominato per Apple
Jivan,

30

Penso che il motivo per cui è stato originariamente scritto in ANSI C89 sia semplicemente perché allora C ++ non era una scelta praticabile con incompatibilità tra diversi compilatori e simili. Voglio dire, ci è voluto fino a che, nel 2005, è stata inventata una specifica ABI che avrebbe permesso al codice compilato con un compilatore di chiamare il codice compilato con un altro compilatore?

La domanda più interessante è perché è ancora scritto in C89.

E c'è una risposta sorprendente: perché le persone usano Python su piattaforme per le quali non esiste un compilatore C ++ e C99! Quando le ottimizzazioni dell'interprete di codice thread ispirate a Forth furono unite, ci fu una discussione enorme su di esso, perché il codice (necessariamente) usato calcolò gotoche non fa parte di C89. Apparentemente c'erano paure reali che questa funzionalità potrebbe non essere disponibile su alcune delle piattaforme su cui Python è attualmente utilizzato.

La stessa cosa è successa con Unladen Swallow, che usa LLVM, che è scritto in C ++. È stato chiarito che un requisito per la fusione di Unladen Swallow in CPython sarebbe che puoi compilarlo senza il compilatore JIT, poiché ci sono piattaforme su cui le persone eseguono Python, per le quali non esiste un compilatore C ++.

Naturalmente, al giorno d'oggi, CPython non è più l'unica implementazione di Python. C'è PyPy, che è scritto in RPython (un sottoinsieme di Python tipicamente statico), Jython in Java, IronPython in C #, Pynie in NQP e PIR e così via.


3
Sono quasi tentato di votare questo, ma non conosco una piattaforma del genere in cui non esiste un compilatore C ++ (in particolare dato che Comeau C ++ viene compilato in C)
Billy ONeal,

1
+1 per menzionare l'ABI
jk.

3
@Abdul: No, Python non è affatto un software. È una specifica. Esistono molteplici implementazioni di tale specifica, scritte in più lingue. IronPython è scritto in C♯, Jython in Java, PyPy in RPython, Pynie in NQP, PIR e Perl6, Pyston in C ++, CPython in C. L'affermazione "Python è scritta in C" non ha senso. Python non è un software. È una specifica. È scritto in inglese, non in alcun linguaggio di programmazione. "Java è un derivato di C" è principalmente sbagliato. Java è ispirato a Objective-C, ma elimina la maggior parte delle parti C e occupa principalmente le parti Smalltalk.
Jörg W Mittag,

3
@MilesRout: ci sono più casi in cui la specifica si discosta da CPython. Ad esempio: la specifica Python non garantisce la finalizzazione deterministica, ma CPython lo fa, almeno per i riferimenti non circolari. Ma anche se CPython garantisce la finalizzazione deterministica per riferimenti non circolari, la scrittura di codice che si basa su tale fatto è interrotta , poiché non fa parte delle specifiche. (Non riesco a trovare la citazione in questo momento, ma GvR ha esplicitamente affermato che la finalizzazione deterministica e il conteggio dei riferimenti sono dettagli di implementazione interna privata di CPython.)
Jörg W Mittag,

2
Allo stesso modo, CPython garantisce che due thread Python non possono essere eseguiti in parallelo, ma anche quello è un dettaglio dell'implementazione interna privata di CPython e non è garantito dalle specifiche del linguaggio. Se ciò che dici fosse vero, non potrebbero esserci altre implementazioni, dal momento che qualsiasi implementazione alternativa deve necessariamente comportarsi identica a CPython e quindi deve essere necessariamente identica. (Rifattorizzazioni Modulo che non cambiano il comportamento osservabile.)
Jörg W Mittag,

10

Una domanda migliore potrebbe essere: "Perché Python non è scritto in Python?"

Più precisamente, una volta che abbastanza primitive per le classi e gli oggetti Python sono scritte in C, quelle possono essere usate per scrivere il resto dell'interprete, quindi non otterresti nulla usando C ++.


1
Se segui il primo link nella mia risposta, vedrai un riferimento a un'implementazione di Python in Python. Questa non è ancora pronta per la produzione. Questo è finanziato dall'UE. codespeak.net/pypy/dist/pypy/doc è il link se è difficile scoprire dalla mia risposta.
vpit3833,

2
Questa è in realtà una risposta piuttosto profonda. Non che Guido's Python sia letteralmente scritto in Python, ma che le strutture di basso livello in C siano usate per scrivere di livello superiore.
Jeremy,

1
Penso che manchi il punto in quanto c'è abbastanza differenza (per le persone che lavorano sull'interprete stesso) in quale lingua è scritto l'interprete. La lingua influenza l' aspetto di questi primitivi e il modo in cui interagiscono tra loro. Ad esempio, ora, nell'implementazione in C di Python, bisogna ricordare di aumentare e diminuire manualmente i conteggi dei riferimenti mentre potrebbe essere possibile utilizzare i puntatori intelligenti in C ++ per questo.
Piotr Dobrogost,

Ora che PyPy è disponibile e talvolta sorpassa in modo interessante CPython, penso che sarebbe stata una grande idea.
Sai Kumar Battinoju,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.