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

15

Sono uno sviluppatore front-end che riesce a malapena a vedere un file con .h o .c estensione. Conosco la sintassi C di base, l'ho appreso in Unreality ma non mi sono mai interessato programmazione di basso livello perché era semplicemente troppo setup per cose semplici.

Sono molto interessato all'apprendimento di tutti gli aspetti dell'informatica, ma voglio crederci Non ho davvero bisogno di conoscere una lingua specifica per capire la maggior parte dei concetti in informatica. Eppure quando inizio a leggere libri e articoli su fondamentali Concetti di informatica come Data Structures e Algorithm Design sembra proprio questo Devo imparare C, perché tutti gli esempi e anche le lezioni sono in C (ea volte Java).

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

    
posta Mohsen 07.09.2013 - 00:03
fonte

9 risposte

31

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

I am very interested in learning all aspects of Computer Science but I want to believe I do not really have to know a specific language in order to understand most of concepts in Computer Science.

(sottolineatura mia)

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

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

    
risposta data 07.09.2013 - 00:59
fonte
12

Per molto tempo, durante il culmine dell'informatica come scienza piuttosto che come vocazione, c'erano poche scelte limitate per un linguaggio che girava su tutti i sistemi utilizzati da tutte le diverse università.

Di gran lunga, le università tendevano ad usare i sistemi Unix. Convenientemente, questo è stato programmato in C. Si potrebbe iniziare con l'apprendimento C su qualsiasi macchina, e alla fine 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 tendeva ad avere il problema che, ad un certo punto della programmazione, non era sufficiente un linguaggio per fare ciò che avevi veramente bisogno di fare (programmare un sistema operativo in pascal sarebbe doloroso) .

Alcuni della scuola più grande apprendevano Fortran, ma ancora una volta, in molti casi non era un linguaggio abbastanza potente da essere in grado di insegnare classi CS di livello superiore (la teoria dell'IA in fortran? fattibile ma dolorosa).

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

Non è l'unica scelta e ci sono molte università che insegnano in altre lingue a sorvolare su alcuni interni e ad apprendere concetti di livello superiore senza dover affrontare la bruttezza della gestione della memoria e simili. Alcuni pensano che questo sia buono, alcuni pensano che questo sia male .

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

    
risposta data 07.09.2013 - 00:18
fonte
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 serio di avere una comprensione solida di informatica.

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

  • Algoritmi e strutture dati. Lo standard C non ne ha quasi nessuno - avendo questi già implementati nella lingua o nella sua libreria standard tendono ad essere demotivazionali per studenti: " Perché dovrei preoccuparmi di implementare qualcosa facilmente disponibile? " Guardando un pezzo di codice C, si vede immediatamente il suo costo algoritmico, poiché tutto in C viene compilato solo con alcune istruzioni macchina. I linguaggi di alto livello (ad esempio Perl o Python) spesso usano strutture dati avanzate sotto la maschera della sintassi leggera. Il codice sembra leggero, ma non lo è. Hai già bisogno di una grande quantità di conoscenza per ragionare correttamente sulla complessità algoritmica di quei pezzi di codice. Pertanto, quelle lingue non sono adatte per l'apprendimento di algoritmi e strutture dati, e molti programmatori che vivevano sempre in linguaggi di alto livello, tendono ad essere incapaci di affrontare problemi di esecuzione, quando li incontrano.

  • Sistemi operativi. La maggior parte dei sistemi operativi sono scritti in C. Come vuoi capire la creazione dei processi senza mai chiamare fork ? Il livello di astrazione della Java VM non è di aiuto qui. E solo parlarne senza mai creare un processo è ancora peggio ... Come si può scrivere un software come Eclipse che può reindirizzare lo standard output in una delle sue finestre? Devi capire i concetti a livello di OS per questo, e puoi toccarli direttamente solo in C.

  • Indirection. Non puoi fare C senza affrontare i 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 più lingue. Vuoi integrare un grande modulo di Ruby nel tuo progetto Python (sostituisci qui due lingue arbitrarie). È probabile che l'unico modo per farlo sia tramite C, perché entrambe le lingue hanno un'interfaccia esterna a C.

  • Scrittura di software per le prestazioni critiche. Non si può omettere di andare a un livello basso 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 abbia programmato.

    
risposta data 07.09.2013 - 10:41
fonte
6

Anche qui andrò contro il limite e cercherò di creare un caso estetico (leggermente umoristico) per C. Mentre alcuni potrebbero chiamarlo "brutto" per ragioni diverse, come la mancanza di costrutti di livello superiore come le classi o la sua dipendenza dai puntatori, trovo che non è il caso di me .

TL; DR : A mio parere, C è semplice, buona C è leggibile e c'è una certa gioia da trovare nei bit "bang".

C è semplice

Lo standard C definisce solo alcuni tipi e meccanismi di base per creare funzioni, puntatori e array al di fuori di essi. Oltre a ciò, c'è un piccolo numero di costrutti di composizione per rendere i tipi più complessi fuori dalle primitive (come le strutture e i sindacati). Notate 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 molti linguaggi di livello superiore, sarebbe difficile trovare un sacco di simboli strani e incomprensibili in C. Nel mondo C, la funzione principale sia per l'astrazione che per la "compressione sintattica" è la funzione - semanticamente costrutto molto semplice e auto-esplicativo. Il buono stile C incoraggia la bellezza quasi poetica e leggibile. Per illustrare, proviamo a leggere il seguente snippet dal kernel di Linux. Anche senza aver compreso le strutture di dati e i dettagli di implementazione, possiamo dare un senso a 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();
}

