Low-Level-Programmierung - Was bringt mir das? [geschlossen]


32

Seit Jahren beschäftige ich mich mit "low level" Sprachen. Für mich bedeutet das C und Montage. Allerdings hatte ich noch keine Zeit dafür und war es auch NIE nötig.

Jetzt, da ich keine Notwendigkeit sehe, sollte ich entweder nur einen Zeitpunkt festlegen, an dem ich das Thema studieren werde, oder den Plan für immer fallen lassen.

Meine Position

In den letzten 4 Jahren habe ich mich auf "Webtechnologien" konzentriert, die sich möglicherweise ändern, und ich bin ein Anwendungsentwickler, der sich wahrscheinlich nicht ändern wird.

In der Anwendungsentwicklung denke ich, dass Benutzerfreundlichkeit das Wichtigste ist. Sie schreiben Anwendungen, die von Benutzern "konsumiert" werden sollen. Je benutzerfreundlicher diese Anwendungen sind, desto mehr Wert haben Sie erzeugt.

Um eine gute Bedienbarkeit zu erreichen, halte ich die folgenden Dinge für realisierbar

  • Gutes Design : Durchdachte Funktionen, auf die über eine durchdachte Benutzeroberfläche zugegriffen werden kann.
  • Richtigkeit : Das beste Design ist nichts wert, wenn es nicht richtig umgesetzt wird.
  • Flexibilität : Eine Anwendung A sollte sich ständig weiterentwickeln, damit die Benutzer nicht zu einer anderen Anwendung B wechseln müssen, die neue Funktionen hat, die A implementieren könnte. Anwendungen, die sich mit demselben Problem befassen, sollten sich nicht in den Funktionen, sondern in der Philosophie unterscheiden.
  • Leistung : Leistung trägt zu einer guten Benutzererfahrung bei. Eine Anwendung ist idealerweise immer ansprechbar und erledigt ihre Aufgaben relativ schnell (basierend auf ihrer Häufigkeit). Der Wert der Leistungsoptimierung über den Punkt hinaus, an dem er vom Benutzer wahrgenommen wird, ist fraglich.

Ich denke, Low-Level-Programmierung wird mir dabei nicht weiterhelfen, abgesehen von der Leistung. Das Schreiben einer ganzen App in einer einfachen Sprache, um die Leistung zu verbessern, ist für mich jedoch eine vorzeitige Optimierung.

Meine Frage

Was könnte mir die Programmierung auf niedrigem Niveau beibringen, welche anderen Sprachen würden mich nicht unterrichten? Vermisse ich etwas oder ist es nur eine Fähigkeit, die für die Anwendungsentwicklung von sehr geringem Nutzen ist? Bitte haben Sie Verständnis dafür, dass ich den Wert von C und Assembly nicht in Frage stelle. Es ist nur so, dass ich in meinem täglichen Leben ziemlich glücklich bin, dass alle Feinheiten dieser Welt für mich abstrahiert und verwaltet werden (meistens durch Schichten, die in C / C ++ geschrieben sind und selbst zusammengesetzt sind). Ich sehe einfach keine Konzepte, die für mich neu sein könnten, nur Details, mit denen ich meinen Kopf füllen müsste. Also, was ist für mich drin?

Meine Schlussfolgerung

Vielen Dank an alle für ihre Antworten. Ich muss sagen, niemand hat mich wirklich überrascht, aber zumindest bin ich mir jetzt ziemlich sicher, dass ich diesen Bereich des Interesses fallen lassen werde, bis ein Bedarf dafür entsteht.
Nach meinem Verständnis ist das Schreiben von Assemblys für Prozessoren, wie sie in heutigen CPUs verwendet werden, nicht nur unnötig kompliziert, sondern es besteht auch die Gefahr, dass die Laufzeitleistung schlechter ist als bei C-Prozessoren. Eine Optimierung von Hand ist aufgrund von OOE nahezu unmöglich, obwohl ein Compiler nicht alle Optimierungen automatisch durchführen kann. Außerdem ist der Code entweder portierbar, weil er eine kleine Teilmenge der verfügbaren Befehle verwendet, oder er ist optimiert, funktioniert dann aber wahrscheinlich nur auf einer Architektur.
Das Schreiben von C ist längst nicht mehr so ​​notwendig wie früher. Wenn ich eine Anwendung in C schreiben würde, würde ich genauso viel erprobte und etablierte Bibliotheken und Frameworks verwenden, die mir die Implementierung von Routinen zum Kopieren von Zeichenfolgen, Sortieralgorithmen und anderem Material ersparen würden, das als Übung an der Universität dient. Mein eigener Code würde auf Kosten der Typensicherheit schneller ausgeführt. Ich bin weder daran interessiert, das Rad während der normalen App-Entwicklung neu zu erfinden, noch versuche
ich, anhand von Core-Dumps zu debuggen: D Ich experimentiere derzeit mit Sprachen und Dolmetschern. Wenn ich also etwas veröffentlichen möchte, nehme ich an würde ein funktionierendes Konzept nach C portieren, obwohl C ++ den Trick genauso gut tun könnte.
Nochmals vielen Dank an alle für Ihre Antworten und Ihre Erkenntnisse.


