Cosa rende C così popolare nell'era di OOP? [chiuso]


91

Scrivo molto codice sia in C che in C ++, ma non mi aspettavo che C fosse il secondo linguaggio più popolare, leggermente dietro Java.

TIOBE Programming Community Index

Sono curioso di sapere perché, in questa era di OOP, C è ancora così popolare? Si noti che 4 dei 5 principali linguaggi di programmazione popolari sono linguaggi "moderni" e orientati agli oggetti.

Ora, sono d'accordo che puoi usare OOP in C in una certa misura, ma è un po 'doloroso e inelegante (almeno almeno rispetto al C ++ credo). Quindi, cosa rende C così popolare? È efficienza; essere di basso livello; la stragrande maggioranza delle biblioteche che già esistono o qualcos'altro?


18
videogiochi, sistemi integrati, programmazione hardware (firmware), sistemi operativi, ecc.

25
Nota che ottieni solo ciò che misuri, nel caso di TIOBE, il numero di risultati per +"<language> programming"i motori di ricerca più diffusi. Un post sul blog "Perché nessuno fa più programmazione in C" conta per C in questo indice. Cavolo, anche questa domanda può essere fatta non appena Google la raccoglie.

40
L'età di OOP? è un'affermazione piuttosto audace.
Mahmoud Hossam,

57
Hai l'illusione che OOP sia un proiettile d'argento, dovresti perderlo rapidamente, non c'è niente di speciale o "buono" in OOP, è solo una delle tante strategie di organizzazione del codice.
Raynos,

23
@DeadMG: Pot, meet kettle. I dati di TIOBE potrebbero non essere affidabili, ma la tua affermazione calva secondo cui "non è popolare" non ha alcuna fonte o citazione. Se hai intenzione di contestare il presupposto alla base della domanda, almeno fornisci alcune prove a sostegno.
Daniel Pryden,

Risposte:


142

Alcuni fattori che contribuiscono:

  • C è onnipresente. Qualunque sia la piattaforma, C è probabilmente disponibile.
  • C è portatile. Scrivi un pezzo di C pulito e si compila con modifiche minime su altre piattaforme - a volte funziona anche fuori dagli schemi.
  • C è in circolazione da un po '. Ai tempi in cui UNIX conquistava il mondo, C (il linguaggio di programmazione UNIX preferito) condivideva il suo dominio mondiale e divenne la lingua franca del mondo della programmazione. Ci si può aspettare che un programmatore serio abbia almeno un senso di un pezzo di C; lo stesso non si può dire per la maggior parte delle altre lingue.
  • C è ancora la lingua predefinita per i sistemi basati su UNIX e UNIX. Se vuoi che una libreria abbia successo in una terra open source, hai bisogno di buoni motivi per non usare C. Ciò è in parte dovuto alla tradizione, ma più perché C è l'unico linguaggio che puoi tranquillamente supporre essere supportato su qualsiasi tipo UNIX sistema. Scrivere la tua libreria in C significa che puoi minimizzare le dipendenze.
  • C è semplice. Manca l'espressività di sofisticati OOP o linguaggi funzionali, ma la sua semplicità significa che può essere raccolto rapidamente.
  • C è versatile. È adatto per sistemi embedded, driver di dispositivo, kernel del sistema operativo, piccole utility da riga di comando, applicazioni desktop di grandi dimensioni, DBMS, implementazione di altri linguaggi di programmazione e praticamente qualsiasi altra cosa ti venga in mente.
  • C è veloce. La maggior parte delle implementazioni in C viene compilata direttamente nel codice macchina e il programmatore ha piena potenza su ciò che accade a livello di macchina. Non c'è interprete, nessun compilatore JIT, nessuna macchina virtuale o runtime - solo il codice, un compilatore, un linker e il bare metal.
  • C è "libero" (sia nella birra che nel senso della parola). Non esiste una singola azienda che possiede e controlla lo standard, ci sono diverse implementazioni tra cui scegliere, non ci sono problemi di copyright, brevetti o marchi per l'utilizzo di C e alcune delle migliori implementazioni sono open source.
  • C ha molto slancio. La lingua è stata popolare per decenni, quindi c'è un'enorme quantità di applicazioni, librerie, strumenti e, soprattutto, comunità, per supportare la lingua.
  • C è maturo. L'ultimo standard che ha introdotto grandi cambiamenti è il C99, ed è per lo più compatibile con gli standard precedenti. A differenza delle lingue più recenti (ad esempio Python), non devi preoccuparti di interrompere le modifiche in qualsiasi momento presto.
  • C è compatibile. La maggior parte delle lingue ha legami con cui parlare a C. Ciò significa che si può sviluppare una libreria in C usando convenzioni di chiamata standard e sentirsi sicuri che quasi qualsiasi altra lingua possa collegarsi a quella libreria. Per citare alcune lingue popolari di uso diffuso: C #, Java, Perl, Python, PHP possono collegarsi senza problemi a librerie C.
  • C è potente: se il linguaggio non può fare qualcosa, tutti i compilatori popolari consentono di incorporare il codice assembler che può fare qualsiasi cosa l'hardware possa fare. Combinato in modo transitorio con il punto precedente sulla compatibilità, questo significa che C può fungere da collegamento tra le lingue di livello superiore e il "metallo nudo" dell'assemblaggio.