La parte centrale della funzione indica "nell'improbabile caso che la corrente si blocchi, chiedi al frigorifero se il congelamento è effettivamente avvenuto". Dr. Seuss non avrebbe potuto scrivere meglio.

Leggibile è bello .

C è trasparente

A meno che una dichiarazione C includa una chiamata di funzione, in genere è possibile ottenere un'idea molto buona dei costi 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 ottenere un'immagine di ciò che accade quando questo frammento (leggermente riformattato per SE) dall'implementazione di strlen() nella libreria GNU C viene eseguito, poiché 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 == '
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();
}
') return char_ptr - str;

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

A mio parere, i tre punti sopra presentati rendono gestibile la creazione di sistemi complessi ma efficienti, incorporati nella mia mente da Linux. Trovo che questo mondo faccia appello alla mia sensibilità estetica e consiglierei a chiunque consideri C come il suo prossimo obiettivo a considerare questi punti. Ritengo che le argomentazioni sui sistemi operativi e su quelle non siano supportate meglio specificandole esplicitamente perché non è necessario comprendere i kernel per essere un programmatore di successo, ma si potrebbero trovare soggettivi questi campi.

    
risposta data 07.09.2013 - 13:41
fonte
3

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

Il (forse) seminale lavoro su Computer Science, The Art of Computer Programming , non usa alcuna lingua esistente per informare l'argomento. Invece, Donald Knuth ha scelto di definire un computer fittizio e un linguaggio fittizio della macchina (e un linguaggio associato all'assemblaggio) in base ai quali discute tutti gli argomenti.

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

Ancora un altro ottimo lavoro su Computer Science, The Elements of Computing Systems (che è in realtà parte uguale Computer Engineering and Computer Science, e molto breve), adotta l'approccio più fondamentale dell'insegnamento della logica digitale, da cui costruisce la macchina, gli strumenti e il linguaggio, prima di insegnare l'informatica elementare.

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

    
risposta data 07.09.2013 - 00:43
fonte
2

Ho iniziato una carriera nella programmazione imparando vb3 dai manuali forniti con i floppy disk. Ho imparato un po 'di java ed è stato in grado di produrre alcuni programmi di tutto rispetto, ma non è stato fino a quando ho studiato C all'università che ho sentito di aver capito davvero cosa stava succedendo "sotto il cofano". Ora lavoro solo con .net e non mi preoccupo mai dei puntatori, degli indirizzi non validi o degli overflow - ma li capisco, questo informa le decisioni che faccio ogni giorno e alcune delle cose della vecchia scuola sono ancora presenti nelle lingue interpretate moderne, bandiere , operazioni bit-saggio, logica booleana, tutti gli strumenti potenti e molto efficienti.

Impara C. Ti starà al posto giusto. Ho tenuto una copia del manuale dei programmatori c per anni e ho letto Kernighan e Ritchie dall'inizio alla fine. Non importa quale linguaggio si finisce per lavorare con Understanding C sarà sicuramente di aiuto.

    
risposta data 07.09.2013 - 22:20
fonte
1

Can one learn Computer Science without learning C?

La risposta è Sì. Sono laureato in CS e non ho avuto bisogno 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 assembly, sulle strutture dati e sulla progettazione di database.

    
risposta data 07.09.2013 - 00:14
fonte
0

Dipende davvero da cosa vuoi fare con ciò che stai imparando. È sicuramente vero che molti algoritmi sono forniti in C, o discendenti di questi. 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 raccogliere o creare una lingua appropriata per il compito in questione.

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 capire la lingua data da una laurea in CS. Anche alcuni laureati CS hanno problemi con la programmazione. Quindi potresti aver bisogno di avere una comprensione abbastanza buona di quelle lingue che puoi comunicare con loro, a seconda del tuo percorso professionale. Se intendi aderire al mondo accademico, avrai ancora più barriere linguistiche per i contenuti, specialmente in aree interdisciplinari (dove le persone usano prolog, lisp, haskell, mathematica, ecc.)

    
risposta data 07.09.2013 - 01:05
fonte
-1

Se hai davvero intenzione di imparare "tutti gli aspetti dell'informatica" (piano ambizioso!), dovresti affrontare diversi linguaggi di assemblaggio e almeno un HDL (e fare pratica di codifica a livello di netlist in esso).

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

Comunque, dubito che questa domanda valga la pena di essere chiesta. Dopotutto, C è solo un linguaggio minuscolo. Potresti averne appreso le basi in un tempo più breve di quello che hai sprecato a riflettere se devi imparare C o no.

    
risposta data 07.09.2013 - 10:35
fonte

Leggi altre domande sui tag