Lohnt es sich, C zu lernen, um ein besseres Verständnis von Betriebssystemen und Computern zu erlangen?

8

Ich arbeite zur Zeit als Actionscript 3 und Php Entwickler. Ich begann mit dem Lernen von PHP und ging dann zu Actionscript 3 und jetzt lerne ich Python. Diese 3 Sprachen sind High-Level-Sprachen, in denen Sie sich keine Sorgen um Low-Level-Speicherverwaltung machen müssen und Dinge wie den zu verwendenden Datentyp für verschiedene Zahlen.

Es fühlt sich an, als würde ich etwas vermissen, obwohl ich drei verschiedene Programmiersprachen kenne. Zum Beispiel weiß ich nicht einmal, was für ein Stack Overflow (Ja, ich weiß, ich sollte mich schämen, da ich diese Frage auf Stackoverflow schreibe) ist in und warum es auftritt. Ich werde solche Dinge nie erfahren, da ich in meiner Branche nie mit solchen Problemen konfrontiert werde.

Also meine Frage an Sie ist ziemlich einfach. Würde ich davon profitieren, C zu lernen, obwohl ich in meinem Beruf nicht damit arbeiten würde?

    
JMax 29.06.2009, 08:27
quelle

18 Antworten

12

Es ist ein guter Schritt, aber es ist, als ob man fragt, ob das Lernen von Italienisch genug ist, um Dantes Göttliche Komödie zu verstehen. Es gibt eine Menge Unterschiede in der OS- und Low-Level-Programmierung, die es in High-Level-Programmen nicht gibt. C ist am Ende des Tages nur eine Sprache.

Ich würde definitiv C lernen, aber ich nutze es, um einige Bücher über Dinge wie Compilerbau, grundlegende Betriebssystemkonzepte usw. zu studieren. Dort lernst du wirklich die Low-Level-Konzepte.

    
Mark Pim 29.06.2009 08:32
quelle
11

Etwas zu lernen ist selten Zeitverschwendung. Und C ist eine ziemlich einfache Sprache zu lernen. Ich habe es kommerziell gelehrt, und wir haben es in 4,5 Tagen geschafft. Also würde ich sagen, versuchen Sie es.

    
anon 29.06.2009 08:30
quelle
6
___ answer1057186 ___

Etwas zu lernen ist selten Zeitverschwendung. Und C ist eine ziemlich einfache Sprache zu lernen. Ich habe es kommerziell gelehrt, und wir haben es in 4,5 Tagen geschafft. Also würde ich sagen, versuchen Sie es.

    
___ answer1057188 ​​___

Ich schlage vor, Sie lesen diesen Artikel von Joel:

Ссылка

Es ist mehr oder weniger ein Vergleich zwischen Java und C / C ++, aber ich denke, es behandelt einige Ihrer Bedenken.

    
___ answer1057217 ___

Als erstes solltest du dich nie schämen, wenn du etwas nicht weißt. Außerdem ist Stack Overflow nicht besonders schwer zu verstehen (die Antwort ist im Namen selbst).

Ich habe immer eine schreckliche Zeit, etwas nur theoretisch zu lernen. Es sei denn, ich kann meine Hände schmutzig machen, ich verstehe das Konzept nicht völlig. Das ist in der Tat, wo C sehr praktisch ist. Sie können über Os Internals lesen & amp; Stack-Überläufe aber nur mit C wären Sie in der Lage, sie in Aktion zu sehen.

C ist eine einfache Sprache zu lernen, aber eine sehr harte Sprache zu meistern (mit all seinen Eigenheiten) .So würde es ein wenig Aufwand erfordern (besonders wenn Sie die fortgeschrittenen Konzepte beherrschen wollen), aber ich spreche aus Erfahrung es ist es total wert.

    
___ answer1057251 ___

Wenn Sie ein ernsthafter Programmierer werden wollen, sollten Sie das unbedingt tun.

Ich schlage sogar vor, sich Assembler anzuschauen. Sie müssen keine echten Programme programmieren, aber ich denke, es ist wichtig zu wissen, wie Kontrollstrukturen und Funktionen in Assembler aussehen. Dies gibt Ihnen ein besseres Verständnis dafür, was wirklich passiert und Sie werden ein besseres Gefühl dafür bekommen, welche Dinge in Hochsprachen teuer sind.

Aber C (so etwas wie ein Assembler-Makro) sollte der erste Schritt sein. Versuchen Sie, möglichst viele Indexfehler (Zugriff auf Array-Elemente außerhalb des Bereichs) und Speicherlecks (Speicherzuweisung, ohne sie nach der Verwendung freizugeben) zu erhalten. Halten Sie Ihren Code komplex genug, damit Sie ihn nicht zu früh finden. ;) Du wirst deine höheren Sprachen danach noch mehr lieben.

Und: Was ich im Hinblick auf das Verständnis von OOP sehr aufschlussreich fand, war die objektorientierte Codierung in einfacher C-Form. Das erfordert etwas Wissen über C:

Ссылка

    
___ answer1057266 ___

