L'apprendimento della C è essenziale per l'Informatica? [chiuso]


15

Sono uno sviluppatore di front-end che a malapena nemmeno vedere un file con .ho .cestensione. Conosco la sintassi C di base, l'ho imparato in Unreality ma non sono mai stato interessato a una programmazione di così basso livello perché era semplicemente troppo impostato per cose semplici.

Sono molto interessato all'apprendimento di tutti gli aspetti dell'informatica, ma voglio credere di non dover conoscere un linguaggio specifico per comprendere la maggior parte dei concetti in Informatica. Tuttavia, quando inizio a leggere libri e articoli su concetti fondamentali di informatica come Data Structures e Algorithm Design, sembra che devo imparare C, perché tutti gli esempi e persino le lezioni sono in C (e talvolta Java).

La mia domanda è: C come linguaggio di programmazione è essenziale per l'Informatica o ci è capitato di avere tutte le nostre risorse in CS scritte in C? Si può imparare l'Informatica senza imparare C?


4
Ecco l'opinione di Joel Spolsky a riguardo: joelonsoftware.com/articles/CollegeAdvice.html È discutibile, ma penso che abbia i suoi punti.
Doc Brown,

2
I puristi sostengono che l'informatica non riguarda i computer, il che rende superflui i linguaggi di programmazione.
Blrfl,

