Warum werden Programme nicht häufiger in Assembly geschrieben? [closed]

Lesezeit: 9 Minuten

Es scheint eine allgemeine Meinung zu sein, dass Assembler-Programmierung länger dauert und schwieriger zu programmieren ist als eine höhere Sprache wie C. Daher scheint es empfohlen oder angenommen zu werden, dass es aus diesen Gründen besser ist, in einer höheren Sprache zu schreiben und aus Gründen der besseren Portabilität.

Kürzlich habe ich in x86-Assembler geschrieben und mir ist klar geworden, dass diese Gründe vielleicht nicht wirklich zutreffen, außer vielleicht Portabilität. Vielleicht ist es eher eine Frage der Vertrautheit und des Wissens, wie man Assembler gut schreibt. Mir ist auch aufgefallen, dass das Programmieren in Assembler ganz anders ist als das Programmieren in einem HLL. Vielleicht könnte ein guter und erfahrener Assembler-Programmierer genauso einfach und schnell Programme schreiben wie ein erfahrener C-Programmierer, der in C schreibt.

Vielleicht liegt es daran, dass die Assembler-Programmierung ganz anders ist als HLLs und daher ein anderes Denken, Methoden und Wege erfordert, was es sehr umständlich erscheinen lässt, für das Unbekannte zu programmieren, und ihm daher seinen schlechten Ruf zum Schreiben von Programmen verleiht.

Wenn Portabilität kein Problem ist, was hätte C dann wirklich über einen guten Assembler wie NASM?

Bearbeiten:
Nur um darauf hinzuweisen. Wenn Sie in Assembler schreiben, müssen Sie nicht nur in Befehlscodes schreiben. Sie können Makros und Prozeduren sowie Ihre eigenen Konventionen verwenden, um verschiedene Abstraktionen vorzunehmen, um Programme modularer, wartbarer und leichter lesbar zu machen. Hier kommt die Vertrautheit mit dem Schreiben guter Assembler ins Spiel.

  • Schreiben ? Was ist mit dem Lesen von Code? Sie (und andere) werden den Code viel öfter lesen als schreiben

    – Nr

    21. April 2010 um 15:44 Uhr

  • Warum sollte ich eine neue Sprache lernen müssen, nur weil mein Programm auf einer neuen Plattform laufen soll? Warum sollte ich meine Programme so konstruieren müssen, dass sie der Vorstellung der CPU entsprechen, wie viele Register es gibt und was man damit machen kann? Ich versuche, Probleme zu lösen, nicht den Computern nachzugeben.

    – Joachim Sauer

    21. April 2010 um 15:45 Uhr


  • Zusammenfassung der EDIT: Man kann einen C-Compiler verwenden.

    – Meinersburg

    21. April 2010 um 17:49 Uhr

  • @Simon Vielleicht habe ich mich dann in meinen Jahren geirrt, aber ich bin überrascht, dass wir 2010 über ASM und “eine Hochsprache wie C” diskutieren. Insbesondere der Teil, in dem C das Beispiel einer Hochsprache ist

    – matt b

    22. April 2010 um 16:27 Uhr

  • @changelog: So schreibt man programmierung.reddit.com nicht.

    – BoltClock

    19. Februar 2013 um 14:05 Uhr

ASM hat schlechte Lesbarkeit und ist nicht wirklich wartbar im Vergleich zu höheren Sprachen.

Außerdem gibt es viele weniger ASM-Entwickler als für andere populärere Sprachen wie C.

Darüber hinaus, wenn Sie eine höhere Sprache verwenden und neue ASM-Anweisungen werden verfügbar (SSE zum Beispiel) müssen Sie nur Ihren Compiler aktualisieren und Ihr alter Code kann die neuen Anweisungen problemlos verwenden.

Was ist, wenn die nächste CPU doppelt so viele Register hat?

Die Umkehrung dieser Frage wäre: Welche Funktionalität bieten Compiler?