Vielleicht. Ich schreibe C ziemlich exklusiv für jetzt, weil ich von der Unterseite arbeite. Ich habe eine Menge Zeit zu töten, bevor ich aufs College gehe, also dachte ich mir: Ich könnte genauso gut (zumindest etwas) in der Architektur der Software versiert sein, bevor ich anfange. Es macht (in einigen Fällen) die höheren Ebenen Konzepte leichter zu lernen, erhöht Ihre Fähigkeit zur Problemlösung, etc. Als ich viel jünger war, lernte ich PHP und VB6. Als ich zu C und Assembly ging, war es für mich am schwierigsten zu begreifen, dass ein "String" kein einzelner Wert war, sondern eine Reihe einzelner Werte - und ich konnte nicht einfach einen Vergleich mit dem anderen machen - ich musste jede Reihe von Zeichen durchlaufen und den Unterschied finden - usw. Kleine Dinge wie diese ließen mich überdenken und neu lernen, wie Computer tatsächlich funktionierten. Ich meine, bevor ich das Ding über Strings rausgefunden habe - ich dachte, Prozessorregister wären völlig nutzlos (wie könnte man irgendwas Nützliches in 32 Bits stecken!?).

Davon abgesehen kann ich über mögliche Vorteile des Lernens auf niedrigerer Ebene plappern, trotz der Tatsache, dass Sie es nie benutzen werden. Aber für mich, egal aus welchem ​​Grund, komme ich meistens aus dem allgemeinen Interesse. Ich denke C macht Spaß, und je mehr ich damit durchkomme, desto besser fühle ich meine Fähigkeiten. Wenn Sie nicht viel Interesse daran haben, Dinge wie Stacküberlauf, Rechenkalkulation, Low-Level-Speicherverwaltung (ungültige oder Nullzeiger, Heap-Korruption und Fragmentierung usw.) usw. zu lernen, dann gibt es keine Garantie für Sie Davon werde ich wirklich profitieren. Aber Sie könnten.

Wenn du C lernst, um etwas über die Architektur zu lernen - und wie Zeug tatsächlich funktioniert unter der Haube - versuche vielleicht, was ich tue. Ich kompiliere häufig zu Assembler-Code, um zu sehen, wie der Computer tatsächlich damit umgeht, was ich von ihm erwarte. Um jeden einzelnen Schritt zu sehen, der für jede Aufgabe genommen wird. Genau so habe ich den Unterschied zwischen %code% und %code% herausgefunden. Der beste Vorteil für Sie wird jedoch sein, zu erkennen, wie schmerzlos höhere Sprachen wirklich sind: P.

Zur Erinnerung: Jeder Prozess erhält einen Call-Stack. Es ist ein Speicherblock, der eine vorbestimmte Größe hat. Es wird hauptsächlich für lokale Variablen verwendet. Jedes Mal, wenn Sie eine lokale Variable erstellen, wird deren Inhalt am Ende des Stapels hinzugefügt - und wenn eine Funktion zurückkehrt (und diese Variablen den Gültigkeitsbereich verlassen), werden diese Daten wieder entfernt. Ein Stapelüberlauf tritt auf, wenn zu viel Material am Ende des Stapels hinzugefügt wird und Sie den zuvor zugewiesenen Speicherplatz überspringen. Es ist in der Regel als Ergebnis der Platzierung von großen Objekten auf dem Stapel oder zu viel Rekursion (eine Funktion, die sich selbst aufruft). Ich denke auch, wenn Sie sich zu sehr in Funktionsaufrufen innerhalb von Funktionsaufrufen verwickeln, was im Grunde dasselbe ist (in diesem Fall) wie das Rekursionsproblem.

    
___ answer1057195 ___

Alles, was Sie brauchen, ist das Programmieren, egal in welcher Sprache. Versuche mindestens eines von jedem Paradigma zu lernen. C ist ein guter Ausgangspunkt.

BTW ... Stapelüberlauf

    
___ answer1057192 ___

Es ist ein guter Schritt, aber es ist, als ob man fragt, ob das Lernen von Italienisch genug ist, um Dantes Göttliche Komödie zu verstehen. Es gibt eine Menge Unterschiede in der OS- und Low-Level-Programmierung, die es in High-Level-Programmen nicht gibt. C ist am Ende des Tages nur eine Sprache.

Ich würde definitiv C lernen, aber ich nutze es, um einige Bücher über Dinge wie Compilerbau, grundlegende Betriebssystemkonzepte usw. zu studieren. Dort lernst du wirklich die Low-Level-Konzepte.

    
___ answer1057301 ___

Sie sollten sich auch die Compiler-Konstruktion ansehen. Es gibt Ihnen einen Einblick in die "Mechanik" unter den Motorhauben, unabhängig von Programmiersprachen oder Programmierparadigmen.

    
___ answer1057400 ___
Als Embedded-Entwickler ist C meine Sprache, aber für mich schmeckt es wie Roastbeef mit Bratkartoffeln und einer guten Soße. Wenn ich heute anfangen würde, gibt es zwei Sprachen, die ich angehen würde; C und C # und vielleicht ein wenig C ++, nur für die nicht verwalteten nativen Anwendungen, die C # nicht selbst bastardisieren wird.