9
Penso che non tutti i tuoi argomenti siano corretti. 1) C è onnipresente. C ++ è onnipresente come C, poiché esistono compilatori da C ++ a C. 2) C è portatile. Lo stesso con C ++. 3). C è in circolazione da un po '. Lo stesso con C ++. 4). C è versatile. Lo stesso con C ++. 5) C è veloce. Lo stesso con C ++. 6). C è "gratuito". Lo stesso con C ++. 7). C ha molto slancio. Lo stesso con C ++ di nuovo. 8) C è maturo. Lo stesso con C ++. Quindi in realtà non rispondi alla domanda.
Konstantin Solomatov,

19
C11 è l'ultimo standard, non C99. Non che sia davvero importante come tutti usano l'89.
Pubblico

53
@KonstantinSolomatov: Se stai scrivendo una biblioteca che sarà consumata da altre persone, per favore fai un favore al mondo e scrivila in C invece che in C ++. Se non puoi farlo, almeno scrivi un'API C. Tutto nell'universo può collegarsi al codice C in un modo o nell'altro, di solito con il minimo sforzo. Al contrario, avrai spesso problemi ABI maggiori quando provi a chiamare il codice C ++ da altro codice C ++ , per non parlare di altre lingue.
Daniel Pryden,

37
@KonstantinSolomatov: il fatto che sia necessario un compilatore da C ++ a C dimostra che C è quello che è onnipresente.
Detly

11
@KonstantinSolomatov: Per favore, smetti di pensare che C sia C ++. C non ha chiusure. Alcune estensioni di C vedere (come quella attuata dalla famiglia gcc di compilatori) ma C non (cioè, non è nella specifica originale K & R o qualsiasi norme C finalizzati).
Donal Fellows il

88

Ho sempre avuto la tendenza a incolpare la popolarità di C sulla necessità di un linguaggio di assemblaggio universale. La combinazione di specificità a livello di macchina, standardizzazione ed estrema portabilità consentono a C di funzionare come quel linguaggio di assemblaggio universale di fatto , e per questo motivo sospetto che il suo ruolo continuerà indefinitamente.

Devo dire che sono sempre un po 'sorpreso quando OOP viene presentato nei corsi di programmazione come una sorta di "modello finale" che è l'unico endpoint possibile per una buona programmazione. Come molti altri aspetti della programmazione, il valore di OOP è un compromesso tra molti fattori concorrenti, tra cui il modo in cui il cervello umano ha organizzato le informazioni, in che modo i gruppi sociali supportano il software a lungo termine e, nel caso della programmazione orientata agli oggetti, alcuni aspetti piuttosto profondi di come funziona l'universo stesso.

E quell'ultimo punto vale la pena martellare un po '. Leggi di più se sei interessato a un'esplorazione a livello di fisica del perché esistono alcuni stili di programmazione, come funzionano insieme e dove il mondo potrebbe essere diretto in futuro mentre espandiamo ulteriormente su tali concetti ...

