Was bringt einem Maschinencode?

Bitte aktiviere JavaScript!
Habe gehört, dass es nützlich wäre, wenn ein Programmierer Maschinen-Code, also Binärcode, beherrscht oder lesen kann. Was macht aber ein Programmierer damit, wenn er programmiert oder etwas mit einem PC macht? Lohnt es sich binär-Code zu lernen oder nicht?
 
Ja doch lohnt sich, wenn du zum Beispiel etwas bis ins Kleinste optimieren möchtest. Oder wenn es dafür noch keinen Compiler usw gibt...
 
Also damals fand ich das mal sehr hilfreich um die Abläufe zu verstehen. Aber heutzutage sehe ich da nur wenig Sinn drin, denn vieles ist deutlich komplexer geworden und man berührt selbst im Studium nur die Oberfläche bei vielen Themen...

Um es etwas zu verdeutlichen: Damals (vor 1990) haben wir mit einem 8086 eine Art RasperryPi aufgebaut und dann in Maschinencode (nicht Assembler! Also selbst im Handbuch der CPU für die Assembler-Befehle die Hex-Codes heraus gesucht) ein Programm geschrieben welches wir dann auf ein EEPROM geschrieben haben und dann wurde es ausgeführt. So haben wir damals schon einiges aufgebaut für einfache Steuerungen....

Aber heute wird ja alles deutlich komplexer. Eine CPU macht ja deutlich mehr. Das fängt an mit den mehreren Threads und der ganzen CPU Logik um sozusagen schon vorab zu erkennen, welche Befehle benötigt werden und und und ...
Das bringt eine enorme Komplexität und selbst wenn man dann im Informatik Studium diese Themen betrachtet, bleibt man meiner Erfahrung nach auf einer "einfachen" Ebene.

Das Argument Optimierungen ist gebracht worden. Und da möchte ich gleich einschreiten: Als Entwickler optimierst Du hier nicht!
Du lässt dies den Compiler machen - zugunsten von lesbarem Code! Zumal der Compiler Optimierungsregeln hat, die verifiziert sind, d.h. weniger Chance auf fehlerhaften Code haben.
Und im Rahmen von Clean Code wird auch extra betont: Vorsicht vor Optimierungen https://clean-code-developer.de/die-grade/roter-grad/#Vorsicht_vor_Optimierungen

Daher sehe ich hier keinen wirklichen Sinn mehr drin. Das macht nur noch Sinn, wenn man sich entsprechend mit der Hardware auseinander setzen will oder muss. Aber als guter Softwareentwickler in den Hauptbereichen (Also Anwendungsentwicklung) benötigt man dies aus meiner Sicht nicht.
 
Ich sehe den Nutzen da auch weniger im Bereich der Programmierung, sondern eher im besseren Verständnis von Mikroprozessorarchitekturen. Wir hatten damals natürlich den Vorteil, dass alles noch sehr einfach war. Bei mir war es ein Z80-Prozessor im Sinclair-Spektrum. So etwas kann man eben auch nebenbei als Schüler ganz gut verstehen. Heute würde ich mir deshalb wahrscheinlich auch lieber etwas einfaches suchen, aber eben nur als Studienobjekt und nicht für produktive Programmierung. Vielleicht hilft es auch etwas beim Verständnis vom Java-Bytecode.
 
Verständnis entwickeln ja, aber andererseits braucht man ihn bei Optimierungen für Sachen, die in einer Programmiersprache schlicht nicht möglich sind. Und nein @kneitzel , alle Aufgaben übernimmt der Compiler nicht für dich.
 
Verständnis entwickeln ja, aber andererseits braucht man ihn bei Optimierungen für Sachen, die in einer Programmiersprache schlicht nicht möglich sind. Und nein @kneitzel , alle Aufgaben übernimmt der Compiler nicht für dich.
Also den Link den ich gepostet habe mal angesehen? Es macht wenig Sinn, das zu wiederholen, was da beschrieben steht.