Heutzutage gibt es praktisch keinen Grund mehr, mit Assembler zu arbeiten. C-Compiler und Chip-Design sind so ineinander verschlungen, dass Sie fast nie effizienter Assembler schreiben können als ein C-Compiler. Zusätzlich können Sie das gesamte zugrundeliegende System mit C verstehen.

Nun, vorher klingt das alles romantisch. Lass mich neu formulieren. Du wirst das zugrundeliegende System verstehen müssen, wenn du in C etwas Sinnvolles schreiben willst. Das bedeutet, dass bevor du etwas entfernteres nützlicher als die Ausgabe von "Hello World" bekommst, wirst du eine Menge lesen, eine Menge Fehler machen. Verständnis und mehr Re-Lektüre, weil die Typen, die die Docs schreiben, verstehen, worüber sie reden, aber die Chaps, die die Docs lesen, tun es sonst nicht, sie würden sie nicht lesen.

C-Syntax ist sehr, sehr einfach und "schreiben" ein Programm ist sehr einfach. Die Schwierigkeit besteht darin, die Interaktion zwischen Ihrem Programm und dem zugrundeliegenden Betriebssystem und der Hardware herzustellen. Nichts ist kostenlos in C, aber Aye! eine schöne Sprache ist es.

Mein Ratschlag zum Erlernen jeder Sprache lautet: Finde ein Projekt, das du tun musst, und zwinge dich dazu, die Sprache zu benutzen, die lernen will.

    
___ qstntxt ___

Ich arbeite zur Zeit als Actionscript 3 und Php Entwickler. Ich begann mit dem Lernen von PHP und ging dann zu Actionscript 3 und jetzt lerne ich Python. Diese 3 Sprachen sind High-Level-Sprachen, in denen Sie sich keine Sorgen um Low-Level-Speicherverwaltung machen müssen und Dinge wie den zu verwendenden Datentyp für verschiedene Zahlen.

Es fühlt sich an, als würde ich etwas vermissen, obwohl ich drei verschiedene Programmiersprachen kenne. Zum Beispiel weiß ich nicht einmal, was für ein Stack Overflow (Ja, ich weiß, ich sollte mich schämen, da ich diese Frage auf Stackoverflow schreibe) ist in und warum es auftritt. Ich werde solche Dinge nie erfahren, da ich in meiner Branche nie mit solchen Problemen konfrontiert werde.

Also meine Frage an Sie ist ziemlich einfach. Würde ich davon profitieren, C zu lernen, obwohl ich in meinem Beruf nicht damit arbeiten würde?

    
___ answer1057450 ___

Ich denke, du solltest C lernen.

Nun, anstatt (nur) C zu lernen, sollten Sie K & amp; R2 lesen.

Hier ist eine Wäscheliste, über die K & amp; R2 Ihnen beibringt:

  • C
  • Sortieren
  • Binäre Suchbäume
  • Hashtabellen
  • Speicherzuweisungsalgorithmen
  • Die Von-Neumann-Flachspeichermaschinenarchitektur
  • Systemprogrammierung ( %code% ist --- oder kann gemacht werden - überraschend komplex)
  • Verbindung mit dem Kernel

Wenn Sie C wirklich "bekommen", haben Sie auch leichten Zugang zum blanken Metall; Es wird viel einfacher, den maschinenspezifischen Call-Stack zu erreichen. Sobald Sie die Ähnlichkeit zwischen Funktionszeigern, if-then-else-Blöcken, "goto" und "return" sehen, wird es viel einfacher zu verstehen, wie Pufferüberlauf-Exploits funktionieren.

Learning C ist eine gute Sache. Nicht, weil es Ihnen automatisch alles über die Funktionsweise von Programmen beibringt, sondern weil es Sie zu diesem Wissen hinzieht.

    
___ answer1057321 ___

So wie ich es sehe, ist Ihr Problem "sollte ich eine Sprache lernen, die ich nie benutzen werde", wäre meine Antwort wie viele Antworten "ja".

Sie würden Ihre Programmierfähigkeiten erheblich verbessern und in einer Weise profitieren, die Sie nie verstehen werden, bis Sie Code in anderen Sprachen schreiben und feststellen, dass Sie nicht nur schneller denken, sondern auch einfacheren, saubereren und besseren Code schreiben.

Die drei Sprachen, die Sie kennen, sind alle Skriptsprachen und nicht viel für die Variablen- und Speicherzuweisung. C würde Sie in eine andere Welt und Programmierung führen als Sie bereits kennen.

Überprüfen Sie diesen Link.

P.S. Zum besseren Verständnis des Stack-Überlaufs überprüfen Sie Jonathans Antwort und beziehen Sie sich auf das schöne Bild von sackoverflow.com oben auf der Seite.

    
___ answer1057387 ___

