it-swarm.it

Non conosco C. E perché dovrei impararlo?

Il mio primo linguaggio di programmazione era PHP ( gasp ). Dopo di che ho iniziato a lavorare con JavaScript: di recente ho lavorato in C #.

Non ho mai visto lingue di livello medio o basso come C.

Il consenso generale nella comunità di programmazione in generale è che "un programmatore che non ha imparato qualcosa come C, francamente, non può gestire concetti di programmazione come puntatori, tipi di dati, passaggio di valori per riferimento, ecc."

Non sono d'accordo. Io sostengo che:

  1. Poiché le lingue di alto livello sono facilmente accessibili, più "non programmatori" si tuffano e fanno casino
  2. Per fare davvero qualsiasi cosa in un linguaggio di alto livello, è necessario comprendere gli stessi concetti simili che evangelizzano la maggior parte dei sostenitori di "impara-basso livello-prima".

Alcune persone hanno bisogno di conoscere C; quelle persone hanno lavori che richiedono loro di scrivere un codice da basso a medio livello. Sono sicuro che C sia fantastico, e sono sicuro che ci sono alcuni programmatori cattivi che conoscono C.

Perché il pregiudizio? Come programmatore bravo, onesto e affamato, se dovessi imparare la C (per qualche motivo imprevisto), imparerei C. Considerando la moltitudine di lingue là fuori, i bravi programmatori non dovrebbero concentrarsi sull'apprendimento di ciò che ci fa avanzare? Non dovremmo imparare ciò che ci interessa? Non dovremmo utilizzare il nostro tempo finito spostandoci in avanti ? Perché alcuni programmatori non sono d'accordo con questo?

Credo che la ricerca dell'eccellenza in ciò che fai sia il tratto deterministico fondamentale tra buoni programmatori e cattivi.

Qualcuno ha qualche esempio nel mondo reale di come qualcosa scritto in un linguaggio di alto livello, ad esempio Java, Pascal, PHP o JavaScript, abbia davvero beneficiato di una precedente conoscenza di C? Gli esempi sarebbero più apprezzati.

58
Stephen

Il vantaggio di sapere C è che hai un'ottima idea di come funziona un computer. Non solo come funziona il tuo modello di programmazione, ma come è disposta la memoria e simili.

L'unico livello sotto C è l'Assemblea parlata da una CPU particolare.

(Aggiungo che la conoscenza di C ti consente anche di apprezzare quanto meno lavoro devi fare in una lingua di livello superiore. E si spera un apprezzamento del costo coinvolto nel lavorare in quella lingua di livello superiore.)

113
Frank Shearar

Non credo che nessuna delle risposte qui sia proprio ciò che l'OP stava cercando, quindi darò la mia opinione.

Senti, sono uno snob C non dispiaciuto. Il mio atteggiamento è che se non conosci C, in una certa misura non davvero sai cosa stai facendo come programmatore. Quindi, penso di essere il tipo di persona "di parte" di cui stai parlando qui.

Tuttavia, in pratica, indipendentemente dal fatto che tu davvero sappia cosa stai facendo come programmatore, non necessariamente ti impedisce di sviluppare software davvero fantastico e utile utilizzando strumenti di alto livello. Voglio dire, il creatore di Stack Overflow, Jeff Atwood, a quanto pare non conosce nemmeno C, e tuttavia direi che Stack Overflow è un'applicazione dannatamente buona.

Il fatto che tu decida o meno di imparare C (o C++ o Assembly) dipende dal tipo di programmatore che desideri essere. Se vuoi solo sviluppare fantastiche app Web o app aziendali, va bene - non c'è davvero bisogno di imparare C. Ma se vuoi davvero Excel in quello che fai - se vuoi lavorare davvero - cool progetti che spingono lo stato dell'arte, quindi devi davvero prenderti abbastanza seriamente come programmatore per davvero capire come funzionano i computer. Poiché C è essenzialmente la lingua franca del sistema operativo, così come il linguaggio che alimenta praticamente tutto il resto (dal kernel Linux alla maggior parte Java VM, al Python = e Ruby, database SQL, server Web e quasi tutti i driver di dispositivo), una comprensione intima della lingua fa molta strada.

Per non parlare del fatto che conoscere C (o C++) offre un'enorme opportunità per contribuire a grandi progetti open source che incidono su milioni (o centinaia di milioni) di persone. Vuoi lavorare per migliorare Python o il browser Chromium? Bene, devi conoscere C per il primo e C++ per il secondo.

