it-swarm-eu.dev

Low-Level-Programmierung - was bringt es mir?

Seit Jahren beschäftige ich mich mit Sprachen, die ich als "Low-Level" -Sprachen betrachte. Für mich bedeutet dies C und Montage. Ich hatte jedoch noch keine Zeit dafür, noch war es jemals notwendig.

Jetzt, da ich keine Notwendigkeit sehe, sollte ich entweder nur einen Zeitpunkt festlegen, zu 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 erzielt.

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

  • Gutes Design: Durchdachte Funktionen, die über eine durchdachte Benutzeroberfläche zugänglich sind.
  • Korrektheit: Das beste Design ist nichts wert, wenn es nicht richtig implementiert wird.
  • Flexibilität: Eine Anwendung A sollte sich ständig weiterentwickeln, damit ihre Benutzer nicht zu einer anderen Anwendung B wechseln müssen, die über neue Funktionen verfügt, die A implementieren könnte. Anwendungen, die sich mit demselben Problem befassen, sollten sich nicht in ihren Funktionen, sondern in ihrer Philosophie unterscheiden.
  • Leistung: Leistung trägt zu einer guten Benutzererfahrung bei. Eine Anwendung reagiert im Idealfall immer und führt ihre Aufgaben relativ schnell aus (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 helfen, außer für die Leistung. Das Schreiben einer ganzen App in einer niedrigen Sprache aus Gründen der Leistung ist für mich jedoch eine vorzeitige Optimierung.

Meine Frage

Was könnte mir Low-Level-Programmierung beibringen, welche anderen Sprachen würden mich nicht lehren? 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 (hauptsächlich durch Ebenen, die in C/C++ und Assembly selbst geschrieben 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 Interessensbereich fallen lassen werde, bis es nötig wird.
Nach meinem Verständnis ist das Schreiben von Assembly in diesen Tagen für Prozessoren, wie sie in heutigen CPUs verwendet werden, nicht nur unnötig kompliziert, sondern birgt auch das Risiko, zu einer schlechteren Laufzeitleistung als ein C-Gegenstück zu führen. Eine manuelle Optimierung ist aufgrund von OOE nahezu unmöglich, während Sie nicht alle Arten von Optimierungen erhalten, die ein Compiler automatisch durchführen kann. Außerdem ist der Code entweder portabel, da 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 bei weitem nicht mehr so ​​notwendig wie in der Vergangenheit. Wenn ich eine Anwendung in C schreiben würde, würde ich genauso viel getestete und etablierte Bibliotheken und Frameworks verwenden, was mir die Implementierung von String-Kopierroutinen, Sortieralgorithmen und anderen Dingen ersparen würde, die als Übung an der Universität dienen. Mein eigener Code würde auf Kosten der Typensicherheit schneller ausgeführt. Ich bin weder daran interessiert, das Rad im Verlauf der normalen App-Entwicklung neu zu erfinden, noch zu debuggen, indem ich mir die Core-Dumps ansehe: D.
Ich experimentiere derzeit mit Sprachen und Dolmetschern. Wenn ich also etwas veröffentlichen möchte, würde ich wahrscheinlich ein funktionierendes Konzept auf C portieren, obwohl C++ genauso gut den Trick machen könnte.
Nochmals vielen Dank an alle für Ihre Antworten und Ihre Einsicht.

32
back2dos

Low-Level-Programmierung ist für Eckfälle vorgesehen, in denen auf normalen Desktop-Computern eine Anforderung nicht sofort vorhanden ist. 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 sich das als Haikus oder Limericks vor, wo die Einschränkungen es interessant machen.

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

9
user1249

Ich habe das gerade erst gedacht. Ich würde mich derzeit als C # -Entwickler betrachten - was für meine Karriere vollkommen in Ordnung ist.

Ab und zu verpasse ich jedoch 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 in meiner Karriere massiv 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 überhaupt in Computer gebracht hat: am Computer herumstöbern und sehen, was zuckt. Assembler und C eignen sich sehr gut zum Stöbern :)

Wenn Sie die älteren Sprachen verwenden, sind Sie meiner Meinung nach gezwungen, so ziemlich alles selbst zu tun. In C # kann ich so etwas wie myArray.SortBy(x=>x.Name) machen. Auf keinen Fall würde ich das in C tun können. 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.

Ich denke also, dass die Sprachen der unteren Ebene Ihnen helfen würden, all die längst vergessenen Teile zu überarbeiten, die alle abstrahiert wurden. Eher eine persönliche Herausforderung als eine berufliche.

29
Jonathon

Mein Vorschlag ist, mit C als intellektueller Neugier herumzuspielen. Machen Sie keine große Investition, weil es sich nicht lohnt.

Vorgeschlagene Ziele:

  • Aktualisieren Sie Ihr Gedächtnis über die grundlegende Datenstrukturen und Algorithmen.
    • Es ist nur eine gute Sache zu wissen, wie Algebra und Geometrie.
    • Versuchen Sie, einige Schulbuchübungen oder Programmrätsel in C zu machen.
  • Eine bessere Einschätzung der Speicher (Bandbreite) Hierarchie vom CPU-Cache bis zur transozeanischen Netzwerklatenz. Dies wird Ihre Fähigkeiten zur Anwendungsentwicklung auf allen Ebenen verbessern.
    • Am wichtigsten ist, dass Sie sich mit Szenarien vertraut machen, in denen a klein unauffällige Neuanordnung von High-Level-Code kann zu einer dramatisch Geschwindigkeitsverbesserung führen.
      • 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 nwissenheit, Angst ​​und schließlich zu Verweigerung, wenn man denkt, dass dies 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 der in C/C++/Assembly entwickelte Komponenten auf niedriger Ebene von Systemen auf hoher Ebene 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)
      • Leistung (ohne die Benutzerfreundlichkeit zu erschweren)
    • Während Sie möglicherweise keine eigenen Komponenten auf niedriger Ebene entwerfen, hilft Ihnen Ihr Verständnis dabei, gute Komponenten zu bewerten und auszuwählen, die in Ihren Projekten auf hoher Ebene verwendet werden sollen.
  • Schließlich sollten Sie sich darüber im Klaren sein, dass Low-Level-Komponenten fast immer komplizierter in ihren Implementierungen sind, alles andere als unergründlich, wenn Sie nur die Schnittstelle betrachten.
    • Das niedrige Niveau ist immer kompliziert. Eine gute Bibliothek verbirgt die Komplexität, ohne ihre Leistungsfähigkeit zu verringern.
    • Erfahren Sie, wie Sie die "technischen Hinweise" lesen, die von Komponentenentwicklern verfasst wurden. Dies sind Vorschläge für übergeordnete Komponentenbenutzer, wie Sie die Komponenten am besten nutzen können.