Dies ist eine immerwährende Frage und viele Dinge sind über das Thema verschüttet worden. Die Antwort lautet: Ja.

  • Selbst wenn Sie es nicht täglich nutzen, ist es immer vorteilhaft, auf niedriger Ebene zu wissen, was den Computer antreibt.

  • Sie werden das Wissen (und unter Umständen auch C selbst) häufiger verwenden, als Sie vielleicht denken.

  • Es gibt viele Erfahrungen, die Sie insgesamt zu einem besseren Programmierer machen, auch wenn Sie nicht direkt in den Sprachen programmieren. C ist ein Beispiel. Andere Beispiele sind funktionale Programmierung, Lisp, Assembler und das Schreiben eines Parsers.

C ist auch ziemlich einfach, so dass es einfacher zu lernen ist, als allgemein bekannt ist. Das Buch von K & amp; R ist aus einem bestimmten Grund kompakt. Viele Sprachen wie Python, Lua oder Tcl eignen sich für die Aufnahme von Modulen in C - dies ist oft eine gute Möglichkeit, ein System zu entwickeln.

So wie diese Debatte immer zu lösen scheint: Ja. Lernen Sie C. Sie werden davon viele Vorteile sehen.

    
___ qstnhdr ___ Lohnt es sich, C zu lernen, um ein besseres Verständnis von Betriebssystemen und Computern zu erlangen? ___ answer1057442 ___

Wie andere betont haben, ist es immer etwas wert, etwas Neues zu lernen.

Allerdings als jemand, der C in den letzten paar Jahren gelernt hat; Ich denke, die Antwort auf Ihre Frage hängt davon ab, ob Sie praktische Anwendungen zum Lernen C haben.

In meiner Instanz; Ich genieße C in Server-Programmen, Embedded-Programmierung und grundsätzlich überall, wo Sie so viel wie möglich steuern wollen (ohne weitere Irrsinn in der Montage zu riskieren).

Also mein Vorschlag ist, dass Sie ein Mini-Projekt finden, das Sie interessiert, das sinnvoll wäre, um in C zu entwickeln. Dann lernen Sie, indem Sie tun.

    
___ answer1060678 ___

Ich bin auch ein Actionscript 3-Entwickler (mit etwas Python in geworfen). Learning C ist ein aktuelles Projekt. Ich bin ein wenig in Objective-C eingetaucht und habe meine erste App im AppStore eingereicht, aber ich möchte ein tiefergehendes Verständnis dessen, was ich tue. Ich habe kein großes Interesse daran, einen Compiler zu schreiben oder den Linux-Kernel zu hacken, aber im Grunde genommen ist alles, was ich anfasse, C / C ++ im Kern, also denke ich, dass es sich lohnt, zumindest ein oberflächliches Verständnis der Sprache zu bekommen.

Im Hinblick auf die Nutzung Ihrer bestehenden Erfahrung ist das Alchemy-Projekt ziemlich nett und ermöglicht Ihnen, Ihre Vorteile zu nutzen C / C ++ Bibliotheken in AS3. Es gibt einige aufregende Konsequenzen davon.

Persönlich habe ich ein loses Ziel, jedes Jahr eine Sprache zu lernen. In diesem Jahr ist es Objective-C, aber wenn ich mich damit beschäftige, möchte ich einen Schritt zurück machen und direkt C lernen. Es kann sicherlich nicht schaden und wird dich auf lange Sicht zu einem besseren Programmierer machen.

    
___ answer1057479 ___
  

Zum Beispiel weiß ich nicht einmal, was ein Stack überläuft [... ist ...] und warum er auftritt.

Immer wenn eine Funktion eine andere aufruft, muss sich der Computer merken, wo die Ausführung des Aufrufers war. Diese Information wird in einem Stapel gespeichert: das Aufrufen einer Funktion drückt einen neuen Datensatz mit der Aussage "Rückkehr zu $ ​​HIER, wenn fertig", während das Zurückkommen von einer Funktion die Rückkehradresse aufruft und zu der nächsten Sache nach dem Funktionsaufruf zurückkehrt das wurde gerade von zurückgegeben).

In der Regel (durch das Betriebssystem oder die Sprachenlaufzeit festgelegt) haben Sie nur einen begrenzten Speicherplatz für diesen Stapel. Das Auslassen dieses Speicherplatzes wird als Stack-Überlauf bezeichnet.

Siehe auch Ссылка

    
___ tag123php ___ PHP ist eine weit verbreitete, dynamische, objektorientierte und interpretierte Skriptsprache, die primär für die serverseitige Webentwicklung entwickelt wurde. ___ tag123c ___ C ist eine universelle Computerprogrammiersprache, die für Betriebssysteme, Bibliotheken, Spiele und andere Hochleistungsanwendungen verwendet wird. Dieses Tag sollte bei allgemeinen Fragen zur C-Sprache verwendet werden, wie in der Norm ISO 9899: 2011 definiert. Fügen Sie ggf. ein versionsspezifisches Tag wie c99 oder c90 für Fragen zu älteren Sprachstandards hinzu. C unterscheidet sich von C ++ und es sollte nicht mit dem C ++ - Tag kombiniert werden, wenn ein rationaler Grund fehlt. ___ answer1079058 ___

