Perché l'industria è passata da C a C ++? [chiuso]


19

Prima di tutto vorrei avere una vera risposta, cerco sempre di ottenere di più da varie fonti e articoli, e quando leggo cose come C ++ è lenta perché ha funzioni virtuali e grazie a questa C è migliore , davvero non so cosa dire e pensare come un essere umano con un cervello. Quindi, per favore, evita di raggiungere questo livello nelle tue risposte.

La mia domanda riguarda un enorme passaggio al C ++ che è stato completato, più o meno, con Doom 3.

La cosa interessante per me è che prima di questo traguardo, la maggior parte dei motori di gioco e dei giochi stessi erano scritti in C, proprio come lo era dall'era del Quake . È anche interessante notare che il software ID decide di riscrivere completamente la base di codice per IdTech 4 in C ++, un'enorme quantità di lavoro che onestamente non riesco a capire senza un buon elenco di motivi.

Mi sto concentrando su Doom 3 perché sono principalmente interessato al mondo OpenGL e nel mio viaggio cerco di rimanere concentrato su questo argomento, quindi ho letto molto su questo, ma penso che una domanda del genere possa essere render-API -agnostico senza troppi problemi.

Perché a un certo punto l'industria è passata massicciamente al C ++? Quali sono i motivi della scelta dell'ID?

L'ultima cosa che vorrei dire è che il linguaggio C è molto più semplice da implementare e fornisce un numero inferiore di funzionalità, per questo ha molte meno possibilità di essere "frammentato" in pezzi a differenza del C ++ che spesso fa. In parole povere ho molte più possibilità di trovare un compilatore C davvero buono piuttosto che un buon compilatore C ++ con tutte le funzionalità implementate in modo positivo.

Ad esempio, NDK per Android non ha ancora un buon supporto C ++ (con la versione r8b) con tutte le funzionalità più recenti e più grandi, ed è il toolkit nativo per il sistema operativo mobile più popolare al mondo!

Se avessi scritto il mio codice in un moderno C ++, probabilmente avrei sofferto ora perché uno dei sistemi operativi più popolari al mondo sarebbe off-limits per me. E come Android, molti altri compilatori non sono così grandi.

Dovrei scrivere il codice C ++ facendo riferimento a una versione C ++ che è 2-3 vecchia versione?


1
Ho il sospetto che il C ++ sia quasi un'estensione di C. Le persone hanno iniziato a scrivere C con funzionalità C ++ come std :: vector, da lì in poi è stato insegnato C ++ anziché C e quindi le persone hanno iniziato a scrivere C ++ in piena regola.
API-Bestia

1
Bene, C vs. C ++ quando si sviluppa un'applicazione di grandi dimensioni ? OOP è un grande paradigma e .. C ++ lo supporta. Se hai intenzione di scrivere un gioco in C, prendi in considerazione la progettazione orientata ai dati . Altrimenti, riflettiamo sul perché tutti i principali attori del settore utilizzano il C ++. L'ingegneria del software, sia per applicazioni finanziarie che per il tempo libero, approfondisce il paradigma OOP e quello dei modelli architettonici e di progettazione. In poche parole, C non può offrire il quadro generale offerto dall'incapsulamento. Esistono software moderni di grandi dimensioni scritti in C? Forse kernel e sistemi embedded.
teodron,

@teodron 1) Devo produrre un buon eseguibile, mi interessa il linguaggio come mi interessa un bene importante, ma non è tutto e non è quello che vendo 2) l'incapsulamento non è così buono per le prestazioni, se qualcuno vuole convincimi a lasciare il mondo C ++, l'incapsulamento è uno dei buoni argomenti per questo.
user827992,

3
" La cosa interessante per me è che prima di questo traguardo, la maggior parte dei motori di gioco e dei giochi stessi erano scritti in C, proprio come era fin dall'era del Quake. " Vorrei vedere alcune prove per questo. Oltre ai motori open source di Id-software. Non sono l'intero settore dei videogiochi.
Nicol Bolas,

@NicolBolas stavo spiegando il motivo per cui stavo parlando di ID, per favore ottieni il significato dell'intera domanda.
user827992

Risposte:


28

C ++ fa tutto ciò che fa C. Puoi mischiare banalmente C e C ++ nei casi in cui i vantaggi di C superano quelli di C ++. Questa è una decisione di progettazione molto intenzionale di C ++.

C ++ fa cose che C non fa. Ciò include un polimorfismo semplice, ma anche una semplice generazione di codici temporali di compilazione tramite modelli. Questo è davvero utile per cose come i contenitori, che sono facilmente il più grande punto debole di C. Consente inoltre tipi di puntatori definiti dall'utente (handle intelligenti) che consentono di risparmiare molto tempo, nonché tipi di primitivi definiti dall'utente come vettori e matrici con supporto operatore (consente inoltre di risparmiare molto tempo).

