it-swarm-eu.dev

Ich kenne C. nicht. Und warum sollte ich es lernen?

Meine erste Programmiersprache war PHP ( keuchen ). Danach begann ich zu arbeiten JavaScript. Ich habe kürzlich in C # gearbeitet.

Ich habe noch nie niedrige oder mittlere Sprachen wie C gesehen.

Der allgemeine Konsens in der gesamten Programmiergemeinschaft ist, dass "ein Programmierer, der ehrlich gesagt nichts wie C gelernt hat, einfach nicht mit Programmierkonzepten wie Zeigern, Datentypen, Übergabe von Werten als Referenz usw. umgehen kann".

Ich stimme nicht zu. Ich argumentiere das:

  1. Da Hochsprachen leicht zugänglich sind, tauchen mehr "Nicht-Programmierer" ein und machen ein Chaos
  2. Um wirklich etwas in einer Hochsprache zu erledigen, muss man dieselben ähnlichen Konzepte verstehen, über die die meisten Befürworter von "Lernen auf niedrigem Niveau zuerst" evangelisieren.

Einige Leute müssen C kennen; Diese Leute haben Jobs, bei denen sie Code auf niedriger bis mittlerer Ebene schreiben müssen. Ich bin sicher, C ist großartig und ich bin sicher, dass es ein paar schlechte Programmierer gibt, die C kennen.

Warum die Voreingenommenheit? Wenn ich als guter, ehrlicher und hungriger Programmierer C lernen müsste (aus einem unvorhergesehenen Grund), würde ich C lernen. Sollten sich gute Programmierer angesichts der Vielzahl der Sprachen nicht darauf konzentrieren, zu lernen, was uns voranbringt? Sollten wir nicht lernen, was uns interessiert? Sollten wir unsere endliche Zeit nicht nutzen, um vorwärts zu bewegen? Warum sind einige Programmierer damit nicht einverstanden?

Ich glaube, dass das Streben nach Exzellenz in dem, was Sie tun, das grundlegende deterministische Merkmal zwischen guten und schlechten Programmierern ist.

Hat jemand Beispiele aus der Praxis, wie etwas, das in einer Hochsprache geschrieben wurde - beispielsweise Java, Pascal, PHP oder JavaScript - wirklich von Vorkenntnissen in C profitiert hat? Beispiele wären sehr dankbar.

58
Stephen

Der Vorteil von C ist, dass Sie eine sehr gute Vorstellung davon haben, wie ein Computer funktioniert. Nicht nur, wie Ihr Programmiermodell funktioniert, sondern auch, wie der Speicher aufgebaut ist und dergleichen.

Die einzige Ebene unter C ist die Assembly, die von einer bestimmten CPU gesprochen wird.

(Ich möchte hinzufügen, dass Sie mit C auch erkennen können, wie viel weniger Arbeit Sie in einer höheren Sprache erledigen müssen. Und hoffentlich eine Wertschätzung der Kosten, die mit der Arbeit in dieser höheren Sprache verbunden sind.)

113
Frank Shearar

Ich glaube nicht, dass eine der Antworten hier wirklich das ist, wonach das OP gesucht hat, also werde ich meine eigene Meinung einbringen.

Schau, ich bin ein nicht entschuldigender C-Snob. Meine Einstellung ist, dass wenn Sie C nicht kennen, Sie bis zu einem gewissen Grad nicht wirklich wissen, was Sie als Programmierer tun. Ich denke also, ich bin die Art von "voreingenommener" Person, von der Sie hier sprechen.

In der Praxis hindert Sie jedoch nicht unbedingt daran, wirklich großartige, nützliche Software zu entwickeln, ob Sie wirklich wissen, was Sie als Programmierer tun oder nicht mit hochrangigen Werkzeugen. Ich meine, der Schöpfer von Stack Overflow, Jeff Atwood, kennt C anscheinend nicht einmal, und dennoch würde ich sagen, dass Stack Overflow eine verdammt gute Webanwendung ist.

