Perché non è uscito un linguaggio "migliore" più veloce di C? [chiuso]


147

Con tutte le nuove lingue "moderne" oggi, come mai C è ancora annunciato come il più veloce e "il più vicino alla macchina"? Non credo davvero che ci sia mai un solo modo corretto di fare le cose, e C è in circolazione da molto tempo (dagli anni '60!). Non abbiamo davvero trovato qualcosa di meglio di qualcosa di scritto quasi 50 anni fa?

Sono consapevole che i linguaggi moderni sono di livello superiore e si occupano di determinati compiti come la garbage collection e l'allocazione della memoria e utilizzano librerie e simili. Sto solo chiedendo perché non ci sia mai stata una vera seconda opzione per C.

Può essere che C sia così perfetto che nessun altro modo di far funzionare un computer sarebbe possibile (adozione da parte dello sviluppatore)?

EDIT Guarda, non sto cercando di battere C o qualunque sia la tua lingua preferita. Mi chiedo perché C sia diventato lo standard e perché non siano mai emerse altre alternative e C sia stato semplicemente "accettato".


44
Il C ++ è altrettanto veloce e molto più produttivo da scrivere. <3
GManNickG

6
ehm, non ti stai dimenticando di c ++?

23
Direi che il montaggio è il più veloce e "il più vicino" alla macchina.

27
perché tutti i movimenti per chiudere? sono davvero curioso ... non sto provando ad avviare guerre di fiamma o altro
Jason

15
chiuso di nuovo? dopo essere stato riaperto dallo stesso Jeff Atwood? perché vorresti forse chiudere questo?
Jason,

Risposte:


164

C è un linguaggio molto semplice ed è per questo che, insieme alla sua longevità, è veloce e ottimizzato. È anche straordinariamente ampiamente supportato, per quanto riguarda ambienti embedded, microprocessori, ecc.

È difficile battere un linguaggio davvero semplice e veloce. L'unica cosa da migliorare su un linguaggio del genere è l'usabilità: ridurre il tempo necessario per creare un codice generico simile e semplificare la modellazione con le astrazioni.

È qui che entra in gioco C ++. C ++ può essere veloce quanto C. Il fatto è che C ++ è un linguaggio molto più complesso, il che significa che aumenta decisamente la produttività; fintanto che le persone sanno come usarlo. C ++ e C non sono più quasi la stessa lingua.

Ora, D è stato un altro passo avanti. Stessa capacità per codice veloce, raccolta dei rifiuti opzionale, ecc., Ma non ha mai funzionato. Speriamo che cambi, perché fa cadere ciò che affligge C ++: retrocompatibilità con C.

Quindi, per rispondere alla tua domanda, "meglio" è una cosa difficile da giudicare. In termini di semplicità e velocità, C è probabilmente vicino al meglio che potremmo fare. In termini di produttività rispetto a semplicità, C ++ è probabilmente il migliore che potremmo fare, anche se tale opinione varia molto di più. Infine, in termini di linguaggio incarnato e pulito, con la velocità e la semplicità di C, D vince questo contesto.


31
Con "Semplice" intendi "semplice da un compilatore POV, non dal programmatore POV". C è semplice perché fondamentalmente si assembla con istruzioni ed espressioni. Non è semplice il modo in cui Python è semplice.
Marius,

15
Ma per chiarire, semplice per il compilatore vuol dire semplice da raccogliere. Forse non è semplice implementare idee complicate.
GManNickG

16
Per quello che vale, OCaml produce un codice nativo altamente ottimizzato con la stessa velocità di C e C ++, e il codice stesso è conciso come Python. Con un po 'di smalto, penso che OCaml potrebbe abbinare o battere C come lingua preferita quando è necessario scrivere codice per la massima velocità e il minimo ingombro di memoria. Anche Objective-C fa un ottimo lavoro, sebbene non sia sempre veloce come C, ottiene l'intera cosa "C con oggetti" proprio come C ++ non potrebbe e non potrà mai fare.
Juliet

2
D'accordo con @ Thorbjørn, la retrocompatibilità con C è il motivo per cui C ++ ha preso piede e D no. Se siamo disposti a rinunciarci, non c'è motivo di accontentarsi del miglioramento incrementale che è D. Potremmo cercare lingue molto migliori che sono completamente fuori dalla famiglia C. Come dice @Juliet, OCaml potrebbe essere un concorrente praticabile dal punto di vista delle prestazioni. Ma anche un certo numero di altre lingue, se gli autori di compilatori avessero trascorso tanto tempo su di loro quanto su C o C ++. Comunque, buona risposta, e +1 da parte mia.
jalf

5
@Ferruccio: Sì, ma ogni lingua può collegarsi alle librerie C. Quindi, se siamo disposti ad accontentarci di questo, invece della reale compatibilità del codice sorgente, come offre C ++ (più o meno), allora potremmo anche scegliere un linguaggio completamente diverso, diciamo, Haskell o Python. Il motivo per cui C ++ è stato scoperto non era che potesse collegarsi alle librerie C. Era in grado di compilare il codice C.
jalf

64

Ci sono più veloci delle lingue C.

Esistono lingue più veloci di C. Ad esempio Fortran, come già accennato, sta andando molto bene perché ha regole di lingua di aliasing molto più limitate.

Esistono anche assemblaggi sperimentali come i linguaggi che stanno attaccando C sul fronte dove viene utilizzato come linguaggio di assemblaggio di alto livello, ad esempio la creazione di compilatori. Hai mai sentito parlare di C-- o Janus? Ma quei due sono stati uccisi dal progetto LLVM.

Scommetto che APL o altri linguaggi matematici faranno esplodere C dall'acqua in domini applicativi speciali in quanto hanno supportato le unità di elaborazione Vector. Questo è qualcosa che non è possibile per C (e ragazzi: NO! Le speciali librerie ottimizzate con collegamento C non hanno nulla a che fare con C come linguaggio).

Inoltre i produttori di CPU hanno rimosso tutto ciò che aiutava gli autori di compilatori in altre lingue: ricordi i codici assemblati aritmetici contrassegnati per rendere veloce l'implementazione di LISP su SPARC? Via col vento.

E se passi dai micro benchmark allo sviluppo di applicazioni, allora ci sono linguaggi più veloci per lo sviluppo di applicazioni. Il mio esempio personale qui è sempre SmartEiffel. Si rivolge a C ma utilizza l'ottimizzazione del sistema globale che lo rende più veloce di C nello sviluppo di applicazioni nel mondo reale.

In questo dominio anche semplici astrazioni errate o di basso livello possono uccidere l'intero linguaggio. Perché C non offre astrazioni elevate la maggior parte delle persone afferma che si tratta di un problema di programmazione ma non lo è. Ad esempio, guarda la mancanza di generici. In C finirai con implementazioni lente come la funzione di libreria "qsort" che può essere scritta molto più velocemente con generici (dove viene eliminata la chiamata di funzione per i confronti dei tasti).

Basta confrontare una chiamata qsort su un array di megabyte di ints con un'implementazione scritta di buona mano che utilizza l'accesso all'array e l'operatore incorporato '<'.


9
Ottimo commento È importante rendersi conto che alcuni aspetti delle specifiche del linguaggio C (come le regole di aliasing del puntatore) rendono impossibile generare un codice macchina davvero ottimale. Essendo un assemblatore di alto livello, C non è "il più veloce", ma semplicemente "piuttosto veloce".

1
Grazie, ho dimenticato di menzionare l'impossibilità di restituire più valori di risultato. Un altro aspetto di basso livello che mi manca molto quando lo uso come assemblatore di alto livello.

5
La C moderna, correttamente scritta, può codificare gli stessi presupposti di aliasing di qualsiasi altra lingua, consentendo al compilatore di effettuare le stesse ottimizzazioni. È una caratteristica importante della lingua che consente anche al programmatore di non assumere quei requisiti quando non sono applicabili. I tuoi altri punti sono esatti, quindi +1.
Stephen Canon,

1
@Rascher: Proprio così e lì vedi l'influenza di C sui progettisti della CPU che specifica sempre un ABI CPU. E i valori di ritorno multipli sono qualcosa che non ci viene in mente anche se il numero di registri non sarebbe un problema (SPARC, PowerPC, Itanium)

13
Alias ​​puntatore in C è stato trattato restrictin C99 (10 anni fa!).

35

Buona domanda. Penso che le lingue riescano a trovare una nicchia. È importante notare che ci sono molte nuove lingue che sono migliori di C nelle loro nicchie.

  • Una volta C era ampiamente usato come linguaggio applicativo, e in quel dominio ha costantemente perso terreno rispetto a C ++, Java e recentemente ogni sorta di altre lingue (in particolare le lingue dinamiche).

  • C era una lingua per scrivere il codice del server. Il Web ha spinto una straordinaria varietà di linguaggi in quello spazio - Perl, Java, Python, VBScript, VB.NET, Ruby, C # - e i casi in cui C ha qualsiasi tipo di senso per il codice del server ora sono pochi e lontani tra loro.

  • C è stato utilizzato per l'elaborazione scientifica, ma deve affrontare la concorrenza di linguaggi specifici di dominio come Matlab e Mathematica, nonché di biblioteche come SciPy . Molte persone che scrivono codice in questa nicchia non sono programmatori commerciali e C non è adatto a loro.

Ma la nicchia di C è il codice di sistema. Kernel del sistema operativo. Autisti. Librerie di runtime. È così stabilito in quello spazio che persino C ++ lo sta spostando piuttosto lentamente.

C ha vinto negli anni '70 a causa di UNIX, perché i linguaggi concorrenti erano o troppo restrittivi o troppo lenti e perché il codice C era considerato ragionevolmente portatile (bugie, anche allora). Ma i suoi maggiori vantaggi oggi non sono correlati e derivano principalmente da decenni di dominazione della sua nicchia. Ci sono buoni strumenti per C: ottimizzazione di compilatori, debugger del kernel, analisi statiche efficaci per trovare bug nel codice del driver, ecc. Quasi tutte le principali piattaforme definiscono un ABI C, e spesso è la lingua franca per le librerie. C'è un pool di programmatori che sanno come codificare C e che sanno quali sono i problemi e le insidie ​​di C.

A lungo termine, questa nicchia non sta andando via; e C ha alcuni problemi. Ma sarebbe ancora estremamente difficile per qualsiasi nuovo arrivato competere.


9
C è ancora ampiamente usato per il codice del server. Non c'è solo il Web, la maggior parte dei server DNS, e-mail, ecc. Sono scritti in C. Anche per il Web, Apache è in C.

@bortzmeyer: Apache è piuttosto vecchio però. Non sto dicendo che non sia utile o sia stato sostituito, è stato creato solo quando lo era C e non c'erano molte buone alternative.
Macke,

1
Sono curioso di sapere perché consideri la C "non molto adatta" al calcolo scientifico. Python è certamente più piacevole su cui lavorare, ma ho trovato C come una solida alternativa quando è necessario un codice più veloce e molte delle possibili alternative (C ++) non apportano un enorme quantitativo in più alla tabella, a differenza di altri aspetti della programmazione .
Fomite,

1
Oltre a ciò, la quantità di cose in SciPy / NumPy ecc. Che è scritto in C rende già utile sapere.
Fomite,

1
@EpiGrad Forse C è una solida alternativa per te. Ma C ha una curva di apprendimento super ripida, specialmente per le persone che non hanno un background nella programmazione. In particolare, a volte si arresta in modo anomalo e se non sei un programmatore hai poche speranze di capirlo. Mathematica semplifica la scrittura di un numero enorme di cose e si finisce con meno codice per fattore di centinaia. E non si blocca.
Jason Orendorff,

25

Parafrasando un ottimo commento: non ci sono molti modi diversi per rendere un linguaggio veloce e "vicino alla macchina" - C ha fatto bene, e non c'è quasi spazio per migliorarlo.

Risposta originale:

Veloce da eseguire o veloce da scrivere?

Le lingue non sono veloci o lente da eseguire, implementazioni specifiche lo sono. Un languge può essere considerato più veloce di altri solo quando in qualche modo è più facile avere implementazioni veloci . Invariabilmente, ciò significa "vicino alla macchina". Ma con le macchine che diventano sempre più esponenziali, questo è diventato progressivamente meno interessante nel tempo. Invece, la facilità e la velocità di sviluppo e portabilità sono diventate molto più importanti, quindi "meglio" è diventato "lontano dalla macchina" . Praticamente tutti gli sforzi nella progettazione del linguaggio sono andati in quella direzione negli ultimi 5 decenni.

Quindi eccoti: più vicino alla macchina e esistono linguaggi più veloci di C; sono quelli che sono venuti prima di C : Assembler, Fortran. Probabilmente alcuni dimenticati.


@michael - ma c'è ancora un mercato per la programmazione super-snella e super-veloce, specialmente con l'assalto di tutti questi dispositivi mobili ... perché C è ancora l'opzione migliore per alcuni di questi dispositivi, cioè perché non c'è un altro linguaggio di quel livello, come .NET-vs-Python-esque?
Jason,

5
Lisp. Sonnecchiante ma non dimenticato! :)

