it-swarm.it

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

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

D'altra parte, l'implementazione 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 su opinioni).

79
Piotr Dobrogost

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 post sul blog di Joel su ricominciare da capo e fare una riscrittura completa come l'errore peggiore che una società 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 di cruciale per il successo: mantenere entrambe le basi di codice per un tempo sufficientemente lungo che la maggior parte degli utenti può passare alla nuova base di codice a loro piacimento , basato su benefici (almeno percepiti).

Per un team di sviluppo delle dimensioni di Python, tuttavia, questo tipo di cambiamento è molto più difficile. Anche la modifica da Python da 2 a 3 ha richiesto un bel po 'di lavoro e ha richiesto una sovrapposizione simile. Almeno in quel caso, tuttavia, ci sono vantaggi diretti per le modifiche, che riscrivono in Il C++ (da solo) non lo 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 molto codice C in C++ con facilità relativa , che ottenere un vantaggio molto reale da C++ richiede non solo un un po 'più di riscrittura, 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. È non solo una questione di modifica di malloc in new e printf in cout, con qualsiasi tratto dell'immaginazione.

122
Jerry Coffin

Penso che il motivo per cui era 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, non è 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: poiché le persone usano effettivamente Python su piattaforme per le quali non esiste un compilatore C++ e C99! Quando le ottimizzazioni dell'interprete di codice thread ispirate a Forth sono state unite, c'era un - enorme discussione a riguardo, poiché il codice (necessariamente) utilizzava calcolati goto che non fa parte di C89. Apparentemente c'erano paure reali che questa funzione potrebbe non essere disponibile su alcune piattaforme that Python è attualmente utilizzato su.

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 la gente esegue Python, per cui non esiste un compilatore C++ .

Naturalmente, al giorno d'oggi, CPython non è più l'unico Python. Esiste 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.

30
Jörg W Mittag

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

Più precisamente, una volta abbastanza primitive per Python sono scritti in C, quelli possono essere usati per scrivere il resto dell'interprete, quindi non otterresti nulla usando C++ invece .

10
Larry Coleman