Il linguaggio di programmazione C è ancora usato?


96

Sono un programmatore C # e la maggior parte del mio sviluppo riguarda siti Web e alcune applicazioni Windows. Per quanto riguarda C, non lo uso da molto tempo, poiché non ce n'era bisogno. Mi ha sorpreso quando uno dei miei amici ha detto che ha bisogno di imparare il C per i lavori di prova, mentre la stavo aiutando a imparare il C #.

Ho pensato che qualcuno avrebbe appreso la C per i test solo se ci fosse uno sviluppo in C. Per quanto ne so, tutto lo sviluppo relativo alla progettazione COM e hardware è fatto anche in C ++. Pertanto, l'apprendimento del C non ha senso se è necessario utilizzare il C ++. Inoltre non credo nel significato storico, quindi perché perdere tempo e denaro nell'apprendimento del C?

C è ancora utilizzato in qualsiasi tipo di sviluppo di nuovi software o qualcos'altro?


46
Hai mai visto un compilatore C ++ per PIC?
SK-logic,

195
Sono l'unico che è triste che qualcuno equiparerebbe l'apprendimento allo spreco di tempo e denaro?
Jetti,

37
" Per quanto ne so , tutto lo sviluppo relativo alla progettazione COM e hardware viene eseguito anche in C ++ " - Mi sembra che tu non esegua effettivamente alcuna progettazione di interfaccia hardware.
Ed S.

32
La gente dimentica che le fantasiose lingue di livello superiore che tutti noi amiamo sono spesso implementate in C.
David Cowden il

13
@ThomasEding Lingua morta? Avrai sicuramente una conoscenza molto limitata dei linguaggi di programmazione se consideri C una lingua morta.
JesperE

Risposte:


214

C ha il vantaggio di essere un linguaggio relativamente piccolo , il che semplifica l'implementazione di un compilatore C (mentre un compilatore C ++ è un mostro da scrivere) e facilita l'apprendimento del linguaggio . Vedi anche l' indice TIOBE , secondo il quale C leggermente più avanti di C ++.

In (IMO) ordine decrescente di giustificazione, C è ancora usato molto per

  • Elementi incorporati
    È molto più semplice trasferire un compilatore C su una piccola piattaforma piuttosto che eseguire il porting di un compilatore C ++. Inoltre, i sostenitori del C sostengono che il C ++ "fa troppo alle loro spalle". Tuttavia, IMO è FUD.

  • Programmazione dei sistemi
    Ancora una volta, ciò è generalmente dovuto alle affermazioni secondo cui è più facile "sapere cosa sta facendo il compilatore". Tuttavia, molti programmi integrati trarrebbero vantaggio, ad esempio, da modelli e altre funzionalità chiave di C ++.

  • Software open source
    Questo è principalmente un problema di attitudine: OSS ha sempre preferito il C al C ++ (mentre è il contrario in gran parte del settore). L'odio irrazionale di Torvalds potrebbe in realtà essere la ragione più importante per questo su Linux .


16
È più storia che attitudine. Molti di quelli che potresti considerare i pacchetti "core" open source sono stati originariamente sviluppati quando il C ++ non era così ampiamente disponibile come lo è ora e le risorse erano ancora scarse.
Blrfl,

65
L'indice TIOBE è uno scherzo. I risultati dei motori di ricerca sono insignificanti.
DeadMG

29
@Sedate: che i template generalmente causano il bloat del codice è un mito, proveniente dai tempi degli antichi compilatori C ++. I compilatori moderni piegheranno istanze di template identiche. OTOH, i modelli consentono la meta-programmazione dei modelli, che esegue il codice in fase di compilazione, anziché in fase di esecuzione, con conseguente generazione di meno codice. Inoltre, rendono i programmi molto più sicuri (meno casting), qualcosa che è spesso molto importante nel dominio incorporato. L'EC ++ è stato condannato a morte dagli esperti del C ++ per (tra le altre cose) la pura stupidità di lanciare modelli.
sabato

