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.
Antworten:
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/
quelle
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.
quelle
Mein Vorschlag ist, mit C als intellektueller Kuriosität herumzuspielen. Machen Sie keine großen Investitionen, weil es sich nicht lohnt.
Vorgeschlagene Ziele:
quelle
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
quelle
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.
quelle
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.
quelle
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.
quelle
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 ...".
quelle
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.
quelle
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.
quelle
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 :)
quelle
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:
Streicher:
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.
quelle
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.
quelle