Le funzioni virtuali sono più lente delle funzioni non virtuali. Tuttavia, è necessario attivare le funzioni virtuali e un programmatore competente lo fa solo quando sono utili. I programmatori C hanno puntatori a funzione e spesso memorizzano raccolte di quelli in struttura a cui fanno riferimento altre strutture; in altre parole, fanno un lavoro extra per ricreare esattamente la stessa cosa delle tabelle di funzioni virtuali. Nei casi in cui è necessario un solo puntatore a singola funzione e non è richiesta alcuna tabella, C ++ lo consente ancora completamente ed è equivalente a C. Con un compilatore moderno, C ++ è solo più lento di C nei casi specifici in cui il programmatore sta optando per una funzione . Inoltre, l'overhead della funzione virtuale in pratica è molto ridotto nelle CPU del modem. L'hardware oggi è progettato per i modelli di utilizzo di C ++ ed è ancora più progettato per le esigenze dei langiages interpretati di alto livello.

Le eccezioni del C ++ impongono storicamente un sacco di sovraccarico, rendendo il C ++ più lento anche se non le si utilizza. Le eccezioni erano una cosa terribile da aggiungere al C ++, se non altro per l'immenso aumento della complessità implicato nella scrittura di codice a prova di eccezione, e in effetti alcuni progetti di contenitori sono letteralmente impossibili da rendere eccezionalmente sicure. I programmatori di giochi spesso ignorano l'esistenza delle eccezioni e addirittura le disabilitano sul compilatore. I compilatori moderni hanno eccezioni zero-overhead (vale a dire, li paghi solo quando li usi effettivamente).

C è più semplice da imparare tutte le regole di. Il C ++ è un linguaggio molto grande e complesso. C ++ consente di scrivere codice di livello superiore, producendo API più facili e semplici. Alcune persone vogliono capire la lingua più facilmente, alcune persone vogliono scrivere codice avanzato più facilmente. È un compromesso tra la semplicità di comprensione di ciò che il compilatore sta facendo con un pezzo di codice specifico rispetto alla semplicità di scrivere applicazioni complesse interconnesse. Alcune persone apprezzano l'una molto più dell'altra, per vari motivi.

Alla fine, C ++ è un superset di C. Secondo me, non esiste un programmatore C ++ altamente competente che non sia anche un programmatore C passabile (anche se ci sono molti programmatori C ++ che scendono al di sotto della mia barra che vorrebbe perdersi nella pura C). Mentre il C ++ aggiunge funzionalità per isolare il programmatore da gran parte del C, il codice C ++ non banale spesso ha bisogno di usare C per fare le cose. Questa è una delle differenze principali tra C ++ e Java e C #. C'è una ragione per cui spesso vedi "C / C ++" raggruppati, dopo tutto.

La mia convinzione personale - che è condivisa con la maggior parte degli altri professionisti del settore dei giochi con cui ho interagito - è che la maggiore espressività e le strutture di programmazione di alto livello del C ++ superano la maggiore complessità del linguaggio rispetto al C e la maggior parte delle altre frequenti le affermazioni anti-C ++ fatte sono semplicemente obsolete con la tecnologia odierna.


19
"Non esiste un programmatore C ++ competente che non sia anche un programmatore C competente" Non sono assolutamente d'accordo con questa affermazione. Il C idiomatico è molto diverso dal C ++ idiomatico. I due stili sono divergenti, uno che enfatizza i puntatori opachi e la funzione statica, l'altro che utilizza l'incapsulamento basato sul linguaggio e così via. Qualcuno che conosce solo il C ++ idiomatico sarebbe competente nel C ++, ma ancora piuttosto confuso dal idiomatico C.
Nicol Bolas,

Non sono d'accordo che tu possa essere competente in C ++ e conoscere solo "C ++ idiomatico". Le parti dure di C ++ sono le stesse parti dure di C (più modelli). Se un programmatore C ++ viene confuso da funzioni autonome, strutture semplici e puntatori grezzi o opachi, non ha ancora scritto alcun codice C ++ non banale in uno scenario non accademico del mondo reale. Andrei fino al punto di sostenere che chiunque sia solo esperto di qualcosa di "idiomatico" non ha ancora raggiunto la competenza.
Sean Middleditch,

3
"Idiomatico" è un altro modo di dire "comodo", che - oltre ad essere relativo - significa anche che esiste, quasi per definizione, una regione scomoda della lingua in cui un programmatore C ++ altrimenti competente non sarà particolarmente competente. (Non penso necessariamente che ciò significhi che sono "confusi" da quegli elementi, semplicemente che sono a disagio con o non sono fluenti con loro.) E, in una certa misura, alle persone che imparano il C ++ idiomatico viene insegnato a sentirsi a disagio intravede semplicemente un puntatore grezzo. Quindi non penso che un programmatore C ++ competente implichi un programmatore C competente.
John Calsbeek,