Un oggetto in fisica è tutto ciò che mantiene coerente la coerenza nel tempo. Ciò a sua volta consente a semplici creature come noi di cavarsela con la rappresentazione dell'oggetto usando solo un piccolo numero di bit, senza mettere in pericolo la nostra sopravvivenza troppo male. Ma in termini di fisica in generale, il numero di cose che devi fare esattamente per rendere quel tipo di semplificazione facile e comune è notevolmente grande. Come umani non pensiamo a tutto questo perché, francamente, non saremmo qui se non fosse vero.

Sembra troppo astratto? Non lo è davvero. Immagina, ad esempio, di provare a guidare la strada verso la casa del tuo amico se invece di automobili incontrassi campi di plasma che oscillano rapidamente e condensazioni momentanee di materia che si muovono con un'enorme gamma di velocità. Uno scenario del genere potrebbe tagliare piuttosto profondamente le opportunità di socializzazione, sì? Abbiamo bisogno di oggetti, ci sono oggetti, e l'esistenza di oggetti ci fornisce un livello enorme e fondamentale importanza della semplificazione del contesto che ci circonda.

Quindi riportiamo tutto al software. Che cosa hanno da dire gli oggetti nel mondo reale sugli oggetti in termini di programmazione?

Bene, per prima cosa significa che ciò che definisce un oggetto "buono" nel software dovrebbe davvero essere se il tipo di dati che stai gestendo supporta prontamente l'idea di persistenza riconoscibile nel tempo .

Con la definizione, le forme più semplici di OOP sono facili da riconoscere. Sono quelli che coprono un po 'usando solo i dati che sono già "allegati" o definiti da un oggetto reale, veramente fisico come una persona, una casa o un'auto. Ancora oggi, questa è ancora troppo spesso l' unica definizione di oggetti che la gente ottiene nei corsi di software. È un peccato, perché anche programmi banali orientati agli oggetti hanno bisogno di una definizione più ampia di quella.

La seconda e molto più interessante categoria di oggetti consiste in quelli che chiamerò eventi del mondo reale immortalati . Per "immortalato" intendo cose che almeno brevemente esistono come entità ben definite o raccolte nel mondo reale, ma che poi si disperdono e cessano di esistere come raccolte fisicamente significative. Un simposio è un ottimo esempio: il simposio esiste per un breve periodo come una raccolta decentemente ben definita di luoghi e persone. Ma purtroppo, anche le migliori conferenze devono finire e le singole parti che le hanno costituite passano ad altre attività.

Ma utilizzando computer e reti, possiamo far sembrare un simposio così transitorio come un oggetto a lungo termine catturandone e conservandone una memoria come oggetto software. Molte delle cose che facciamo con computer e database equivalgono a questo tipo di immortalizzazione di eventi transitori, in cui in effetti cerchiamo di arricchire il nostro universo reale catturandolo ed estendendolo in modi che non possono esistere fisicamente. Ad esempio, hai visto un vero Pandora ultimamente? Tali acquisizioni ed estensioni di pezzi del mondo reale aiutano ad arricchire ed estendere le nostre vite, economie e scelte in modi straordinari. Questo per me è il cuore della programmazione orientata agli oggetti, il luogo in cui ha avuto e continua ad avere gli impatti più notevoli.

Un'ultima categoria di OOP è costituita da oggetti che non hanno una stretta connessione con eventi esterni, ma sono invece l' infrastrutturanecessario per supportare la nostra continua estensione della realtà usando oggetti immortalati dal mondo reale. È qui che puoi scendere fino al (semi) metallo del computer, creando pezzi di realtà persistente che come gli elementi chimici del mondo reale possono essere combinati rapidamente e in modi interessanti per costruire nuovi mondi interni. Il mobile computing ha contribuito a promuovere la crescita di questo tipo di approccio altamente ricombinatorio, che ancora una volta in molti modi imita le caratteristiche ricombinatorie del mondo fisico. È anche difficile: quella che può sembrare una buona scelta potrebbe rivelarsi nel tempo inaspettatamente cattiva, di solito perché finisce per bloccare la diversità e l'espansione invece di supportarla.

