Ist die Vollversammlung noch relevant? [geschlossen]


18

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?


Warum sollte jemand heute ein komplettes Projekt ausschließlich in Assemblersprache schreiben? Oder fragen Sie nach einer Umgebung mit mehreren Sprachen, wie sie heute in der Regel in der Assembly verwendet wird?
Martin Vilcans

6
Beachten Sie, dass es Bereiche der 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.
Mchl

1
@Mchl: Sind diese Projekte nicht in C (oder sogar C ++) und möglicherweise in Assembler erstellt? Ich hätte gedacht, dass es sehr ungewöhnlich ist, ausschließlich Assembly zu verwenden.
Martin Vilcans

1
Tatsächlich trifft man in der industriellen Automatisierung auf eine ganze Reihe von Sprachen, die es außerhalb dieses Bereichs einfach nicht gibt. Ein Teil davon ist auf Unterschiede in der Hardware zurückzuführen (Harvard-Architektur im Gegensatz zu der von Neumann-Architektur, die wir so gewohnt sind). sowie aus der Geschichte, diese Steuerungen für Elektriker zugänglich zu machen, die es gewohnt waren, mit Schaltern und Relais zu arbeiten. Auf diese Weise entsteht LD ( en.wikipedia.org/wiki/Ladder_logic ), eine grafische Interpretation der Assemblierung. Weitere Sprachen für die Automatisierung finden Sie im verlinkten Artikel.
Mchl

2
Ich habe einen kleinen Installer, den ich jetzt bei der Montage unterstütze. Das Schreiben in Assembly (mit der Windows-API) war genauso einfach wie alles andere. Warum also nicht? Ich habe auch eine Kreditkarte Swiper-Schnittstelle in Assembly geschrieben. Begonnen in Hochsprachen, hatte aber so viele Schwierigkeiten, es zum Laufen zu bringen, dass ich es in der Montage neu geschrieben habe, um eine bessere Kontrolle über alle fließenden Teile zu bekommen ...
Brian Knoblauch

Antworten:


25

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:

  • Demontage-Dumps beim Debuggen zu lesen, was ich gelegentlich auch heute noch mache.
  • Umgang mit nicht standardmäßigen CPU-Funktionen, wie dem funky Grafikmodus.
  • Compiler-Schreiben - Es stellt ein für Menschen lesbares Zwischenformat zur Verfügung, in das übergeordnete Sprachen übersetzt werden können.

1
Und selbst Ihr Grund # 3 verschwindet allmählich mit Compilern, die entweder auf ein Compiler-Framework auf hoher Ebene wie LLVM, Nanojit oder Libjit oder auf etwas wie JVM, CIL, Parrot, Rubinius oder Neko-Bytecode abzielen.
Jörg W Mittag

Es ist immer noch manchmal notwendig, ein bisschen SSE2 in der Grafik- / Videoarbeit zu machen. Obwohl Benchmark gegen TBB / OMP zuerst!
Martin Beckett

@Martin: OMP ist orthogonal zu SSE2. (Gute
Datenlayout-

@rwong - aber der Prozess ist noch nicht abgeschlossen, 1 entdecken Sie, dass er zu langsam ist. 2, hoffe, OMP / TBB beschleunigt es genug. 3, greifen Sie auf Handschrift SSE2-Version! (in der Reihenfolge der Schmerzen)
Martin Beckett

2
Als Beispiel wurde die gesamte Version von Roller Coaster Tycoon in Assembler geschrieben (abzüglich der Grafiken, die in c erstellt wurden) und war für diese Zeit erstaunlich leistungsfähig. Hunderte von einzelnen AIs agierten unabhängig voneinander, fast nahtlos, wenn die meisten Spiele Sprites mit einer Auflösung von 16 x 16 Pixel aufwiesen, die vordefinierte Bewegungen ausführten. Das nutze ich immer gerne, um die Kraft der Montage zu demonstrieren.
Ampt

19

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.


3
gute Antwort. Wie viele Leute würden lieber doppelt so viel für etwas bezahlen, dass die Batterien nur halb so lange halten, weil Java oder etwas anderes als Entwicklungsplattform verwendet wurde? Schauen Sie sich groupon und alle anderen Möglichkeiten an, wie Leute Geld sparen wollen, schauen Sie sich die grüne Bewegung an, die Ressourcen spart. Warum die Kosten und die Leistung aller eingebetteten Produkte steigern, um die Montage zu vermeiden?
old_timer

1
Sie haben vergessen hinzuzufügen, dass auf Computern jetzt Javascript (Chromebooks) ausgeführt wird. Für mich ist dieser Fortschritt ziemlich traurig, aber wahr.
Hawken

Ab 2017 wird CIA auf Ihrem Fernseher mit Linux installiert, Signale von Java, die auf Autoschlüsseln laufen, können gefälscht werden, jeder kann über WIFI eine Verbindung zur C ++ - Firmware einer Dildokamera herstellen , eine Zahnbürste wurde 2013 per Fernzugriff ausgenutzt, aber glücklicherweise sind immer noch Kopfhörer mit dabei Geräuschunterdrückung bei Montagearbeiten. Obwohl Montag verliert Position als Top-Level - Steuerung von etwas , bewegt in Unterkomponenten statt. Auf Ihren Jalousien wird bereits Java ausgeführt, aber diese Java-Steuerkarte kommuniziert mit der Jalousiemotorsteuerung, die mit der Montage ausgeführt wird.
SF.

8

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).


Ich habe gute Erinnerungen an TASM und Orca / M Assembler =)
Patrick Hughes

0

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.


0

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?


-3

Wenn Sie wirklich wirklich wissen wollen, warum das Lernen der Montage die beste Wahl ist. Hier sind Gründe.

  1. Es ist nicht erforderlich, Assembler zu lernen, wenn Sie mit Visual Basic und diesem MS-Material programmieren möchten.
  2. Das Zusammenbauen muss nicht erlernt werden, wenn Sie keine ernsthaften Mikrocontroller-Geräte herstellen müssen.
  3. Keine Notwendigkeit, die Montage zu erlernen, wenn Sie während der Arbeit am Mikrocontroller über ausreichend Speicher verfügen (Gott hilft Ihnen bei der Anbindung des Speichers an den Mikrocontroller)
  4. Sie müssen das Zusammenbauen nicht erlernen, wenn Sie nicht möchten, dass Ihr Mikrocontroller / Mikroprozessor so stark wie Gott ist.
  5. Montage nicht zu kennen ist wie Eisberg zu kennen. Sie können 25% Ihrer und Ihrer mikroskopischen Fähigkeiten sehen und 75% werden Sie nie kennen oder verstehen
  6. Versuchen Sie, Kolibris OS auszuführen, das vollständig in Assembly geschrieben wurde !!! Haben Sie ein Betriebssystem gesehen, das in weniger als 5 Sekunden hochfährt und die Anwendung mit 1 Sekunde Mausklick startet?
  7. Moderne Compiler haben Allzweckfunktionen im Backend, und daher wäre der generierte endgültige Code im Vergleich zu Assembly schwierig.

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.


1
dies scheint nicht zu bieten alles wesentliche über gemacht Punkte und erläuterte vor 5 Antworten
gnat
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.