Warum programmierst du in Assembler? [closed]

Lesezeit: 10 Minuten

Benutzeravatar von Tom Ritter
Thomas Ritter

Ich habe eine Frage an alle Hardcore-Low-Level-Hacker da draußen. Ich bin in einem Blog auf diesen Satz gestoßen. Ich denke nicht, dass die Quelle wichtig ist (es ist Haack, wenn es Sie wirklich interessiert), weil es eine allgemeine Aussage zu sein scheint.

Zum Beispiel haben viele moderne 3-D-Spiele ihre leistungsstarke Kern-Engine in C++ und Assembly geschrieben.

Was die Assembly betrifft – ist der Code in Assembly geschrieben, weil Sie nicht möchten, dass ein Compiler zusätzliche Anweisungen ausgibt oder übermäßig viele Bytes verwendet, oder verwenden Sie bessere Algorithmen, die Sie nicht in C ausdrücken können (oder ohne die Sie nicht ausdrücken können). der Compiler bringt sie durcheinander)?

Ich verstehe vollkommen, dass es wichtig ist, die Dinge auf niedriger Ebene zu verstehen. Ich möchte nur die verstehen warum Programm in Assembler, nachdem Sie es verstanden haben.

  • Ähnliche Fragen gibt es schon, denke ich…

    – mmx

    26. April 2009 um 20:23 Uhr

  • Eeeeehh .. technisch ist das eine andere Frage. Diese Fragen sind beide, warum Assembler lernen, warum darin programmieren, was … ich denke, es ist anders …?

    – vgl

    26. April 2009 um 20:33 Uhr

  • Warum programmierst du in Assembler? — Schauen wir uns einige UNMÖGLICHE Antworten auf diese Fragen an: 1) Um meinen Code wartbar zu machen, 2) flexibel, 3) um Portabilität zu gewährleisten, 4) Testbarkeit, 5) Lesbarkeit, … 😉

    – ivan_ivanovich_ivanoff

    27. April 2009 um 0:18 Uhr

  • Berufssicherheit……..

    – San Jacinto

    24. Oktober 2009 um 21:52 Uhr

  • weil es Spaß macht.. 🙂

    – RainingComputers

    26. Februar 2016 um 7:11 Uhr

Benutzeravatar von Todd Gamblin
Tod Gamblin

Ich glaube du missverstehst diese Aussage:

Zum Beispiel haben viele moderne 3-D-Spiele ihre leistungsstarke Kern-Engine in C++ und Assembly geschrieben.

Spiele (und die meisten Programme heutzutage) sind nicht „in Assembler geschrieben“, so wie sie „in C++ geschrieben“ sind. Dieser Blog sagt nicht, dass ein beträchtlicher Teil des Spiels in Assembler entworfen wurde oder dass ein Team von Programmierern herumsitzt und Assembler als ihre Hauptsprache entwickelt.

Was ist das Ja wirklich bedeutet, dass Entwickler zuerst das Spiel schreiben und es in C++ zum Laufen bringen. Dann profilieren sie es, finden heraus, wo die Engpässe liegen, und wenn es sich lohnt, optimieren sie sie in der Montage. Oder, wenn sie bereits Erfahrung haben, wissen sie, welche Teile Engpässe sein werden, und sie haben optimierte Teile aus anderen Spielen, die sie gebaut haben, herumliegen.

Das Punkt der Programmierung in Assembler ist die gleiche wie immer: Geschwindigkeit. Es wäre lächerlich, a zu schreiben viel Code in Assembler, aber es gibt einige Optimierungen, die der Compiler nicht kennt, und für ein ausreichend kleines Codefenster ist ein Mensch besser geeignet.

Beispielsweise sind Compiler für Gleitkommazahlen eher konservativ und kennen möglicherweise einige der fortgeschritteneren Funktionen Ihrer Architektur nicht. Wenn Sie bereit sind, einige Fehler zu akzeptieren, können Sie es normalerweise besser machen als der Compiler, und es lohnt sich, dieses bisschen Code in Assembler zu schreiben, wenn Sie feststellen, dass viel Zeit dafür aufgewendet wird.