Ob Sie C (oder C++ oder Assembly) lernen möchten oder nicht, hängt davon ab, welcher Programmierertyp Sie sein möchten. Wenn Sie nur coole Web-Apps oder Business-Apps entwickeln möchten, ist das in Ordnung - Sie müssen C nicht wirklich lernen. Aber wenn Sie wirklich Excel zu welchem ​​Zweck möchten Sie tun dies - wenn Sie an wirklich coolen Projekten arbeiten möchten, die den Stand der Technik vorantreiben, müssen Sie sich als Programmierer wirklich ernst genug nehmen um wirklich zu verstehen , wie Computer funktionieren. Da C im Wesentlichen die Verkehrssprache des Betriebssystems ist, sowie die Sprache, die fast alles andere unterstützt (vom Linux-Kernel bis zu den meisten Java VMs, bis zum Python) = und Ruby Interpreter, SQL-Datenbanken, Webserver und nahezu jeder Gerätetreiber), ein tiefes Verständnis der Sprache reicht weit.

Ganz zu schweigen davon, dass die Kenntnis von C (oder C++) eine große Chance bietet, zu großen Open-Source-Projekten beizutragen, die Millionen (oder Hunderte von Millionen) Menschen betreffen. Möchten Sie an der Verbesserung des Interpreters Python) oder des Chromium-Webbrowsers arbeiten? Nun, Sie müssen C für den ersten und C++ für den letzteren kennen.

Deshalb ist es völlig falsch, C mit toten natürlichen Sprachen wie Latein oder veralteten Technologien wie Pferd und Wagen zu vergleichen. Ein großer Teil unserer Software-Infrastruktur des 21. Jahrhunderts wird mit C-Code betrieben, weshalb C heute nach wie vor relevant ist.

Ob Sie also C lernen sollten oder nicht, hängt wirklich davon ab, was Sie von Ihrer Karriere als Programmierer erwarten.

72
Charles Salvia

Eine praktische Faustregel lautet, dass Sie mindestens eine Abstraktionsebene verstehen müssen, die unter der Ebene liegt, in der Sie normalerweise arbeiten. Beachten Sie, dass Ihr PHP oder JavaScript-Interpreter möglicherweise tatsächlich in C oder C++ implementiert ist. Schließlich werden Sie einen Fehler im Interpreter oder sogar einen C-Laufzeitfehler feststellen. Wenn Sie C nicht verstehen, können Sie nur einen Fehlerbericht an den Betreuer senden, in der Hoffnung, dass er ihn reproduzieren und sich darum kümmern kann. und dann drehen Sie Ihre Daumen. Wenn Sie C kennen, können Sie ihnen genau sagen, wo das Problem liegt und was es ist.

Dies bedeutet auch, dass Sie, wenn Sie in C/C++ arbeiten, zumindest Assembly auf Ihrer Plattform lesen können sollten.

Was das Erlernen von C betrifft, wenn Sie es benötigen: Meine Beobachtung ist, dass die meisten Programmierer Perl/Python/Javascript bei Bedarf lernen können, aber Assembler/C/LISP scheinen viel mehr Zeit zu benötigen, sodass es sich lohnt, zumindest einige Grundlagen vor der Notwendigkeit zu lernen entsteht.

12

Ich bin nicht der Meinung, dass Sie C zuerst lernen müssen, aber ich glaube, Sie sollten C irgendwann lernen. Alle Abstraktionen sind undicht und das Verständnis von C erleichtert das Verständnis dessen, was wirklich passiert, wenn Sie eine ausgefallene Abstraktion auf hoher Ebene verwenden. Trotzdem denke ich auch, dass alle ernsthaften Programmierer aus dem gleichen Grund lernen sollten, zumindest Assembler zu lesen.

Das Erlernen dieser Konzepte auf niedriger Ebene bietet eine überraschende Möglichkeit, über Dinge auf hoher Ebene nachzudenken. In C++ und D werden Standardargumente für virtuelle Funktionen beispielsweise durch den statischen Typ (Kompilierungszeit) des Objekts und nicht durch den dynamischen Typ (Laufzeit) bestimmt. Dies ist nur dann sinnvoll, wenn Sie verstehen, wie vtables und Aufrufkonventionen funktionieren und warum es äußerst schwierig ist, virtuelle Funktionen auf die entgegengesetzte Weise zu implementieren.

7
dsimcha

