Perché non esiste una lingua più veloce, "migliore" di C? [chiuso]

144

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 solo un modo corretto di fare le cose, e C è in circolazione da molto tempo (dagli anni '60!). Non abbiamo davvero niente di meglio di qualcosa scritto quasi 50 anni fa?

Sono consapevole del fatto che le lingue moderne 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 c'è mai stata una vera seconda opzione per C.

Può essere che C sia così perfetto che nessun altro modo di operare su un computer potrebbe essere possibile (l'adozione da parte dello sviluppatore a parte)?

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

    
posta Jason 08.12.2009 - 07:14
fonte

6 risposte

163

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

È difficile battere un linguaggio veramente 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 ++. Il C ++ può essere veloce come C. Il fatto è che il C ++ è un linguaggio molto più complesso, il che significa che sicuramente aumenta la produttività; finché le persone sanno come usarlo. C ++ e C sono non quasi la stessa lingua più.

Ora, D era un altro passo avanti. Stessa capacità per il codice veloce, la garbage collection opzionale, ecc., Ma non ha mai preso piede. Speriamo che cambi, perché elimina ciò che affligge C ++: compatibilità con le versioni precedenti 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 alla semplicità, il C ++ è probabilmente il migliore che potremmo fare, anche se l'opinione varia molto di più. Infine, in termini di linguaggio perfezionato e ripulito, con la velocità e la semplicità di C, D vince questo contesto.

    
risposta data 08.12.2009 - 07:21
fonte
63

Ci sono più veloci dei linguaggi C.

Ci sono linguaggi più veloci di C. Ad esempio, Fortran come già detto sta andando molto bene perché ha regole di linguaggio di aliasing molto più ristrette.

Ci sono anche assembly sperimentali come linguaggi che attaccano C sul fronte in cui viene usato come linguaggio di alto livello per la creazione di compilatori di esempio. Hai mai sentito parlare di C-- o di Giano? Ma quei due sono stati uccisi dal progetto LLVM.

Scommetterei che l'APL o altri linguaggi matematici soffieranno C fuori dall'acqua in quei domini di applicazioni speciali, dato che hanno creato supporto per le unità di elaborazione Vector. Questo è qualcosa che non è possibile per C (e ragazzi: NO! Le librerie ottimizzate speciali con collegamento C non hanno nulla a che fare con C come linguaggio).

Anche i produttori di CPU hanno rimosso tutto ciò che aiuta gli scrittori di compilatori in altre lingue - ricorda i codici di assembler aritmetici con tag per rendere l'implementazione di LISP su SPARC veloce? Andato con il vento.

E se si passa 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 globale del sistema che lo rende più veloce di C nello sviluppo di applicazioni nel mondo reale.

In questo dominio anche una semplice astrazione errata o di basso livello può uccidere l'intera performance linguistica. Poiché 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 della libreria "qsort" che può essere scritta più velocemente con i generici (dove viene eliminata la chiamata alla funzione per i confronti chiave).

Basta confrontare una chiamata qsort su un array di megabyte di interi con una buona implementazione scritta a mano che utilizza l'accesso agli array e il builtin '<' operatore.

    
risposta data 08.12.2009 - 08:50
fonte
35

Buona domanda. Penso che le lingue abbiano successo trovando una nicchia. È importante notare che ci sono molte nuove lingue che sono migliori di C nelle loro nicchie.

  • C una volta era ampiamente usato come linguaggio applicativo e in quel dominio ha costantemente perso terreno in C ++, Java e recentemente in tutti i tipi di altri linguaggi (in particolare i linguaggi dinamici).

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

  • C è stato utilizzato per il calcolo scientifico, ma affronta la concorrenza di linguaggi specifici del dominio come Matlab e Mathematica, oltre a librerie come SciPy . Un sacco di persone che scrivono codice in questa nicchia non sono programmatori di mestiere e C non è particolarmente adatto per loro.

Ma la nicchia di C è il codice di sistema. Kernel del sistema operativo. Driver. Librerie run-time. È così stabilito in quello spazio che perfino il C ++ lo sposta piuttosto lentamente.

C ha vinto negli anni '70 a causa di UNIX, perché le lingue in competizione erano troppo restrittive o troppo lente, e perché il codice C era considerato ragionevolmente portatile (bugie, anche allora). Ma i suoi maggiori vantaggi oggi non sono collegati, e derivano principalmente da decenni di dominare la sua nicchia. Esistono buoni strumenti per C: ottimizzazione di compilatori, debugger del kernel, analisi statiche efficaci per trovare errori nel codice del driver, ecc. Quasi tutte le principali piattaforme definiscono una C ABI, e spesso è la lingua franca per le biblioteche. 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 comunque estremamente difficile per qualsiasi nuovo arrivato competere.

    
risposta data 08.12.2009 - 09:13
fonte
24

Parafrasando un ottimo commento: Non ci sono molti modi per rendere una lingua 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 in?

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

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

    
risposta data 08.12.2009 - 08:15
fonte
21

Fortran è più veloce di C per compiti numerici a causa del modo in cui gestisce i riferimenti di memoria (i puntatori C sono più difficili da ottimizzare). Le librerie dei pesi massimi alla base di cose come Matlab e Numpy sono ancora scritte in Fortran.

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

    
risposta data 08.12.2009 - 07:17
fonte
16

Che diamine, interverò con il mio $ 0.02.

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

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

Dal punto di vista di un programmatore, tuttavia, C non è così semplice. La velocità e la potenza arrivano al prezzo della gestione manuale della memoria e non tanto supporto OOP integrato nella lingua. Il C ++ (non la mia lingua preferita) è 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 è un nuovo arrivato in Objective-C, per esempio). Ma dal momento che il mondo informatico come molti di noi sanno che è stato scritto in C, è difficile per le lingue più nuove, più complicate ma "più facili" ottenere un'adozione diffusa.

In alcuni casi, specialmente quando lo "standard" corrente è "abbastanza buono" come C, semplicemente non c'è un incentivo per qualcosa di "migliore" (C ++, Objective-C, D ecc.) per ottenere la trazione , quando c'è ancora abbastanza incentivo per creare qualcosa di "migliore".

    
risposta data 08.12.2009 - 10:29
fonte

Leggi altre domande sui tag