Cosa può fare C ++ che Python non può? [chiuso]

1

Stavo leggendo questo post: link

E mi chiedo il contrario di questa domanda: che cosa può fare C ++ che Python non può?

Ad esempio, nel campo della grafica delle prestazioni e delle GUI: Capisco che C ++ sarebbe un linguaggio migliore per lo sviluppo di giochi di fascia alta che richiede una grafica fantastica e grandi prestazioni, ma per quanto riguarda la creazione di GUI non capisco il differenza tangibile tra l'uso di C ++ e QT, o la scelta di PyQt.

Se qualcuno potesse compiacere un rapido resoconto punto per punto come questo (ad es. GUI, grafica ad alte prestazioni, costruzione di strumenti a riga di comando, concorrenza, ecc.), sarebbe molto utile per me decidere se scegliere C ++ o Python per il mio prossimo progetto di programmazione.

    
posta warship 03.12.2014 - 06:44
fonte

3 risposte

5

Python è un linguaggio tipizzato in modo dinamico. Questo ha due importanti conseguenze:

  • Il compilatore non è in grado di rifiutare determinati tipi di errori logici in fase di compilazione che potrebbero essere catturati da un compilatore C ++
  • Poiché i tipi di alcune (anche la maggior parte) variabili non possono essere determinati in fase di compilazione, le operazioni su quelle variabili devono essere implementate inviando dinamicamente una chiamata al metodo (un'operazione abbastanza lenta) mentre i compilatori C ++ sono spesso in grado di generare codice inline ( che non ha spese generali). C ++ è quindi intrinsicamente più veloce lingua.

Il primo di questi è in realtà sorprendentemente utile. Si veda ad esempio la libreria Boost Units, che consente di scrivere codice scientifico e ingegneristico in modo da consentire al compilatore di verificare staticamente che i calcoli abbiano un utilizzo unitario logicamente coerente in fase di compilazione, senza sovraccarico di runtime. Questo sarebbe impossibile in Python.

Python ha anche un supporto molto scarso per il multithreading. La sua progettazione linguistica richiede alcune operazioni (ad esempio le modifiche alle liste) per completare atomicamente, il che ha portato all'implementazione più comune utilizzando un blocco globale per impedire che due thread eseguano il codice Python nello stesso momento (anche se un thread chiama codice nativo l'altro sarà permesso di procedere), perché l'overhead di bloccare e sbloccare singoli oggetti rendeva le prestazioni a thread singolo terribili.

C ++, d'altro canto, lascia il compito di garantire che il codice sia sicuro per i thread fino allo sviluppatore, il che consente un efficiente multithreading.

C ++ offre inoltre agli sviluppatori un controllo molto maggiore sulla gestione della memoria, consentendo ad esempio contenitori generici che assegnano tipi di oggetto specificati dall'utente all'interno delle loro strutture (portando a un overhead più basso e ad una migliore localizzazione di riferimento di quanto non sia possibile con Python), allocando oggetti in specifici regioni di memoria (ad es. in modo che più oggetti possano essere eliminati in una singola operazione o allocarli in un file mappato in memoria) o utilizzando allocatori personalizzati forniti dallo sviluppatore.

Anche il C ++ viene tipicamente digitato, il che significa che è possibile utilizzare un'area di memoria per un tipo di dati e quindi passare a considerarlo come contenente un altro tipo. Mentre operazioni di questo tipo sono pericolose (e le specifiche del linguaggio affermano che i programmi che lo fanno hanno un "comportamento indefinito"), se sai cosa stai facendo puoi usarlo per implementare il caricamento dinamico dei moduli di codice, generazione di codice nativo di runtime, manipolazione diretta delle strutture di file senza estrarre individualmente i campi come dovresti in Python e una vasta gamma di altri usi. Questo è il motivo per cui i sistemi operativi possono essere implementati in C ++ e non in Python.

    
risposta data 03.12.2014 - 09:55
fonte
11

I programmi che richiedono il crunch numerico in tempo reale (come workstation audio digitali o lettori video) hanno quella che io chiamo una "soglia computazionale". Ciò significa che la scelta del linguaggio di programmazione può avere importanza quando non c'è abbastanza potenza hardware per soddisfare il carico computazionale necessario, se il linguaggio stesso consuma una parte sostanziale dei cicli di clock della CPU. In altre parole, se la tua lingua non è abbastanza efficiente, l'applicazione potrebbe non funzionare affatto.

Di conseguenza, la scelta della lingua dipende dalla presenza di tale soglia. Naturalmente, avrai una migliore possibilità di scrivere un video player funzionale se lo fai in una lingua che è altamente efficiente, come il C ++. Il compromesso è che generalmente scriverai più codice (e ci vorrà più tempo per scrivere), ma in genere è vero per le applicazioni come i lettori video.

Per le applicazioni aziendali con GUI basata su moduli, python viene spesso scelto su C ++ perché, in generale, python consente di codificare a un livello più alto di astrazione e con meno ostacoli intellettuali rispetto a C ++. La prototipazione più rapida è quindi possibile.

Naturalmente, si tratta di generalizzazioni generali e il tuo chilometraggio può variare a causa di fattori come la velocità del processore, il numero di core disponibili, la dimensione della RAM installata, indipendentemente dal fatto che tu stia eseguendo il cross-compiling del python in C , ecc., prendendo qualsiasi decisione definitiva su quale lingua usare per quale applicazione impossibile da prevedere. Come tutte le cose relative alle prestazioni, misura, non indovinare.

    
risposta data 03.12.2014 - 06:55
fonte
1

Si tratta in particolare di un problema di implementazione, non di una lingua (tuttavia la digitazione è diversa nelle lingue).

Pedanticamente, sia Python che amp; C ++ sono lingue complete di Turing con molti binding a librerie esterne, quindi ogni programma che potresti scrivere in Python potrebbe essere riscritto in C ++ e viceversa.

Su Linux, /usr/bin/python (a.k.a. cpython ) è un interprete bytecode ma /usr/bin/g++ è un compilatore nativo

Quindi molto spesso un programma C ++ sarebbe più veloce del programma python equivalente .

noti che esistono compilatori python sperimentali (ad esempio pypy ) e interpreti C ++ sperimentali.

Quindi C ++ è utile per i programmi che devono essere veloci, ma possono accettare più tempo di sviluppo e Python è utile per i programmi che devono essere scritti rapidamente.

Probabilmente non scriverete una shell Unix o un kernel OS (o anche un compilatore C ++ ottimizzante) in Python (ma in C ++ o C), e probabilmente non scriverete uno script sysadmin o un'utilità in C ++ (ma in Python).

Inoltre, un programma C ++ può essere normalmente distribuito come un eseguibile autonomo (collegato staticamente o utilizzando molte librerie condivise C ++).

Finalmente, C ++ è tipizzato staticamente, e Python è digitato dinamicamente. Ciò significa che è necessario eseguire l'intera analisi del tipo di programma per compilare Python in codice efficiente. Tuttavia, alcune implementazioni JavaScript JIT (ad esempio v8 ) sembrano indicare che le lingue digitate in modo dinamico potrebbero essere compilate in modo efficiente con un molto impegno (sullo sviluppo dell'implementazione). Ma nessuno ha pagato un simile sforzo per una mitica implementazione del compilatore di interi programmi Python.

BTW, alcune implementazioni comuni di Lisp (ad esempio SBCL ) ti offrono una digitazione dinamica e un'espressività simile a quella di Python con una performance vicina a C ++.

    
risposta data 03.12.2014 - 06:55
fonte

Leggi altre domande sui tag