M.A. Jackson Zitat bringe ich aber gerne dennoch:
Rules of Optimization:
Rule 1: Don’t do it.
Rule 2 (for experts only): Don’t do it yet.

Aber auf der Seite gibt es schon einen recht guten Abriss bezüglich Optimierung.

Aber Du scheinst ja schon genaue Vorstellungen zu haben. An was für eine Entwicklung denkst Du denn z.B. derzeit? Was entwickelst Du wo und wie, so dass dann eine Optimierung im Maschinencode wichtig oder zumindest sinnvoll ist? Und wie meinst Du, dass dies ein Entwickler machen müsste?

Es gibt ja viele Bereiche. Wir Java Entwickler sind ja nur Anwendungsentwickler. Aber es gibt ja genug andere Bereiche. Treiberentwicklung, Entwicklung von Betriebssystemen, .... Evtl. hast Du da ja etwas vor Augen?

Ich würde mich also freuen, wenn Du das etwas ausführen könntest.
 
@httpdigest verarbeitet Maschinencode - binär am Stück, versteht sich. Persönlich ist mir aber niemand bekannt, der das auch machen würde. :rolleyes:
Im Studium habe ich jemanden kennen gelernt, der x86 Maschinencode aus dem Kopf schreiben konnte. Da wurden dann kleine COM Dateien mit dem HEX Editor geschrieben (Also kleine Programme, aber mit IO Operationen oder damals dann auch so Spielereien mit Interrupts und so) und wenn es um die Analyse von Binaries ging: Das konnte er gut...

Ist interessant, aber wirklich viel Sinn habe ich darin gesehen. War halt für ihn auch nur Spielerei. Aber er war dann auch genial bezüglich Compiler / Decompiler und so...
 
Auch nicht schlecht, wobei man sagen muss, dass die OpCodes WIMRE eine gewisse Systematik haben. Schwierig stelle ich mir allerdings vor, die Offsets bzgl. Sprungadressen zu berechnen.
 
Also den Link den ich gepostet habe mal angesehen? Es macht wenig Sinn, das zu wiederholen, was da beschrieben steht.

M.A. Jackson Zitat bringe ich aber gerne dennoch:
Rules of Optimization:
Rule 1: Don’t do it.
Rule 2 (for experts only): Don’t do it yet.

Aber auf der Seite gibt es schon einen recht guten Abriss bezüglich Optimierung.

Aber Du scheinst ja schon genaue Vorstellungen zu haben. An was für eine Entwicklung denkst Du denn z.B. derzeit? Was entwickelst Du wo und wie, so dass dann eine Optimierung im Maschinencode wichtig oder zumindest sinnvoll ist? Und wie meinst Du, dass dies ein Entwickler machen müsste?

Es gibt ja viele Bereiche. Wir Java Entwickler sind ja nur Anwendungsentwickler. Aber es gibt ja genug andere Bereiche. Treiberentwicklung, Entwicklung von Betriebssystemen, .... Evtl. hast Du da ja etwas vor Augen?

Ich würde mich also freuen, wenn Du das etwas ausführen könntest.
Wenn Dir der Compiler wirklich jede Optimierung abnimmt, warum muss ich mich dann heute immer noch entscheiden was für einen Datentypen ich für eine Variable verwende? Das könnte der Compiler doch bitte selber optimieren.

Warum gibt es Bitteschön verschiedene iterationensmöglichkeiten? Warum verschiedene Tapen von Collections? Warum überhaupt verschiedene Programmiersprachen und verschiedene Datenbanken? Würde doch reichen wenn es eins gibt und der Compiler das dann beim compilieren perfekt in das umsetzt was ich brauche...

Warum erkennt der Compiler nicht automatisch, dass ich beim Suchen nach Primzahlen nur die ungeraden zahlen testen muss? Also so eine einfache Optimierung, sollte ja nun wirklich drin sein...

Warum erkennt eine Datenbank nicht von selber anhand der queries welche Indexe benötigt werden damit die Performance akzeptabel ist? Ah ja, der Compiler kann ja gar nicht wissen was für dich akzeptabel ist...