18
@James: Intendi cose come astrazioni efficienti, programmazione generica e sicurezza dei tipi? Sì, chi lo vorrebbe.
Xeo

11
@JesperE A quanto pare, ho cambiato lavoro da quando l'ho scritto e ora sto programmando per i dispositivi integrati. Stiamo usando il C ++ ed è straordinario ciò che la meta-programmazione STL e template può fare per te quando hai hardware debole, vincoli in tempo reale difficili e necessità di affidabilità. (Stiamo realizzando centrali elettriche.) Sì, devi sapere se dovresti usare a std::vectoro a std::mapper un certo codice - ma non devi implementarlo tu stesso, ma puoi fare affidamento su testati, altamente performanti, e implementazioni di librerie affidabili che offrono alte astrazioni.
sabato

119

C è molto usato nella programmazione hardware integrata dove le risorse sono scarse.

Il kernel di Linux è scritto in C perché, secondo Linus Torvalds, C ++ è un linguaggio orribile .


14
Penso che gran parte del kernel di Windows sia anche C. E molti sistemi legacy.
Coder

14
Per essere completo, Linus ha provato a c ++ nel kernel. Quello era più un problema che un vantaggio. Comunque, il sviluppo del kernel è un argomento davvero specifico, ciò non significa che il C ++ sia in generale cattivo.
deadalnix,

75
Secondo altri , l'argomentazione di Linus è orribile.
sabato

36
Gli argomenti di Linus possono essere o meno validi, ma il kernel di Linux è ancora scritto in chiaro C :-)
Joonas Pulakka,

15
Linus è un idiota.
ubiyubix,

94

Tutte le lingue moderne che ho visto possono interagire con C:

  • C ++
  • Giava
  • C #
  • Pitone
  • Haskell
  • Obiettivo C

La necessità di interagire con C deriva da:

  • C con un semplice ABI
  • C essere in giro per molto tempo

Significa che poiché queste lingue possono comunicare con C, possono:

  • sfruttare le sue librerie
  • comunicare tra loro tramite C (ad esempio, Clang è scritto in C ++ ma offre collegamenti Python collegati alla sua interfaccia C).

E scommetterei che tutti si affidano a C per i loro tempi di esecuzione (a meno che non siano andati in assemblea completa? Dubbia).

C è la Lingua Franca dei linguaggi di programmazione e uno dei più semplici (saggio ABI) non legato a un'architettura specifica (come l'assemblaggio), ci vorrà un grande cambiamento per sbarazzarsene.


45

Secondo me questa è una domanda miope simile a "Io e i miei amici ascoltiamo il Reggae. Qualcuno ascolta davvero ancora il Rap?".

Ogni lingua là fuori ha il suo uso. Diverse lingue hanno sicuramente le loro nicchie. Ma chiedendo di C! Sono sicuro che meno persone usano C # che C su base giornaliera (dal punto di vista totalmente parziale di lavorare in un negozio dove nessuno usa C #).

Google veloce alla ricerca della popolarità relativa delle lingue.
Sono sicuro che nulla di tutto ciò è autorevole, ma possiamo usarlo per vedere le tendenze:

http://www.tiobe.com/index.php/content/paperinfo/tpci/index.html
http://langpop.com/

Anche guardando il rapporto SO della domanda sui tag:
https://stackoverflow.com/tags

  • N. C: 209845
  • 16 altri tag
  • C: 38790

Quindi C è l'argomento 18 più popolare su SO (e ci sono molte altre lingue lì).

Nota: l'indice TIOBE sopra è stato costantemente aggiornato per oltre un decennio (e ha alcuni dati che risalgono a 3 decenni fa) dovrebbe misurare gli ingegneri che lavorano in ogni lingua (anche se non ho idea di quanto sia preciso). Delle prime 10 lingue tranne Java / Visual Basic riflette ciò che le persone nel mio negozio sanno (anche se i nostri rapporti saranno leggermente diversi in quanto abbiamo una dimensione del campione molto più piccola).