Ecco perché confrontare C con linguaggi naturali morti come il latino o tecnologie obsolete come il cavallo e la carrozza è completamente sbagliato. Una gran parte della nostra infrastruttura software del 21 ° secolo è alimentata dal codice C, motivo per cui C rimane oggi rilevante come non mai.

Quindi, se dovresti imparare o meno C dipende davvero da cosa vuoi dalla tua carriera di programmatore.

72
Charles Salvia

Una pratica regola pratica è che devi capire almeno un livello di astrazione al di sotto di quello in cui lavori abitualmente. Considera che il tuo interprete PHP o JavaScript potrebbe essere effettivamente implementato in C o C++. Alla fine colpirai un bug nell'interprete o anche un errore di runtime C. Se non capisci C, ti limiterai a inviare una segnalazione di bug al manutentore, sperando che possano riprodurlo e preoccuparsene, e poi agitando i pollici. Se conosci C puoi dire esattamente dove si trova il problema e qual è.

Questo significa anche che se lavori in C/C++ dovresti almeno essere in grado di leggere Assembly sulla tua piattaforma.

Per quanto riguarda l'apprendimento di C quando ne hai bisogno: la mia osservazione è che la maggior parte dei programmatori può imparare Perl/Python/Javascript su richiesta, ma assemblatore/C/LISP sembrano richiedere molto più tempo, quindi vale la pena imparare almeno alcune nozioni di base prima della necessità sorge.

12
Charles E. Grant

Non sono d'accordo che devi imparare C prima, ma credo che dovresti imparare C eventualmente. Tutte le astrazioni perdono e la comprensione di C semplifica la comprensione di ciò che sta realmente accadendo quando si utilizza un'astrazione di alto livello. Detto questo, penso anche che tutti i programmatori seri dovrebbero eventualmente imparare a leggere almeno l'assemblatore, per lo stesso motivo.

Imparare questi concetti di basso livello offre una sorprendente capacità di ragionare su cose di alto livello. Ad esempio, in C++ e D, gli argomenti predefiniti delle funzioni virtuali sono determinati dal tipo statico (tempo di compilazione) dell'oggetto, non dal tipo dinamico (runtime). Ciò non ha senso a meno che non si capisca come funzionano le convenzioni di chiamata e chiamate e perché sia ​​estremamente difficile implementare le funzioni virtuali in modo opposto.

7
dsimcha