Hier sind einige relevantere Beispiele:

Beispiele aus Spielen

  • Artikel von Intel über die Optimierung einer Game-Engine mit SSE-Intrinsics. Der endgültige Code verwendet Intrinsic (kein Inline-Assembler), sodass die Menge an reiner Assemblierung sehr gering ist. Aber sie sehen sich die Assembler-Ausgabe des Compilers an, um genau herauszufinden, was optimiert werden muss.

  • Erdbeben schnelle inverse Quadratwurzel. Auch hier enthält die Routine keinen Assembler, aber Sie müssen etwas über Architektur wissen, um diese Art der Optimierung durchzuführen. Die Autoren wissen, welche Operationen schnell (multiplizieren, verschieben) und welche langsam (dividieren, quadrieren) sind. Also haben sie eine sehr knifflige Implementierung der Quadratwurzel entwickelt, die die langsamen Operationen vollständig vermeidet.

High Performance Computing

  • Außerhalb der Domäne der Spiele optimieren Leute im wissenschaftlichen Rechnen häufig den Mist aus Dingen, damit sie auf der neuesten Hardware schnell laufen. Betrachten Sie dies als Spiele, bei denen Sie die Physik nicht betrügen können.

    Ein großartiges aktuelles Beispiel dafür ist Gitter-Quantenchromodynamik (Gitter-QCD). Dieses Papier beschreibt, wie das Problem auf einen sehr kleinen Rechenkern hinausläuft, der stark für PowerPC 440 auf einem optimiert wurde IBM Blaues Gen/L. Jeder 440 hat zwei FPUs und sie unterstützen einige spezielle ternäre Operationen, die für Compiler schwierig auszunutzen sind. Ohne diese Optimierungen wäre Lattice QCD viel langsamer gelaufen, was kostspielig ist, wenn Ihr Problem Millionen von CPU-Stunden auf teuren Maschinen erfordert.

    Wenn Sie sich fragen warum Dies ist wichtig, sehen Sie sich das an Artikel in Wissenschaft das ist aus dieser Arbeit entstanden. Unter Verwendung von Lattice QCD berechneten diese Jungs die Masse eines Protons anhand von Grundprinzipien und zeigten letztes Jahr, dass 90 % der Masse von starker Kraftbindungsenergie stammt und der Rest von Quarks. Das ist E=mc2 in Aktion. Hier ist eine Zusammenfassung.

Für alle oben genannten sind die Anwendungen nicht zu 100 % in Assembler entworfen oder geschrieben – nicht einmal annähernd. Aber wenn die Leute wirklich Geschwindigkeit brauchen, konzentrieren sie sich darauf, die wichtigsten Teile ihres Codes zu schreiben, um auf bestimmter Hardware zu fliegen.

  • erstaunliche Antwort. Ich wünschte, wir könnten das in ein Wiki stellen!

    – bdd

    30. April 2009 um 17:02 Uhr

  • @Paperino … du kannst. Fragen und Antworten auf StackOverflow sind lizenzierte Creative-Commons-Namensnennung.

    – Aaron Maenpaa

    23. Mai 2009 um 21:51 Uhr

  • Weitere Informationen zum Verständnis von asm, damit Sie besser C/C++ schreiben können, finden Sie unter Warum ist dieser C++-Code schneller als meine handgeschriebene Assembly zum Testen der Collatz-Vermutung?. Meine Antwort dort weist darauf hin, dass das Lesen der Compiler-ASM-Ausgabe und das Optimieren der Quelle hilfreich sein kann, wenn der Compiler keine nützliche Optimierung bemerkt. Sie schreiben also mental (oder tatsächlich) in asm, dann halten Sie den Compiler in der Hand, um zu tun, was Sie wollen, aber jetzt haben Sie zukunftssicheres, tragbares C.

    – Peter Cordes

    16. November 2017 um 4:24 Uhr

Benutzeravatar von Uri
Uri