1
Questa risposta mi confonde ... vai avanti su C # e poi mostri i tag delle domande SO ma nulla di tutto ciò ha davvero a che fare con l'uso di C. La popolarità (specialmente su langpop, dove usano le query dei motori di ricerca per determinare la popolarità) non mostra realmente l'uso moderno di una lingua, ma solo ricerche moderne su una lingua. È necessario prendere in considerazione, per le ricerche, che C viene utilizzato frequentemente nelle Università per le classi di livello inferiore in modo che possa aumentare il numero di query e anche i post SO.
Jetti,

3
@Jetti: Ecco perché dico esplicitamente: I am sure none of this is authoritative but we can use it to see trendsMa non sono d'accordo con la tua seconda affermazione; C non è più la lingua principale insegnata negli istituti di istruzione superiore (se fosse allora il nuovo gruppo di laureati non sarebbe così inutile). Al giorno d'oggi le persone tendono ad imparare in modo nitido Java / C #. Anche il rapporto Tiobe riguarda lavori non query.
Martin York,

Guardando indietro, sembra che ci sia una scelta sbagliata da parte mia. Non intendevo le classi a basso numero (classi iniziali), intendevo che le classi di sistemi (architettura del computer) sono dove C è usato.
Jetti,

4
Il conteggio dei tag SO non definisce la popolarità della lingua in generale, mostra semplicemente la popolarità della lingua tra gli utenti di SO .
Ed S.

4
@Ed S. Ovviamente. Ma la domanda non riguarda la popolarità. Riguarda l'esistenza di C come lingua. Il conteggio dei tag SO ci mostra che sicuramente non è una lingua morta. Il fatto che C sia tra i primi 2 negli altri siti non lo rende la prima / seconda lingua più utilizzata. Ma la sua esistenza nella top 10 è un indicatore significativo del fatto che non è morta. Naturalmente nulla di tutto ciò è la prova solo di forti indicatori del fatto che C sia ancora utilizzato attivamente.
Martin York,

23

Potrebbe essere necessario utilizzare C quando le risorse sono insufficienti e non sono necessarie funzionalità orientate agli oggetti.

Molti software in uso oggi sono ancora scritti in C, per non parlare dei driver hardware.

Secondo l' indice Tiobe , C è ancora la lingua più utilizzata.


Come suggerito da Tcrosley, potresti dare un'occhiata a questa domanda correlata .


Dovresti anche controllare alcuni articoli correlati sulle differenze tra C e C ++, come questo wiki o questo per esempio.


4
ahem !! questo è un ottimo punto. Non ho mai pensato che "le funzionalità OOP aggiungono effettivamente costi generali per la lingua". Grazie per aver chiarito questo punto valido. Ora, posso capire, dove C è davanti agli altri
Pankaj Upadhyay,

7
@Pankaj C ++ generalmente non aggiunge necessariamente molto tempo di esecuzione, molta della complessità del linguaggio è il principio del "non pagare per ciò che non usi" - se non usi le eccezioni, allora le eccezioni non lo fanno rallenta o aggiungi dimensione al tuo codice. Il compilatore è però più grande e complesso
Martin Beckett,

2
re C nel campo incorporato, vedere anche questa domanda e risposte: programmers.stackexchange.com/questions/84514/…
tcrosley,

6
In realtà non hai mai bisogno delle funzionalità OOP, funziona semplicemente bene in alcuni scenari.
Ed S.

2
@Jose Faeti: Il mio capo sarebbe d'accordo perché il mio capo è un ragazzo esperto e razionale. Non compra in programmazione religione.
Ed S.

20

Sembra che tu stia cercando di convincerti che C è inutile e quindi può essere ignorato. Dividiamo la tua domanda:

"Ho pensato che qualcuno avrebbe imparato la C solo per i test solo se ci fosse uno sviluppo in C."