Die meiste Zeit bist du glücklich damit, etwas zu tun. Aber Sie werden schließlich von, wie zu warum bekommen. Wenn Sie sich fragen, warum Sie etwas tun, kann C Ihnen diese Antwort oft geben, weil es so niedrig ist. Natürlich wird jede andere "rohe" Sprache Ihnen die gleichen Antworten geben. Unter "rohe" verstehe ich eine Sprache, die Ihnen direkten Zugriff auf den Computer ermöglicht und nicht unter einer Vielzahl von API-Ebenen und -Klassen versteckt ist.

Natürlich fragen manche Leute nie, warum ... wie oft genug für sie. Sie sind diejenigen, die nicht lernen wollen, C.

    
___ tag123actionskript3 ___ ActionScript 3 (AS3) ist die OOP-Sprache (Open Object Object Oriented Programming) der Adobe Flash- und AIR-Plattformen. AS3 wird häufig für RIAs, mobile Apps und Desktop-Anwendungen verwendet. (ActionScript 3 ist ein ECMAScript-Dialekt.) ___ answer1063842 ___

Meine Antwort ist: vielleicht. Diese Fragen können Ihnen bei der Entscheidung helfen:

  1. Müssen Sie hart arbeiten? mathematische Probleme mit numerische Methoden (Kalkül, linear Algebra, diff-eq, finite Element Analyse usw.)? Viele der Besten Bibliotheken sind in C geschrieben, und zu verstehen, wie man diese implementiert Algorithmen in einer anderen Sprache würden verlangen Sie, dass Sie C verstehen könnte sie übersetzen.
  2. Müssen Sie kompakte Daten entwickeln? Strukturen, die keine Erinnerung verschwenden? Meine Erfahrung in C ermöglichte mir zu schaffen Sammlung und Zeichenklassen in Java, das viel weniger Speicher als verwendet die Standardklassen in der J2SE-Bibliothek.
  3. Müssen Sie mit Legacy interagieren? Anwendungen? Viele sind in C geschrieben oder C ++.

Es gibt viele andere gute Gründe, um C zu lernen, aber es hängt davon ab, welche Art von Programmierung Sie durchführen wollen und ob es eine Schnittmenge zwischen den Fähigkeiten gibt, die das Lernen C bietet und den Fähigkeiten, die Sie brauchen.

    
___ answer1057291 ___

Die Antwort ist auch einfach: Ja, würden Sie.

Es gibt einige Sprachen, die für jeden Entwickler nützlich sein sollten, da sie wie Meilensteine ​​sind. Ich würde sagen, dass C, Java, PHP zu solchen Sprachen gehören. Gerade jetzt lese ich ein Buch über JavaScript nur für Bildung, obwohl meine Website es überhaupt nicht verwendet und wahrscheinlich nicht.

Wenn es Ihnen gefällt, gehen Sie dafür!

    
___
Cambium 29.06.2009 08:31
quelle
3

Als erstes solltest du dich nie schämen, wenn du etwas nicht weißt. Außerdem ist Stack Overflow nicht besonders schwer zu verstehen (die Antwort ist im Namen selbst).

Ich habe immer eine schreckliche Zeit, etwas nur theoretisch zu lernen. Es sei denn, ich kann meine Hände schmutzig machen, ich verstehe das Konzept nicht völlig. Das ist in der Tat, wo C sehr praktisch ist. Sie können über Os Internals lesen & amp; Stack-Überläufe aber nur mit C wären Sie in der Lage, sie in Aktion zu sehen.

C ist eine einfache Sprache zu lernen, aber eine sehr harte Sprache zu meistern (mit all seinen Eigenheiten) .So würde es ein wenig Aufwand erfordern (besonders wenn Sie die fortgeschrittenen Konzepte beherrschen wollen), aber ich spreche aus Erfahrung es ist es total wert.

    
Aditya Sehgal 29.06.2009 08:39
quelle
2

Wenn Sie ein ernsthafter Programmierer werden wollen, sollten Sie das unbedingt tun.

Ich schlage sogar vor, sich Assembler anzuschauen. Sie müssen keine echten Programme programmieren, aber ich denke, es ist wichtig zu wissen, wie Kontrollstrukturen und Funktionen in Assembler aussehen. Dies gibt Ihnen ein besseres Verständnis dafür, was wirklich passiert und Sie werden ein besseres Gefühl dafür bekommen, welche Dinge in Hochsprachen teuer sind.

Aber C (so etwas wie ein Assembler-Makro) sollte der erste Schritt sein. Versuchen Sie, möglichst viele Indexfehler (Zugriff auf Array-Elemente außerhalb des Bereichs) und Speicherlecks (Speicherzuweisung, ohne sie nach der Verwendung freizugeben) zu erhalten. Halten Sie Ihren Code komplex genug, damit Sie ihn nicht zu früh finden. ;) Du wirst deine höheren Sprachen danach noch mehr lieben.

Und: Was ich im Hinblick auf das Verständnis von OOP sehr aufschlussreich fand, war die objektorientierte Codierung in einfacher C-Form. Das erfordert etwas Wissen über C:

Ссылка

    
Dill 29.06.2009 08:48
quelle
2