2
@Jason: La domanda è: di quanti assemblatori portatili hai bisogno? C è ben noto ed è molto difficile scrivere una lingua con un'implementazione più veloce, quindi perché preoccuparsi? In parole povere, non c'è nessun requisito, nessun mercato, nessuna motivazione.

4
@ Michele, mi scuso per aver commentato la tua risposta. La ragione per cui c'è di più nel terreno di python / ruby ​​/ java ecc è che quando smetti di provare la lingua più efficiente possibile ottieni molte più opzioni su quali caratteristiche dare la priorità e ogni approccio può produrre una nuova lingua. Esistono molti meno modi per scrivere la lingua più veloce possibile.

1
-1 per "e non c'è quasi spazio per migliorarlo" - c'è molto spazio per migliorare su C / C ++ senza influire sulle prestazioni.
BlueRaja - Danny Pflughoeft

21

Fortran è più veloce di C per le attività numeriche a causa del modo in cui gestisce i riferimenti di memoria (i puntatori C sono più difficili da ottimizzare). Le pesanti librerie numeriche alla base di cose come Matlab e Numpy sono ancora scritte in Fortran.

D'altra parte, C ++ può essere veloce quanto C, ma ha molte altre funzionalità di programmazione avanzate. È un linguaggio molto più recente, dalla metà degli anni '80.