No, ci sono molte ragioni per imparare C. Anche se non sapessi che eviterei comunque di usare affermazioni generali come quelle, specialmente in combinazione con la logica circolare. Ovviamente è necessario conoscere la lingua in cui è scritto il codice per essere in grado di testarlo / correggerlo correttamente, ma ciò presuppone che il linguaggio sia ancora usato come dato ed è vero per qualsiasi lingua e non solo per C.

"Per quanto ne so, tutto lo sviluppo relativo alla progettazione COM e hardware viene eseguito anche in C ++."

Questo non è corretto

"Pertanto, l'apprendimento del C non ha senso se è necessario utilizzare il C ++. Inoltre, non credo nel significato storico, quindi perché perdere tempo e denaro nell'apprendimento del C?"

Questa è la logica più discutibile di tutte. Prima di tutto, il significato storico è qualcosa in cui dovresti credere, perché se lo facessi sapresti che C è un sottoinsieme di C ++ e, per questo, conoscere C può aiutarti a essere un programmatore C ++ migliore. Naturalmente, il C ha influenzato anche la maggior parte delle lingue che lo hanno seguito, quindi i benefici non si fermano qui. Inoltre, poiché C è così importante, non si può ritenere che abbia solo un significato storico. È ancora ampiamente utilizzato e quindi non può essere relegato in una posizione secondaria come quella. Puoi sostenere che non è un linguaggio che ogni programmatore deve usare e di cui ha una conoscenza approfondita e che sarebbe giusto ma per favore non costruire la tua argomentazione sul dire che non credi a qualcosa senza prima esaminare i suoi veri meriti.


7
C è un sottoinsieme di C ++ , è questo che intendevi ?? . C non è un sottoinsieme di C ++; infatti sono piuttosto diversi. Sì, C ++ è un miglioramento di C, o talvolta indicato come C con classi e OOP , ma dire che C è un sottoinsieme, non giustifica
Pankaj Upadhyay

7
Il C ++ è principalmente un superset di una vecchia versione di C, e da allora C è andato in una direzione un po 'diversa. Alcuni aspetti delle lingue sono andati in direzioni sostanzialmente parallele, ma altri no (e C ++ ha molte altre cose oltre).
Donal Fellows,

Concordo nel voto per chiarire questo fatto, non tutti i programmi C validi sono programmi C ++ validi, vale a dire che C ++ non è un superset di C. Tuttavia, è un superset di come C stava per prendere la decisione un superset, come menzionato da Donal Fellows. Semplicemente non ha senso dire che lo è più, quando comunque non è più vero.
Joshua Hedges,

16

Oltre ai sistemi integrati, la maggior parte delle lingue più recenti ha un modo per interfacciarsi con C. Quando si scrive una libreria che si desidera avere un tempo facile da usare in tutte quelle lingue, C è una scelta ovvia. C ++, sebbene possa anche interfacciarsi con alcune lingue (come Python (solo CPython)), C ++ non può interfacciarsi con un numero maggiore di lingue a causa di alcune delle sue caratteristiche (in particolare la gestione dei nomi, ma i modelli non aiutano il problema). L'ABI C è uno dei più facili da interfacciare (so che puoi scrivere C ++ e usare la "C" esterna per l'interfaccia. Non mi interessa).

Ha anche il vantaggio che C e C ++ sono davvero i migliori linguaggi per la programmazione dei sistemi e che i tempi di compilazione C sono molto più rapidi. I tempi di compilazione in C ++ sono notevolmente i peggiori di qualsiasi linguaggio che abbia mai usato.

Ora mentre ci sono altre lingue che vogliono diventare la lingua di sistemi popolare là fuori (so in particolare di D ), gran parte del software è scritto in C / C ++. Lingue come D richiedono che qualcuno crei un wrapper attorno alla libreria C invece di usarlo direttamente (come faresti con C ++).