Detto in altro modo, esiste sicuramente un ambito C ++ di livello superiore su cui è possibile evitare completamente l'utilizzo di qualsiasi funzionalità di livello inferiore che sarebbe necessaria per scrivere un codice C serio. Sono sicuro che la maggior parte delle basi di codice non accademiche del mondo reale non rimarranno interamente all'interno di questo regno, ma sospetto che potresti trovare una persona che si trova a proprio agio con questo regno e comunque chiamarli "competenti". Certo, non paragoneresti una persona simile a un programmatore C, paragoneresti a qualcuno che sta programmando in un numero qualsiasi di altri linguaggi di alto livello.
John Calsbeek,

1
@DanielCarlsson: Abbastanza giusto, sono solo pedante. Scusa. In tale ottica, però ... C ++ non fa nulla che renda le ottimizzazioni più difficili di C. :) Voglio dire, certo, se usi lo STL allora sei limitato a quello che fa lo STL, ma gran parte del perché usiamo C ++ invece di C # o Java perché possiamo semplicemente reimplementare l'intero STL o usare array grezzi o persino girare in assembler inline o estensioni del linguaggio (come intrinsechi SSE), ecc.
Sean Middleditch

12

Perché a un certo punto l'industria è passata massicciamente al C ++? Quali sono i motivi della scelta dell'ID?

Id Software non è "il settore". Sono una società. Sebbene possano essere influenti, non sono tutti.

Ho lavorato su un paio di motori di gioco che risalgono al 1999 e hanno usato il C ++.

Le ragioni principali per l'adozione del C ++ "in quel periodo" sono:

  1. È stato standardizzato . C ++ 98 è chiamato così perché è stato rilasciato come standard ISO nel 1998. Fino ad allora, c'erano più dialetti di C ++ senza una chiara idea che fosse "reale" o "corretto". Una volta che è stato standardizzato e i compilatori hanno iniziato a implementare lo standard, gli sviluppatori di giochi potevano fare affidamento sullo standard reale.

  2. Ricorda la vecchia battuta: un ragazzo entra nell'ambulatorio medico e dice "Fa male quando alzo il braccio in questo modo". Quindi il dottore dice "Quindi non alzare il braccio in quel modo".

    Se le funzioni virtuali sono lente per le tue esigenze, C ++ non ti obbliga a usarle. Tutto in C ++ è opt-in. Si sceglie di utilizzare ogni funzione particolare. Se hai un codice critico per le prestazioni e non desideri un sovraccarico virtuale, non usi le funzioni virtuali. Proprio come se sei in codice critico per le prestazioni in C, non usi i puntatori a funzione.

    In effetti, ciò portò a molti giochi in C ++ che non erano C ++ idiomatico (almeno, non C ++ idiomatico moderno ), ma semplicemente "C con classi". E questo è un modo perfettamente funzionale per programmare C ++. Diavolo, essere in grado di non dover digitare typedef structquando si crea un nuovo tipo è un vantaggio.

    C ++ è una grande varietà di funzionalità e puoi scegliere quelle che desideri.

Ad esempio, NDK per Android non ha ancora un buon supporto C ++ (con la versione r8b) con tutte le funzionalità più recenti e più grandi, ed è il toolkit nativo per il sistema operativo mobile più popolare al mondo!

Il tuo punto è? Google tollera a malapena le persone che usano NDK; è chiaro che vogliono che tutti usino Java. L'unica ragione per cui NDK esiste è perché ci sono alcuni sviluppatori importanti che semplicemente non useranno la piattaforma senza di essa. Pertanto, NDK esiste per servire loro e le loro esigenze di funzionalità.

Sì, C ++ è una specifica più grande e complicata da implementare. Anche Java. Quindi è qualsiasi lingua tranne C.

Inoltre, cosa intendi con "tutte le funzionalità più recenti e più avanzate"? Se stai parlando di cose in C ++ 11, beh, nessuno lo implementa ancora del tutto. Le specifiche hanno appena un anno. Inoltre, non so se NDK supporta C11; sì, C ha anche "le più recenti e grandi funzionalità" che non sono supportate ovunque.

Il che fa apparire un punto importante: se vuoi che la tua applicazione pure-C si compili su Visual Studio, allora deve conformarsi a C89 e niente di più. Quindi la frammentazione con C esiste già. Alcune piattaforme supportano solo C89. Alcuni supportano C99. Alcuni supportano C11, a vari livelli. Eccetera.

Se si desidera utilizzare C, quindi utilizzare C . Il fatto che altre persone non abbiano fatto questa scelta non significa che la tua scelta sia sbagliata o che la loro scelta sia sbagliata. Non è necessario per giustificare se stessi per loro, e che non c'è bisogno di giustificarsi a voi.