Ich habe seit vielen Jahren nicht mehr in Assemblersprache codiert, aber ich kann mehrere Gründe nennen, die ich häufig gesehen habe:

  • Nicht alle Compiler können bestimmte CPU-Optimierungen und Befehlssätze nutzen (z. B. die neuen Befehlssätze, die Intel hin und wieder hinzufügt). Zu warten, bis Compiler-Autoren aufholen, bedeutet, einen Wettbewerbsvorteil zu verlieren.

  • Einfacherer Abgleich des tatsächlichen Codes mit bekannter CPU-Architektur und -Optimierung. Zum Beispiel Dinge, die Sie über den Abrufmechanismus, das Caching usw. wissen. Dies sollte für den Entwickler transparent sein, aber Tatsache ist, dass dies nicht der Fall ist, weshalb Compiler-Autoren optimieren können.

  • Bestimmte Zugriffe auf Hardwareebene sind nur über die Assemblersprache möglich/praktisch (z. B. beim Schreiben von Gerätetreibern).

  • Formales Denken ist für die Assemblersprache manchmal tatsächlich einfacher als für die Hochsprache, da Sie bereits wissen, wie das endgültige oder fast endgültige Layout des Codes aussieht.

  • Das Programmieren bestimmter 3D-Grafikkarten (ca. Ende der 1990er Jahre) ohne APIs war in Assembler oft praktischer und effizienter und in anderen Sprachen manchmal nicht möglich. Aber auch hier handelte es sich um Spiele auf Expertenniveau, die auf der Beschleunigerarchitektur basieren, wie z. B. das manuelle Verschieben von Daten in einer bestimmten Reihenfolge.

Ich bezweifle, dass viele Leute Assemblersprache verwenden, wenn eine höhere Sprache ausreichen würde, insbesondere wenn diese Sprache C ist. Die manuelle Optimierung großer Mengen von Allzweckcode ist unpraktisch.

Es gibt einen Aspekt der Assembler-Programmierung, den andere nicht erwähnt haben – das Gefühl der Befriedigung, wenn man weiß, dass jedes einzelne Byte in einer Anwendung das Ergebnis Ihrer eigenen Bemühungen ist, nicht der des Compilers. Ich würde keine Sekunde lang wieder ganze Apps in Assembler schreiben wollen, wie ich es in den frühen 80ern getan habe, aber manchmal vermisse ich dieses Gefühl…

  • Heh, es ist das Ergebnis der Assembler-Arbeit! Normalerweise schreiben Sie viele Makros in asm.

    – mmx

    27. April 2009 um 12:08 Uhr

  • Nicht nur Zufriedenheit, sondern Wertschätzung für Präzision. Ein prägnanter Prozess, bei dem alles darüber erklärt ist, ist eine Freude anzusehen.

    – deau

    27. Oktober 2009 um 15:14 Uhr

Benutzeravatar von Ólafur Waage
Ólafur Waage

Normalerweise ist die Assemblierung eines Laien langsamer als C (aufgrund der Optimierung von C), aber viele Spiele (ich erinnere mich deutlich Untergang) mussten bestimmte Abschnitte des Spiels in Assembly haben, damit es auf normalen Computern reibungslos lief.

Hier ist das Beispiel, auf das ich mich beziehe.

Ich habe in meinem allerersten Job (80er) mit dem professionellen Programmieren in Assembler begonnen. Für eingebettete Systeme war der Speicherbedarf – RAM und EPROM – gering. Sie könnten straffen Code schreiben, der die Ressourcen schont.

In den späten 80er Jahren war ich auf C umgestiegen. Der Code war einfacher zu schreiben, zu debuggen und zu warten. Sehr kleine Codeschnipsel wurden in Assembler geschrieben – bei mir war es, als ich die Kontextumschaltung in einem Roll-Your-Own-RTOS schrieb. (Etwas, das Sie nicht mehr tun sollten, es sei denn, es handelt sich um ein “Wissenschaftsprojekt”.)

Sie werden Assembler-Snippets in einigen Linux-Kernel-Codes sehen. Zuletzt habe ich es in Spinlocks und anderem Synchronisationscode durchsucht. Diese Codeteile müssen Zugang zu atomaren Test-and-Set-Operationen erhalten, Caches manipulieren usw.