15
rwong

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

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

es wird Ihre Grundlage verbessern, aber es wird wahrscheinlich Ihre Web-Apps nicht verbessern

8
Steven A. Lowe

Jede Programmiersprache ändert sich ein wenig darüber, wie Sie über das Programmieren im Allgemeinen 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 einfach viel mehr Sinn. Ich hatte es nie benutzt Falten Sie einen meiner Codes vor, aber nach dem Haskell sehe ich ihn so ziemlich überall, wo ich Arrays sehe. Die Chancen stehen also gut, dass Sie sich beim Erlernen von C der relativen Leistungsmerkmale verschiedener Konstrukte in Ihrer Lieblingssprache viel bewusster werden. A. Vor ein paar Minuten hörte ich einen Vortrag über das Schreiben von schnellem und optimiertem Javascript 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 und der Dolmetscher ist ist entweder in C oder C++ geschrieben. Dies ging mir direkt über den Kopf, weil ich sehr wenig C-Erfahrung habe und keine Ahnung habe, was in C schwierig oder einfach ist.

8
davidk01

Wenn Sie dies nicht nur zum Spaß tun, weil Geeks es wirklich lieben, die volle Kontrolle über ihre Hardware zu haben, können Sie zumindest ein besseres Gefühl dafür bekommen, wie viel schneller ein Programm werden kann, wenn es in C anstelle von beispielsweise Java geschrieben wird. Möglicherweise lernen Sie auch, die Funktionen höherer Sprachen wie die Speicherbereinigung wirklich zu schätzen.