Vielleicht. Ich schreibe C ziemlich exklusiv für jetzt, weil ich von der Unterseite arbeite. Ich habe eine Menge Zeit zu töten, bevor ich aufs College gehe, also dachte ich mir: Ich könnte genauso gut (zumindest etwas) in der Architektur der Software versiert sein, bevor ich anfange. Es macht (in einigen Fällen) die höheren Ebenen Konzepte leichter zu lernen, erhöht Ihre Fähigkeit zur Problemlösung, etc. Als ich viel jünger war, lernte ich PHP und VB6. Als ich zu C und Assembly ging, war es für mich am schwierigsten zu begreifen, dass ein "String" kein einzelner Wert war, sondern eine Reihe einzelner Werte - und ich konnte nicht einfach einen Vergleich mit dem anderen machen - ich musste jede Reihe von Zeichen durchlaufen und den Unterschied finden - usw. Kleine Dinge wie diese ließen mich überdenken und neu lernen, wie Computer tatsächlich funktionierten. Ich meine, bevor ich das Ding über Strings rausgefunden habe - ich dachte, Prozessorregister wären völlig nutzlos (wie könnte man irgendwas Nützliches in 32 Bits stecken!?).

Davon abgesehen kann ich über mögliche Vorteile des Lernens auf niedrigerer Ebene plappern, trotz der Tatsache, dass Sie es nie benutzen werden. Aber für mich, egal aus welchem ​​Grund, komme ich meistens aus dem allgemeinen Interesse. Ich denke C macht Spaß, und je mehr ich damit durchkomme, desto besser fühle ich meine Fähigkeiten. Wenn Sie nicht viel Interesse daran haben, Dinge wie Stacküberlauf, Rechenkalkulation, Low-Level-Speicherverwaltung (ungültige oder Nullzeiger, Heap-Korruption und Fragmentierung usw.) usw. zu lernen, dann gibt es keine Garantie für Sie Davon werde ich wirklich profitieren. Aber Sie könnten.

Wenn du C lernst, um etwas über die Architektur zu lernen - und wie Zeug tatsächlich funktioniert unter der Haube - versuche vielleicht, was ich tue. Ich kompiliere häufig zu Assembler-Code, um zu sehen, wie der Computer tatsächlich damit umgeht, was ich von ihm erwarte. Um jeden einzelnen Schritt zu sehen, der für jede Aufgabe genommen wird. Genau so habe ich den Unterschied zwischen char *a = "a string" und char a[] = "a string" herausgefunden. Der beste Vorteil für Sie wird jedoch sein, zu erkennen, wie schmerzlos höhere Sprachen wirklich sind: P.

Zur Erinnerung: Jeder Prozess erhält einen Call-Stack. Es ist ein Speicherblock, der eine vorbestimmte Größe hat. Es wird hauptsächlich für lokale Variablen verwendet. Jedes Mal, wenn Sie eine lokale Variable erstellen, wird deren Inhalt am Ende des Stapels hinzugefügt - und wenn eine Funktion zurückkehrt (und diese Variablen den Gültigkeitsbereich verlassen), werden diese Daten wieder entfernt. Ein Stapelüberlauf tritt auf, wenn zu viel Material am Ende des Stapels hinzugefügt wird und Sie den zuvor zugewiesenen Speicherplatz überspringen. Es ist in der Regel als Ergebnis der Platzierung von großen Objekten auf dem Stapel oder zu viel Rekursion (eine Funktion, die sich selbst aufruft). Ich denke auch, wenn Sie sich zu sehr in Funktionsaufrufen innerhalb von Funktionsaufrufen verwickeln, was im Grunde dasselbe ist (in diesem Fall) wie das Rekursionsproblem.

    
Carson Myers 29.06.2009 08:52
quelle
1

Alles, was Sie brauchen, ist das Programmieren, egal in welcher Sprache. Versuche mindestens eines von jedem Paradigma zu lernen. C ist ein guter Ausgangspunkt.

BTW ... Stapelüberlauf

    
Jonathan 29.06.2009 08:32
quelle
1

Sie sollten sich auch die Compiler-Konstruktion ansehen. Es gibt Ihnen einen Einblick in die "Mechanik" unter den Motorhauben, unabhängig von Programmiersprachen oder Programmierparadigmen.

    
ftl 29.06.2009 09:00
quelle
1
Als Embedded-Entwickler ist C meine Sprache, aber für mich schmeckt es wie Roastbeef mit Bratkartoffeln und einer guten Soße. Wenn ich heute anfangen würde, gibt es zwei Sprachen, die ich angehen würde; C und C # und vielleicht ein wenig C ++, nur für die nicht verwalteten nativen Anwendungen, die C # nicht selbst bastardisieren wird.

Heutzutage gibt es praktisch keinen Grund mehr, mit Assembler zu arbeiten. C-Compiler und Chip-Design sind so ineinander verschlungen, dass Sie fast nie effizienter Assembler schreiben können als ein C-Compiler. Zusätzlich können Sie das gesamte zugrundeliegende System mit C verstehen.