6
@TheLQ: meine frage ist nicht warum man es benutzt, sondern was ich daraus lernen kann .
back2dos


Antworten:


9

Low-Level-Programmierung ist für die Eckfälle gedacht, in denen auf normalen Desktop-Computern eine Anforderung nicht sofort vorliegt. Dies kann ein Geschwindigkeitsengpass oder ein Speicherengpass oder etwas völlig anderes sein, und es ist sehr häufig sehr interessant zu sehen, was angesichts dieser Anforderungen getan werden kann.

Stellen Sie es sich als Haikus oder Limericks vor, wo die Einschränkungen es interessant machen.

Hier ist einer der größten Hacks aller Zeiten, um Ihnen eine Vorstellung davon zu geben, was in dem möglich ist, was heute unmöglich erscheint. Schach in 1 Kb RAM! http://users.ox.ac.uk/~uzdm0006/scans/1kchess/


1
Ich denke, ich werde mich wirklich für "Beschränkungen machen es interessant" entscheiden. Von allen hier erwähnten Dingen ist dies wahrscheinlich das Beste. In der Schule habe ich Spiele auf meinem Taschenrechner mit 32 KB Speicher und einer 8-MHz-CPU programmiert. Es hat Spaß gemacht, aber ich habe nicht viel gelernt, von dem ich jetzt profitieren kann.
back2dos

Downvoter, bitte erwähnen Sie warum?

29

Ich habe gerade darüber nachgedacht. Ich betrachte mich derzeit als C # -Entwickler - was für meine Karriere völlig in Ordnung ist.

Allerdings verpasse ich von Zeit zu Zeit die wirklich niedrigen Dinge (im Wesentlichen "meine Hände schmutzig machen", indem ich Assembler- oder Gerätetreiber in C mache). Ich vermisse nur die Programmierung. Ich erwarte nicht, dass mir das massiv in meiner Karriere hilft. Wenn Gerätetreiber oder eingebettete Systeme Ihr Ding sind, dann könnte es viel helfen.

Je mehr ich in den abstrakten Sprachen programmiere, desto mehr vermisse ich, was mich in den Computer hineingezogen hat: Stöbern im Computer und sehen, was zuckt. Assembler und C sind sehr gut zum Stossen geeignet :)

Wenn Sie die älteren Sprachen verwenden, sind Sie meiner Meinung nach gezwungen, so ziemlich alles selbst zu tun. In C # kann ich sowas machen myArray.SortBy(x=>x.Name). Auf keinen Fall wäre ich in der Lage, das in C zu tun. Ich akzeptiere, dass die Sprache die beste Sortierung für mich macht. Wenn ich es in C machen würde, könnte ich zu den Tagen meiner Universitätsmodule zurückkehren und meine verschiedenen Sortier- und Suchalgorithmen überarbeiten.

Daher denke ich, dass die niedrigeren Sprachen Ihnen helfen würden, die längst vergessenen Teile zu überarbeiten, die alle weg abstrahiert wurden. Eher eine persönliche Herausforderung als eine berufliche.


15
+1 für die Liebe zum Stöbern in der Hardware und zu sehen, was zuckt - ein echter Geek
Gary Rowe