Die Tendenz ist eine des Status quo. In den alten Tagen (1980er und früher) war C/C++ eine wichtige Voraussetzung für Leistungsanwendungen. Das hat sich geändert, aber ältere Entwickler kommen im Allgemeinen aus diesem alten Hintergrund und sehen die Dinge in diesem Kontext.

Für die eigentliche Entwicklung werden andere Sprachen are verwendet - C # ist ebenso beliebt wie Java, während PHP und Python sind beliebt für) interne Projekte und es ist immer nützlich, jemanden mit mindestens Grundkenntnissen in diesem Bereich zur Hand zu haben, falls Sie sich für ein Open Source-Projekt entscheiden PHP Projekt für beispielsweise Ihr Bug-Tracking-System Die Spezifikationen scheinen immer noch von dieser Standardvorlage zu stammen, die vor 25 Jahren geschrieben wurde.

7
JohnL

Was für ein tolles Schneckenfest! (Wie sie angeblich sagen: Ist das ein privater Kampf oder kann sich jemand beteiligen?)

Ich war Professor, und was ich (nach einigem Ausprobieren) fand, war, dass es viel einfacher war, Studenten durch die komplizierten Konzepte der Programmierung zu führen, wenn sie auf einer Basisebene verstanden, was ein Computer tat. Nicht in allen Details, aber im Grundprinzip, wie Speicher, Anweisungen usw. Was mir an C gefällt, ist die Nähe zur Maschine.

Das heißt nicht, dass andere Lehrer an den gleichen Ort kamen. Sie begannen in der Hochsprache (BASIC :-) und gingen von dort aus ohne offensichtliche negative Auswirkungen weiter.

Unterm Strich, Stephen, könnten Sie Recht haben. Ich würde es nicht glauben, aber ich habe mich vorher geirrt.

6
Mike Dunlavey

So sehr ich es hasse, den obligatorischen Joel-Blog-Beitrag zu veröffentlichen, stimme ich ihm zu hier . C ist die Verkehrssprache der Programmierung. Ich kann mir keine Hochsprache vorstellen, die irgendwie nicht mit ihr kommunizieren kann. Aus diesem Grund ist C immer noch eine beliebte Wahl für die Programmierung von Systemen. Ohne C kann man einfach nicht mit einigen Dingen auf Betriebssystemebene kommunizieren.

Was planen Sie außerdem, wenn Ihre Hochsprache nicht schnell genug ist? Es ist besonders wichtig zu wissen, wie man C schreibt, wenn Sie eine dynamisch typisierte Hochsprache wie Ruby, Python oder PHP verwenden. Aber auch Java und C # -Programmierer müssen von Zeit zu Zeit auf C herunterfallen.

6
Jason Baker

Ich denke, das ist ein Fortschritt.

Vor zwanzig Jahren war die übliche Weisheit, dass man Assembler lernen musste, um zu verstehen, was man von höheren Sprachen wie C erhielt (weshalb ich mit VAX Macro eine Assembler-Klasse am College belegen musste; rate , wie nützlich sich das nach dem Abschluss herausstellte).

Es gibt einen Aberglauben, dass C, weil es etwas schwer zu lernen ist und fast keine Abstraktionen liefert (Zeiger und Byte-Streams sind so ziemlich alles), es lernen wird Machen Sie sich irgendwie zu einem besseren Programmierer oder geben Sie Ihnen einen besseren Einblick in die Funktionsweise auf Hardwareebene.

Dies ist nicht (notwendigerweise) wahr. Standard C bringt Sie dem Metall nicht näher als jedes andere 3GL (Pascal, Fortran usw.). Einige C -Implementierungen bieten möglicherweise Hooks, mit denen Sie besser auf einige Bereiche zugreifen können. Im Allgemeinen sind nackte Zeiger jedoch so nah wie möglich, was nicht der Fall ist überhaupt schließen. Sie können beispielsweise nicht direkt auf Register oder Statuswörter zugreifen.

Am Ende kommt es auf Opcodes und Adressierungsmodi an. Wenn Sie also wirklich daran interessiert sind, wie die Dinge auf der unteren Ebene funktionieren, sind Sie ' Es wäre besser, Assembler über C zu lernen.

Das Lernen von C allein macht Sie (nicht unbedingt) zu einem besseren Programmierer. Es wird Ihnen jedoch definitiv eine Wertschätzung für tatsächliche Zeichenfolgentypen und standardisierte Containerbibliotheken geben.