2
Non penso che Google tolleri a malapena chi usa l'NDK perché lo sviluppo dell'NDK è in corso e ci sono diverse versioni disponibili per Android, anche se Google odia il C / C ++ non credo di poter ottenere un buon livello di prestazioni per il mio gioco in Java o i giocatori più importanti sul mercato possono riscrivere il loro codice solo per java e Android, probabilmente è un male necessario per Google, non lo so, il mio punto è chiedere un vasto vista e non una domanda scadente su C vs C ++ vs Java vs il mondo, stavo cercando una risposta più generalizzata dalla lingua continua
user827992

al compilatore considerando tutte le funzionalità del linguaggio, la tua risposta mi permette anche di sottolineare il mio punto iniziale sulla disponibilità dei compilatori C sul mercato, su Windows ho quasi tutto il software house che produce un compilatore con il proprio compilatore, ho anche altre opzioni gratuite come MinGW. Il vero problema che ho riscontrato con la C è la mancanza di supporto nativo per le strutture di dati, i container, in C ++ puoi avere un'idea di quanto ti costa un particolare container o una particolare istruzione,
user827992

in C probabilmente il codice che fa la stessa cosa ha più di una sola implementazione, anche in C ++ il compilatore può ottimizzare di più in conseguenza di ciò. Probabilmente dovrei studiare di più il C ++, ma penso che passerò al C ++ solo per un buon supporto per alcune caratteristiche particolari, non per il linguaggio stesso.
user827992

7

È anche interessante notare che il software ID decide di riscrivere completamente la base di codice per IdTech 4 in C ++, un'enorme quantità di lavoro che onestamente non riesco a capire senza un buon elenco di motivi.

È stato comune per loro riscrivere praticamente l'intero motore per ogni versione (almeno fino a poco tempo fa - non so molto sugli ultimi giochi), e dal momento che il C ++ sta crescendo in popolarità ha senso usarlo piuttosto che attenersi con C. Nel tempo sempre meno persone saranno competenti con C.

Perché a un certo punto l'industria è passata massicciamente al C ++?

Perché ti offre molte funzionalità di livello superiore pur essendo quasi interamente retrocompatibile con il codice C.

Quali sono i motivi della scelta dell'ID?

Google avrebbe risposto a questa domanda per te: http://fabiensanglard.net/doom3/interviews.php

"... metà dei programmatori avevano davvero uno sfondo C ++ all'inizio. Avevo uno sfondo C e Objective-C, e in un certo senso" sono scivolato in C ++ "semplicemente guardando il codice che stavano scrivendo i ragazzi del C ++. Con il senno di poi, io vorrei avere programmato il tempo per ricercare a fondo ed esplorare la lingua prima di iniziare a usarla.

Potresti ancora essere in grado di dire che il codice del renderer è stato in gran parte sviluppato in C, quindi in qualche modo scuoiato in C ++.

Oggi sono fermamente convinto che C ++ sia la lingua giusta per grandi progetti multi-sviluppatore con requisiti di prestazioni critiche e Tech 5 è molto meglio per l'esperienza di Doom 3 ".

Se avessi scritto il mio codice in un moderno C ++, probabilmente avrei sofferto ora perché uno dei sistemi operativi più popolari al mondo sarebbe off-limits per me.

  1. I programmatori non possono vedere nel futuro. Non saprebbero che ci sarebbe una nuova piattaforma con scarso supporto C ++. Android non esisteva correttamente fino al 2009. Doom 3 era del 2004.
  2. Pensi che i programmatori che stanno scrivendo giochi 3D all'avanguardia per PC e console si aspettano che il loro codice venga eseguito anche sui telefoni? Puntare su quel grado di portabilità è molto raro e spesso inutile a causa dell'enorme differenza di potenza disponibile.

Dovrei scrivere il codice C ++ facendo riferimento a una versione C ++ che è 2-3 vecchia versione?

Perché ti importa di questo? Non rimanere intrappolato a caccia dell'ultima cosa. Se fosse stato abbastanza buono 5 anni fa, ora non sarebbe peggiorato improvvisamente.


3

Bene, C ++ è uscito dagli anni '80, quindi se un compilatore non lo supporta, forse dovresti usare un compilatore diverso. Inoltre, C ++ non è molto più lento di C. È solo più lento se lo carichi con funzioni virtuali e altre astrazioni. Tuttavia, C ++ è molto usato oggi nel mondo non unix a causa della sua flessibilità e delle nuove funzionalità che C non ha. Scrivere codice modulare in C ++ è molto più semplice che farlo in C ++ e ti aiuta a scrivere codice più portatile. Tornando all'argomento dei compilatori, non conosco nessun compilatore che non supporti C ++ (forse non completamente C ++ 11, ma qualsiasi compilatore decente dovrebbe supportare C ++).

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.