2
Sie können die Sortierfunktion auch selbst in C # schreiben. Sie können auch eine Bibliotheksfunktion verwenden, um in C zu sortieren: gnu.org/s/libc/manual/html_node/Array-Sort-Function.html. Ich würde sogar sagen, wenn Sie ältere Sprachen verwenden, müssen Sie weniger Dinge selbst tun. Weil die meisten Probleme bereits gelöst wurden. Das hindert die Leute sowieso nicht daran, das Rad neu zu
erfinden

15

Mein Vorschlag ist, mit C als intellektueller Kuriosität herumzuspielen. Machen Sie keine großen Investitionen, weil es sich nicht lohnt.

Vorgeschlagene Ziele:

  • Aktualisieren Sie Ihr Gedächtnis über die grundlegenden Datenstrukturen und Algorithmen.
    • Es ist nur eine gute Sache zu wissen, wie Algebra und Geometrie.
    • Versuchen Sie, einige College-Lehrbuchübungen zu machen oder Rätsel in C zu programmieren.
  • Besseres Verständnis der Speicherhierarchie (Bandbreite) vom CPU-Cache bis zur transozeanischen Netzwerklatenz. Dies wird Ihre Fähigkeiten in der Anwendungsentwicklung auf allen Ebenen verbessern.
    • Am wichtigsten ist, dass Sie sich mit Szenarien vertraut machen, in denen eine kleine, unauffällige Neuanordnung von Code auf hoher Ebene zu einer dramatischen Geschwindigkeitsverbesserung führen kann .
      • Manchmal kann der Grund nur in der Implementierung auf niedriger Ebene im Kontext der Speicherhierarchie verstanden werden.
      • Das Nichtverstehen der natürlichen Ursache dieser Möglichkeit führt zu Unwissenheit , Angst und schließlich zu Verleugnung , da man denkt, dass es für hochrangige Entwickler falsch ist, diese Art der Optimierung zu nutzen. In Wirklichkeit ist daran nichts auszusetzen.
  • Schätzen Sie die Ästhetik komponentenbasierter Softwaresysteme , mit deren Hilfe in C / C ++ / Assembly entwickelte Low-Level-Komponenten von High-Level-Systemen verwendet werden können.
    • Die Ästhetik entspricht genau der Benutzerfreundlichkeit der Software:
      • Gutes Design (leistungsstark, einfach zu bedienen, gut durchdacht)
      • Richtigkeit
      • Flexibilität (Erweiterungen und neue Verhaltensweisen durch Zusammenstellung vorhandener Teile mit jeweils klar definiertem Zweck)
      • Performance (ohne die Benutzerfreundlichkeit zu beeinträchtigen)
    • Obwohl Sie möglicherweise keine eigenen Komponenten auf niedriger Ebene entwerfen, hilft Ihnen Ihr Verständnis, gute Komponenten zu bewerten und auszuwählen, die Sie in Ihren Projekten auf hoher Ebene verwenden können.
  • Schließlich sollten Sie sich darüber im Klaren sein , dass Low-Level-Komponenten in ihrer Implementierung fast immer komplizierter sind , als wenn man sich nur die Benutzeroberfläche ansieht.
    • Der niedrige Pegel ist immer kompliziert. Eine gute Bibliothek verbirgt die Komplexität, ohne ihre Leistungsfähigkeit einzuschränken.
    • Lesen Sie die "technischen Hinweise", die von Komponentenentwicklern verfasst wurden. Hierbei handelt es sich um Vorschläge für übergeordnete Komponentenbenutzer, wie die Komponenten optimal genutzt werden können.

8

Wenn Sie verstehen möchten, wie die Maschine funktioniert, und nicht nur die virtuelle Maschine, von der Ihre Hochsprache abhängt, wird Ihnen Assembly dies beibringen

Wenn Sie keinen Grund zur Sorge haben - und die meisten Programmierer dies heutzutage wirklich nicht tun -, dann machen Sie sich darüber keine Sorgen.

Es wird Ihr Fundament verbessern, aber Ihre Web-Apps werden wahrscheinlich nicht verbessert


6
C funktioniert fast genauso gut. Die meisten C-Konzepte lassen sich leicht in die Maschinensprache übersetzen. Lernen Sie C und werfen Sie einen kurzen Blick auf Assembler, und Sie sind in guter Verfassung.
David Thornley

Ich wollte eine ähnliche Antwort posten. Ich würde argumentieren, dass C auch eine Wertschätzung für die Funktionsweise der Maschine liefert, insbesondere wenn es um die Speicherverwaltung geht. Darüber hinaus sind viele Sprachen, die die Komplexität von Maschinen abstrahieren, in C geschrieben. Zumindest würde die Person wirklich verstehen, wie verwöhnt sie sind :)
Tim Post

1
@Jorg: interessant. und wie viele dieser CPUs sind im aktiven kommerziellen Einsatz im Vergleich zu beispielsweise Intel x86 oder 6502s?
Steven A. Lowe

1
@ Jörg, wo findest du diese CPUs?

1
@Thor: Geschwindigkeit ist hier nicht die Frage, Bildung ist.
Steven A. Lowe

8

Jede Programmiersprache ändert ein wenig darüber, wie Sie generell über das Programmieren denken. Ein konkretes Beispiel, das ich Ihnen geben kann, ist, als ich anfing, Haskell zu lernen, und plötzlich machten die funktionalen Teile von Javascript, Ruby und Python viel mehr Sinn. Ich hatte noch nie zuvor Foldl in einem Code verwendet, aber nach Haskell sehe ich es so ziemlich überall, wo ich Arrays sehe. Die Chancen stehen so gut, dass Sie sich beim Erlernen von C der relativen Leistungsmerkmale verschiedener Konstrukte in Ihrer Lieblingssprache viel bewusster werden. Vor ein paar Minuten habe ich mir einen Vortrag über das schnelle und optimierte Schreiben von Javascript angehört und der Sprecher sagte: "Wenn es in C schwierig ist, wird es in Javascript sehr langsam sein." Seine Absicht ist, dass Javascript eine interpretierte Sprache ist und der Interpreter entweder in C oder C ++ geschrieben ist.


2
+1 für die Vorstellung, wie jede Sprache Ihre Meinung ändert.
Sean

7

Wenn Sie es nicht nur zum Spaß machen, weil Geeks wirklich gerne die volle Kontrolle über ihre Hardware haben, bekommen Sie vielleicht ein besseres Gefühl, wie viel schneller ein Programm werden kann, wenn es in C geschrieben wird, anstatt beispielsweise in Java. Sie können auch lernen, die Funktionen von Sprachen höherer Ebenen wie die Speicherbereinigung wirklich zu schätzen.


1
+1 für den Geek-Spaß. Obwohl ich sagen muss, bin ich kein großer Geek. Und ich hasse Hardware :)
back2dos

1
Der Geschwindigkeitsunterschied ist normalerweise unerheblich. Dies gilt insbesondere für Web-Apps, bei denen die serverseitige Verarbeitung normalerweise nicht der Engpass ist.
David Thornley

David: Ich bin völlig einverstanden mit den durchschnittlichen Brot-und-Butter-Web-Apps. In anderen Bereichen kann der Unterschied sehr relevant sein.
user281377

1
@back2dos, wenn dir die Idee, in der Nähe der Hardware zu programmieren, nicht zusagt, dann würde ich sagen, mach dir keine Sorgen. Es wäre, als würde man sich zwingen, Latein zu lernen, nur weil es die Grundlage für viele spätere romanische Sprachen war.
Tcrosley

2
Bei genügend Speicher ist Java genauso schnell oder schneller als C.

5

Ein Hoch auf die Neugier!

Es ist sehr gut, eine Vorstellung davon zu haben, was auf den untersten Ebenen eines komplexen Systems wirklich vor sich geht, auch wenn für die täglichen Aufgaben keine logische Notwendigkeit besteht, dies zu wissen. Der weitaus beste Weg, um Dinge auf der Bit-Ebene in den Griff zu bekommen, ist die Erstellung einer eigenen CPU. Sie müssen über Opcodes auf Maschinensprachenebene nachdenken, verstehen, warum orthogonale Befehlssätze so gut sind, Komplikationen bei der Interrupt-Behandlung, Kompromisse zwischen komplexen Schaltkreisen und Mikrocode (z. B. in Multiplikationseinheiten) und vieles mehr.

