Ist C-Lernen für die Informatik essentiell? [geschlossen]

15

Ich bin ein Front-End-Entwickler, der kaum eine Datei mit .hoder eine .cErweiterung sieht . Ich kenne die grundlegende C-Syntax, habe sie in Unreality gelernt, habe mich aber nie für so einfache Programmierung interessiert, weil es einfach zu viel Setup für einfache Dinge war.

Ich bin sehr daran interessiert, alle Aspekte der Informatik zu lernen, aber ich möchte glauben, dass ich nicht wirklich eine bestimmte Sprache sprechen muss, um die meisten Konzepte der Informatik zu verstehen. Wenn ich jedoch anfange, Bücher und Artikel über grundlegende Informatikkonzepte wie Datenstrukturen und Algorithmusdesign zu lesen, muss ich offenbar C lernen, da alle Beispiele und sogar Lektionen in C (und manchmal in Java) vorliegen.

Meine Frage ist, ob C als Programmiersprache für die Informatik unverzichtbar ist oder ob wir zufällig alle unsere CS-Ressourcen in C geschrieben haben. Kann man Informatik lernen, ohne C zu lernen?

Mohsen
quelle
4
Hier ist Joel Spolskys Meinung dazu: joelonsoftware.com/articles/CollegeAdvice.html Es ist diskutierbar, aber ich denke, er hat seine Argumente .
Doc Brown
2
Puristen würden argumentieren, dass es in der Informatik nicht um Computer geht, was Programmiersprachen überflüssig macht.
Blrfl
1
Was meinst du mit "Informatik"? Was Sie beschreiben, ist hauptsächlich der Software-Engineering- Teil der Informatik, denke ich. Außerdem verstehe ich nicht, wie alle Ressourcen in C geschrieben sind. Ich habe etliche Bücher über Algorithmen / Datenstrukturen gelesen und keine verwendet C. Fast alle verwendeten eine Art Pseudocodesprache, die für alle leicht verständlich ist (na ja , außer TAOCP, die Montage verwendet ... aber das ist eine andere Geschichte)
Bakuriu
Unwirklichkeit? Sollte es eine Eigenart der Autokorrektur von der Universität sein oder ist es eine Schule der schwarzen Magie? Ich kenne die unsichtbare Universität: [
Deer Hunter

Antworten:

31

Ich gehe hier gegen den Strom und sage ja, Sie müssen C lernen. Ich stimme den Punkten in vielen anderen Antworten tatsächlich zu, aber Sie geben die sehr starke Aussage ab, dass

Ich bin sehr daran interessiert, alle Aspekte der Informatik zu lernen, aber ich möchte glauben, dass ich nicht wirklich eine bestimmte Sprache sprechen muss, um die meisten Konzepte der Informatik zu verstehen.

(Hervorhebung von mir)

Nun, Betriebssysteme und Netzwerkstacks sind zwei große Aspekte der Informatik, und alle vorherrschenden Betriebssysteme und Netzwerkstacks sind größtenteils in C geschrieben. Wenn Sie diese verstehen möchten, sollten Sie C lernen. Ja, einige Schulen schaffen es, zu unterrichten ihre OS-Klassen in Java, aber es ist wie Homer auf Englisch zu lesen.

Außerdem ist C nicht so groß in der Sprache. Wenn Sie wirklich alle Aspekte der Informatik lernen möchten, sollten Sie mit den Schultern zucken und "meh" sagen: "Was ist noch eine Sprache?"

Charles E. Grant
quelle
Ich stimme dem im Allgemeinen zu, obwohl "C lernen" für mich bedeutet, dass ich im Wesentlichen fließend genug in der Sprache bin, um ohne Hilfe nicht-triviale Programme darin zu schreiben. Ich bin nicht sicher, ob dieses Verständnis eine Voraussetzung für Betriebssysteme und Netzwerkprogrammierung ist.
Telastyn
3
@Telastyn: Das bedeutet, dass Sie fließend genug sind, um den Code von Betriebssystemen und Netzwerken zu verstehen und zu ändern - die Domänen, für die C verwendet wird, und das war's. Es bedeutet nicht, dass Sie wissen müssen, wie man Spiele in C schreibt, eine schöne Benutzeroberfläche erstellt und Anwendungen für Diagramme in C, Grafiken oder Machine Intelligence-Engines in C erstellt. denn für jede andere Domäne von CS gibt es andere Sprachoptionen.
Rwong
12

Während der Hochphase der Informatik als Wissenschaft und nicht als Berufung gab es lange Zeit nur wenige Möglichkeiten für eine Sprache, die auf allen Systemen der verschiedenen Universitäten ausgeführt werden konnte.

Universitäten tendierten bei weitem dazu, Unix-Systeme zu verwenden. Praktischerweise wurde dies in C programmiert. Man konnte mit dem Erlernen von C auf jeder Maschine beginnen und schließlich in den Unix-Quellcode in C einsteigen. Zu Hause konnten die Schüler einen C-Compiler wie Borland Turbo C unter Windows oder MPW auf einem verwenden Mac - es hat überall funktioniert.

Pascal war eine andere Option, aber das hatte das Problem, dass es zu einem bestimmten Zeitpunkt in der Programmierung nicht ausreichte, eine Sprache zu tun, was man wirklich tun musste (das Programmieren eines Betriebssystems in Pascal wäre schmerzhaft).

Einige der älteren Schüler lernten Fortran, aber auch hier war es in vielen Fällen nicht mächtig genug, um höhere CS-Klassen zu unterrichten (KI-Theorie in Fortran? Machbar, aber schmerzhaft).

Und so war C lange Zeit die Wahl.

Es ist nicht die einzige Wahl, und es gibt viele Hochschulen, die in anderen Sprachen unterrichten, um einige der Interna zu beschönigen und Konzepte auf höherer Ebene zu erlernen, ohne sich mit der Hässlichkeit des Speichermanagements und dergleichen auseinandersetzen zu müssen. Einige finden das gut, andere finden das schlecht .


Nein, das Erlernen von C ist für das Erlernen der Informatik nicht unbedingt erforderlich. Es gibt viele andere Bücher, die Informatik aus Java oder Python lehren. Es ist nur so, dass C lange Zeit die Wahl war und wissenschaftliche Bücher sich nur langsam bewegen.


quelle
In den 70er und 80er Jahren wurde KI-Training traditionell mit Cs Egghead-Begleiter LISP durchgeführt, aber die Antwort liegt auf dem Kopf.
Jwrush
@jwrush Meine Antwort war eher so, dass man auch in C AI lernen kann, verglichen mit den anderen Sprachen der Zeit (nicht LISP - und ich habe in den 90ern einen Lisp-Kurs für AI belegt). Zugegeben, MIT (Heimat der Eggheads) unterrichtete damals viele ihrer Klassen in LISP - und es war sicherlich eine andere Option, aber in anderen Bereichen nicht ganz so praktisch. Beim Unterrichten war es wichtig, in jeder Klasse auf der gleichen Grundlage zu arbeiten, damit man nicht die ersten ein oder zwei Wochen damit verbringen musste, den Schülern eine andere Sprache beizubringen, die auf diese Klasse spezialisiert war.
12

Ich gebe zu, dass man einen gut bezahlten Job bekommen und produktiv sein kann, ohne jemals C zu berühren, aber ich empfehle C für jeden, der es ernst meint, solide Kenntnisse der Informatik zu haben.

Obwohl es in der Informatik um Konzepte geht, die unabhängig von einer bestimmten Programmiersprache erlernt werden können, gibt es Bereiche, die durch das Erlernen von C oder durch das Erlernen dieses Bereichs mit C besser verstanden werden können.

  • Algorithmen und Datenstrukturen. In Standard C gibt es so gut wie nichts davon - wenn diese bereits in der Sprache oder in der Standardbibliothek implementiert sind, sind sie für die Schüler eher demotivierend: " Warum sollte ich mir die Mühe machen, etwas sofort verfügbares zu implementieren?"Wenn Sie sich einen Teil des C-Codes ansehen, sehen Sie sofort die algorithmischen Kosten, da alles in C nur mit wenigen Maschinenanweisungen kompiliert wird. Hochentwickelte Sprachen (z. B. Perl oder Python) verwenden häufig erweiterte Datenstrukturen unter dem Deckmantel einer leichten Syntax. Code fühlt sich leicht an, ist es aber nicht. Sie benötigen bereits viel Wissen, um die algorithmische Komplexität dieser Codeteile richtig zu beurteilen. Daher sind diese Sprachen nicht so geeignet, um Algorithmen und Datenstrukturen zu lernen, und viele Programmierer, die immer gelebt haben In Hochsprachen sind sie in der Regel nicht in der Lage, Leistungsprobleme zu lösen, wenn sie auf sie stoßen.

  • Betriebssysteme. Die meisten Betriebssysteme sind in C geschrieben. Wie möchten Sie die Prozesserstellung verstehen, ohne jemals anzurufen fork? Die Abstraktionsschicht der Java VM ist hier keine Hilfe. Und nur darüber zu reden, ohne jemals einen Prozess zu erstellen, ist noch schlimmer ... Wie kann man eine Software wie Eclipse schreiben, die die Standardausgabe in eines ihrer Fenster umleiten kann? Dazu müssen Sie Konzepte auf Betriebssystemebene verstehen, und Sie können diese nur in C direkt berühren.

  • Indirektion. Sie können C nicht tun, ohne sich mit Zeigern zu befassen. Zeiger zwingen Sie, auf zwei Ebenen zu denken, und das erweitert Ihre Abstraktionsfähigkeiten.

Es gibt auch einige technische Vorteile von C-Kenntnissen:

  • Sprachübergreifende Interoperabilität.Sie möchten ein großartiges Ruby-Modul in Ihr Python-Projekt integrieren (ersetzen Sie hier zwei beliebige Sprachen). Wahrscheinlich ist der einzige Weg, dies zu tun, C, da beide Sprachen eine fremde Schnittstelle zu C haben.

  • Schreiben von leistungskritischer Software. Man kann es nicht auslassen, dies auf niedrigem Niveau zu tun.


Ich sage nicht, dass jedes Programm in C geschrieben sein sollte. Aber C kann Ihnen beim Erlernen von Kenntnissen helfen, die in jeder Sprache nützlich sind, in der Sie programmieren.

Miklós Homolya
quelle
Die Zeigerarithmetik ist für das Verständnis von Betriebssystemen von entscheidender Bedeutung, da sie zum Warum führt. ZB warum sind Heaps und Stacks unterschiedlich, warum funktioniert der virtuelle Speicher gut oder schlecht, warum funktionieren einige Loops schneller als andere usw.
Michael Shopsin
6

Ich werde hier auch gegen den Strich gehen und versuchen, eine (etwas humorvolle) ästhetische Argumentation für C zu formulieren. Einige Leute nennen es aus verschiedenen Gründen "hässlich", beispielsweise weil es keine übergeordneten Konstrukte wie Klassen oder gibt Wenn ich mich auf Zeiger verlasse, sehe ich, dass dies bei mir nicht der Fall ist .

TL; DR : Meiner Meinung nach ist C einfach, gutes C ist lesbar und es gibt eine gewisse Freude, wenn man Bits schlägt.

C ist einfach

Standard C definiert nur einige grundlegende Typen und Mechanismen, um daraus Funktionen, Zeiger und Arrays zu erstellen. Darüber hinaus gibt es eine kleine Anzahl von Kompositionskonstrukten, mit denen komplexere Typen aus den Primitiven (wie Strukturen und Vereinigungen) erstellt werden können. Beachten Sie, wie ich den größten Teil der Sprache in zwei Sätzen beschrieben habe. Dies bedeutet, dass Sie beim Codieren nicht zu viele syntaktische Regeln und Formulare im Kopf behalten müssen.

Einfach ist schön .

C ist nicht arkan

Im Gegensatz zu vielen höheren Sprachen wird es Ihnen schwer fallen, in C viele seltsame, unverständliche Symbole zu finden. In der C-Welt ist die Funktion sowohl für die Abstraktion als auch für die "syntaktische Komprimierung" die wichtigste Funktion - semantisch eine sehr einfache und selbsterklärendes Konstrukt. Guter C-Stil fördert fast poetische, lesbare Schönheit. Versuchen wir zur Veranschaulichung das folgende Snippet aus dem Linux-Kernel zu lesen. Auch ohne die zugrunde liegenden Datenstrukturen und Implementierungsdetails zu verstehen, können wir Folgendes sinnvoll verstehen:

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();
}

