Frage Was sind die praktischen Vorteile von Assembly lernen?


Die meisten Leute schlagen vor, dass das Lernen von Assembly essentiell ist, dass es wichtig ist, die zugrunde liegende Funktionsweise des Computers zu kennen und so weiter. Aber nach was ich suche, sind einige praktische Vorschläge, die die Anstrengung machen werden, Versammlung zu lernen, um es wert zu sein.

Was sind deine Vorschläge? Was vermisse ich, wenn ich Assembly und Pointer / Memory Management generell nicht lerne?


6
2018-01-07 23:28


Ursprung


Antworten:


Ich denke, der wichtigste praktische Vorteil beim Lernen von Low-Level-Dingen wie Assembler, Pointern und Speicherverwaltung ist, dass Sie beim Schreiben oder Überprüfen von High-Level-Code besser instinktiv oder unbewusst Performance-Probleme oder andere Fallstricke erkennen können.

Ein durchschnittlicher Entwickler könnte eine einfache Schleife schreiben und denken: "Dieser Code iteriert über eine Menge von Ganzzahlen und schreibt jede auf die Konsole."

Ein Experte Entwickler könnte die gleiche Schleife schreiben und denken: "Dieser Code iteriert über eine Menge von ganzen Zahlen, und jedes Element muss die ToString-Methode aufrufen und ToString muss die Zeichenfolge in der Basis 10 formatieren, die etwas nicht-trivial ist, und Dann werden sowohl die Boxed Integer als auch die formatierte Zeichenfolge bald für die Garbage Collection geeignet sein, da keine Referenzen mehr vorhanden sind. Wenn diese Methode zum ersten Mal ausgeführt wird, muss sie JIT'ed sein ... "und so weiter.

In 9 von 10 Fällen spielt es keine Rolle. Aber dieses eine Mal von 10, wird der Expertenentwickler wahrscheinlich ein Problem im Code bemerken, das der durchschnittliche Entwickler niemals in Betracht ziehen würde.


7
2018-01-07 23:57



Sie müssen lernen, Assembly zu lesen, damit Sie herausfinden können, was schief geht, wenn eine komplexe Aussage ausbricht. Das CPU-Debug-Fenster sollte kein mysteriöser Ort sein.


5
2018-01-07 23:40



Zeiger / Speicherverwaltung sind allgemeiner als Assemblersprache. Sie müssen sie auch für C und C ++ verstehen, die Sie benötigen, wenn Sie den in C geschriebenen Code pflegen müssen.

Für die Assemblersprache ist es manchmal nützlich, den Assemblercode zu lesen, den der C-Compiler generiert, um herauszufinden, ob er korrekten und effizienten Code generiert.


4
2018-01-07 23:32



Ich finde es toll, neue Sprachen zu lernen. Es öffnet meine Meinung. Manche Sprachen öffnen sich mehr als andere. Ich würde sagen Assembler ist einer von denen. Es zwingt Sie, über Dinge wie den Call-Stack und den Anweisungszeiger nachzudenken. Und Sie werden höherwertige Sprachen noch mehr schätzen lernen. Eine weitere unterhaltsame Sprache ist PostScript.


3
2018-01-07 23:35



Ich denke dich nicht brauchen Montage für alles lernen praktisch.  Es wird jedoch sicherstellen, dass Sie die wahren Wurzeln dessen, was Sie als Entwickler tun, verstehen. Im Wesentlichen ist die Baugruppenprogrammierung eine Disziplin zum Erlernen der Chiplogik und -architektur. Ich habe keine Assemblierung in mehr als zwei Jahrzehnten programmiert, aber es gibt immer noch die Auswahlmöglichkeiten, die ich bei der Programmierung von C # treffe.


3
2018-01-07 23:40



Dies ist eine Art von Fragen, die immer gestellt werden: "Warum sollte ich etwas wissen?" usw. Nun, vielleicht könntest du einen Job bekommen, der neben dem Aufbau der nächsten generischen CRUD-Anwendung oder etwas in der Art von etwas funktioniert. Wenn Sie irgendeine Art von Systementwicklung durchführen möchten, ist es sehr hilfreich, wenn nicht sogar wichtig, über gute Kenntnisse in der Montage zu verfügen. Was Sie "verpassen" vielleicht fehlt es Ihnen tatsächlich zu wissen, wie Computer arbeiten. Manche Leute denken, das ist wünschenswert. Manche Leute nicht. Manche Leute bauen Prozessoren. Manche Leute graben Gräben. Es ist alles eine Frage der persönlichen Vorliebe :)


2
2018-01-07 23:34



Aber nach was ich suche, sind einige praktische Vorschläge, die die Anstrengung machen werden, Versammlung zu lernen, um es wert zu sein.