Quest'ultima categoria indica anche i rischi dell'utilizzo di un solo modello per la programmazione, poiché, proprio come nel mondo reale, anche i mondi programmati hanno bisogno di processi che noncorrisponde bene ad oggetti relativamente immutabili. La Terra è piena di oggetti, ma il sole è pieno di flussi di energia altamente dinamici che alla fine sono necessari per "guidare" gli oggetti e le attività sulla terra a energia più bassa. Allo stesso modo, nella creazione di mondi informatici ci sono casi in cui è necessario gestire flussi e trasformazioni e contesti in rapida evoluzione che, sebbene non molto simili agli oggetti in sé, sono comunque assolutamente critici per consentire gli oggetti più semplici e più rispettosi dell'uomo utilizzati a livelli più alti . Non è un caso che gran parte della programmazione fatta a livello di kernel non sia evidentemente simile ad un oggetto, o che tende a fare molto affidamento su linguaggi come C che sono più orientati all'elaborazione. Questi sono i domini più profondi che completano l'affascinante diversità che vediamo più in alto nei mondi generati dal computer.

L'altra area in cui OOP può andare storto si sta concentrando troppo sui vecchi concetti di oggetti.

Gli oggetti nel mondo reale, e in particolare gli oggetti viventi , hanno un livello assolutamente sorprendente di capacità di interagire con i loro ambienti in modi complessi e sottili. Widget componibili che si guardano l'un l'altro, eseguono alcuni controlli di compatibilità e sanità mentale e forse addirittura escogitano alcuni nuovi modi di interagire avvicinandosi molto al concetto biologico di oggetti del mondo reale rispetto ai semplici quadri e ai semplici schemi ereditari che tendiamo concentrarsi (di solito per necessità!) a livello di codice. Questa è una delle aree di crescita degli oggetti nel mondo cibernetico, più approcci "simili agli agenti" in cui la reattività all'ambiente è la norma anche all'interno della programmazione stessa.

E tanto per la mia "critica" di OOP! Tuttavia, spero di aver sottolineato il motivo per cui creare un mondo cibernetico più ricco significa abbracciare la diversità degli stili di programmazione, piuttosto che supporre che "solo uno" sia tutto ciò che serve. La mia sensazione è che le cose davvero interessanti debbano ancora venire, non importa quanto banale di ciò che facciamo ora sia!


18
Sono sicuro che alcune persone hanno abbandonato la parte "Leggi oltre solo se sei interessato a un'esplorazione a livello di fisica". Sono contento di non averlo fatto. Questo è il tipo di pensiero che scuote le basi della nostra comprensione e probabilmente l'unico modo per fare notevoli progressi. Grazie per la piacevole lettura.
Matt Esch,

@Raynos, $ MattEsch, grazie ad entrambi per le vostre gentili parole, e sono contento che l'abbia trovato interessante!
Terry Bollinger,

1
Si è registrato al sito solo per poter votare - questa risposta magnifica e profonda. =)
sgorozco

2
In linea con i tuoi pensieri, sto programmando da un po 'di tempo e sono diventato uno zelante OOP, dal momento che ho davvero visto le mie capacità di programmazione migliorare notevolmente quando l'ho adottato. Comunque l'esperienza mi ha mostrato che forzare ogni cosa a diventare un oggetto può davvero essere dannoso. Ora mi oppongo agli strumenti di mappatura da oggetto a relazione (che confusione) o schemi di serializzazione di oggetti e grafici completi che consumano la larghezza di banda del 1000% rispetto a un semplice protocollo binario che invia semplicemente via cavo la giusta quantità di dati binari necessari a il momento. Grazie per la piacevole lettura.
sgorozco,

2
Questa risposta è anche la risposta al perché abbiamo ancora bisogno di SQL!
HLGEM,

25

In primo luogo, non hai bisogno di OOP per tutto, nonostante qualunque dogma sia stato reso popolare. A differenza di Java, C consente puntatori di funzioni e persino chiusure che aprono la porta alla programmazione funzionale e risolvono un bel po 'dello spazio problematico che gestisce le OOP, perché fornisce i mezzi per l'iniezione delle dipendenze. Anche l' uso cauto delle macro può effettivamente creare alcune cose molto belle, come dimostra lo sglib .

In un modo strano, si potrebbe vedere C come un buon compromesso tra Java e C ++. Nota che non sto dicendo che C sia in qualche modo un mix di entrambi. Ma a differenza di Java, è un linguaggio piuttosto potente mentre a differenza di C ++ ha una complessità gestibile.

