Ist es für einen erfahrenen Entwickler sinnvoll, Zeit mit dem Studium der Montage zu verbringen? [geschlossen]


33

Es ist klar, dass das Wissen über Sachen auf niedrigem Niveau bei unserer Arbeit sehr wichtig ist.

Aber in einer Situation, in der Sie bereits kommerzielle Software auf hohem Niveau entwickeln und wenn Sie bereits eine bestimmte Richtung gewählt haben, aber keine Assembler-Fähigkeiten besitzen, ist es nicht sinnvoller, sich auf das Lernen von Dingen zu konzentrieren, die mit Ihrer Richtung zusammenhängen? Oder gibt es einen Grund, warum Sie etwas Zeit aufwenden sollten, um die Grundlagen auf niedrigem Niveau zu erlernen?

Wann ist es zu spät und wann nicht? Und wenn es nicht zu spät ist, wie kann man dann optimal lernen (in dem Sinne, dass man nicht zu viel Zeit aufbringt, um etwas Tiefe und Verständnis zu erlangen)?


Viele Fragen in einem Beitrag :)
Shamim Hafiz

Ich habe die Assemblersprache Schritt für Schritt genossen. Am Anfang viel Noobie-Zeug programmieren, aber der Autor ist sehr unterhaltsam. Ich habe eine allgemeine Idee für hilfreich befunden und schreibe hauptsächlich JavaScript.
Erik Reppen

Meine erste (unterrichtete) Sprache war ein Assembler-Dialekt. Ich kann sehen, wie nützlich es wäre (in der Fülle von Möglichkeiten, auf die andere hingewiesen haben), und es hilft Ihnen, dem Rest des Teams unterschiedliche Beiträge zu liefern.
Jamie Taylor

Antworten:


43

Kann nicht glauben, dass niemand das Debuggen erwähnt hat ...

Ich habe seit vielen Jahren keine Assembler-Code-Zeile mehr geschrieben . Aber ich habe es einigermaßen oft gelesen . High-Level-Debugging ist großartig, wenn Sie über die Quell- und Symbolinformationen verfügen. Wenn Ihre ausgefallene Bibliothek jedoch eine unbehandelte Ausnahme auf Kundencomputern auslöst, ist es zu spät, dies in die Lizenz aufzunehmen ...

Aber ich kann immer noch den Disassembler öffnen und sehen, was Ihre übergeordnete Logik letztendlich getan hat , fehlerhafte Daten bis zu ihrem Ursprung zurückverfolgen und herausfinden, wer das FPU-Steuerregister geändert hat ...

Das hat meinen Speck öfter gerettet, als ich gedacht habe. Und es ist nie zu spät zu lernen - es gibt viele großartige Referenzen und Tutorials im Internet, und so gut wie jedes Programm, das auf Ihrem Computer ausgeführt wird, kann eine praktische Umgebung bieten.


10
+1, und ich würde mehr dafür stimmen, wenn ich könnte. Jeder ernsthafte Entwickler muss in der Lage sein, ASM zu lesen, wenn es keinen anderen Grund gibt.
Mason Wheeler

3
Die Folge davon ist die Optimierung. Wenn Sie wissen, wie der Complier Ihren Code in Assembler übersetzt, können Sie ihn dramatisch beschleunigen!
Lambacck

3
+1 Assembly ist eine der wenigen Sprachen, mit denen Sie verstehen müssen, wie ein Prozessor tatsächlich funktioniert. Es hilft Ihnen bei Ihrer Entwicklung mit Hochsprache. Muss gelesen werden: blogs.msdn.com/b/ericlippert/archive/2010/09/30/…

Zu wissen, welcher Computer zugrunde liegt , ist UNGLAUBLICH hilfreich, sei es für das Debugging, die Optimierung oder die Neugierde. Im Ernst, lernen Sie, mindestens eine oder zwei Familien von Assemblersprachen zu lesen. Auch wenn Sie es nie lesen oder schreiben, nachdem Sie es gelernt haben, wird es die Art und Weise beeinflussen, wie Sie die Dinge in Zukunft verstehen. Nun, wenn Sie lieber in keiner anderen Sprache schreiben möchten, könnte das ein bisschen viel sein ...
Michael Trausch