Erfahren Sie, was Montage ist. Wirklich lernen, wie man kleine Fragmente davon liest (und versteht): wie man es in Gedanken durchläuft. Vielleicht auch mit einem Debugger (einschließlich des Speicher- und Registerwechsels). Suchen Sie im Idealfall eine mit Anmerkungen versehene Assembly.

Aber machen Sie sich nicht die Mühe, Assembly zu schreiben: Stattdessen ist das Schreiben von C oder C ++ für die meisten praktischen Zwecke wahrscheinlich "niedrig" genug.


1
2018-01-07 23:37



Zeiger und Speicherverwaltung sind wirklich eine andere Frage als Assembly. Wenn Sie C / C ++ machen wollen, müssen Sie Pointer und Speicherverwaltung lernen, da diese Teil der Sprache sind. Aber selbst wenn Sie planen, während Ihres ganzen Lebens nichts als Java zu verwenden, sollten Sie etwas über die Speicherverwaltung lernen, um trotz GC kein Speicherleck zu schreiben, und Zeiger sind nur der Unterschied zwischen atomaren Typen und Objektreferenzen. Sie brauchen die Konzepte oder Sie schreiben Programme, die nicht funktionieren!

Praktische Gründe für das Lernen von Assembly: Debugging und Optimierung. Selbst wenn Sie keine Assembly schreiben, müssen Sie möglicherweise an einem dieser Tage den C / C ++ - Code für die Leistung optimieren. In diesem Fall müssen Sie in der Lage sein lesen die Assembly für Ihre innere Schleife, auch wenn Sie nie eine andere Zeile davon schreiben müssen.

Letztendlich denke ich, dass Ihre Unterscheidung zwischen "das Wissen um die zugrunde liegende Funktionsweise Ihres Computers" und "praktische Vorschläge, die das Bemühen, die Montage zu lernen, wert sind" falsch ist. Unwissenheit zahlt sich nicht aus. Lernen, wie Ihr Computer funktioniert ist Ein praktischer Vorschlag lohnt sich!

Ich habe eine Prophezeiung: Eines Tages wird Ihr Programm viel zu langsam laufen, um praktisch zu sein, und stürzt ab und zu mit einer Ausnahme wegen zu wenig Speicher ab. An diesem Tag wird die schiere schreiende Angst, nicht zu wissen, was zur Hölle los ist oder wo man anfangen soll, zu suchen, um es zu reparieren, deine Karma-Schuld mit Zinsen zurückerstatten ...


1
2018-01-08 00:11



Heutzutage sind viele Assemblersprachen ziemlich hoch.

Und es war schon immer so, dass wenn man "C" lernt, dies nahe genug ist, um die meisten Lernvorteile zu erzielen.

edit: Wenn ich darüber nachdenke, beschreibt er in Knuths Büchern eine idealisierte Assemblersprache. Sie werden nicht viel falsch machen, wenn Sie das lernen und diese Bücher lesen.


0
2018-01-07 23:31



Ein weiterer praktischer Grund, den ich mir vorstellen kann, ist der Reverse-Engineering-Anwendungscode, um ihn NUR für Bildungszwecke zu modifizieren, da dies von Crackern häufig verwendet wird, um Shareware-Anwendungsschutz wie Zeitlimits oder Seriennummern zu umgehen.

Eine Anwendung wie win32Dasm kann ausführbare Dateien in Assembler-Code konvertieren, der später mit einem Hex-Editor wie hiew geändert werden kann. Sie können eine Menge über den Ablauf des Programms lernen.


0
2018-01-07 23:52



Nun, auf einer praktischen Ebene habe ich einen Kurs in 6502 Assembler absolviert, als ich zum ersten Mal lernte, die frühen 80er zu programmieren. Ich habe auch einen 8088 Assembler gemacht. Es ist gelegentlich von den Jahren seitdem gewesen, aber ich kann nicht sagen, dass es überhaupt ist Ja wirklich habe mich in 25 Jahren mehr als ein oder zwei Mal aus einem Loch gelöst. Groking C auf einer ziemlich grundlegenden Ebene ist von weit mehr Nutzen. YMMV und es ist sicherlich hilfreich als Hintergrund, aber als direkter praktischer Nutzen? Marginal wirklich.

Pervers ist eine Sache, die sich als nützlich erwiesen hat, auf einer noch niedrigeren Ebene. Ich habe ein Class-on-Chip-Design gemacht (NAND-Gatter und ähnliches) und als Teil davon wurde formale Boolesche Logik in einiger Tiefe gelehrt. Das ist seither enorm nützlich - es überrascht die Anzahl der Programmierer, die nicht wirklich wissen, was sie mit ands, ors und nots machen :-)


0
2018-01-07 23:55