Aber das erfordert natürlich Elektronik-Know-how und ist zeitaufwändig. Das nächstbeste ist es, mit einer 8-Bit-CPU im antiken Stil herumzuspielen. Mikrocontroller wie der 8051 sind immer noch weit verbreitet und für Bastler verfügbar. Das erfordert immer noch einiges Know-how in Bezug auf das Hüten von Elektronik und das Glühen von LEDs ohne Rauchen und kostet US $, wenn Sie nicht bereits mit Elektronik ausgerüstet sind.

Das Nächste, was danach das Beste ist: In einem CPU-Simulator herumspielen (Emulator? Ich verwechsele diese Begriffe) - diese existieren für Z80, 6502, 8086 ... alle alten 8-Bitter. Das ist vielleicht das lehrreichste und unterhaltsamste für einen Anwendungsprogrammierer, der nicht weiß, welches Ende des Lötkolbens er halten soll (obwohl man das ziemlich schnell lernt). Wie Text in den Videospeicher geschrieben wird, wie Assembler-Code-Tricks die Leistung verbessern. Auf diesem Level gibt es jede Menge Spaß zu entdecken.

Ich bin mir nicht so sicher, ob ich C als eine andere Sprache lernen soll, ohne ein anfängliches Verständnis der inneren Funktionsweise der CPU. Zu wissen, wie Bits zwischen CPU-Registern gesendet werden und wie auf den Speicher zugegriffen wird, hilft enorm dabei, echte Zeiger und andere C-Sprachkonzepte zu erhalten.


+1 weil dies die einzige Antwort war, die Zeiger erwähnte. Ich dachte, das wäre die Nummer 1 und akzeptierte die Antwort.
Erik

4

Mit einem Wort, Spaß. Als ich mit Assembler herumgespielt habe (nachdem ich von VB auf C ++, C usw. heruntergearbeitet hatte), war es einfach fantastisch, Daten von einem Teil des Prozessors auf einen anderen zu verschieben. Es war ein großartiges Gefühl, genau zu wissen , was in der CPU vor sich ging, ohne sich Gedanken darüber zu machen, was unter der CPU vor sich ging, von dem Sie nichts wussten. Plus ein großartiges Gefühl der Freiheit - Sie können so gut wie alles tun, da es keine eingebauten Einschränkungen gibt, die Sie in höheren Sprachen finden.

Es war auch kindisch, sich an jeden wenden zu können, der in irgendeiner anderen Sprache programmiert hat und sagt: "Gut, wenn du nicht hardcore genug bist ...".


4
In der CPU ist tatsächlich eine Menge los, die Sie vom Assembler nicht sehen. Dinge wie Out-of-Order-Ausführung, Hyperthreading und Speicher-Caching werden von der CPU automatisch ausgeführt. Sie können immer einen Schritt tiefer gehen, bis Sie die grundlegenden Materieteilchen erreichen. Oder ist Materie nur Energie?
Kevin Panko

Man kann solche Geheimnisse vermeiden, indem man seine eigene CPU aus Transistoren und Logik-Chips zusammensetzt: D (Eine meiner Lieblings-Tech-Fantasien!) Wie auch immer +1 für eine großartige Antwort.
DarenW

Gutes Argument! Obwohl, als ich das letzte Mal Assembler-Hyperthreading verwendet habe, war es wahrscheinlich eher ein Begriff für schnelles Nähen als für CPUs ...
Dan O

2

Gibt es einen guten Grund, Low-Level-Programmierung zu lernen / zu üben? Ich habe je nach Kontext unterschiedliche Antworten.

Erstens unterrichte ich C-Programmierung (aber auch OCaml und Java). Die Motivation der Schüler, das Programmieren von der harten Seite zu lernen, ist wahrscheinlich der schwierigste Teil der Aufgabe. Das beste Argument, das ich bisher gefunden habe, ist "Verstehen": Sprachen auf höherer Ebene verbergen viele zugrunde liegende Mechanismen und manchmal nicht für immer. Sie zwingen Sie auch dazu, auf der höheren Ebene zu bleiben, selbst wenn einige Tricks auf niedriger Ebene wirklich nützlich sein könnten ( Für die Leistung meistens.) Wenn Sie wissen, was Sie verwenden, können Sie es besser einsetzen. Meine Unterrichtserfahrung zeigt mir, dass Schüler, die Programmieren auf niedrigeren Ebenen (und andere nicht benutzerorientierte, solche Compiler) gelernt haben, anpassungsfähiger sind und schneller neue Konzepte oder Tools auf höheren Ebenen lernen.