È una lingua vecchia, che è diventata affidabile e coerente, pur non diventando sempre più complicata. E a parte questo, ha un gigantesco ecosistema e funziona semplicemente ovunque.


11
La programmazione funzionale è ottima, nessuna obiezione al riguardo. Ma C è un linguaggio piuttosto brutto per la programmazione funzionale. Le chiusure / blocchi sono hack non portatili e hanno una brutta sintassi (così come i gotcha, scommetto). Anche ignorando tutto ciò, devi ancora preoccuparti della gestione della memoria. C è un linguaggio utile, ma come con qualsiasi linguaggio, stai solo rendendo la tua vita più dura di quanto dovrebbe essere se la abusi per usare un paradigma per cui non è stato creato. Puoi anche emulare la programmazione funzionale in Java (vedi Guava ), ma non è neanche bello.

7
È molto difficile programmare in uno stile funzionale senza un Garbage Collector.
Konstantin Solomatov,

@KonstantinSolomatov: Innanzitutto, è molto soggettivo. In secondo luogo, è possibile aggiungere Garbage Collection a C, se necessario.
back2dos,

Se vuoi un compromesso tra Java e C ++, prova Obj-C :) Sicuramente qualcosa che ogni programmatore C / C ++ dovrebbe provare.
Sulthan,

21

C ha un ABI (Application Binary Interface) C ++ no. Ciò rende C più utile di C ++ in alcuni casi. Se ho intenzione di scrivere una libreria ed essere in grado di spedire file binari per l'uso di altre persone, C ++ è lo strumento sbagliato per il lavoro. Se ho intenzione di scrivere librerie che verranno usate di nuovo da qualche altra lingua, C è lo strumento giusto per il lavoro. Non ho mai sentito parlare di un linguaggio che non supportasse FFI (Foreign Function Interface) in C, d'altra parte C ++ non funzionerà con le librerie scritte in C ++ se si usano compilatori diversi.

Fondamentalmente si riduce a C che ricopre un ruolo per il quale C ++ non è adatto.


2
Mmm .. un rotolo di C, pomodoro e formaggio!
DeadMG

3
Bene, C ++ ha un ABI. È solo che C ABI è solido come il rock mentre quello in C ++ cambia troppo spesso. Inoltre un sacco di C ++ sono modelli compilati nell'applicazione di utilizzo, quindi non è possibile aggiornarlo. Quando tutte le funzionalità sono nascoste dietro le chiamate di funzione, è possibile correggere la libreria e far funzionare l'applicazione.
Jan Hudec,

12

Uno dei vantaggi dell'utilizzo di C rispetto a linguaggi come C ++ o Java è che non c'è molta magia che sta accadendo sotto il cofano. Nessun costruttore viene eseguito quando gli oggetti vengono allocati e nessun distruttore viene eseguito quando gli oggetti escono dall'ambito. Non vi è alcun nome che ruba e non sia disponibile. Le prestazioni sono più facili da prevedere; non devi preoccuparti di un bidone della spazzatura che interrompe una routine e butta via i suoi tempi.

I costruttori, i distruttori, la manomissione del nome, i vtables, i garbage collector, ecc., Possono alleviare parte della complessità del codice che crei, ma poi quella complessità diventa parte del linguaggio stesso, dove non hai quasi nessun controllo su di esso . Potresti finire con tempi di costruzione più lunghi (fastidiosi, ma tollerabili), ingombro della memoria di runtime maggiore (può o meno essere tollerabile) o prestazioni più lente. Con C puoi eliminare un po 'di quella complessità fino a quando non ti resta la funzionalità di cui hai bisogno .

Ad esempio, il stringtipo di dati C ++ è anni luce più facile da lavorare rispetto alle stringhe in stile C, ma è un pezzo di codice abbastanza pesante e aggiunge un po 'di peso alle dimensioni dell'immagine. Raramente ho visto qualcuno sfruttare appieno stringle capacità di un programma. Le stringhe in stile C, sebbene più difficili da lavorare, impongono meno di una penalità in termini di tempo di esecuzione e dimensioni dell'immagine, e per un particolare problema possono essere più attraenti per questo motivo.