Ich bezweifle, dass Sie Ihr ASM besser optimieren können/wollen/sollten als gcc -O3 kann.

  • gcc ist nicht so gut in der Optimierung, viel besser als der durchschnittliche Mensch, aber es gibt viele Stellen, an denen die Optimierer keine gute Arbeit leisten. Stimme dir ansonsten aber zu.

    – Oldtimer

    21. April 2010 um 18:08 Uhr

  • @dwelch Es kommt in sehr seltenen Fällen vor, dass gcc (oder viele andere Compiler) kompiliertes C nicht richtig optimieren. In diesen Fällen können Sie jedoch immer eine begrenzte Anzahl von Prozeduren in ASM schreiben und nur diese Methoden während des Builds einbinden.

    – Kortison

    21. April 2010 um 18:21 Uhr

  • Es ist nicht selten, dass ich es bei jedem kompilierten Programm sehe. das bedeutet nicht, dass es in jedem Programm behoben werden sollte. Ich stimme zu, dass Sie einen wirklich guten Grund brauchen, und wenn ja, dann rufen Sie eine abgestimmte Routine auf. Wenn Sie nicht in einer Eckfallwelt leben, wie der, in der ich arbeite, würde ich sagen, dass Sie die Compilerausgabe wahrscheinlich niemals berühren oder optimieren sollten, außer mit Compilerschaltern. Es gibt weitaus bessere Compiler als gcc, bei denen ich Ihnen noch mehr zustimmen würde.

    – Oldtimer

    21. April 2010 um 18:52 Uhr

  • Es gibt viele Fälle, in denen ein Compiler nicht gut optimieren kann, aber ziemlich oft kann ein Entwickler, der sich der Einschränkungen des Optimierers bewusst ist, seinen C-Code optimieren, ohne auf Assembler zurückzugreifen.

    – Qwertie

    23. April 2010 um 19:49 Uhr

  • FWIW In meiner täglichen Arbeit kompiliere ich unser Produkt mit gcc -g -O0, weil die Möglichkeit, gdb auf einem Live-System daran anzuhängen und nicht wegen nicht mehr optimierter Variablen verrückt zu werden, dem viel mehr wert ist Unternehmen, als jeden Tag weitere 4 Milliarden CPU-Zyklen ungenutzt zu lassen (von insgesamt 3 Billionen). Das Knacken von ganzen Zahlen ist nicht oft der Engpass.

    – Bernd Jendrissek

    13. Mai 2010 um 19:39 Uhr

Ich liebe es, in Assemblersprache zu programmieren, aber es braucht mehr Code, um dasselbe zu tun wie in einer Hochsprache, und es gibt eine direkte Korrelation zwischen Codezeilen und Fehlern. (Dies wurde vor Jahrzehnten in erklärt Der mythische Mann-Monat.)

Es ist möglich, sich C als ‘High-Level-Assembler’ vorzustellen, aber wenn Sie ein paar Schritte darüber hinausgehen, befinden Sie sich in einer anderen Welt. In C# denken Sie nicht zweimal darüber nach, dies zu schreiben:

foreach (string s in listOfStrings) { /* do stuff */ }

Dies wären Dutzende, vielleicht Hunderte von Codezeilen in Assembler, jeder Programmierer, der es implementiert, würde einen anderen Ansatz verfolgen, und die nächste Person, die vorbeikommt, müsste es herausfinden. Wenn Sie also glauben (was viele tun), dass Programme hauptsächlich für andere Leute geschrieben wurden, ist Assembler weniger lesbar als das typische HLL.

Bearbeiten: Ich habe eine persönliche Bibliothek mit Code für allgemeine Aufgaben und Makros zum Implementieren von C-ähnlichen Kontrollstrukturen zusammengestellt. Aber ich stieß in den 90er Jahren an die Wand, als GUIs zur Norm wurden. Es wurde zu viel Zeit mit Dingen verbracht, die Routine waren.

Die letzte Aufgabe, die ich hatte, wo ASM unerlässlich war, war vor einigen Jahren das Schreiben von Code zur Bekämpfung von Malware. Keine Benutzeroberfläche, also waren es alle lustigen Teile ohne das Aufblähen.

  • Bist du dir da sicher? Ich erinnere mich, dass ich in Code Complete gelesen habe, dass dies nicht der Fall war …

    – jcolebrand

    21. April 2010 um 15:53 ​​Uhr

  • Ich bin mir sicher, dass es einen Punkt gibt, an dem der Vorteil der „weniger Zeilen“ durch den Nachteil der „vorzeitigen Optimierung“ übertroffen wird. Aber Code Complete habe ich mir ewig nicht angeschaut…

    – Egruin

    21. April 2010 um 15:59 Uhr

  • Ein bisschen ironisch, “vorzeitige Optimierung” als Argument zu verwenden zum Montage … (Wahrscheinlich interpretiere ich Sie aber falsch. Ich finde es immer noch lustig.)

    – Bernd Jendrissek

    13. Mai 2010 um 19:44 Uhr


  • Sie können die Funktion immer noch in Assembler aufrufen, daher bezweifle ich, dass eine Foreach-Schleife Dutzende bis Hunderte von Zeilen benötigt. Oder was übersehe ich?

    – Sebastian Mach

    7. November 2012 um 11:57 Uhr

  • @phresnel: foreach macht viel mehr Arbeit als for – Es instanziiert und verwendet einen typspezifischen Iterator.

    – Egruin

    7. November 2012 um 16:39 Uhr