Nun, vorher klingt das alles romantisch. Lass mich neu formulieren. Du wirst das zugrundeliegende System verstehen müssen, wenn du in C etwas Sinnvolles schreiben willst. Das bedeutet, dass bevor du etwas entfernteres nützlicher als die Ausgabe von "Hello World" bekommst, wirst du eine Menge lesen, eine Menge Fehler machen. Verständnis und mehr Re-Lektüre, weil die Typen, die die Docs schreiben, verstehen, worüber sie reden, aber die Chaps, die die Docs lesen, tun es sonst nicht, sie würden sie nicht lesen.

C-Syntax ist sehr, sehr einfach und "schreiben" ein Programm ist sehr einfach. Die Schwierigkeit besteht darin, die Interaktion zwischen Ihrem Programm und dem zugrundeliegenden Betriebssystem und der Hardware herzustellen. Nichts ist kostenlos in C, aber Aye! eine schöne Sprache ist es.

Mein Ratschlag zum Erlernen jeder Sprache lautet: Finde ein Projekt, das du tun musst, und zwinge dich dazu, die Sprache zu benutzen, die lernen will.

    
EndsOfInvention 29.06.2009 09:29
quelle
1

Ich denke, du solltest C lernen.

Nun, anstatt (nur) C zu lernen, sollten Sie K & amp; R2 lesen.

Hier ist eine Wäscheliste, über die K & amp; R2 Ihnen beibringt:

  • C
  • Sortieren
  • Binäre Suchbäume
  • Hashtabellen
  • Speicherzuweisungsalgorithmen
  • Die Von-Neumann-Flachspeichermaschinenarchitektur
  • Systemprogrammierung ( wc ist --- oder kann gemacht werden - überraschend komplex)
  • Verbindung mit dem Kernel

Wenn Sie C wirklich "bekommen", haben Sie auch leichten Zugang zum blanken Metall; Es wird viel einfacher, den maschinenspezifischen Call-Stack zu erreichen. Sobald Sie die Ähnlichkeit zwischen Funktionszeigern, if-then-else-Blöcken, "goto" und "return" sehen, wird es viel einfacher zu verstehen, wie Pufferüberlauf-Exploits funktionieren.

Learning C ist eine gute Sache. Nicht, weil es Ihnen automatisch alles über die Funktionsweise von Programmen beibringt, sondern weil es Sie zu diesem Wissen hinzieht.

    
Jonas Kölker 29.06.2009 09:43
quelle
0

So wie ich es sehe, ist Ihr Problem "sollte ich eine Sprache lernen, die ich nie benutzen werde", wäre meine Antwort wie viele Antworten "ja".

Sie würden Ihre Programmierfähigkeiten erheblich verbessern und in einer Weise profitieren, die Sie nie verstehen werden, bis Sie Code in anderen Sprachen schreiben und feststellen, dass Sie nicht nur schneller denken, sondern auch einfacheren, saubereren und besseren Code schreiben.

Die drei Sprachen, die Sie kennen, sind alle Skriptsprachen und nicht viel für die Variablen- und Speicherzuweisung. C würde Sie in eine andere Welt und Programmierung führen als Sie bereits kennen.

Überprüfen Sie diesen Link.

P.S. Zum besseren Verständnis des Stack-Überlaufs überprüfen Sie Jonathans Antwort und beziehen Sie sich auf das schöne Bild von sackoverflow.com oben auf der Seite.

    
Secko 29.06.2009 09:06
quelle
0

Dies ist eine immerwährende Frage und viele Dinge sind über das Thema verschüttet worden. Die Antwort lautet: Ja.

  • Selbst wenn Sie es nicht täglich nutzen, ist es immer vorteilhaft, auf niedriger Ebene zu wissen, was den Computer antreibt.

  • Sie werden das Wissen (und unter Umständen auch C selbst) häufiger verwenden, als Sie vielleicht denken.

  • Es gibt viele Erfahrungen, die Sie insgesamt zu einem besseren Programmierer machen, auch wenn Sie nicht direkt in den Sprachen programmieren. C ist ein Beispiel. Andere Beispiele sind funktionale Programmierung, Lisp, Assembler und das Schreiben eines Parsers.

C ist auch ziemlich einfach, so dass es einfacher zu lernen ist, als allgemein bekannt ist. Das Buch von K & amp; R ist aus einem bestimmten Grund kompakt. Viele Sprachen wie Python, Lua oder Tcl eignen sich für die Aufnahme von Modulen in C - dies ist oft eine gute Möglichkeit, ein System zu entwickeln.

So wie diese Debatte immer zu lösen scheint: Ja. Lernen Sie C. Sie werden davon viele Vorteile sehen.

    
quelle
0

Die Antwort ist auch einfach: Ja, würden Sie.

Es gibt einige Sprachen, die für jeden Entwickler nützlich sein sollten, da sie wie Meilensteine ​​sind. Ich würde sagen, dass C, Java, PHP zu solchen Sprachen gehören. Gerade jetzt lese ich ein Buch über JavaScript nur für Bildung, obwohl meine Website es überhaupt nicht verwendet und wahrscheinlich nicht.

Wenn es Ihnen gefällt, gehen Sie dafür!

    
Malcolm 29.06.2009 08:57
quelle
0

Wie andere betont haben, ist es immer etwas wert, etwas Neues zu lernen.

Allerdings als jemand, der C in den letzten paar Jahren gelernt hat; Ich denke, die Antwort auf Ihre Frage hängt davon ab, ob Sie praktische Anwendungen zum Lernen C haben.

In meiner Instanz; Ich genieße C in Server-Programmen, Embedded-Programmierung und grundsätzlich überall, wo Sie so viel wie möglich steuern wollen (ohne weitere Irrsinn in der Montage zu riskieren).

Also mein Vorschlag ist, dass Sie ein Mini-Projekt finden, das Sie interessiert, das sinnvoll wäre, um in C zu entwickeln. Dann lernen Sie, indem Sie tun.

    
Andrioid 29.06.2009 09:41
quelle
0
  

Zum Beispiel weiß ich nicht einmal, was ein Stack überläuft [... ist ...] und warum er auftritt.

Immer wenn eine Funktion eine andere aufruft, muss sich der Computer merken, wo die Ausführung des Aufrufers war. Diese Information wird in einem Stapel gespeichert: das Aufrufen einer Funktion drückt einen neuen Datensatz mit der Aussage "Rückkehr zu $ ​​HIER, wenn fertig", während das Zurückkommen von einer Funktion die Rückkehradresse aufruft und zu der nächsten Sache nach dem Funktionsaufruf zurückkehrt das wurde gerade von zurückgegeben).

In der Regel (durch das Betriebssystem oder die Sprachenlaufzeit festgelegt) haben Sie nur einen begrenzten Speicherplatz für diesen Stapel. Das Auslassen dieses Speicherplatzes wird als Stack-Überlauf bezeichnet.

Siehe auch Ссылка

    
Jonas Kölker 29.06.2009 09:51
quelle
0

Ich bin auch ein Actionscript 3-Entwickler (mit etwas Python in geworfen). Learning C ist ein aktuelles Projekt. Ich bin ein wenig in Objective-C eingetaucht und habe meine erste App im AppStore eingereicht, aber ich möchte ein tiefergehendes Verständnis dessen, was ich tue. Ich habe kein großes Interesse daran, einen Compiler zu schreiben oder den Linux-Kernel zu hacken, aber im Grunde genommen ist alles, was ich anfasse, C / C ++ im Kern, also denke ich, dass es sich lohnt, zumindest ein oberflächliches Verständnis der Sprache zu bekommen.

Im Hinblick auf die Nutzung Ihrer bestehenden Erfahrung ist das Alchemy-Projekt ziemlich nett und ermöglicht Ihnen, Ihre Vorteile zu nutzen C / C ++ Bibliotheken in AS3. Es gibt einige aufregende Konsequenzen davon.

Persönlich habe ich ein loses Ziel, jedes Jahr eine Sprache zu lernen. In diesem Jahr ist es Objective-C, aber wenn ich mich damit beschäftige, möchte ich einen Schritt zurück machen und direkt C lernen. Es kann sicherlich nicht schaden und wird dich auf lange Sicht zu einem besseren Programmierer machen.

    
Joel Hooks 29.06.2009 21:30
quelle
0

Meine Antwort ist: vielleicht. Diese Fragen können Ihnen bei der Entscheidung helfen:

  1. Müssen Sie hart arbeiten? mathematische Probleme mit numerische Methoden (Kalkül, linear Algebra, diff-eq, finite Element Analyse usw.)? Viele der Besten Bibliotheken sind in C geschrieben, und zu verstehen, wie man diese implementiert Algorithmen in einer anderen Sprache würden verlangen Sie, dass Sie C verstehen könnte sie übersetzen.
  2. Müssen Sie kompakte Daten entwickeln? Strukturen, die keine Erinnerung verschwenden? Meine Erfahrung in C ermöglichte mir zu schaffen Sammlung und Zeichenklassen in Java, das viel weniger Speicher als verwendet die Standardklassen in der J2SE-Bibliothek.
  3. Müssen Sie mit Legacy interagieren? Anwendungen? Viele sind in C geschrieben oder C ++.

Es gibt viele andere gute Gründe, um C zu lernen, aber es hängt davon ab, welche Art von Programmierung Sie durchführen wollen und ob es eine Schnittmenge zwischen den Fähigkeiten gibt, die das Lernen C bietet und den Fähigkeiten, die Sie brauchen.

    
Paul Chernoch 30.06.2009 13:58
quelle
0

Die meiste Zeit bist du glücklich damit, etwas zu tun. Aber Sie werden schließlich von, wie zu warum bekommen. Wenn Sie sich fragen, warum Sie etwas tun, kann C Ihnen diese Antwort oft geben, weil es so niedrig ist. Natürlich wird jede andere "rohe" Sprache Ihnen die gleichen Antworten geben. Unter "rohe" verstehe ich eine Sprache, die Ihnen direkten Zugriff auf den Computer ermöglicht und nicht unter einer Vielzahl von API-Ebenen und -Klassen versteckt ist.

Natürlich fragen manche Leute nie, warum ... wie oft genug für sie. Sie sind diejenigen, die nicht lernen wollen, C.

    
Xetius 03.07.2009 12:01
quelle

Tags und Links