2
La penalità del tempo di esecuzione è una sciocchezza. Le stringhe C (null terminate) sono molto meno efficienti delle stringhe C ++. Inoltre, una classe di stringhe può essere compatta come C, purché non trascini il tutto std.
Pubby

1
Una toolchain che non rimuove le funzioni inutilizzate in stringcui non vengono utilizzate se si collega staticamente il CRT è una toolchain che non vale la pena salare.
Billy ONeal

10
La cosa sciocca è che lavoro con una biblioteca dove std::stringnon è abbastanza sofisticato . Se sei davvero serio con le stringhe, sia in termini di prestazioni che di capacità, sei tornato a usare C e fare di nuovo tutto da solo, anche se non ne sei char*certo. (Le stringhe sono sorprendentemente complesse, anche se ti aspetti che siano complicate.)
Donal Fellows

1
@DonalFellow Interessante. Questo è esattamente il motivo per cui lo standard C ha sempre rinunciato a cose come stringhe e tabelle di hash, proprio come la loro assenza mi irrita a volte.
Ingegnere

@ArcaneEngineer: il tipo di dati mancanti fondamentale in C è un tipo "slice of T []" che combinerebbe un T * e un size_t, potrebbe essere indicizzato come un array, potrebbe decomporsi in un T * e potrebbe essere implicitamente convertito da qualsiasi tipo T [n] (con le dimensioni fornite automaticamente dal compilatore). Un tale tipo potrebbe consentire il controllo automatico dei limiti in molti casi in cui sarebbe altrimenti impossibile, rendendo molti tipi di codice molto più puliti e più leggibili.
supercat

11

I sistemi e i driver incorporati sono di solito programmati in C. A parte questo ci sono tonnellate di sistemi C legacy là fuori che sono ancora mantenuti ed estesi.


2
Sì, C funziona su tutto. Ed è una lingua abbastanza facile da imparare (rispetto a c ++).
BenjaminB,

10

La stessa cosa che rende popolare un martello manuale in un'epoca di martelli pneumatici (martelli pneumatici): C è ancora lo strumento giusto per alcuni lavori.


6

Semplicità, coerenza e precisione.

È semplice: non è necessario un ambiente di sviluppo complesso, librerie estese o una macchina virtuale.

È coerente: la maggior parte dei C scritti 10 anni fa potrebbe essere compilata oggi.

Precisione: consente di scendere a livello della macchina, conoscendo le posizioni di memoria in base alle esigenze. Questo è ottimo per prestazioni e hardware incorporato.

Non è per tutto, bit è ancora uno strumento utile.


5
Meglio ancora, c'è una buona probabilità che il codice compilato 10 anni fa possa essere eseguito oggi.
Donal Fellows il

@DonalFellows: E, per le applicazioni che usano i plug-in, c'è una buona probabilità che un'applicazione scritta, compilata e rilasciata (in forma eseguibile) oggi sarà in grado di utilizzare plug-in compilati con strumenti di compilazione che non sono nemmeno stati progettato ancora.
supercat

6

Cito due punti da un'altra risposta, perché catturano esattamente i motivi per cui uso ancora C di tanto in tanto (non è la mia lingua principale di scelta, però):

  • C è semplice. Manca l'espressività di sofisticati OOP o linguaggi funzionali, ma la sua semplicità significa che può essere raccolto rapidamente.
  • C è maturo. L'ultimo standard che ha introdotto grandi cambiamenti è il C99, ed è per lo più compatibile con gli standard precedenti. A differenza dei linguaggi più recenti (diciamo, Python), non devi preoccuparti di interrompere i cambiamenti presto.