Ich denke, es würde Ihnen schwer fallen, moderne C-Compiler für die meisten allgemeinen Programmierungen zu optimieren.

Ich stimme @altCognito zu, dass Sie Ihre Zeit wahrscheinlich besser damit verbringen, intensiver über das Problem nachzudenken und die Dinge besser zu machen. Aus irgendeinem Grund konzentrieren sich Programmierer oft auf die Mikroeffizienz und vernachlässigen die Makroeffizienz. Assemblersprache zur Verbesserung der Leistung ist eine Mikroeffizienz. Wenn Sie für eine breitere Ansicht des Systems zurücktreten, können die Makroprobleme in einem System aufgedeckt werden. Das Lösen der Makroprobleme kann oft zu besseren Leistungssteigerungen führen. Sobald die Makroprobleme gelöst sind, kollabieren Sie auf die Mikroebene.

Ich denke, Mikroprobleme liegen in der Kontrolle eines einzelnen Programmierers und in einem kleineren Bereich. Das Verhalten auf der Makroebene zu ändern, erfordert die Kommunikation mit mehr Menschen – eine Sache, die manche Programmierer vermeiden. Diese ganze Cowboy-gegen-Team-Sache.

Benutzeravatar von cgp
cgp

“Ja”. Aber verstehen Sie, dass die Vorteile des Schreibens von Code in Assembler größtenteils den Aufwand nicht wert sind. Die Rendite, die Sie erhalten, wenn Sie es in Assembly schreiben, ist in der Regel geringer als wenn Sie sich einfach darauf konzentrieren, intensiver über das Problem nachzudenken und Ihre Zeit damit zu verbringen, über eine bessere Vorgehensweise nachzudenken.

John Carmack und Michael Abrash, die maßgeblich für das Schreiben von Quake und den gesamten Hochleistungscode verantwortlich waren, der in IDs Gaming-Engines einfloss, gehen in diesem Buch ausführlich darauf ein.

Ich würde auch Ólafur Waage zustimmen, dass Compiler heutzutage ziemlich schlau sind und oft viele Techniken anwenden, die sich versteckte architektonische Verbesserungen zunutze machen.

Benutzeravatar von Norman Ramsey
Norman Ramsey

Heutzutage schlägt zumindest für sequenziellen Code ein anständiger Compiler fast immer sogar einen erfahrenen Assembler-Programmierer. Aber für Vektorcodes ist es eine andere Geschichte. Weit verbreitete Compiler leisten beispielsweise keine so gute Arbeit, wenn sie die vektorparallelen Fähigkeiten der x86-SSE-Einheit ausnutzen. Ich bin ein Compiler-Autor, und Nutzung von SSE steht ganz oben auf meiner Liste der Gründe, auf eigene Faust zu gehen, anstatt dem Compiler zu vertrauen.

  • In diesem Fall würde ich einen intrinsischen Compiler verwenden.

    – mmx

    27. April 2009 um 12:05 Uhr

  • Immer noch nicht dasselbe. Es ist wie ein Compiler ohne Registeroptimierer

    – Marco van de Voort

    26. Oktober 2009 um 17:28 Uhr

  • Es hängt davon ab, welche Art von Würze Ihr asm-Programmierer hat. Wenn Sie gelesen und grokked haben agner.org/optimieren um mehr über die Mikroarchitektur zu erfahren, auf die Sie abstimmen, indem Sie den Compiler schlagen nur für kurze Sequenzen ist oft einfach. Mindestens die Hälfte der Zeit sehe ich verpasste kleinere Optimierungen, wenn ich mir die Compilerausgabe für kleine Funktionen ansehe. Wo Compiler großartig sind, ist die Optimierung über große Codebasen mit Inlining und konstanter Ausbreitung.

    – Peter Cordes

    16. November 2017 um 4:30 Uhr

1419910cookie-checkWarum programmierst du in Assembler? [closed]

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

Privacy policy