Soll ich weiter aufzählen damit du die Sinnhaftigkeit von Optimierungen akzeptierst?

Claus
 
Also erst einmal vielen Dank, dass Du mich auf diese Art und Weise darauf aufmerksam gemacht hast, dass wir das Wort Optimierung verwendet haben, ohne es genau zu spezifizieren. Durch den Kontext sollte es eigentlich deutlich werden. Wäre man meinem Link gefolgt, dann hätte man evtl. auch mehr verstanden, um was es ging.

Hier bedeutet Optimierung eine Beschleunigung vom Code zur "Codingzeit" ohne am eigentlichen Algorithmus etwas zu ändern. Und in diesem Kontext speziell: Durch Verwendung von Maschinencode!

Selbstverständlich sind viele Optimierungen sinnvoll. Eine Optimierung, die jeder Software Entwickler können und praktizieren sollte, ist die Optimierung der Lesbarkeit / Verständlichkeit. Oft als Refactoring bezeichnet.

Ansonsten sind viele Beispiele, die Du hier bringst, eben keine Optimierung sondern schlicht Teil der normalen Softwareentwicklung: Man Analysiert und entwirft ein Design. Und dieses setzt man dann um und man lässt es dann eben bleiben, dass man ständig irgendwas optimiert. Hintergrund ist, dass man ja noch keine Details zur Laufzeit hat. Du optimierst etwas, das dann statt 1ms nur noch 0,9 ms benötigt (Super Sache! 10% Optimierung!) nur leider ist das in einem Bereich, der uninteressant war. Die Applikation selbst braucht an anderer Stelle zu lange und wurde daher vom Kunden nicht angenommen. Also doch keine super Leistung...

Und was kommt dann? Es findet eben keine einfache Optimierung statt sondern es gibt eine Analyse mit Auswertung, Und dann wird an der notwendigen Stelle eine normale Entwicklung stattfinden. Und das sind dann i.d.R. eben keine "Optimierungen" im sinne von: Der Algorithmus wird durch Einsatz von irgendwelchen coolen Tricks in Maschinencode beschleunigt) sondern es werden Algorithmen ausgetauscht.

Und jeder der Ahnung hat, dem sollte klar sein:
- Durch Maschinencode Optimierungen erreicht man wenig. Du hast einen konstanten Faktor und das war es. Der Algorithmus bleibt noch bei tollen Komplexität von 2^n oder so :)
- Wenn Du wirklich optimieren willst, dann muss man den Algorithmus anpassen. Und das ist eben eine Designfrage und keine Codingfrage.
 
Und die Problematik mit dem Wort "Optimieren" ist wirklich massiv. Selbst in meinem Beitrag wird das direkt deutlich:
- Zum einen versuche ich mich an einer kleinen Abgrenzung.
- Und dann verwende ich es selbst umgangssprachlich, also außerhalb der gemachten Definition: "Wenn Du wirklich optimieren willst, dann muss man den Algorithmus anpassen." Und das ist eben eine Designfrage und keine Codingfrage.".

Das zeigt, wie schwer die Kommunikation ist, wenn man nicht gut genug bei der Wortwahl aufpasst.

Aber das Topic und der Text von Tobias gibt es ja sehr genau vor: Und da geht es um die Optimierung durch Verwendung von Maschinencode.
BTW: So das für jemanden wirklich so wichtig ist, dann sollte er schnell auf eine Sprache wechseln, die dies unterstützt. C / C++ bieten da deutlich mehr z.B. Einbettung von Assembler in den Code aber auch viele low Level Spracheigenschaften wie Inline Funktionen, Makros, ...

Bei Java geht vieles eher in eine andere Richtung. Ein Punkt, dass man da ja auf die untere Ebene gar nicht kommt außer man macht etwas mit JNI. Und da wird auf diese "Optimierungen" weniger Wert gelegt bzw. andere Dinge sind wichtiger. AOP fällt mir da direkt ein. Wenn das mit Reflection einhergeht, muss man über Performance Optimierung nicht mehr reden. Aber selbst bei Proxy Objekten hat man dann statt einem Aufruf gleich mind. 2. Also in einem Java Forum über Maschinencode Optimierungen zu reden erscheint mir da recht seltsam.

Auch nicht schlecht, wobei man sagen muss, dass die OpCodes WIMRE eine gewisse Systematik haben. Schwierig stelle ich mir allerdings vor, die Offsets bzgl. Sprungadressen zu berechnen.
Es war mal interessant zu sehen und ich hatte damals ein paar nette Diskussionen über Sinn und Unsinn. Es gibt ganz klar Bereiche, in denen sowas wichtig sein kann (Compilerbau wäre da ein Beispiel), aber wenn man im Bereich der Anwendungsentwicklung ist, dann wirkt das etwas seltsam.
 
Wenn Dir der Compiler wirklich jede Optimierung abnimmt, warum muss ich mich dann heute immer noch entscheiden was für einen Datentypen ich für eine Variable verwende? Das könnte der Compiler doch bitte selber optimieren.
Warum erkennt eine Datenbank nicht von selber anhand der queries welche Indexe benötigt werden damit die Performance akzeptabel ist? Ah ja, der Compiler kann ja gar nicht wissen was für dich akzeptabel ist...
Die einzigen beiden Dinge, die ich als die Art von Optimierung sehen würde, die @kneitzel meinte, werden beide gemacht.

Datentypen ersetzen macht selbst die JVM (zb immer mit int statt byte und short rechnen), Indizes selbst erstellen machen Datenbanken mittlerweile auch.


Der Rest davon ist eher Optimierung auf Ebene des Algorithmus - das ist nicht das, was üblicherweise mit "Optimiziation" gemeint ist, wie zB in den Zitaten von M.A. Jackson und Don Knuth.
 
Interessante Frage.

Ich denke zunächst, es schadet definitiv nicht, Bescheid zu wissen. Auch über Maschinencode. Aber ich bin mir fast schon sicher, daß man die Probleme, die man auf der Hardware direkt hat, meist eher in Assembler lösen wird als Maschinencode zu schreiben. Wenn man damit überhaupt in Berührung kommt, denn die Codelesbarkeit würde ich auch als deutlich wichtiger ansehen als technische Optimierungen.
 
Ich glaube 90% der heutigen Software würde besser, schneller und resourcen sparender laufen wenn die Programmierer vorher mal Assembler gelernt hätten.

Das ist wie mit dem Auto eine Runde auf dem Ring drehen. Kann jeder Depp und kommt irgendwie am Ziel an. Will er schneller ankommen muss er schnelleres auto kaufen.
Aber die, die sich mit der Technik auseinader setzen wissen wie man ein Fahrwerk so einstellt das man immer perfekte Bodenhaftung hat und damit schneller und Teileschonender fährt und sind mit einem Polo schneller am Ziel als der erstere mit seinem Porsche.

Gruß

Claus
 
"schneller und resourcen sparender" ist aber nicht wartbarer. Eine wichtige Anforderung an Code ist heutzutage, dass ich schnell Entwickler und sogar ganze Teams die daran austauschen kann.... leider :-(
 
"schneller und resourcen sparender" ist aber nicht wartbarer. Eine wichtige Anforderung an Code ist heutzutage, dass ich schnell Entwickler und sogar ganze Teams die daran austauschen kann.... leider :-(
Ich finde das wäre bei gleichem Ausbildungsstand aber deutlich einfacher. Das mit dem "Jeder muss es warten können" ist ja heutzutage nur ein Problem weil du immer für den "dümmsten" Programmierer schreiben must. Gäbe es hier einen einheitlichen mindest Standard was ein Programmierer können muss wäre alles viel einfacher.
 
Passende Stellenanzeigen aus deiner Region:

Neue Themen

Oben