In der Mitte der Funktion steht "Wenn der Strom unwahrscheinlich einfriert, fragen Sie den Kühlschrank, ob das Einfrieren tatsächlich stattgefunden hat". Dr. Seuss hätte es nicht besser schreiben können.

Lesbar ist schön .

C ist transparent

Wenn eine C-Anweisung keinen Funktionsaufruf enthält, können Sie sich im Allgemeinen einen guten Überblick über die Laufzeitkosten und die Nebenwirkungen verschaffen. C gibt dem Programmierer die Kontrolle und vertraut letztendlich darauf, dass er das Richtige tut. Wir können uns ein Bild davon machen, was passiert, wenn dieser (für SE leicht neu formatierte) Ausschnitt aus der Implementierung strlen()in der GNU C-Bibliothek ausgeführt wird, da jeder Operator eine genau definierte Semantik hat. Es gibt keine Überlastung 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;

Für die Zwecke der "Optimierbarkeit" ist diese Eigenschaft großartig. Zwar erleichtern einige übergeordnete Sprachen den prägnanten Ausdruck übergeordneter Algorithmen (wie C ++ mit Klassen und Überladung), doch für die Zwecke, für die C als portabler Assembler konzipiert wurde, ist C ideal. Manchmal fühlt sich ein Programmierer nach erfolgreicher Ausführung von Code auf niedriger Ebene in gewisser Weise eins mit der Maschine (oder Null - es ist ein Implementierungsdetail). Das soll nicht heißen, dass andere Sprachen schlecht sind, nicht "Zen" genug oder etwas Dummes wie das, nur dass IMO C auf eine Weise interessant sein kann, die viele andere Sprachen aus vielen triftigen Gründen nicht gewählt haben.