7
user281377

Hurra für 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 es keine logische Notwendigkeit gibt, es für die täglichen Aufgaben zu wissen. Bei weitem der beste Weg, um Dinge auf Bits-Ebene zu erfassen, ist der Aufbau 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 so viel mehr Spaß!

Aber das erfordert natürlich elektronisches Know-how und ist zeitaufwändig. Das nächstbeste ist also, mit einer 8-Bit-CPU im antiken Stil herumzuspielen. Mikrocontroller wie der 8051 sind immer noch weit verbreitet und stehen Hobbyisten zur Verfügung. Das erfordert noch etwas Know-how in der Hüteelektronik und das Leuchten von LEDs ohne Rauchen und kostet $ $, wenn Sie nicht bereits für Elektronik ausgerüstet sind.

Das nächstbeste danach: Spielen Sie in einem CPU-Simulator (Emulator? Ich verwechsle diese Begriffe) - diese existieren für Z80, 6502, 8086 ... alle alten 8-Bitter. Das mag für einen Anwendungsprogrammierer am lehrreichsten und unterhaltsamsten sein, der nicht weiß, welches Ende des Lötkolbens zu halten ist (obwohl man das ziemlich schnell lernt :) Wie Text in den Videospeicher geschrieben wird, wie Tricks mit Assembler-Code zur Leistung beitragen. .. auf diesem Level gibt es viel Spaß zu entdecken.

Ich bin mir nicht so sicher, ob ich C als eine andere Sprache lernen soll, ohne ein erstes Verständnis für das Innenleben der CPU zu haben. Zu wissen, wie Bits zwischen CPU-Registern gesendet werden und wie auf den Speicher zugegriffen wird, hilft enorm dabei, Zeiger und andere C-Sprachkonzepte wirklich zu erhalten.

5
DarenW

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

Es war auch kindisch, kindisch lustig, sich an jeden wenden zu können, der in einer anderen Sprache programmiert hat, und zu sagen: "Nun, wenn Sie nicht hardcore genug sind ...".

4
Dan O

Gibt es einen guten Grund, Low-Level-Programmierung zu lernen/zu üben? Ich habe je nach Kontext verschiedene 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": Übergeordnete Sprachen verbergen viele zugrunde liegende Mechanismen und manchmal nicht für immer. Sie drängen Sie auch dazu, auf der höheren Ebene zu bleiben, selbst wenn einige Tricks auf niedriger Ebene wirklich nützlich sein könnten ( Meistens für die Leistung.) Wenn Sie verstehen, was Sie verwenden, können Sie es wirklich besser nutzen. Meine Unterrichtserfahrung zeigt mir, dass Schüler, die Programmieren auf niedrigerer Ebene gelernt haben (und andere nicht benutzerorientierte Compiler), anpassungsfähiger sind und schneller neue Konzepte oder Werkzeuge auf höherer Ebene lernen.

Zweitens ist die Leistung, wie Sie sagen, ein Teil der Benutzererfahrung. In den meisten Fällen wird Leistung als eine Frage des Schreibens komplexer und in der Nähe des Maschinencodes gesehen. Dies ist nicht immer der Fall, die Leistung hängt viel mehr von Algorithmen und Datenstrukturen ab, als auch von der Interaktion zwischen Algo und Daten. Ich verwende ein spezielles Projekt zu diesem Thema, im Grunde ist es eine einfache Wegfindung, aber das eigentliche Problem ist die Größe der Daten: Das Diagramm ist unendlich. Die einzige Möglichkeit, Abstiegsleistungen zu erzielen und in den Speicher zu passen, besteht darin, einen dedizierten Speicherzuweiser zu schreiben (in der Tat zwei, einen Poolzuweiser und einen Recyclingzuweiser). Dies ist in den meisten höheren Sprachen nicht möglich. Tatsächlich weisen die meisten durch Müll gesammelten Sprachen Leistungs- und Speicherprobleme auf.