Zusätzlich zu den Antworten anderer Leute zu Lesbarkeit, Wartbarkeit, kürzerem Code und daher weniger Fehlern und viel einfacher füge ich einen weiteren Grund hinzu:

Programmgeschwindigkeit.

Ja, in der Assemblierung können Sie Ihren Code von Hand optimieren, um jeden letzten Zyklus zu nutzen und ihn so schnell wie physikalisch möglich zu machen. Doch wer hat die Zeit? Wenn Sie ein nicht ganz dummes C-Programm schreiben, wird der Compiler wirklich gute Arbeit bei der Optimierung für Sie leisten. Wahrscheinlich machen Sie mindestens 95 % der Optimierungen, die Sie von Hand vornehmen würden, ohne dass Sie sich darum kümmern müssen, den Überblick zu behalten. Hier gibt es definitiv eine Art 90/10-Regel, bei der die letzten 5 % der Optimierungen am Ende 95 % Ihrer Zeit in Anspruch nehmen. Wieso sich die Mühe machen?

  • Bist du dir da sicher? Ich erinnere mich, dass ich in Code Complete gelesen habe, dass dies nicht der Fall war …

    – jcolebrand

    21. April 2010 um 15:53 ​​Uhr

  • Ich bin mir sicher, dass es einen Punkt gibt, an dem der Vorteil der „weniger Zeilen“ durch den Nachteil der „vorzeitigen Optimierung“ übertroffen wird. Aber Code Complete habe ich mir ewig nicht angeschaut…

    – Egruin

    21. April 2010 um 15:59 Uhr

  • Ein bisschen ironisch, “vorzeitige Optimierung” als Argument zu verwenden zum Montage … (Wahrscheinlich interpretiere ich Sie aber falsch. Ich finde es immer noch lustig.)

    – Bernd Jendrissek

    13. Mai 2010 um 19:44 Uhr


  • Sie können die Funktion immer noch in Assembler aufrufen, daher bezweifle ich, dass eine Foreach-Schleife Dutzende bis Hunderte von Zeilen benötigt. Oder was übersehe ich?

    – Sebastian Mach

    7. November 2012 um 11:57 Uhr

  • @phresnel: foreach macht viel mehr Arbeit als for – Es instanziiert und verwendet einen typspezifischen Iterator.

    – Egruin

    7. November 2012 um 16:39 Uhr

Wenn ein durchschnittliches Produktionsprogramm beispielsweise 100.000 Codezeilen hat und jede Zeile etwa 8-12 Assembleranweisungen enthält, wären das 1 Million Assembleranweisungen.

Selbst wenn Sie all dies mit einer anständigen Geschwindigkeit von Hand schreiben könnten (denken Sie daran, es ist 8-mal mehr Code, den Sie schreiben müssen), was passiert, wenn Sie einige der Funktionen ändern möchten? Etwas zu verstehen, das Sie vor ein paar Wochen aus diesen 1 Million Anweisungen geschrieben haben, ist ein Albtraum! Es gibt keine Module, keine Klassen, kein objektorientiertes Design, keine Frameworks, nichts. Und die Menge an ähnlich aussehendem Code, die Sie selbst für die einfachsten Dinge schreiben müssen, ist bestenfalls entmutigend.

Außerdem können Sie Ihren Code nicht annähernd so gut optimieren wie eine Hochsprache. Wo C zum Beispiel eine wahnsinnige Anzahl von Optimierungen durchführt, weil Sie beschreiben Ihre Absicht, nicht nur Ihr Code, in Assembler schreiben Sie nur Code, der Assembler kann keine nennenswerten Optimierungen an Ihrem Code vornehmen. Was Sie schreiben, ist, was Sie bekommen, und glauben Sie mir, Sie können 1 Million Anweisungen, die Sie patchen und patchen, nicht zuverlässig optimieren, während Sie sie schreiben.

1425930cookie-checkWarum werden Programme nicht häufiger in Assembly geschrieben? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy