Lohnt sich der Aufwand noch, heute für x86 CPUs Assembler zu lernen
-
wenn man:
1. kein Betriebssystem entwickeln möchte
2. keinen Compiler schreiben möchte
3. neue Software lieber architekturunabhängig entwickeln möchte
4. selten einen Treiber für ein bestehendes OS schreiben dürfteBringt es also irgendeinen Vorteil beim z.B. entwickeln von C oder C++ Anwendungen, wenn man Hintergrundwissen in Assembler hat?
Und falls es doch irgendwas bringen sollte.
Wie tief sollte man dann in die Materie einsteigen?
Also welchen Aufwand sollte man reinstecken und reichen auch die Grundlagen?
-
Es bringt auf jeden Fall was, ein Gefühl dafür zu haben, was unter der Haube passiert, wenn Du die Performance von Anfang an im Entwicklungsprozess dabeihaben willst.
Es reicht dafür völlig, ASM einigermaßen flüssig lesen zu können, und gelegentlich das Compilat anzuschauen.
Insgesamt ist es unwichtiger als der Ausflug in funktionale Sprachen.
-
Lohnt sich ...
Im Sinne von Geld/Gehalt?
-
volkard schrieb:
Es bringt auf jeden Fall was, ein Gefühl dafür zu haben, was unter der Haube passiert, wenn Du die Performance von Anfang an im Entwicklungsprozess dabeihaben willst.
Es reicht dafür völlig, ASM einigermaßen flüssig lesen zu können, und gelegentlich das Compilat anzuschauen.
Insgesamt ist es unwichtiger als der Ausflug in funktionale Sprachen.Danke für die Antwort, aber der letzte Satz klingt ja gar nicht gut für Asm, wenn man mehr davon hat, wenn man die Zeit in funktionale Sprachen wie Haswell investiert.
knivil schrieb:
Lohnt sich ...
Im Sinne von Geld/Gehalt?
Naja, oftmals lohnt es sich ja nichtmal, wenn man mehr in C++ kann als das nötigste. Wenn es um Kommerz geht, dann geht's leider nur darum, wie schnell der Code fertig ist und wenn er halbwegs akzeptabel ist, dann reicht das leider auch schon.
Insofern habe ich diesbezüglich keine Erwartungen, wenn ich mich nun mit Asm beschäftigen würde.
-
knivil schrieb:
Lohnt sich ...
Im Sinne von Geld/Gehalt?
welches unternehmen setzt denn heute noch assembler ein?
mag sein, dass man mit assembler vieles optimieren kann... aber das ganze wird recht schnell unübersichtlich, und die wahrscheinlichkeit ist groß, dass am ende fetter murks rauskommt.
außerdem kann man auch c++ code optimieren, in dem man die entsprechenden passagen in c neuschreibt. assembler ist eigentlich keine richtige option mehr.@Threadstarter:
wenn du einen 32-bit computer hast und mit assembler programmieren willst, dann bleibt dir wohl nichts anderes übrig.
und wenn du einen 64-bit computer hast, dann kannst du auch x86-assembler lernen, die meisten assembler-"compiler" können auch x86 code auf x86_64 computern erzeugen, und die meisten 64-bit computer können auch 32-bit programme ausführen.
-
Assembler hat gegenüber allen anderen Programmiersprachen einen entscheidenden
Vorteil - man kann nicht noch näher an der Hardware programmieren.D.h. wenn z.B. Sicherheit eine sehr große Rolle spielt,ist Assembler durchaus noch zu gebrauchen.
-
Lohnt es sich noch? schrieb:
wenn man:
3. neue Software lieber architekturunabhängig entwickeln möchteWenn eine Software sehr hardwarenah für eine bestimmte Architektur programmiert werden soll, dann kann diese Software quasi unmöglich von dieser Architektur besonders unabhängig entwickeln werden.
Interessant wären aber vieleicht Hinweise darauf zu finden, wie man Lösungswege für bestimmte Aufgaben so entwickeln kann, dass sie sich auf verschiedenen Architekturen gut verwenden lassen und die weniger stark für eine bestimte Architektur entwickelt werden, sondern auf allen Architekturen performante Ergebnisse zeigen und allgemein gut von jeder Architektur unterstützt werden.
Bringt es also irgendeinen Vorteil beim z.B. entwickeln von C oder C++ Anwendungen, wenn man Hintergrundwissen in Assembler hat?
Es kann das Wissen darüber vervollständigen, wie eine C oder C++ Anwendungen von einer x86 CPUs verarbeitet wird.
Und falls es doch irgendwas bringen sollte.
Wie tief sollte man dann in die Materie einsteigen?Also welchen Aufwand sollte man reinstecken und reichen auch die Grundlagen?
Es reichen wohl auch schon die Grundlagen um erste Einblicke zu bekommen, wie der eigene C oder C++ -Code denn nun verarbeitet wird.
Dirk
-
Die Maschinensprache ist letztendlich "die Wahrheit".
Egal ob du nun mit C++, Java oder Haskell programmierst, der Prozessor kann nur Maschinensprache verarbeiten.Ich persönlich finde, ein Informatiker sollte auf jeden Fall einen Assembler kennen. Das heisst nicht, dass er damit täglich arbeitet. Sondern es geht darum, dass man ein tiefes Verständnis dafür hat, wie die Dinge unter der Haube funktionieren.
Ich habe jahrelang einen Lehrling auf C++ ausgebildet. Um Dinge wie die Vtable oder auch Callling Conventions und ähnliches zu erklären, fand ich es immer sehr hilfreich, auf Assembler zurückgreifen zu können. Da kann man einen halbstündigen Vortrag halten, oder man geht im DevStudio kurz ins Disassembly-Window und zeigt es direkt.
Wenn man den Dingen auf den Grund gehen und wirklich Bescheid wissen will, wie sie in ihrem Innern zusammenhängen, wenn man neugierig ist - dann lohnt es sich, Assembler zu lernen
-
ein grundlegendes verständnis für computer kann nicht schaden.
es geht nicht darum, ab jetzt alle probleme, für die man sonst ein shell script verwenden würde, mit asm zu erledigen.aber mal ein kleines asm programm zu schreiben schadet sicher nicht.
wenn man versteht, was der stack tatsächlich ist, wie lokale variablen am stack dargestellt werden, wie funktionen aufgerufen werden, wie man die kontrolle ans betriebssystem abgibt, usw..., dann ist das in meinen augen ein großer pluspunkt.außerdem sollte man sich mit dingen beschäftigen, die einen interessieren, und nicht mit dingen, die maximal viel kohle abwerfen.
-
Es lohnt sich unbedingt, nicht nur um die Maschine
besser und effektiver zu nutzen, sondern auch um
längere Programmstrecken drastisch zu beschleunigen.Die Mühe lohnt sich.
-
Für C-Sprachtyp-Programmierer lohnt sich Assembler auf alle Fälle, wie soll man denn sonst die absurden Fehlerquellen oder grundlegende Designprinzipien der Programme verstehen?
(Oder gar Insiderwitze in Diskussionen. Es gibt aber viele professionelle Programmierer, vor allem im Mikrocontrollerbereich, die kommen mit C fast überall hin und können auch (zumindest) debugger/disassemblercode ganz gut "lesen")Für funktionale Programmierer lohnt sich Assembler auch, ...wieso eigentlich? Weiß ich gar nicht so genau, vielleicht liegst auch ein wenig an der Strenge von Assembler? Aber Assembler heißt auch, effiziente Programmierung ...und außerdem hat man gewisse Hardwareablaufstrukturen im Kopf, die helfen.
(und außerdem helfen funktinale Programmiertechniken, die Assemblerprogramme schneller ablaufen zu lassen (wer hätte das gedacht?)Vorteile generell:
Kleine Programme, schnelle Programme, fehlerfreie Programme (wenn mans ernst meint).
Unleserliche Programme: Geschützen C-Code einfach nach Assembler umschreiben (natürlich ohne Stackfenstergedöns usw.) und / oder zusätzlich als Bytecode.Assembler: wenig auswendig lernen, viel Nachdenken und Üben, Algo umsetzen, Hardware-Doku suchen, Schnittstellen, Kompromisse usw.
C/Java usw.: viel auswendig lernen, viel üben, aber im Rahmen bleiben
Haskell: (weil noch abstrakter) noch viel viel mehr auswendig lernen, noch viel viel mehr üben, den Rahmen sprengen.Die Frage, inwieweit es sich lohnt, Assembler zu lernen, hängt auch von den eigenen Vorlieben/Berufsgewohnheiten ab. Wenn man Spaß an Mathematik und Algorithmen hat, ist Assembler immer von Vorteil. Wenn man lieber abstrakter Programmiert, tendenziell eher top-down o.ä. oder eine flexible Sprache wie C hat, oder Spaß am Skripten, oder an der Uni Hausarbeiten mit Java aufbekommt, dann kann man erst mal versuchen, wie weit man damit kommt.
Generell ist der Lernaufwand für Assembler für grundlegende Geschichten aber eher klein. Das kann man von moderneren Ansätzen eher nicht behaupten.