Meiner Meinung nach machen die drei oben genannten Punkte die Schaffung komplexer und dennoch effizienter Systeme, die in meinem Kopf von Linux verkörpert werden, überschaubar. Ich finde, dass diese Welt meine ästhetischen Empfindungen anspricht, und ich würde jedem raten, C als sein nächstes Ziel zu betrachten, um diese Punkte zu berücksichtigen. Ich bin der Meinung, dass Argumente über Betriebssysteme und so weiter besser unterstützt werden, wenn sie explizit angegeben werden, da man Kernel sicherlich nicht verstehen muss, um ein erfolgreicher Programmierer zu sein, aber man könnte diese Felder als subjektiv überzeugend empfinden.

Idobie
quelle
3

Die Programmiersprache, mit der Sie die Informatik diskutieren, spielt für die Aufgabe, die Mittel und die Wissenschaft der Informatik zu erlernen, keine Rolle.

Die (wohl) wegweisende Arbeit über Informatik, die Kunst der Computerprogrammierung , verwendet keine existierende Sprache, um das Thema zu informieren. Stattdessen hat Donald Knuth einen fiktiven Computer und eine fiktive Maschinensprache (und eine zugehörige Assemblersprache) definiert, in denen er alle Themen behandelt.

Eine weitere hoch angesehene Arbeit zu diesem Thema, Die Struktur und Interpretation von Computerprogrammen , verfolgte einen ähnlichen Ansatz und entwickelte einen vereinfachten Dialekt der LISP-Programmiersprache, um als eigener Kontext zu fungieren. Diese Sprache kennen wir jetzt als Schema.