D può chiamare direttamente il codice C, proprio come C ++. Tutto ciò di cui hai bisogno se il prototipo di funzione (di nuovo, proprio come C ++). Scrivi semplicemente extern(C)in D, mentre in C ++ scriviextern "C"
Peter Alexander,

@Peter Alexander Sono a conoscenza di extern (C) in D. Questo è ciò a cui mi riferivo quando ho detto il file wrapper. Non puoi includere direttamente l'intestazione C (cosa che puoi fare in C ++, supponendo che l'intestazione C usi extern "C" e abbia i blocchi #ifdef __cplusplus, che la maggior parte fa). Esistono quindi altre incompatibilità tra il solo utilizzo di extern (C) (in particolare il modo in cui vengono gestite le stringhe. Per quanto ne sappia, non hanno un terminatore nullo in D. Quindi, è necessario modificare in modo speciale l'array quando si passa a C).
jsternberg,

11

controlla langpop.com , in particolare i grafici di Freshmeat e Google Code. Mostra che C è ancora molto avanti.

C è ancora popolare nei sistemi in cui è necessario avvicinarsi al metal (ovvero al sistema incorporato) e alle applicazioni affamate di prestazioni.


4
NON APRIRE questo URL! Il sito Web non esiste più e l'URL reindirizza ad alcune fastidiose pagine di spam.
Nikolay Suvandzhiev,

11

Lo uso quasi ogni giorno sviluppando per iPad / iPhone. Molte librerie sono scritte in C e non hanno un equivalente Objective-C. Quindi sì, è ancora utilizzato e da uno dei dispositivi più recenti sul mercato.

Con C puoi programmare molti sistemi embedded, è piccolo e maneggevole, e probabilmente resterà in circolazione per molti anni a venire (ovvero non stai perdendo tempo né denaro imparandolo)


2
"Objective-C è ancora giovane" in realtà risale alla metà degli anni '80, circa quanto C ++. La maggior parte delle persone che lo usano non lo hanno incontrato fino al 2007, però.

È vero, quello che volevo dire è fondamentalmente che ci sono molte librerie C che non hanno un equivalente in Objective-C per iOS. In effetti, la lingua stessa non è affatto giovane (verificata con Wiki). Grazie per la segnalazione.
Valentin Radu,

7

Generalmente per il sistema embedded C è ancora ampiamente utilizzato.

Questa domanda fornisce qualche altro esempio.

L' indice di Tiobe , che tenta di classificare la lingua in base alla popolarità / all'utilizzo , pone costantemente C al primo posto.


2 ° posto (dopo Java).
Martin York,

7
È interessante notare che C ++ e Java sembrano entrambi in tendenza al ribasso in popolarità negli ultimi 10 anni, mentre C rimane più o meno statico.
Paolo R,

7

Portabilità.

Fai un elenco di ogni sistema che pensi eseguirà il codice C e quindi un elenco simile per ogni altra lingua che ti piace.

Se hai trovato la mia stessa risposta, la conclusione è sì.


5

Beh, penso che C sia il linguaggio più potente per i seguenti motivi!

1) Alla prima C, è un linguaggio di sistema (il che significa che può essere utilizzato per programmare a basso livello con un tempo di esecuzione minimo o nullo).

2) Velocità dell'applicazione risultante. Il codice sorgente C può essere ottimizzato molto più delle lingue di livello superiore poiché il set di lingue è relativamente piccolo e molto efficiente. Si avvicina il più possibile alla programmazione in linguaggio assembly, senza programmazione in linguaggio assembly. e puoi persino usare assembly e C insieme!

3) C ha quale è la sua applicazione nella programmazione del firmware (hardware). Ciò è dovuto alla sua capacità di utilizzare / lavorare con gli assemblaggi e di comunicare direttamente con controller, processori e altri dispositivi.