4
John Bode

Prokoativ gefragt: Bitten Sie um Bestätigung, dass Sie C nicht lernen müssen? Wenn Sie pure C lernen (nicht unbedingt C++), erhalten Sie ein gründliches Verständnis des Ausführungsmodells eines Computers. Besonders über Speicher und Zuordnung. Dieses Zeug ist auch für Leute wichtig, die in höheren Sprachen programmieren.

Für einen PHP Programmierer ist es nur weniger transparent, wie Code auf dem gegebenen Computer ausgeführt wird. Für den PHP Programmierer ist dies möglicherweise nicht von Bedeutung, da die Netzwerkübertragung der Flaschenhals ist) in der Anwendung usw.

Normales PHP/Python/C # hat viele Abstraktionsschichten zwischen der Sprache und der CPU. Diese Schichten sind so dick, dass Sie nicht durch sie hindurchsehen können. Wenn Sie C lernen, befindet sich zwischen Ihnen, der CPU und dem Betriebssystem ein dünnes Blatt. Das macht die Programmierung nicht einfacher (und vielleicht sogar nicht besser). Aber Sie können tatsächlich lernen, wie die CPU funktioniert. Sobald Sie das "mittlere" C kennen, können Sie dieses Wissen tatsächlich mit der höheren Sprache verknüpfen. Dies ist der unmittelbare Vorteil, den Sie erhalten.

Meiner Meinung nach sollte ein Programmierer immer einige Zeit damit verbringen, verschiedene Programmierkonzepte zu lernen. Es lohnt sich auf jeden Fall, einen Blick auf C zu werfen, aber auch auf einen Blick auf noch höhere Programmiersprachen wie Clojure, Haskell, Prolog.

Sie müssen kein Meister in diesen Bereichen sein, sie werden Ihnen nur die Lektion erteilen, dass "Ebenen" von Programmiersprachen nicht binär sind, aber es gibt viele Ebenen. Lernen Sie sie von oben bis unten kennen (Assembler). Es wird Sie zu einem besseren Programmierer machen.

2
wirrbel

Sie müssen genug C kennen, um in C geschriebenen Code lesen zu können, da in der Sprache eine große Menge sehr wichtigen Codes geschrieben ist. Das ist ungefähr alles, was Sie davon abhalten werden, ein gründliches Handbuch zu diesem Thema durchzuarbeiten (ich habe Kochans "Programmierung in C" verwendet), ohne tatsächlich in der Sprache codieren zu müssen. Sollten Sie jemals in eine Situation geraten, in der Sie die Sprache ausgiebig verwenden müssen, haben Sie eine gute Basis, auf der Sie aufbauen können. Sie möchten wahrscheinlich so etwas wie Duntemanns Versammlungsbuch studieren, wenn die Maschine für Sie eine abstraktierte Black Box ist. Ich empfehle auch Petzolds "Code".

Abgesehen davon - Grundkenntnisse in C und grundlegende Vertrautheit mit der zugrunde liegenden Maschine - sollten Sie Ihre Lernzeit am besten mit den realen Dingen wie SICP, TCP/IP Illustrated oder Büchern über konkrete Mathematik, Algorithmen oder Datenstruktur verbringen . Das echte Zeug.

Verbringen Sie viel Zeit mit dem Lernen von C beim Codieren in PHP ist die Opportunitätskosten einfach nicht wert. Es gibt hilfreichere Dinge zu lernen. C ist wirklich nur eine andere Sprache, die Sie nur durch Lernen gut lernen können und verwenden, kann aber abholen, wenn Sie müssen.

Schwitzen Sie das harte Zeug.

2
naftalimich

Eine Sprache ist ein Werkzeug. Wenn Sie nur Webseiten und ähnliches schreiben müssen, können Sie sicher davonkommen, ohne C lernen zu müssen, genauso wie wenn Sie nur Plastikmodellbausätze herstellen, brauchen Sie nur ein scharfes Messer und Kleber, a Schraubenschlüssel ist normalerweise nicht erforderlich.