1
@Mason: Ich weiß nicht, ob "jeder ernsthafte Entwickler" in der Lage sein muss, ASM zu lesen. Wenn Sie JavaScript schreiben oder eine Programmiersprache verwenden, die auf einem dicken Framework (wie .NET oder Java) basiert, würde ich ASM nicht als unerlässlich erachten, um ein seriöser Entwickler zu sein. Allerdings kann es auch in höheren Programmiersprachen und -umgebungen hilfreich sein, zu verstehen, wie der Computer Anweisungen auf einer sehr niedrigen Ebene ausführt.
Scott Mitchell

15

Sie müssen keine Assemblersprache lernen, sondern nur verstehen, wie es funktioniert. Sie müssen wissen, was XOR ist, und im Schlaf in Binärform zählen usw. Aber ich habe in meiner Arbeit noch nie Assembler-Code benötigt.

Wie Sie bereits sagten, sind Kenntnisse über einfache Dinge wichtig, praktische Kenntnisse in der Montage jedoch nicht.


1
Ich stimme zu. Sie können ein gutes Auskommen Programmierung verdienen und nie haben lesen / schreiben ASM. Es gibt einige Positionen, die dies erfordern. Das Lesen eines Speicherauszugs nach einer Race-Bedingung in Ihrem Code hat den Prozess beendet. Oder wenn Sie sehr leistungsintensive Programme schreiben (wie GPU-Parallelisierung / OpenCL). Der Prozentsatz der Entwicklerjobs, bei denen Sie diese Aufgaben ausführen müssen, ist sehr gering.
Yzorg

11

Wenn Sie wirklich keine geringen Programmierkenntnisse haben, würde ich Ihnen dringend empfehlen, einige davon in Ihrer Freizeit zu lernen. Sie müssen kein Experte sein; erreichen Sie einfach ein gewisses Maß an Kompetenz. Sie müssen einen Großteil der mathematischen Arbeit selbst erledigen, anstatt vom Compiler oder den Bibliotheken abhängig zu sein, um dies für Sie zu tun. Es wird Ihnen helfen, die Lesbarkeit bei der Programmierung zu verstehen, da die meisten Montageanweisungen einer Prozessoranweisung entsprechen. Sie müssen die Komplexität in etwas größeren Programmen selbst verwalten, ohne die Vorteile von Dingen wie if...else. Auf diese Weise können Sie einfachere übergeordnete Programme schreiben, da Sie durch die Assembler-Erfahrung gelernt haben, wie viel einfacher das Lesen ist.

Denken Sie auch daran, dass Assembly keine Sprache ist! Es ist ein Oberbegriff, der im Grunde den Befehlssatz eines Prozessors bezeichnet, der in eine symbolische Sprache abstrahiert wurde. Unterschiedliche Prozessoren haben unterschiedliche Befehlssätze und daher unterschiedliche Assemblersprachen. Wenn Sie "Assemblierung" lernen, lernen Sie einen Prozess, keine Sprache.


8

Sie werden immer davon profitieren, unter die Decke zu schauen und ein bisschen mehr darüber zu verstehen, was sich unter der Abstraktion befindet, auf der Sie stehen. Wie ein Hochschulprofessor von mir einmal sagte: "Alle guten Programmierer verstehen die Hardware" - Sie müssen keine Schaltkreise erstellen und manipulieren können, aber Sie sollten ein gewisses Verständnis dafür haben, was dort unten vor sich geht - es wird nur funktionieren Du solltest besser.

Probieren Sie Computer Organisation und Design


1