Il pregiudizio è di status quo. Ai vecchi tempi (anni '80 e precedenti), C/C++ era praticamente un requisito per le applicazioni prestazionali. Questo è cambiato, ma gli sviluppatori senior generalmente provengono da quel background vecchio stile e vedono le cose in quel contesto.

Per lo sviluppo reale altri linguaggi sono usati - C # è popolare, così come Java, mentre PHP e Python sono popolari per progetti interni ed è sempre utile avere qualcuno a portata di mano con almeno le conoscenze di base in quell'area nel caso in cui si scelga un open source PHP per, diciamo, il sistema di tracciamento dei bug. Tuttavia, lavoro le specifiche sembrano ancora provenire da quel modello standard che è stato scritto 25 anni fa.

7
JohnL

Che grande festa delle lumache! (Come presumibilmente dicono: è una lotta privata o qualcuno può unirsi?)

Ero un professore, e quello che ho scoperto (dopo alcuni tentativi ed errori) è stato che era molto più facile condurre gli studenti attraverso gli intricati concetti di programmazione se avessero capito, a livello di base, cosa stesse facendo un computer. Non in tutti i dettagli, ma il principio di base, come la memoria, le istruzioni, ecc. Quello che mi piace di C è che è vicino alla macchina.

Questo non vuol dire che altri insegnanti siano venuti nello stesso posto. Hanno iniziato con il linguaggio di alto livello (BASIC :-) e sono andati avanti da lì, senza evidenti effetti negativi.

Quindi, in conclusione, Stephen, potresti avere ragione. Non la penso così, ma ho sbagliato prima.

6
Mike Dunlavey

Per quanto odio pubblicare il post obbligatorio sul blog di Joel, sono d'accordo con lui qui . C è la lingua franca della programmazione. Non riesco a pensare a nessun linguaggio di alto livello che non possa in qualche modo interfacciarsi con esso. Per questo motivo, C è ancora una scelta popolare per roba di tipo di programmazione di sistemi. Semplicemente non puoi interfacciarti con alcune cose a livello di sistema operativo senza C.

Oltre a ciò, cosa pensi di fare quando la tua lingua di alto livello non è abbastanza veloce? Sapere come scrivere C è particolarmente importante quando si utilizza un linguaggio di alto livello e digitato in modo dinamico come Ruby, Python o PHP. Ma anche Java e C # devono passare di tanto in tanto a C.

6
Jason Baker

Immagino che questo sia progresso.

Venti anni fa, la saggezza convenzionale era che dovevi imparare l'assemblatore per capire cosa stavi guadagnando da linguaggi di livello superiore come C (motivo per cui dovevo prendere una classe di assemblatore al college usando VAX Macro; indovinare quanto utile si è rivelato essere dopo il diploma).

C'è una superstizione che, dato che C è in qualche modo difficile da imparare e che fornisce quasi no astrazioni (puntatori e flussi di byte lo sono praticamente), imparare in qualche modo ti renderà un programmatore migliore o ti darà maggiori informazioni su come funzionano le cose a livello hardware.

Questo non è (necessariamente) vero. Lo standard C non ti avvicina al metal più di qualsiasi altro 3GL (Pascal, Fortran, ecc.). Alcuni C implementazioni possono fornire hook che ti danno maggiore accesso ad alcune aree, ma in generale i puntatori nudi sono più vicini che puoi, il che non lo è affatto. Ad esempio, non è possibile accedere direttamente ai registri o alle parole di stato.

Alla fine, tutto si riduce ai codici operativi e alle modalità di indirizzamento, quindi se sei davvero interessato a come funzionano le cose al livello inferiore, ti servirebbe meglio apprendere assemblatore su C.

Di per sé, l'apprendimento del C non ti renderà (necessariamente) un programmatore migliore. Ti darà sicuramente un apprezzamento per i tipi di stringa effettivi e le librerie contenitore standardizzate.

4
John Bode

In modo proattivo chiesto: stai chiedendo la conferma che non devi imparare C? Se impari puro C (non necessariamente C++) otterrai una conoscenza approfondita del modello di esecuzione di un computer. Soprattutto su memoria e allocazione. Questo è importante anche per le persone che programmano in lingue di livello superiore.

Per un PHP è solo meno trasparente il modo in cui il codice viene eseguito su una determinata macchina. Potrebbe non importare per il programmatore PHP poiché il trasferimento di rete è il collo di bottiglia nell'applicazione, ecc.

Il semplice PHP/Python/C # ha molti livelli di astrazione tra il linguaggio e la CPU. questi strati sono così spessi che non ti permettono di guardarli. Quando impari C, c'è un foglio sottile tra te, la CPU e il sistema operativo. Ciò non semplifica la programmazione (e potrebbe anche non essere migliore). Ma in realtà sei in grado di imparare come funziona la CPU. Una volta che conosci la C "intermedia", puoi effettivamente iniziare a collegare quella conoscenza verso l'alto al linguaggio di livello superiore. Questo è il vantaggio immediato che otterrai.

Secondo me un programmatore dovrebbe sempre dedicare del tempo all'apprendimento di concetti di programmazione diversi. Vale sicuramente la pena dare un'occhiata a C, ma anche a dare un'occhiata a linguaggi di programmazione di livello ancora più elevato come Clojure, Haskell, Prolog.

Non devi diventare un maestro in questi, ti insegneranno semplicemente la lezione che i "livelli" dei linguaggi di programmazione non sono binari ma ci sono molti livelli. Conoscerli dall'alto verso il basso (assemblatore). Ti renderà un programmatore migliore.

2
wirrbel

Devi conoscere abbastanza C per leggere il codice scritto in C, a causa della grande quantità di codice molto importante scritto nella lingua. Questo è tutto ciò che trarrete dall'andare bene attraverso un manuale approfondito sull'argomento (ho usato la "programmazione in C" di Kochan) senza in realtà dover scrivere codice nella lingua. Se dovessi mai ritrovarti in una situazione in cui ti viene richiesto di usare ampiamente la lingua, avrai una buona base su cui basare. Probabilmente vorresti studiare qualcosa come il libro dell'Assemblea di Duntemann se la macchina è una scatola nera distrutta per te. Consiglio anche il "Codice" di Petzold.

Al di fuori di questo - l'alfabetizzazione di base in C e la familiarità di base con la macchina sottostante - saresti meglio servito spendendo il tuo tempo di studio su cose reali, come SICP, TCP/IP Illustrated o libri su matematica concreta, algoritmi o struttura dati . Le cose vere.

Trascorrere molto tempo a studiare C durante la programmazione in PHP semplicemente non vale il costo opportunità. Ci sono cose più utili da imparare. C è davvero solo un'altra lingua che puoi imparare bene solo studiando e utilizzare, ma può riprendere quando è necessario.

Sudare le cose difficili.

2
naftalimich

Una lingua è uno strumento. Se devi solo scrivere pagine Web e simili, sono sicuro che puoi cavartela senza dover imparare C, nello stesso modo in cui se fai solo kit di modelli in plastica hai solo bisogno di un coltello affilato e una colla, un la chiave non è normalmente richiesta.

Scrivo codice per sistemi embedded con risorse di memoria altamente limitate (il più grande che ho fatto di recente è 16kbyte e che era ENORME) In questo mercato quindi C o assemblatore sono le uniche opzioni e tutti i linguaggi di livello più alto non funzionano.

2
uɐɪ

Nella mia esperienza, per un certo periodo C/C++ è stato un buon buffer che ha separato i programmatori validi dai programmatori VB6. Dopo aver fatto cinque anni dispari di C/C++, ho ottenuto un lavoro lavorando in VB6. Sono rimasto sorpreso dalla qualità (o dalla mancanza di ciò) dei programmatori. Avevano scarso interesse per il coraggio della lingua, per il design o per le prestazioni. Sfortunatamente, quando la società passò a .Net, i codificatori C/C++ e .Net usavano gli stessi strumenti. I codificatori VB erano anche peggiori programmatori VB.Net. La situazione peggiorava quando tutto lo sviluppo passava ad ASP.NET. Improvvisamente chiunque potesse trascinare e rilasciare un controllo era un programmatore.

Nel mercato del lavoro, tuttavia, non c'era molto da differenziare i programmatori hard-core (ex C/C++) e i turisti.

Pertanto, avere C o C++ sul tuo curriculum può aiutarti a differenziarti dal riff-raff.

2
dave

C (e possibilmente C++) è il mare in cui stai nuotando. Il sistema operativo che eseguirà il tuo codice è probabilmente codificato in C (e C++). Quindi la tua API nativa per accedere ai servizi del SO sarà in C.

Se riesci a fare a meno di sapere cosa c'è di seguito, non è necessario conoscere C. Tuttavia, la maggior parte dei programmatori deve immergersi a livelli inferiori in qualche momento della propria vita.

Si basa anche sulla tua specializzazione delle aree di sviluppo. Ad esempio, uno sviluppatore web che scrive HTML, Javascript e alcuni script lato server potrebbe non aver mai bisogno di sapere nulla di C, ma lo farà un sistema distribuito o uno sviluppatore di giochi.

Non fa mai male passare qualche settimana a imparare qualcosa di così fondamentale per la tua professione.

1
Mert Akcakaya

C è la lingua utilizzata per scrivere altre lingue. Ti permette di entrare in intimità con la CPU e altri hardware come preferisci.

Se non conosci C, non sai come altre lingue ottengono i risultati che ottengono.

L'astrazione è un concetto importante, ovviamente, e non tutti hanno bisogno di sapere come il loro quadro di scelta sta raggiungendo i risultati che promette. Non hai bisogno di passare 20 anni a scrivere C, o anzi a pensare a cosa succede ai tuoi vtables quando usi l'ereditarietà multipla, per scrivere un buon codice.

Ora, puoi guidare un'auto senza capire come funziona un motore a 4 tempi o addirittura senza poter utilizzare una leva del cambio (cambio manuale).

Tuttavia, se capisci cosa sta succedendo sotto il cofano, di volta in volta sarai in grado di ottenere risultati eccezionali che qualcuno senza quella conoscenza fatica a replicare.

1
Bill Michell

C ha molti vantaggi:

  1. C è un linguaggio di basso livello. Puoi usare c per sviluppare kernel e driver.
  2. C è la lingua più veloce. Molti software di potenza possono essere sviluppati da c. Ad esempio: memcached, redis, nginx, Apache, mysql ecc.
  3. C è un linguaggio multipiattaforma. Il programma sviluppato da c può essere eseguito su ogni piattaforma. Altre lingue multipiattaforma non possono farlo. Java, python, php ecc. Non possono essere eseguiti sulla piattaforma iOS.
  4. Il C++ non può essere eseguito su molti sistemi embedded.
1
Edward Shen