Ich schreibe Code für eingebettete Systeme mit stark eingeschränkten Speicherressourcen (der größte, den ich in letzter Zeit gemacht habe, ist 16 KByte und das war RIESIG). In diesem Markt sind dann C oder Assembler die einzigen Optionen, und jede der flauschigen höheren Sprachen funktioniert einfach nicht.

2
uɐɪ

Nach meiner Erfahrung war C/C++ für eine Weile ein guter Puffer, der die guten Programmierer von den VB6-Codierern trennte. Nachdem ich fünf ungerade Jahre C/C++ gemacht hatte, bekam ich einen Job in VB6. Ich war erstaunt über die Qualität (oder das Fehlen) der Codierer. Sie hatten wenig Interesse an den Eingeweiden der Sprache, am Design oder an der Leistung. Als das Unternehmen zu .Net wechselte, verwendeten die C/C++ - und die .NET-Codierer leider dieselben Tools. Die VB-Codierer waren noch schlechtere VB.Net-Codierer. Die Situation verschlechterte sich, als die gesamte Entwicklung auf ASP.NET überging. Plötzlich war jeder, der ein Steuerelement ziehen und ablegen konnte, ein Programmierer.

Auf dem Arbeitsmarkt gab es jedoch nicht viel zu unterscheiden zwischen den Hardcore-Programmierern (ex C/C++) und den Touristen.

Wenn Sie also C oder C++ in Ihrem Lebenslauf haben, können Sie sich vom Riff-Raff unterscheiden.

2
dave

C (und möglicherweise C++) ist das Meer, in dem Sie schwimmen. Das Betriebssystem, auf dem Ihr Code ausgeführt wird, ist wahrscheinlich in C (und C++) codiert. Ihre native API für den Zugriff auf Betriebssystemdienste befindet sich also in C.

Wenn Sie darauf verzichten können, ohne zu wissen, was sich unten befindet, müssen Sie C nicht kennen. Die meisten Programmierer müssen jedoch irgendwann in ihrem Leben in niedrigere Ebenen eintauchen.

Es basiert auch auf Ihrer Spezialisierung auf Entwicklungsbereiche. Zum Beispiel muss ein Webentwickler, der HTML, Javascript und einige serverseitige Skripte schreibt, möglicherweise nie etwas über C wissen, ein verteilter System- oder Spieleentwickler jedoch.

Es tut nie weh, ein paar Wochen damit zu verbringen, etwas zu lernen, das für Ihren Beruf so grundlegend ist.

1
Mert Akcakaya

C ist die Sprache, in der andere Sprachen geschrieben werden. So können Sie mit der CPU und anderer Hardware so vertraut werden, wie Sie möchten.

Wenn Sie C nicht kennen, wissen Sie nicht, wie andere Sprachen die Ergebnisse erzielen, die sie erzielen.

Abstraktion ist natürlich ein wichtiges Konzept, und nicht jeder muss wissen, wie sein Wahlrahmen die versprochenen Ergebnisse erzielt. Sie müssen nicht 20 Jahre damit verbringen, C zu schreiben oder darüber nachzudenken, was mit Ihren vtables passiert, wenn Sie Mehrfachvererbung verwenden, um guten Code zu schreiben.

Jetzt können Sie ein Auto fahren, ohne zu verstehen, wie ein 4-Takt-Motor funktioniert, oder ohne einen Schalthebel (Schaltgetriebe) verwenden zu können.

Wenn Sie jedoch verstehen, was unter der Haube vor sich geht, können Sie von Zeit zu Zeit außergewöhnliche Ergebnisse erzielen, die jemand ohne dieses Wissen nur schwer replizieren kann.

1
Bill Michell

C hat viele Vorteile:

  1. C ist eine einfache Sprache. Mit c können Sie Kernel und Treiber entwickeln.
  2. C ist die schnellste Sprache. Viele Power-Software werden von c entwickelt. Zum Beispiel: memcached, redis, nginx, Apache, mysql usw.
  3. C ist eine plattformübergreifende Sprache. Das von c entwickelte Programm kann auf jeder Plattform ausgeführt werden. Andere plattformübergreifende Sprachen können dies nicht. Java, Python, PHP usw. können nicht auf der iOS-Plattform ausgeführt werden.
  4. C++ kann nicht auf vielen eingebetteten Systemen ausgeführt werden.
1
Edward Shen