1
E C ++ è ancora in fase di aggiornamento.
GManNickG,

5
@GMan: così è C.


3
Correggimi se sbaglio, ma un restrictpuntatore C99 non avrebbe la stessa semantica di aliasing di Fortran? E cos'altro c'è che fa la differenza?

9
Penso che l'idea che Fortran sia più veloce di C sia in qualche modo un mito, a seconda di ciò che viene codificato e di chi lo sta facendo. Il motivo per cui le librerie numeriche pesanti sono in Fortran non è perché Fortran è più veloce, ma perché le routine sono state originariamente codificate in Fortran e poche persone hanno il coraggio o hanno bisogno di riscriverle. Il piccolo numero di matematici che scrivono e controllano questi algoritmi sono felici in Fortran e non vedono la necessità di cambiare, soprattutto perché immaginano che Fortran sia più veloce.
Mike Dunlavey,

16

Che diamine, entrerò con i miei $ 0,02.

In molti casi esiste una differenza reale o percepita tra le lingue dei "sistemi" e le lingue di livello superiore. Ignorerò la maggior parte delle lingue di "livello superiore", dal momento che nessuno (almeno non molti) sosterrà che per molte attività, lingue come Python, Ruby, ecc. Sono più semplici da utilizzare.

C è stato progettato per essere un linguaggio di sistema, nel senso che è stato progettato come il linguaggio in cui è stato scritto il sistema operativo Unix. Come tale, è stato progettato per essere semplice, potente e veloce. Un linguaggio semplice guadagna potere grazie al fatto che i programmatori non di sistema spesso considerano pericolosi: puntatori, gestione manuale della memoria, ecc. Come già accennato, C è abbastanza semplice. K&R è di gran lunga il libro più piccolo sul mio scaffale di programmazione (senza contare i riferimenti tascabili di O'Reilly) ed è solo leggermente "più grande" del mio riferimento tascabile di Ruby. C è abbastanza potente. Se hai bisogno di parlare con l'hardware, controlla manualmente e modifica la memoria, ecc. C ha la capacità.

Dal punto di vista di un programmatore, tuttavia, C non è così semplice. La velocità e la potenza sono al prezzo della gestione manuale della memoria e non molto supporto OOP integrato nella lingua. Il C ++ (non il mio linguaggio preferito) è molto più semplice dal punto di vista di un programmatore, ma molto meno semplice dal punto di vista di un compilatore. Objective-C (forse la mia lingua preferita) ha lo stesso compromesso, con una leggera inclinazione nella direzione di mantenere la lingua semplice (la garbage collection è una novità di Objective-C, per esempio). Ma poiché il mondo dell'informatica come molti di noi sanno che è stato scritto in C, è difficile per l'adozione di linguaggi più recenti, più complicati ma "più facili".

In alcuni casi, specialmente quando l'attuale "standard" è "abbastanza buono" come lo è C, semplicemente non c'è molto incentivo per qualcosa di "migliore" (C ++, Objective-C, D ecc.) Per ottenere trazione, quando c'è è persino un incentivo sufficiente per creare qualcosa di "migliore".

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.