Ja - Kontinuierliches, lebenslanges Lernen ist ein wesentlicher Bestandteil einer Karriere in der Softwareentwicklung. Wenn Sie sich weiter mit Programmieren und der Verbesserung Ihres Handwerks beschäftigen möchten, sollten Sie irgendwann die Montage lernen, da Sie dadurch eine völlig neue Sprache und eine völlig neue Art des Codeschreibens kennenlernen. Aus dem gleichen Grund empfehle ich, mit vielen Sprachen / Programmierstilen zu experimentieren, einschließlich Ruby / Python (dynamische Sprache), Haskell / F # (reine Funktionssprache), Lisp / Scheme (Funktionssprache) usw.

Ich würde sagen, dass es zu spät ist, wenn Sie nicht mehr mehr mehr über das Programmierhandwerk erfahren möchten. Zum Beispiel, wenn Sie in Ihrer Karriere an einem Punkt angelangt sind, an dem Sie möglicherweise bald von der Programmierung in einen anderen Bereich wechseln, z In den nächsten Jahren würde ich mich dann mehr auf die Fähigkeiten konzentrieren, die für die Entwicklung in diesem Bereich erforderlich sind, anstatt auf das Programmierhandwerk.


1

Sie sollten wissen, was es ist und was der Computer tut. Etwas wie Knuths MIX zu lernen, wird Ihnen helfen. Meistens in der Lage, die Effizienz Ihres Codes zu beurteilen. Holen Sie sich die Kunst der Computerprogrammierung und lesen Sie sie. Es wird Sie zu einem intelligenteren Programmierer machen.


1

Ist es nicht sinnvoller, sich auf das Lernen von Dingen zu konzentrieren, die mit Ihrer Richtung zusammenhängen? Oder gibt es einen Grund, warum Sie etwas Zeit aufwenden sollten, um die Grundlagen auf niedriger Ebene zu erlernen?

Antworten:

  1. Wenn Sie nicht vorhaben, Ihre Richtung zu Program Embedded System zu ändern, gibt es keinen Grund, Assamble zu lernen. Auch wenn Sie der Ansicht sind, dass die Assembly von der CPU abhängt, lernen Sie möglicherweise einige Grundlagen, aber Ihr Wissen basiert auf der CPU-Architektur und dem Befehlssatz für diese CPU.
  2. Angenommen, Sie codieren für Windows. Wenn Sie eine niedrigere Stufe als eine höhere Stufe lernen möchten, die für Sie von Vorteil sein kann, empfehle ich Ihnen, Windows I Deep, die Windows-API, die Windows-Speicherverwaltung usw. zu lernen. Lernen Sie einfach das Betriebssystem / die Plattform, das / die Sie codieren.
  3. Verbessern Sie Ihre Kenntnisse in Ihrer aktuellen Hochsprache, wie z. B. Speicherverwaltung, Speicherbereinigung usw., wenn Sie ein niedriges Niveau erreichen möchten.

0

Ich denke, dass Sie mit zunehmender Karriere einen Punkt erreichen, an dem die Rendite sinkt. Das heißt, Sie sollten die Assemblersprache früh lernen, da dies zu einem besseren grundlegenden Verständnis von allem führt, was danach kommt. Wenn Sie jedoch bereits in der Belegschaft tätig sind und über einige Jahre Erfahrung verfügen, haben Sie bereits ein Gespür für die Funktionsweise. Wenn Sie also die tatsächlichen Details kennen, erhalten Sie möglicherweise nicht so viele Einsichten .


0

Ich weiß nicht, wie viel es nützen würde, Montage zu studieren. Aber zumindest wäre es von Vorteil, wenn Sie in einer Sprache wie C programmieren würden. Ich musste in letzter Zeit etwas in C programmieren und fand es ziemlich aufschlussreich. C entfernt einen Großteil der Abstraktion, die in höheren Sprachen vorhanden ist. Diese Abstraktionen sind nicht ohne Kosten. Sie müssen mehr Details der niedrigeren Ebene in C verwalten, wobei diese Details wie in einer höheren Sprache für Sie verwaltet werden. Wenn Sie in C programmieren, müssen Sie sich mit diesen Details vertraut machen. Wenn Sie also wieder in Ihrer Alltagssprache sind, haben Sie dieses Bewusstsein und können besser einschätzen, was tatsächlich passiert. Das sollte helfen, Sie zu einem besseren Programmierer zu machen.