Noch eine sehr gute Arbeit über Informatik, die Elemente von Computersystemen (die eigentlich zu gleichen Teilen aus Computertechnik und Informatik besteht) und sehr kurz ist), befasst sich mit dem grundlegenderen Ansatz des Lehrens der digitalen Logik, aus der die Maschine, die Werkzeuge, aufgebaut werden und die Sprache, bevor Sie elementare Informatik unterrichten.

Also, nein, C ist nicht notwendig für ein Verständnis der Informatik. Was zählt, ist Ihr Verständnis der Kernkonzepte von Algorithmen und ihrer Anwendung.

greyfade
quelle
2

Ich begann eine Karriere in der Programmierung, indem ich vb3 aus den Handbüchern lernte, die mit den mitgelieferten Disketten geliefert wurden. Ich habe etwas Java gelernt und konnte einige respektable Programme produzieren, aber erst als ich C an der Universität studierte, hatte ich das Gefühl, wirklich zu verstehen, was "unter der Haube" vor sich geht. Ich arbeite jetzt nur noch mit .net und mache mir nie wirklich Gedanken über Zeiger, ungültige Adressen oder Überläufe - aber ich verstehe sie, dies informiert über die Entscheidungen, die ich täglich treffe, und einige der alten Schulsachen sind immer noch in modern interpretierten Sprachen, Flaggen vorhanden , bitweise Operationen, Boolesche Logik, alle leistungsfähigen Werkzeuge und sehr effizient.