4) C è un elemento costitutivo di molte altre lingue attualmente conosciute. Cerca la storia di C e scoprirai che esiste da un po 'di tempo (dato che i linguaggi di programmazione vanno comunque). Dai un'occhiata a Python, ad esempio un linguaggio di programmazione di alto livello completamente orientato agli oggetti. È scritto in C (forse anche in C ++). Questo ti dice se vuoi mai sapere cosa succede sotto il cofano in altre lingue; comprendere C e come funziona è essenziale.

Un linguaggio applicativo viene utilizzato per la programmazione di alto livello, ad esempio la scrittura di un word processor o di un gioco. Esempi di linguaggi di applicazioni sono Java, C #. Il motivo è perché contengono la garbage collection, la digitazione automatica, la convalida del runtime, ecc., Dove l'attenzione è rivolta alla produttività.

Un linguaggio di sistema viene utilizzato per la programmazione di basso livello. ad es. un microcontrollore, un driver e un kernel del sistema operativo. Gli esempi includono assembly, C. Richiedono un runtime minimo o nullo per eseguire il codice direttamente sull'hardware e l'obiettivo è che il programmatore abbia il controllo diretto sull'hardware.

Nel complesso, sta diminuendo come linguaggio delle applicazioni, ma è ancora forte come linguaggio dei sistemi.


1

Oh sì, è usato. Lavoro nel campo dell'elaborazione di pacchetti di rete. Sono stato in due diverse società in cui elaboriamo i pacchetti di rete. Quindi, stiamo operando a livello Ethernet o IP, non a livello superiore a TCP.

È interessante notare che in entrambe le società C è stato scelto rispetto al C ++. In una delle società, uno dei due prodotti è stato creato sopra il kernel Linux, mentre l'altro prodotto è stato creato nello spazio utenti Linux. Il prodotto del kernel ovviamente usa C come kernel Linux è programmato in C, ma hanno scelto di usare anche C per il prodotto userspace. Entrambi i prodotti sono stati sviluppati a partire dall'anno 2000 circa (il prodotto kernel un po 'prima del 2000 e il prodotto userspace un po' dopo il 2000).

Nella società in cui sono andato dopo, il prodotto è stato costruito su C, non su C ++. Si tratta in realtà di una continuazione di un progetto a partire dalla metà degli anni '90, sebbene a causa delle recenti richieste di miglioramento delle prestazioni, si decise che essenzialmente tutto sarebbe stato riscritto. A causa di questa riscrittura avevamo un'opzione per selezionare C ++, ma non lo abbiamo fatto.

Nel campo dell'elaborazione dei pacchetti di rete, le prestazioni contano molto. Quindi, voglio implementare la mia tabella hash con prestazioni più elevate rispetto alle tabelle hash esistenti. Io, non l'autore della tabella hash, sono chi seleziona quale funzione hash deve essere utilizzata. Forse voglio prestazioni e scelgo MurMurHash3 . Forse voglio sicurezza e scelgo SipHash . Gli allocatori di memoria sono ovviamente personalizzati. In effetti, tutte le importanti strutture dati che utilizziamo sono state implementate su misura per le massime prestazioni possibili.

Mentre non c'è nulla che possa impedire l'uso del C ++, di solito è una cattiva idea. Una singola eccezione generata per pacchetto ridurrà la velocità di elaborazione dei pacchetti a livelli inaccettabili! Quindi, non possiamo usare le eccezioni di C ++. Troppo lento. Stiamo già utilizzando un tipo di codice C orientato agli oggetti implementando strutture di dati come strutture e quindi implementando funzioni che operano su tali strutture. Il C ++ consentirebbe di avere funzioni virtuali, ma ancora una volta le chiamate alle funzioni virtuali ucciderebbero le prestazioni se utilizzate ovunque. Quindi, è meglio essere espliciti e avere un puntatore a funzione se sono necessarie chiamate a funzioni virtuali.

Il C ++ farà molte cose alle tue spalle: allocazione della memoria, ecc. D'altra parte, in C che di solito non accade. È possibile scrivere una funzione che alloca memoria, ma di solito dall'interfaccia della funzione è evidente che l'allocazione sta avvenendo.