Zweitens, wie Sie sagen, ist die Leistung ein Teil der Benutzererfahrung. Die meiste Zeit wird die Leistung als eine Frage des Schreibens komplexer und in der Nähe des Maschinencodes angesehen. Dies ist nicht immer der Fall, die Leistung hängt vielmehr von Algorithmen und Datenstrukturen ab, sondern auch von der Interaktion zwischen Algo und Daten. Ich benutze ein spezielles Projekt zu diesem Thema, im Grunde ist es eine einfache Wegfindung, aber das eigentliche Problem ist die Größe der Daten: Die Grafik ist unendlich. Die einzige Möglichkeit, Abstiegsleistungen zu erzielen und in den Arbeitsspeicher zu passen, besteht darin, einen dedizierten Arbeitsspeicher-Allokator (in der Tat zwei, einen Pool-Allokator und einen Recycling-Allokator) zu schreiben. Dies ist in den meisten höheren Sprachen nicht möglich. Tatsächlich haben die meisten Sprachen, die mit Speicherbereinigungen erstellt wurden, Leistungs- und Speicherprobleme.

Es gibt wahrscheinlich viel mehr Argumente wie die Stabilität (im Sinne der Geschichte und der Langlebigkeit) von untergeordneten Sprachen gegenüber "Hype" -Sprachen (die Tatsache, dass eine Sprache, die als zukünftige Referenz für die Programmierung angesehen wird, in ein paar Jahren verschwinden kann, ist lang Geschichte, man kann die Langlebigkeit eines neuen Materials nicht vorhersagen, aber dieses Argument gilt weiterhin für ältere Sprachen ...) Natürlich gibt es auch eine Geschmackssache oder die Tatsache, dass das, was in den meisten höheren Sprachen getan werden kann, auch so sein kann in niedrigeren Sprachen aber nicht umgekehrt (aber wenn man das bedenkt, sollten wir alle nur in Assembler programmieren ...)

Ich bin selbst eine Falle in beiden Welten (ganz unterschiedlich), ich beschäftige mich mehrere Jahre mit theoretischem Programmierkonzept, Typensystemdesign und Proof und habe dabei nur sehr hohe Sprachen (meistens funktionale, aber auch reine) verwendet und gelernt objektorientiert.) Vor kurzem bin ich auf die andere Seite zurückgekehrt (hauptsächlich System- und Kernelprogrammierung) und habe mich in diesem Bereich ziemlich wohl gefühlt. Ich habe viel Spaß! Für mich ist der nächste Schritt, den gemeinsamen Punkt zu finden: Sprachfunktionen auf höherer Ebene für die Programmierung auf niedrigerer Ebene! Bisher gibt es dafür keine Sprache (vielleicht ist Google für die Userland-System-Programmierung zuständig), und ich denke darüber nach, eine eigene Sprache zu erstellen, aber das ist eine andere Geschichte.


1

Ich würde sagen, es gibt nicht viel Grund in Ihrer Domäne, aber wenn Sie Hochleistungs-Computing betreiben (z. B. Spiele, Wissenschaft usw.), wäre dies gerechtfertigt.


1
Ich bin mir nicht sicher, ob es noch viele Hochleistungsbereiche gibt. Für das Spielen sind keine einfachen Sprachen erforderlich. Zum Spielen verwenden Sie normalerweise Engines oder beginnen zumindest mit OpenGL oder so. Und für die Wissenschaft ist Parallelisierung sehr wichtig und Korrektheit. Ich nehme an, Sie wären besser dran mit OCaml oder so. Leistungskritische Bereiche sind nicht mehr diejenigen, die eine Menge Zahlen knirschen, sondern die extrem häufig verwendet werden, wie z. B. Kernel, Treiber, Speicher-Engines und dergleichen. Ich schätze, dass weniger als 1% aller Entwickler diese wirklich jemals berühren.
back2dos

4
@ back2dos, Game Engines tauchen nicht einfach so aus dem Nichts auf - jemand muss sie schreiben. Und in was ist OpenGL Ihrer Meinung nach geschrieben? Nicht C#. Man muss heutzutage für die meisten Anwendungen keine einfachen Sprachen verwenden ... aber in den anderen Bereichen, in denen dies erforderlich ist, arbeiten viele Leute .
GrandmasterB