Lerne C. Es wird dir gut tun. Ich habe jahrelang eine Kopie des c-Programmierhandbuchs aufbewahrt und Kernighan und Ritchie von Anfang bis Ende gelesen. Es spielt keine Rolle, in welcher Sprache Sie am Ende mit Understanding C arbeiten.

Matt
quelle
1

Kann man Informatik lernen, ohne C zu lernen?

Die Antwort ist ja. Ich habe einen Abschluss in CS und musste nicht C, sondern Java lernen. Zumindest in meiner Schule lag der Schwerpunkt auf dem Erlernen der objektorientierten Programmierung, mit einigen Unterweisungen in Assemblersprache, Datenstrukturen und Datenbankdesign.

PhillyNJ
quelle
7
Sind Sie sicher, dass Ihr Abschluss " alle Aspekte" von CS abdeckt?
SK-logic
Ich würde alle notwendigen Aspekte sagen. Kein Abschluss deckt alle Aspekte eines Studiengangs ab. Plus "alles" ist subjektiv.
PhillyNJ
1
Wie definieren Sie "notwendig"? Alles ist alles - was bedeutet, dass alle möglichen CS-Anwendungen abgedeckt sind. Es ist nicht "subjektiv", sondern durchaus quantifizierbar.
SK-logic
Ich definiere "notwendig" in dem Kontext, dass CS das Studium von Computer- und Computertechnologie, Hardware und Software abdeckt und keine spezifische Sprache, die die ursprüngliche Frage beantwortet.
PhillyNJ
Ok, und wie werden Sie die Hardware ohne die Low-Level-Sprachen abdecken? Wie werden Sie die Geschichte der Programmiersprachen (die ein außerordentlich wichtiger Teil von "allen" CS ist) ohne eine solche Schlüsselsprache behandeln? Wie werden Sie die Programmiersprachensemantik ohne mindestens eine Sprache mit Zeigerarithmetik behandeln? So oder so, aber eine Sprache ähnlich wie C muss in jedem umfassenden CS-Lehrplan vorhanden sein.
SK-logic,
0

Es hängt wirklich davon ab, was Sie mit dem, was Sie lernen, machen wollen. Es ist definitiv richtig, dass eine Menge Algorithmen in C oder einer davon abgeleiteten Version angegeben sind. Im Laufe der Jahre habe ich jedoch mehr C ++ -, C # - und Java-Beispiele gesehen. Was CS lehren soll, ist ein allgemeines Verständnis von Computer und daher, wie eine Sprache ausgewählt oder erstellt werden kann, die für die jeweilige Aufgabe geeignet ist.

Es gibt jedoch immer noch viele Leute, deren erste und letzte Sprache eine Variation von C oder Java ist, und nicht alle von ihnen werden die Ausbildung erhalten, um eine bestimmte Sprache zu verstehen, die ein CS-Abschluss bietet. Sogar einige CS-Absolventen haben Probleme mit der Programmierung. Abhängig von Ihrem beruflichen Werdegang müssen Sie möglicherweise die Sprachen gut genug verstehen, um mit ihnen kommunizieren zu können. Wenn Sie an der akademischen Welt festhalten möchten, haben Sie noch mehr Sprachbarrieren, insbesondere in interdisziplinären Bereichen (wo Menschen Prolog, Lisp, Haskell, Mathematica usw. verwenden).

jzx
quelle
-1

Wenn Sie wirklich "alle Aspekte der Informatik" lernen wollen (ehrgeiziger Plan!), Müssen Sie sich mit mehreren verschiedenen Assemblersprachen und mindestens einer HDL auseinandersetzen (und darin das Codieren auf Netzlistenebene üben).

Und als übergeordneter Schritt, um sich diesen wirklich grundlegenden Dingen zu nähern, müsste man etwas wie C oder Pascal aufgreifen, was unvermeidlich ist. Das Überspringen von Schritten auf einer Abstraktionsleiter ist kontraproduktiv.

Jedenfalls bezweifle ich, dass diese Frage überhaupt eine Frage wert ist. Immerhin ist C nur eine winzige Sprache. Sie hätten die Grundlagen in kürzerer Zeit erlernen können, als Sie es verschwendet hätten, darüber nachzudenken, ob Sie C lernen müssen oder nicht.

SK-Logik
quelle