0

Im Lehrerberuf müssen Lehrer, zumindest hier in Großbritannien, weit über das hinaus qualifiziert sein, was sie unterrichten. Von einem Lehrer der Sekundarstufe (High School) wird erwartet, dass er einen Abschluss in dem Fach hat, das er unterrichtet, und von Lehrern der Primarstufe (Elementary School) wird ebenfalls ein Abschluss erwartet, und er muss in allen wichtigen Fächern bis zu einem guten GCSE-Niveau (High School) kompetent sein Exit-Prüfungen ?, kein echtes US-weites Äquivalent).

Warum? Denn um etwas gut zu lehren oder tatsächlich gut zu gebrauchen, muss man es verstehen. Dies setzt voraus, dass Sie die zugrunde liegende Struktur und die Kette von Entscheidungen verstehen, bevor Sie mit der arbeiten, die dazu geführt hat. Um Code auf hoher Ebene richtig zu verstehen, müssen Sie die Ebene verstehen, auf der er aufgebaut ist, wie er funktioniert, wo seine Stärken und Schwächen liegen. Dies ist rekursiv. Um die darunter liegende Ebene zu verstehen, müssen Sie auch die darunter liegende Ebene verstehen.

Am Ende ist dies der Grund, warum die anständigen Universitäts- / Hochschulkurse in Computing vor allem andere gute Mathematikfähigkeiten verlangen, da dies praktisch die unterste Stufe ist.

Maths -> Physics                ->
      -> Chemistry -> Materials -> Hardware Design -> Microcode      -> Assembler
                                                   -> Bus Interfaces -> Peripherals

... Assembler    -> Low Level      -> High Level   ->
... OS / Drivers -> API Level      -> Applications -> User

Wenn Ihnen Kenntnisse in diesen Bereichen fehlen, ist Ihr Verständnis darunter beeinträchtigt. Je näher Sie der Ebene kommen, auf der Sie eine andere Ebene bedienen, desto wichtiger ist die Erdung.

Also: Müssen Sie Assembler als High-Level-Codierer kennen?  Es wird helfen.


0

Das war in meinem früheren Leben als Supercomputer-Guru sehr wichtig gewesen. Damals hatte ich das Gefühl, dass Sie eine Maschine nicht verstanden haben, bis Sie mindestens mehrere hundert Zeilen Assembler geschrieben und daran herumgebastelt haben, um die Leistung zu steigern. Da nur sehr wenige Programmierer so tief gehen wollten, war ich wirklich unverzichtbar. Und ich habe immer noch eine gemeinsame Sprache, wenn ich mit HW-Designern spreche.

Wirklich, die Notwendigkeit / der Nutzen dafür ist meistens einige Jahrzehnte her. Zwischen den Compiler-Fortschritten und der Ausführung außerhalb der vorgegebenen Reihenfolge gibt es kaum noch Möglichkeiten, den Helden zu spielen, indem Sie Assembler schreiben. Obwohl ich es nützlich finde zu verstehen, wie die Dinge funktionieren. Ich habe vor, meine Kinder (Studienanfänger, CS-Majors) darin zu unterrichten, in einem sehr vereinfachten Assembler auf einer einfachen virtuellen Maschine zu programmieren, damit sie ein Gefühl dafür haben, was vor sich geht. Hoffentlich können wir mit Sachen wie Unrolling, Software-Pipelining, Caches und Prefetching, Bottomloading usw. spielen. Zumindest werden sie wissen, dass diese Sachen auf einer bestimmten Ebene vor sich gehen.

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.