Come esempio del tipo di micro-ottimizzazioni che puoi fare durante la programmazione in C, dai un'occhiata alla macro container_of nel kernel di Linux. Certo, potresti usare container_of nel codice C ++, ma chi lo fa? Voglio dire, è del tutto accettabile nella maggior parte dei programmi C, ma i programmatori C ++ tipici proporrebbero immediatamente qualcos'altro, come un elenco collegato che alloca i nodi di collegamento come blocchi separati. Non lo vogliamo perché ogni blocco di memoria allocato è dannoso per le prestazioni.

Forse l'unica cosa che ci trarrebbe beneficio in C ++ è che C ++ consente la metaprogrammazione dei modelli, il che significa che a volte puoi evitare chiamate di funzione virtuali pur avendo ancora un parametro di funzione e consentire al compilatore di incorporare le funzioni. Ma la metaprogrammazione dei modelli è complicata e siamo riusciti a soddisfare tutti i requisiti in C, quindi il vantaggio di questa funzionalità in C ++ non è così critico.

In una delle società, avevamo effettivamente un linguaggio compilato personalizzato in cui erano implementate parte delle funzionalità. Indovina qual era la lingua di destinazione del compilatore? Assemblea? No, abbiamo dovuto supportare architetture a 32 e 64 bit. C ++? Sicuramente scherzi. Ovviamente, era C con il goto calcolato di GCC . Quindi, il linguaggio personalizzato è stato compilato in C (o in realtà la variante gcc di C che supportava goto calcolata) e il compilatore C ha prodotto assembly.


0

Uso ancora C quotidianamente e uno dei motivi principali è l'interoperabilità con altre lingue e un SDK progettato per essere utilizzato da plugin creati da tutti i tipi di compilatori in varie lingue.

Non riesco a scrivere un'API C ++ che utilizza classi con costruttori e distruttori e vtables, sovraccarico di funzioni, genera eccezioni, ecc. Che può essere utilizzato da Lua, C #, Python, C, ecc. E tanto meno un plug-in C ++ scritto utilizzando diversi compilatori e impostazioni dal nostro.

Non riesco a scrivere un SDK C # che può essere chiamato da Python, ad esempio, o un SDK Python che può essere chiamato da C #.

C è l'unica lingua qui che mi permette di creare un'API che può essere chiamata da una di queste lingue. Detto questo, utilizzo spesso C ++ per implementare queste interfacce C (anche se a volte le implemento solo in C).

Oltre a ciò, a volte trovo C il linguaggio più semplice con cui lavorare per cose come strutture di dati di basso livello e allocatori di memoria. Tutta la sicurezza aggiuntiva del tipo che ottieni in C ++ non aiuta se stai scrivendo un allocatore di memoria progettato per unire bit e byte allineati. E contro il ricco sistema di tipo C ++ e la gestione delle eccezioni, non è facile implementare le proprie strutture di dati - basta guardare a quanto sforzo ci vuole per scrivere una struttura di dati banale come std::vectorse si volesse renderla sicura dalle eccezioni ed evitare di invocare ctors and dtors su elementi che non hai inserito nel contenitore (sto parlando come uno che ha implementato l'intera libreria standard C ++). Quando solo un array coltivabile è molto difficile da implementare bene, immagina il lavoro necessario per implementare un BVH di qualità produttiva.

Preferisco C ++ rispetto a C quando voglio usare strutture di dati esistenti o implementare quelle di livello superiore usando quelle esistenti, ma se sto per implementare una struttura di dati di basso livello al centro di un motore che non serve a nulla strutture di dati esistenti, C rende sicuramente molto più facile fare con il suo superbo sistema di tipi semplicistico che ti permette solo memcpycose qui e memmovecose lì, mallocun blocco contiguo e realloclì, senza preoccuparti che vengano lanciati costruttori, distruttori ed eccezioni.

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.