Es gibt wahrscheinlich viel mehr Argumente wie die Stabilität (im Sinne von Geschichte und Langlebigkeit) von Sprachen auf niedrigerer Ebene gegenüber "Hype" -Sprachen (die Tatsache, dass eine Sprache, die als zukünftige Referenz für die Programmierung angesehen wird, in einigen 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 Frage des Geschmacks oder der Tatsache, dass das, was in den meisten Hochsprachen getan werden kann, auch sein kann Dies geschieht in niedrigeren Sprachen, aber nicht umgekehrt (aber wenn man das bedenkt, sollten wir alle nur in Assembly codieren ...)

Ich bin selbst in beiden Welten gefangen (ganz anders), arbeite mehrere Jahre an theoretischem Programmierkonzept, Typensystemdesign und Proof und habe dabei nur sehr hohe Sprachen verwendet und studiert (meistens funktionale, aber auch reine) 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 Google für die Programmierung von Userland-Systemen), und ich denke über die Idee nach, meine eigene Sprache zu erstellen, aber dies ist eine andere Geschichte.

2
Marwan Burelle

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

1
Darknight

Ich denke, heutzutage können Low- und High-Level-Programmierung ziemlich getrennt werden. Grundsätzlich bedeutet dies, dass Sie Ihr ganzes Berufsleben ohne Probleme mit C und Assembler leben können. Die Programmiersprache C kann Ihnen jedoch aus Programmier- und Designgesichtspunkten nicht viel beibringen.

Nur aus Neugier könnte man lernen, wie die Dinge auf einer niedrigeren Ebene funktionieren. Als ich zum Beispiel an der Universität war, habe ich es genossen, mit gcc Assembler-Code aus C++ zu generieren. Es war nützlich zu verstehen, wie Polymorfismus und Ausnahmen implementiert werden. Abgesehen davon können Sie heutzutage nur noch von C lernen:

1) schmutzige Speichertricks. C ist der beste Weg zu verstehen, dass der Wahnsinn der Programmierer keinen Grund hat :)

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

3) Erfahren Sie besser, 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 :)

1
Emiliano

Sie müssen keine Niedrigsprachen verstehen, aber Sie sollten verstehen, was unter den Deckblättern Ihrer gewählten Hochsprache vor sich geht. Die Verwendung einer niedrigen Sprache wird Ihnen dies beibringen, aber es ist nicht der einzige Weg.

Hier sind 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?

Saiten:

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? (Fast unmöglich, dies zu wissen, ohne auf einer ziemlich niedrigen Ebene zu verstehen, wie eine Liste funktioniert)

- -

Ist es notwendig, all dieses Zeug zu kennen? Nein, aber es kann Auswirkungen haben, und wenn Sie eine Hochsprache beherrschen möchten, müssen Sie eine ziemlich gute Vorstellung vom Innenleben haben.

1
Alistair

Was könnte mir Low-Level-Programmierung beibringen, welche anderen Sprachen würden mich nicht lehren?

Vor allem wird es Ihnen zeigen, wie Computer tatsächlich funktionieren. Es gibt keine andere Möglichkeit, dies zu lernen, als durch Programmieren auf niedriger Ebene. 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. Wenn Sie also diese Sprache kennen, können Sie direkt mit dem Betriebssystem kommunizieren, wenn Sie eine Funktion verwenden müssen, die Ihren aktuellen Sprachen und deren Bibliotheken fehlt.

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

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

1
user29079