Gibt es beim Codieren und / oder Verwalten von Projekten große Unterschiede zwischen Assembler- und höheren Sprachen? Natürlich sind mehr Anweisungen in der Assemblersprache erforderlich, um einen bestimmten Vorgang auszuführen, als in den meisten anderen Sprachen. Es gibt jedoch Unterschiede, die sich darauf auswirken, wie ein Projekt basierend auf der Zielassemblersprache (insbesondere x86 / x64-Assemblersprache) ausgeführt werden muss (oder sollte). ?
In dem Maße, in dem es Unterschiede zwischen der Assemblersprache und anderen Sprachen gibt, kann davon ausgegangen werden, dass zumindest einige davon Vorteile für die anderen Sprachen haben. Kann jemand auf spezifische Nachteile der Assemblersprache hinweisen und Möglichkeiten finden, diese Nachteile abzumildern?
Ein konkretes Beispiel wäre die Verfügbarkeit von Personal. Hat jemand Probleme gehabt, erfahrene Assembler-Programmierer zu finden, und wenn ja, welche Schritte können unternommen werden, um dieses Problem zu mindern?
non-[PC|web|enterprise]
Programmierung gibt, in denen Assembly vorherrscht oder sehr beliebt ist. Ich spreche von Mikrocontrollern, Industrieautomation oder Robotik. Natürlich gibt es auch in diesen Bereichen Hochsprachen, aber Sie sehen Assembly sehr oft.Antworten:
Ja - aber nicht oft.
In gewisser Hinsicht ist Assembly eigentlich nur ein Proxy für Maschinensprache, sodass Sie in Assembly natürlich alles tun können, was Sie mit einer höheren Sprache könnten.
Das Gegenteil ist nicht immer der Fall. Zum Beispiel habe ich vor ein paar Jahren an einer ARM-CPU gearbeitet, die einige funky Opcodes zum Ändern von Grafikzuständen hatte, die nur im Kernel-Modus verwendet werden konnten. Sie hätten keine direkte Entsprechung in einer höheren Sprache, und ich bin sicher, dass die Funktion im Linux-Kernel-Treiber zum Ändern dieser Zustände eine gewisse Assemblierung enthielt.
Auf Mikroprozessoren in den 80ern und in den frühen Mitte der 90er Jahren, wenn Sie Code hatten, den Sie wirklich schnell ausführen mussten, haben Sie ihn oft in Assembler geschrieben, weil ein erfahrener Mensch einfach optimierteres Assembler schreiben konnte als die meisten C Compiler könnten generieren. Einige frühe Mac-Programme wurden komplett in Assembler geschrieben und waren für die damalige Zeit erstaunlich schnell. Auch ohne das gesamte Programm in Assembler zu schreiben, habe ich sicherlich meinen Teil zur Optimierung der inneren Schleifen in C über eingebettete Assembler beigetragen.
Aber die Dinge begannen sich Mitte der neunziger Jahre zu ändern. CPUs wurden mit Funktionen wie Pipelining und Verzweigungsvorhersage ausgestattet, sodass die effizienteste Anweisungsreihenfolge für einen Menschen nicht immer offensichtlich war. Schlimmer noch, die effizienteste Bestellung war bei den CPUs derselben Familie unterschiedlich. Beispielsweise boten PowerPC-Compiler in der Regel Ziel-Switches für die Serien G3, G4 und G5 an. Auf allen würde derselbe Objektcode ausgeführt, auf einer dieser Serien jedoch effizienter.
Seitdem ist die Anweisungsreihenfolge immer komplizierter geworden, insbesondere bei den architektonisch komplexeren CPUs wie x86, PowerPC und SPARC. (Ich glaube, dass ARM auf diese Weise immer noch recht einfach ist.) Ein großer zusätzlicher Faktor ist die Codegröße. Code, der mehr CPU-Zyklen verwendet, aber im CPU-Cache verbleiben kann, wird häufig viel schneller ausgeführt als Code, der weniger CPU-Zyklen verwendet, aber langsame Speicherabrufe auslöst . Die großen modernen Compiler können den Code auf diesen CPUs viel besser optimieren als ein Mensch.
Ich habe seit mindestens 15 Jahren keinen guten Grund gefunden, eine Versammlung zu schreiben. Ich denke, im Jahr 2011 wären die Hauptanwendungen für die Montage:
quelle
Versuchen Sie, einen Mikrocontroller für ein "kleines Embedded" zu programmieren - eine Autoalarm-Fernbedienung, einen Telefonbatteriemonitor, einen Tastaturcontroller und einen Lüftergeschwindigkeitsregler, ohne eine Baugruppe zu verwenden.
Während sich die Grenze bewegt, ist immer Platz für die Montage.
Vor 15 Jahren war Ihr Fahrradkilometerzähler mechanisch, ein Mikrowellenherd war in einer analogen Schaltung, eine TV-Fernbedienung war in einer digitalen Schaltung, ein Sat-TV-Tuner war in einer Baugruppe geschrieben, eine Telefon-Firmware war in C und ein Computer-Applet war in Java.
Vor 7 Jahren befand sich ein Mikrowellenherd in einer digitalen Schaltung, eine TV-Fernbedienung war in der Baugruppe geschrieben, eine TV-Set-Top-Box war in C geschrieben, auf Ihrem Telefon lief eine Java-basierte Benutzeroberfläche.
Heutzutage befindet sich ein Fahrradkilometerzähler in einer digitalen Schaltung, ein Mikrowellenherd erhält Firmware in der Baugruppe, eine TV-Fernbedienung verfügt über Firmware in C, eine TV-Set-Top-Box führt Java aus, Ihr Telefon verfügt über Linux.
Willst du die nächsten 7 Jahre wetten? Je weiter fortgeschrittene Steuerungssprachen für die Technologie entwickelt werden, desto mehr werden neue Grundlagen für die Montage geschaffen. Schauen Sie sich an, was heute mit mechanischen oder analogen Schaltungen gemacht wird. Sie können dort in ein paar Jahren auf die Montage wetten. Dein Lichtschalter? Dein Wasserhahn? Dein Wasserkocher? Deine Zahnbürste?
Bei der Montage muss immer ein neues Gerät, Gerät, Spielzeug und Gebrauchsgegenstand programmiert werden.
quelle
Ich stütze mich hauptsächlich auf die Assembler, die ich verwendet habe - hauptsächlich MASM, NASM und (in geringerem Maße) TASM. Einige der neueren Versionen von TASM hatten (haben?) Einige Funktionen, um OO zu unterstützen, aber ich habe sie nicht viel benutzt, und ich versuche nicht, sie zu kommentieren.
Erstens: Die meisten Sprachen sind zu einer Struktur übergegangen, die zumindest etwas baumähnlich ist. Ob objektorientiert oder objektbasiert oder genau das, es ist ziemlich viel über die Beziehungen zwischen verschiedenen Teilen eines Systems definiert. Es gibt auch eine Menge zu "schützen" einen Teil eines Systems vor versehentlichem "Einmischen", aber andere Teile (obwohl der Schutz normalerweise umgangen werden kann, wenn Sie möchten). Im Gegensatz dazu ist die Assemblersprache relativ "flach" - die meisten Beziehungen zwischen Code (und Daten) in verschiedenen Teilen des Systems werden hauptsächlich durch Dokumentation und in geringerem Maße durch Benennungskonventionen hergestellt.
Das Ergebnis ist, dass es oft viel einfacher ist, Code viel enger zu koppeln, als es ideal wäre. Die Anforderungen, die für die Wahl der Assemblersprache ausschlaggebend waren (höhere Leistung, geringere Größe usw.), belohnen dies oftmals auch. Durch Umgehen zugelassener Schnittstellen und solcher kann häufig Code abgerufen werden, der kleiner und schneller ist (wenn auch in der Regel nicht sehr häufig) besser in jeder Dimension). Die Sprache und die Tools selbst können Ihre (guten oder schlechten) Handlungen viel weniger einschränken, was die Manager erheblich mehr belastet, um Probleme zu vermeiden. Ich würde nicht sagen, dass es qualitativ anders ist, aber quantitativ. Das heißt, das Management muss arbeiten, um Probleme in beiden Richtungen zu vermeiden. Bei Assemblersprachen sind jedoch im Allgemeinen mehr (und oftmals strengere) Richtlinien erforderlich, um festzustellen, was nicht der Fall ist. nicht akzeptabel.
Dies zu mildern, ist größtenteils eine Frage sorgfältigerer Richtlinien, mehr Anleitung durch erfahreneres Personal und spezifischerer, sorgfältig durchgesetzter Namenskonventionen.
Personal ist ein Problem. Die Probleme, auf die ich gestoßen bin, waren jedoch nicht in erster Linie die, die ich erwartet hatte. Es war ziemlich einfach, Leute mit einer Art "Fighter Jock" -Persönlichkeit zu finden, die sich freuten, in Assembler-Code zu springen. Die meisten machten eine ziemlich vernünftige Arbeit, obwohl sie fast keine Vorkenntnisse im Umgang mit Assembler hatten.
Die Schwierigkeit, auf die ich stieß, bestand darin, mehr leitende Angestellte zu finden - Leute, die das Projekt zumindest scheinbar unter Kontrolle halten konnten und nicht vollständig an Sprachen gewöhnt waren, die die Richtlinien für eine vernünftige Einhaltung des Codes lieferten (und weitgehend durchsetzten) wartbar und verständlich.
Rückblickend könnte ich in dieser Hinsicht eines der größten Probleme verursacht haben. Ich sehe zwei Ursachen für Probleme. Erstens habe ich zum Zeitpunkt des Projekts, an das ich denke, schon seit einiger Zeit hauptsächlich in höheren Sprachen programmiert und nur Assemblersprache verwendetals letztes. Als ich es benutzte, war fast jeder mögliche Trick, um Leistung zu erzielen, nicht nur faires Spiel, sondern erwartet. Zweitens, als ich an einigen Systemen gearbeitet hatte, die vollständig (oder hauptsächlich) in Assemblersprache geschrieben waren, war es unter einigen ziemlich eisernen Projektmanagern. Zu der Zeit war ich noch relativ jung und hatte ehrlich gesagt einen Groll gegen die Art und Weise, wie sie Dinge betrieben, und neigte daher dazu, das Gegenteil zu tun. Rückblickend war es wichtig, was sie wirklich taten, und nicht nur, weil sie alt und unflexibel waren (was ich ziemlich sicher war, wie ich die Dinge damals sah).
quelle
meiner meinung nach ist assembly als entwicklungsplattform möglicherweise nicht alltagstauglich. Der Hauptgrund für diese Ansicht kann sein, dass die Menge an Rechenleistung, die einem bestimmten Prozess entzogen wird, im Vergleich zu der Menge an Entwicklungszeit, die zum Optimieren desselben bestimmten Prozesses benötigt wird, in der Regel nicht die Zeit und Energie wert ist (hierfür gibt es einen bestimmten Begriff) .. es klingt wie Mann / Stunde oder so..bearbeiten Sie bitte, wenn Sie wissen, wovon ich spreche ..) Es gibt die oben genannten offensichtlichen Ausnahmen, aber was die Mainstream-Programmierung betrifft, wird die Montage nicht oft verwendet.
Vor diesem Hintergrund ist die Assemblierung auch heute noch relevant, wenn Sie im Rahmen eines Software-Engineering-Studiums Programmieren lernen. Sie vermittelt, wie sich eine Programmiersprache auf niedriger Ebene anfühlt und wie sie sich anfühlt. Ich werde weitergehen und das Beispiel geben, was wir heutzutage im Unterricht verwenden. Wir verwenden die pep / 8-Assembly, die von Stanley Warford (Pepperdine University, USA) entwickelt wurde, und die hier angegebene Open-Source-Software . Wird hauptsächlich verwendet, weil es die CPU virtualisiert und den Speicherinhalt anzeigt, während der Code ausgeführt wird (sehr nützlich zum Lernen und Debuggen).
Abhängig von Ihrer Nutzung kann die Assembly meiner Meinung nach relevant sein oder auch nicht.
quelle
Ich denke, Sie fragen: "Sind LKWs immer noch relevant, wenn wir Autos haben?". Ich meine, Baugruppen haben ein sehr breites Anwendungsspektrum, aber nicht so viele wie High-Level-Programme, genauso wie es viel weniger Lastwagen als Autos gibt.
In Bereichen wie der Optimierung von Algorithmen können Sie Prozessorregister direkt verwenden, um Bild- / Videoverarbeitungsalgorithmen zu verbessern.
In Bereichen wie Kryptografie können Sie es auf die gleiche Weise verwenden.
In neuen Prozessoren mit neuen Architekturen (denken Sie daran, als der Cell-Mikroprozessor herausgegeben wurde) mussten sie natürlich Bootloader usw. in die Baugruppe schreiben (und auch in alten Prozessoren, aber langzeitverwendete Prozessoren haben einen sehr stabilen Grund und sind schwer zu verbessern es).
Es könnten noch viele weitere Beispiele angeführt werden. Es hängt also davon ab, auf welches Gebiet sich Ihr Unternehmen konzentriert, ob Ihr Unternehmen der Web- / Mobilentwicklung gewidmet ist, ob Sie es nicht benötigen, ob Ihr Unternehmen sich jedoch auf Mikrocontroller konzentriert. eingebettete Systeme usw. ist ziemlich wahrscheinlich, dass Sie es brauchen.
Und die Verfügbarkeit des Personals hängt davon ab, ob Sie bei Intel oder Qualcomm nachfragen. Sie müssen über eine große Liste von Montageprogrammierern verfügen (etwa, wenn Sie an Ihrem Arbeitsplatz fragen: "Wie viele LKW-Fahrer gibt es hier?") denke nicht viel nach, aber das heißt nicht, dass es keine anderen Orte gibt. Was passiert, wenn du fragst, wie viele Autofahrer hier sind?
quelle
Wenn Sie wirklich wirklich wissen wollen, warum das Lernen der Montage die beste Wahl ist. Hier sind Gründe.
Die Versammlung ist wie die Natasha Romanoff von Avengers. Es ist ein Zauber und eine Magie. Erstens wird es Sie beißen, aber vertrauen Sie mir, Sie werden den Geschmack nie vergessen.
quelle