1
Cosa intendi con "Informatica"? Ciò che descrivi è principalmente la parte dell'ingegneria del software dell'informatica, penso. Inoltre, non riesco a vedere come tutte le risorse sono scritte in C. Ho letto parecchi libri su algoritmi / strutture dati e nessuno ha usato C. Quasi tutti hanno usato un qualche tipo di linguaggio pseudocodice, facilmente comprensibile per tutti (beh, tranne TAOCP che usa il montaggio ... ma questa è un'altra storia)
Bakuriu,

Irrealtà? Doveva essere una stranezza di auto-correzione dell'Università o è una scuola di magia nera? Conosco l'Unseen University, però: [
Deer Hunter

Risposte:


31

Ho intenzione di andare contro il flusso qui e dire di sì, devi imparare C. In realtà sono d'accordo con i punti in molte delle altre risposte, ma fai la dichiarazione molto forte che

Sono molto interessato all'apprendimento di tutti gli aspetti dell'informatica, ma voglio credere di non dover davvero conoscere un linguaggio specifico per comprendere la maggior parte dei concetti in Informatica.

(enfatizzare il mio)

Bene, i sistemi operativi e gli stack di rete sono due aspetti enormi dell'informatica e tutti i sistemi operativi e gli stack di rete dominanti sono scritti in gran parte in C. Se vuoi capirli, dovresti imparare C. Sì, alcune scuole riescono a insegnare le loro classi di SO in Java, ma è come leggere Homer in inglese.

Inoltre, C non è un linguaggio così grande. Se vuoi davvero imparare tutti gli aspetti dell'informatica, dovresti scrollare le spalle e dire "meh", "qual è un'altra lingua?"


In genere sono d'accordo con questo, anche se per me "imparare" C significa che sono sostanzialmente abbastanza fluente nella lingua per scrivere programmi non banali in esso senza assistenza. Non sono sicuro che quel livello di comprensione sia un prerequisito per i sistemi operativi e la programmazione di rete.
Telastyn,

3
@Telastyn: significa che sei abbastanza fluente da comprendere e modificare il codice dei sistemi operativi e il codice di rete - i domini in cui viene utilizzato C, e basta. Ciò non significa che devi sapere come scrivere giochi in C, creare un'interfaccia utente graziosa e creare grafici in motori C, grafici o di intelligenza artificiale in C; perché per ogni altro dominio di CS ci sono altre scelte linguistiche.
rwong

12

Per molto tempo, al culmine dell'informatica come scienza piuttosto che come vocazione, c'erano alcune scelte limitate per una lingua che correva su tutti i sistemi utilizzati da tutte le diverse università.

Di gran lunga le università tendevano a usare i sistemi Unix. Convenientemente, questo è stato programmato in C. Si potrebbe iniziare con l'apprendimento del C su qualsiasi macchina, e infine entrare nel codice sorgente unix in C. A casa, gli studenti potrebbero usare un compilatore C come Borland Turbo C su Windows o MPW su un Mac: ha funzionato ovunque.

Pascal era un'altra opzione, ma quello tendeva ad avere il problema che a un certo punto della programmazione, non era abbastanza un linguaggio per fare ciò che era veramente necessario fare (programmare un sistema operativo in Pascal sarebbe doloroso).

Alcune delle scuole superiori hanno imparato Fortran, ma ancora una volta, in molti casi, non era una lingua abbastanza potente da poter insegnare classi CS di livello superiore (teoria dell'IA in fortran? Fattibile ma dolorosa).

E così, per lungo tempo C è stata la scelta.

Non è l'unica scelta e ora ci sono molti college che insegnano in altre lingue a sorvolare alcuni degli interni e ad apprendere concetti di livello superiore senza dover affrontare la bruttezza della gestione della memoria e simili. Alcuni pensano che sia buono, altri pensano che sia negativo .


Quindi no, l'apprendimento del C non è essenziale per l'apprendimento dell'informatica. Puoi trovare molti altri libri là fuori che insegnano informatica da Java o Python. È solo che per molto tempo C è stata la scelta e i libri accademici si muovono lentamente.


Per la cronaca, la formazione AI è stata tradizionalmente svolta con il compagno di egghead di C negli anni '70 e '80, LISP, ma la risposta è in testa.
jwrush,

@jwrush la mia risposta è stata più sulla falsariga che puoi fare anche lo studio dell'IA in C, rispetto alle altre lingue dell'epoca (non LISP - e ho preso una lezione di lis negli anni '90 per l'IA). Certo, il MIT (casa delle teste delle uova) all'epoca insegnava a molte loro lezioni in LISP - ed era certamente un'altra opzione, ma non altrettanto pratica in altre aree. Nell'insegnamento, era importante lavorare dalla stessa base in ogni classe in modo che non si dovesse passare la prima settimana o due a insegnare agli studenti un'altra lingua specializzata in quella classe.

12

Ammetto che si può ottenere un lavoro ben pagato ed essere produttivi senza mai toccare C, ma consiglio vivamente di imparare C per chiunque sia seriamente intenzionato ad avere una solida conoscenza dell'informatica.

Sebbene l'informatica riguardi concetti, che possono essere appresi indipendentemente da qualsiasi linguaggio di programmazione specifico, ci sono campi che possono essere molto meglio compresi imparando C o imparando quel campo usando C.

  • Algoritmi e strutture dati. Lo standard C non ha quasi nessuno di questi - avere questi già implementati nella lingua o nella sua libreria standard tende ad essere demotivazionale per gli studenti: " Perché dovrei preoccuparmi di implementare qualcosa di prontamente disponibile?"Guardando un pezzo di codice C, si vede immediatamente il suo costo algoritmico, poiché tutto in C si compila solo con poche istruzioni macchina. I linguaggi di alto livello (ad esempio Perl o Python) spesso usano strutture di dati avanzate sotto il cappuccio di una sintassi leggera. Il codice sembra leggero, ma non lo è. Hai già bisogno di molte conoscenze per ragionare correttamente sulla complessità algoritmica di quei pezzi di codice, quindi quei linguaggi non sono adatti all'apprendimento di algoritmi e strutture di dati, e molti programmatori che sono sempre vissuti su linguaggi di alto livello, tendono a non essere in grado di affrontare i problemi di performace, quando si imbattono in essi.

  • Sistemi operativi. La maggior parte dei sistemi operativi sono scritti in C. Come si desidera comprendere la creazione del processo senza mai chiamare fork? Il livello di astrazione della VM Java non aiuta qui. E solo parlarne senza mai creare un processo è ancora peggio ... Come si può scrivere un software come Eclipse che può reindirizzare l'output standard in una delle sue finestre? Per questo devi comprendere i concetti a livello di sistema operativo e puoi toccarli direttamente solo in C.

  • Indirection. Non puoi fare C senza occuparti dei puntatori. I puntatori ti costringono a pensare su due livelli e questo allunga le tue abilità di astrazione.

Ci sono anche alcuni vantaggi tecnici della conoscenza C:

  • Interoperabilità tra lingue. Vuoi integrare un ottimo modulo Ruby nel tuo progetto Python (sostituisci due lingue arbitrarie qui). È probabile che l'unico modo per farlo sia attraverso C, perché entrambe le lingue hanno un'interfaccia straniera con C.

  • Scrittura di software critico per le prestazioni. Non si può omettere di andare a basso livello per farlo.


Non dico che ogni programma dovrebbe essere scritto in C. Ma C può aiutarti a conoscere, il che è utile in qualunque lingua tu programmi.


L'aritmetica del puntatore è fondamentale per comprendere i sistemi operativi poiché porta al perché. Ad esempio, perché i cumuli e le pile sono diversi, perché la memoria virtuale funziona bene o male, perché alcuni loop funzionano più velocemente di altri, ecc.
Michael Shopsin,

6

Vado anche contro il grano qui e cercherò di creare un caso estetico (leggermente divertente) per C. Mentre alcune persone potrebbero chiamarlo "brutto" per motivi diversi, come la mancanza di costrutti di livello superiore come le classi o la sua dipendenza dai puntatori, trovo che non sia il caso per me .

TL; DR : A mio avviso, C è semplice, buona C è leggibile e c'è una certa gioia da trovare nei colpi.

C è semplice

Lo standard C definisce solo alcuni tipi e meccanismi di base per creare funzioni, puntatori e matrici da essi. Inoltre, c'è un piccolo numero di costrutti di composizione per creare tipi più complessi dalle primitive (come le strutture e i sindacati). Nota come ho descritto la maggior parte della lingua in due frasi. Ciò significa che non devi tenere troppe regole e moduli sintattici nella tua testa durante la codifica.

Semplice è bello .

C non è arcano

A differenza di molte lingue di livello superiore, sarebbe difficile trovare molti simboli strani e incomprensibili in C. Nel mondo C, la funzione principale sia per l'astrazione che per la "compressione sintattica" è la funzione - semanticamente un metodo molto semplice e costrutto autoesplicativo. Il buon stile C incoraggia la bellezza quasi poetica e leggibile. Per illustrare, proviamo a leggere il seguente frammento dal kernel Linux. Anche senza avere una comprensione delle strutture di dati e dei dettagli di implementazione sottostanti, possiamo avere molto senso di quanto segue:

bool kthread_freezable_should_stop(bool *was_frozen)
{
    bool frozen = false;

    might_sleep();

    if (unlikely(freezing(current)))
        frozen = __refrigerator(true);

    if (was_frozen)
        *was_frozen = frozen;

    return kthread_should_stop();
}

Il centro della funzione indica "nell'improbabile caso in cui la corrente si sta congelando, chiedere al frigorifero se il congelamento si è effettivamente verificato". Il dottor Seuss non avrebbe potuto scriverlo meglio.

Leggibile è bellissimo .

C è trasparente

A meno che un'istruzione C includa una chiamata di funzione, in genere è possibile avere un'ottima idea del costo di runtime e degli effetti collaterali. C dà al programmatore il controllo e alla fine si fida di lui o lei per fare la cosa giusta. Possiamo avere un quadro di ciò che accade quando questo frammento (leggermente riformattato per SE) esce dall'implementazione strlen()nella libreria GNU C, perché ogni operatore ha una semantica ben definita. Non c'è sovraccarico in C.

for (char_ptr = str; ((unsigned long int) char_ptr & (sizeof (longword) - 1)) != 0;
        ++char_ptr)

if (*char_ptr == '\0')
    return char_ptr - str;

Ai fini di "ottimizzabilità", questa proprietà è eccezionale. Probabilmente, alcuni linguaggi di livello superiore rendono più semplice l'espressione concisa di algoritmi di livello superiore (come C ++ con classi e sovraccarico), ma ai fini C è stato progettato per - agendo come un assemblatore portatile - C è l'ideale. A volte, dopo aver eseguito con successo il codice di basso livello, un programmatore potrebbe sentirsi un tutt'uno con la macchina, in un certo senso (o zero - è un dettaglio di implementazione). Questo non vuol dire che altre lingue siano cattive, non abbastanza "zen" o qualcosa di così sciocco, solo che l'IMO C può essere interessante in modi in cui molte altre lingue hanno scelto di non esserlo, per molte valide ragioni.

A mio avviso, i tre punti presentati sopra rendono gestibile la creazione di sistemi complessi, ma efficienti, incarnati nella mia mente da Linux. Trovo che questo mondo faccia appello alla mia sensibilità estetica e consiglierei a chiunque consideri C il suo prossimo obiettivo di considerare questi punti. Ritengo che gli argomenti sui sistemi operativi e quant'altro siano meglio supportati affermandoli esplicitamente perché non è certo necessario comprendere i kernel per essere un programmatore di successo, ma si potrebbero trovare questi campi convincenti soggettivamente.


3

Il linguaggio di programmazione che usi per discutere della scienza dell'informatica è in gran parte irrilevante per il compito di apprendere i mezzi e la scienza dell'informatica.

Il lavoro (probabilmente) fondamentale sull'informatica, The Art of Computer Programming , non utilizza alcun linguaggio esistente per informare l'argomento. Invece, Donald Knuth ha scelto di definire un computer immaginario e un linguaggio macchina fittizio (e un linguaggio di assemblaggio associato) in termini di cui discute tutti gli argomenti.

Un altro lavoro molto apprezzato in materia, La struttura e l'interpretazione dei programmi per computer , ha adottato un approccio simile, escogitando un dialetto semplificato del linguaggio di programmazione LISP per agire come proprio contesto. Questa lingua è ciò che conosciamo ora come Schema.

Un altro ottimo lavoro su Informatica, The Elements of Computing Systems (che è in realtà parti uguali di Ingegneria Informatica e Informatica, e molto breve), adotta l'approccio più fondamentale dell'insegnamento della logica digitale, da cui costruisce la macchina, gli strumenti e la lingua, prima di insegnare l'informatica elementare.

Quindi, no, C non è necessario per una comprensione dell'Informatica. Ciò che conta è la comprensione dei concetti chiave degli algoritmi e della loro applicazione.


2

Ho iniziato una carriera nella programmazione imparando vb3 dai manuali forniti con i floppy disk in cui è arrivato. Ho imparato un po 'di java e sono stato in grado di produrre alcuni programmi rispettabili, ma solo quando ho studiato C all'università ho sentito di aver veramente capito cosa stava succedendo "sotto il cofano". Ora lavoro solo con .net e non mi preoccupo mai veramente di puntatori, indirizzi non validi o overflow - ma li capisco, questo informa le decisioni che prendo quotidianamente e alcune delle cose della vecchia scuola sono ancora lì nelle moderne lingue interpretate, bandiere , operazioni un po 'sagge, logica booleana, tutti strumenti potenti e molto efficienti.

Impara C. Ti aiuterà. Ho conservato una copia del manuale dei programmatori c per anni e ho letto Kernighan e Ritchie da cima a fondo. Non importa quale lingua finirai per lavorare con Comprensione C ti aiuterà sicuramente.


1

Si può imparare l'Informatica senza imparare C?

La risposta è si. Ho la mia laurea in CS e non mi è stato richiesto di imparare C, ma piuttosto Java. Almeno nella mia scuola, l'enfasi era sull'apprendimento della programmazione orientata agli oggetti, con alcuni insegnamenti sul linguaggio degli assemblaggi, sulle strutture dei dati e sulla progettazione dei database.


7
Sei sicuro che la tua laurea abbia coperto " tutti gli aspetti" di CS?
SK-logic

Direi tutti gli aspetti necessari. Nessuna laurea copre tutti gli aspetti di un corso di laurea. Inoltre "tutto" è soggettivo.
PhillyNJ,

1
Come definisci "necessario"? Tutto è tutto - significato, che copre tutte le possibili applicazioni CS. Non è "soggettivo", è abbastanza quantificabile.
SK-logic

Definisco 'necessario' nel contesto in cui CS copre lo studio della computazione e della tecnologia informatica, hardware e software e non di qualsiasi linguaggio specifico, che sta rispondendo alla domanda originale.
PhillyNJ,

Ok, e come coprirai l'hardware senza le lingue di basso livello? Come tratterai la storia dei linguaggi di programmazione (che è una parte eccezionalmente importante di "tutto" il CS) senza un tale linguaggio chiave? Come tratterai la semantica del linguaggio di programmazione senza almeno una lingua con l'aritmetica del puntatore? In un modo o nell'altro, ma un linguaggio simile a C deve essere presente in qualsiasi curriculum CS completo.
SK-logic

0

Dipende davvero da cosa vuoi fare con quello che stai imparando. È sicuramente vero che molti algoritmi sono dati in C, o loro discendenti. Tuttavia, nel corso degli anni ho visto più esempi C ++, C # e Java. Ciò che CS intende insegnare è una comprensione generale dell'informatica, e quindi come apprendere o creare una lingua appropriata per l'attività da svolgere.

Tuttavia, ci sono ancora molte persone la cui prima e ultima lingua è una variante di C o Java, e non tutte avranno la formazione per comprendere qualsiasi lingua data fornita da una laurea in CS. Anche alcuni laureati in CS hanno problemi con la programmazione. Quindi potrebbe essere necessario avere una conoscenza sufficiente di quelle lingue da poter comunicare con loro, a seconda del percorso professionale. Se hai intenzione di restare fedele al mondo accademico, allora avrai ancora più barriere linguistiche ai contenuti, in particolare nelle aree interdisciplinari (dove le persone usano prolog, lisp, haskell, matematica, ecc.)


-1

Se davvero imparerai "tutti gli aspetti dell'Informatica" (piano ambizioso!), Dovresti avere a che fare con diversi linguaggi di assemblaggio e almeno un HDL (e praticare la codifica a livello di netlist in esso).

E come passaggio di livello superiore per affrontare queste cose veramente fondamentali dovresti raccogliere qualcosa come C o Pascal, è inevitabile. Saltare i gradini su una scala di astrazione è controproducente.

Ad ogni modo, dubito che valga la pena porre questa domanda. Dopotutto, C è solo un linguaggio minuscolo. Avresti potuto imparare le sue basi in un tempo più breve di quello che hai sprecato riflettendo sul fatto che devi imparare la C o no.

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.