Penso che questo sia molto vero. Ho imparato il C nei primi anni della notte: era semplice, poche parole chiave e costrutti, la maggior parte del lavoro svolto dalle biblioteche. Quindi non ho usato C per alcuni anni. Intorno al 2002 avevo bisogno di un'implementazione rapida di un algoritmo, ho installato un compilatore C e l'ho implementato. Conosco la lingua, so a cosa serve, a cosa non serve ( non implementerei mai un'applicazione web in C!), Ed è lì solo quando ne ho bisogno. Niente sorprese.

Con C ++ ho avuto un'esperienza diversa. L'ho imparato intorno al 1995 e ha significato un grande cambio di paradigma da imperativo a OOP. Grande! L'ho usato per diversi progetti fino al 1999. Per alcuni anni non ho usato il C ++ e quando l'ho ripreso (2008) ho trovato molte nuove funzionalità già nella lingua e ancora più pianificate (nel frattempo introdotte in C ++ 11). Ho la sensazione di dover imparare di nuovo la lingua.

Come sviluppatore preferisco lingue mature e stabili. Mi piace imparare una lingua una volta, capire i suoi principi di progettazione, a cosa serve e usarla quando penso che sia lo strumento giusto per il lavoro. Mi piace anche imparare lingue diverse e scegliere la lingua che soddisfa le mie necessità (C, C ++, Java, Scala, Haskell e così via). Quello che non mi piace è imparare la stessa lingua ancora e ancora perché si sviluppa sempre di più e non raggiunge mai la maturità.

IMHO, un linguaggio di programmazione dovrebbe avere un design chiaro, coerente e stabile. Mi piace l'approccio di designer come Niklaus Wirth: ogni volta che sentiva il bisogno di un linguaggio diverso, ne progettava uno nuovo (Pascal, Modula-2, Modula-3, Oberon). Non mi piacciono le lingue che subiscono importanti cambiamenti ogni 5-10 anni: sono come obiettivi in ​​movimento e non penso mai che valga la pena investire il mio tempo per impararli in profondità, perché la versione che sto imparando ora sarà probabilmente obsoleta in pochi anni comunque.

In questo senso C è un vincitore dell'IMO: è buono per alcune applicazioni e meno appropriato per altre, ma ha il vantaggio di essere semplice e relativamente stabile.


4

Sono sorpreso che nessuno abbia ancora menzionato Worse Is Better . A questo punto ha più di 20 anni, ma vale comunque la pena di leggerlo. Mentre a volte leggermente ironico, fa un ottimo lavoro nel delineare come e perché l'espediente spesso vince sull'ideale, usando C (contrapposto a LISP) come uno dei suoi esempi centrali.


Cose che ho inserito nella categoria "peggio ma meglio": inglese, PHP, Windows. .. Forse McDonald. Anche se invidio / preferisco la cucina spagnola, Python, Linux e francese artigianale; il più possibile, se non comunemente possibile.
ThorSummoner,

1

Probabilmente volevi chiederti perché le persone usano C invece di C ++ nonostante il fatto che quando hai un compilatore C, di solito hai anche un compilatore C ++.

  • Il linguaggio C è molto più semplice di C ++. Non conosco alcuna azienda che utilizza lo standard C ++ completo nella sua convenzione di codifica. Dai un'occhiata allo stile del codice C ++ di Google come esempio: http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml
  • C è molto più veloce da compilare. Grazie alla mancanza di costrutti difficili da compilare.

Questo link è interrotto.
ar2015,

0

Niente. TIOBE è un indice senza valore. Se davvero osservi la loro misurazione, è un'ipotesi assoluta, nella migliore delle ipotesi.


10
Il fatto che TIOBE sia inutile non significa che C non sia popolare
Raynos il

Sicuramente, tuttavia, sconfigge l'argomento presentato nell'OP, secondo cui C è popolare e quindi deve essere utile.
DeadMG

2
Una misura migliore della popolarità di C è che quasi ogni piattaforma ha un compilatore C
Raynos

@Raynos: non è affatto una misura. L'unica cosa che significa è che è facile da implementare. Non dice nulla su quante persone lo usano o sul perché.
DeadMG

2
Non del tutto, accetto felicemente punti di vista opposti. La tua risposta a una riga sembra avere poco pensiero applicato e tu sei polemico e non costruttivo con le tue risposte.
Mattnz,

0

Un sacco di software legacy

Molte aziende non possono cambiare, immediatamente tutto il loro codice in C ++ o simili.

Molte aziende non possono permettersi di modificare il proprio codice.

Molte aziende possono permettersi di modificare il proprio codice, ma non se ne curano o sono "economiche".

Molte aziende stanno migrando, ma non sono ancora finite.

Orientamento agli oggetti nascosti

Codice sorgente C (non orientato agli oggetti) progettato come codice sorgente C orientato agli oggetti, applicazioni modellate con Orientamento agli oggetti e codificate con "C pura" o strumenti che traducono da "C ++" o altri programmi OO. ha parlato in C.

Ho sentito che alcuni videogiochi sono fatti in questo modo. Alcuni strumenti anche multipiattaforma e la libreria di interfaccia visiva GTK (GObject, GLibrary) per le distribuzioni del sistema operativo GNome Linux.


3
L'ultima metà di questa risposta deve essere deobfuscata.
Aramis,

@aramis. La seconda parte significa: Molti codici sembrano essere direttamente in "C", ma, in realtà in un'altra lingua, e tradotti in "C"
umlcat

0

Vedo alcuni dei rispondenti sul perché C è il più popolare, è in circolazione da molto tempo, è disponibile nella maggior parte delle piattaforme, gratuito, ecc.

Lo stesso si può dire di altre lingue, ad esempio Pascal gratuito: è gratuito e supportato per quasi tutte le piattaforme.

Pascal è stato inventato intorno al 1970, C è stato inventato intorno al 1972, quindi penso che Pascal sia in circolazione da quando C.

Personalmente penso che C sia il linguaggio più popolare perché c'è solo più codice open source disponibile per essere riutilizzato da chiunque. E sì, è di livello inferiore rispetto a Pascal, quindi si sta avvicinando all'assemblaggio ma è molto più leggibile dell'assemblaggio.

Penso che ci siano troppi linguaggi di programmazione là fuori. Come programmatori dobbiamo conoscere la maggior parte di quelli importanti, ma alla fine non dovrebbe esserne necessario. Un linguaggio di programmazione può essere implementato per fare tutto dalla costruzione di siti Web ai giochi per computer iOS.

C sembra essere quel linguaggio globale, ma vorrei che fosse qualcosa come Object Pascal. Perché Object Pascal, è un linguaggio di programmazione più leggibile, il codice OOP tende ad essere più riutilizzabile e meno soggetto a bug (secondo me) di C.

Le applicazioni molto grandi sono più facili da gestire con Object Pascal rispetto a C / C ++.

Come avere un linguaggio di programmazione che è stato un po 'dagli anni '70, e non amare i linguaggi che cambiano ogni 5 o 10 anni. Col passare del tempo i progressi della tecnologia e i metodi di programmazione sono migliorati. Se una lingua cambia drasticamente ogni pochi anni, probabilmente non è stata ben pensata dal suo designer. Ma dal 1970 al 2012 è quasi mezzo secolo, va bene apportare modifiche a una lingua in quel momento per incorporare i progressi utilizzati nello sviluppo del software.

C stesso è stato rivisto più volte. Quindi, non è meglio di altre lingue da quel punto di vista.


3
Un problema con Pascal è che la versione "ufficiale" della lingua ha tralasciato alcune funzionalità molto necessarie. Per un bel po ', sia il PC che il Macintosh hanno avuto compilatori Pascal che erano molto più utilizzabili rispetto a qualsiasi compilatore C esistente all'epoca, ma tali compilatori hanno aggiunto estensioni di linguaggio che non erano supportate da alcuno standard "ufficiale". Penso che se ci fosse stato uno sforzo per creare uno standard ufficiale che codificasse tali estensioni, Pascal avrebbe potuto sostituire quell'hack di un linguaggio che è noto come "C".
supercat

0

Perché C ha una base di utenti enorme. Sì, è un po 'un catch-22, ma quando faccio una domanda su C su StackOverflow, ottengo la risposta quasi istantaneamente. La stessa domanda su Python potrebbe richiedere ore per ricevere risposta.

Rispetto al C ++, l'IMO è più complicato da imparare. Inoltre, dopo aver provato OOP per 10 anni, trovo che non sia sempre utile, e spesso invece è più semplice utilizzare la programmazione procedurale.


hai confrontato facendo domande SO per C # o Java?
moscerino

@gnat era un esempio isolato di C v Python (che tra l'altro ha posto più domande!). Non ho esperienza con C # (hai notato che non sto facendo domande SO per C # o jav?)
puk

Heh, trovo che la community #python su StackOverflow sia quasi sempre super veloce. Anche se sarei sorpreso se la comunità C superasse la comunità javascript per la velocità delle risposte. (Principalmente a causa del volume)
ThorSummoner,
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.