1

Ich denke, dass heutzutage Low- und High-Level-Programmierung ziemlich getrennt werden können. Grundsätzlich bedeutet dies, dass Sie Ihr gesamtes Berufsleben ohne Kenntnis von C und Assembler ohne Probleme führen können. Die Programmiersprache C kann Ihnen jedoch aus Programmier- und Designsicht nicht viel beibringen.

Nur aus Neugierde konnte man lernen, wie es auf einer niedrigeren Ebene funktioniert. Als ich zum Beispiel an der Universität war, hat es mir Spaß gemacht, mit gcc Assembler-Code aus C ++ zu generieren. Es war hilfreich zu verstehen, wie Polymorfismus und Ausnahmen umgesetzt werden. Aber abgesehen davon sind die einzigen Dinge, die Sie heutzutage von C lernen können:

1) schmutzige Gedächtnistricks. C ist der beste Weg, um zu verstehen, dass es im Wahnsinn der Programmierer keinen Grund gibt :)

2) GOTOs werden tatsächlich verwendet (und sind nützlich), um Fehler zurückzusetzen

3) Erfahren Sie mehr darüber, wie die Speicherzuweisung funktioniert (Unterschied zwischen Heap und Stack?).

Meine These lautet also im Grunde: Wenn du die Universität bereits abgeschlossen hast und noch kein C brauchst, dann lerne es nicht :)


2
Wenn Sie wissen, wie die Dinge auf einer niedrigen Ebene funktionieren, können Sie besser verstehen, warum bei einer undichten Abstraktion etwas schief läuft.
Michael Shaw

1

Sie müssen keine einfachen Sprachen verstehen, aber Sie sollten verstehen, was unter dem Deckmantel der von Ihnen gewählten höheren Sprache vor sich geht. Die Verwendung einer einfachen Sprache wird Ihnen dies beibringen, aber es ist nicht der einzige Weg.

Hier einige Beispiele für Konzepte auf niedriger Ebene, die sich auf Sprachen auf hoher Ebene auswirken können.

Zeiger:

List<object> listOne = new List<object>();
List<object> listTwo = listOne;

listTwo.Add(new object());

Debug.WriteLine(listOne.Count); //do you know what this will be?

Streicher:

string initial = "initial";
string another = initial;

another = "changed!";
Debug.WriteLine(initial); //what about this?

Listen:

Wann verwenden Sie eine Liste gegen eine verknüpfte Liste? (Es ist fast unmöglich, dies zu wissen, ohne zu verstehen, wie eine Liste funktioniert.)

-

Muss man all das wissen? Nein, aber es kann Auswirkungen haben und wenn Sie ein Meister einer höheren Sprache sein möchten, müssen Sie eine ziemlich gute Vorstellung von der inneren Funktionsweise haben.


1

Was könnte mir die Programmierung auf niedrigem Niveau beibringen, welche anderen Sprachen würden mich nicht unterrichten?

Vor allem lernen Sie, wie Computer tatsächlich funktionieren. Es gibt keinen anderen Weg, dies zu lernen als durch einfache Programmierung. Egal welche Art von Anwendungen Sie programmieren, dies wird immer helfen. Sie werden tatsächlich verstehen, was tief unter all dem Web Zeug vor sich geht. Wenn Sie mit Windows arbeiten, ist die gesamte API in C geschrieben, sodass Sie mit dieser Sprache direkt mit dem Betriebssystem kommunizieren können, wenn Sie eine Funktion verwenden müssen, die Ihren aktuellen Sprachen und ihren Bibliotheken fehlt.

Natürlich können Sie mit Low-Level-Programmierung mit ganz anderen Dingen arbeiten, wie Embedded-Programmierung und Echtzeitprogrammierung, bei denen asm / C / C ++ ein Muss ist. Wenn Sie kein Interesse an solchen Anwendungen haben, müssen Sie tatsächlich nicht viel über asm / C / C ++ lernen.

Außerdem lernen Sie Bits und Bytes. Bit-Manipulationen, hexadezimal usw. Diese Dinge können gelegentlich auftreten, selbst wenn Sie Web- / Desktop-Programmierung ausführen. Verschlüsselungsalgorithmen sind ein Beispiel dafür, wo sie verwendet werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.