Was sind einige Vorteile / Nachteile der Verwendung von C gegenüber der Montage? [geschlossen]


15

Ich studiere derzeit Ingenieurwesen in Telekommunikation und Elektronik und wir sind in der Mikroprozessorprogrammierung von Assembler zu C gewechselt. Ich habe Zweifel, dass dies eine gute Idee ist. Welche Vor- und Nachteile hat C gegenüber der Montage?

Die Vor- und Nachteile, die ich sehe, sind:

Vorteile:

  • Ich kann sagen, dass die C-Syntax viel einfacher zu erlernen ist als die Assembler-Syntax.
  • C ist einfacher zu verwenden, um komplexere Programme zu erstellen.
  • Das Erlernen von C ist irgendwie produktiver als das Erlernen von Assembler, da sich in C mehr Dinge entwickeln als in Assembler.

Nachteile:

  • Assembler ist eine niedrigere Programmiersprache als C und eignet sich daher gut für die direkte Programmierung auf Hardware.
  • Ist viel flexibler und lässt Sie mit Speicher, Interrupts, Mikroregistern usw. Arbeiten.

17
Ähm ... Willkommen im neuen Jahrhundert. Es wird dir hier gefallen. Wir haben Mikrocontroller, auf denen .NET , Java , Linux und sogar Python zum Programmieren von PICs ausgeführt werden .
ZJR

@ZJR Wie programmiert man mit Python einen PIC? Welches Foto?
Detly

2
@detly Es ist kein vollwertiges Python, nur eine Teilmenge des Kerns. Wenn Sie möchten, können Sie sich mit der Python-Syntax der Controller-Funktionalität auseinandersetzen . pyastra ist das erste Beispiel, bei dem ich wieder gegoogelt habe, aber ich erinnere mich, dass ich Dokumente eines anderen gelesen habe, der auch ATMELs gemacht hat.
ZJR

4
Um ehrlich zu sein, wäre ich angesichts der Komplexität moderner Prozessoren überrascht, wenn viele Programmierer kompaktere, effizientere Assembler schreiben könnten, als ein moderner C-Compiler ohnehin erzeugen kann. Ich würde es hassen, zu versuchen, eine EPIC-Architektur- CPU in Assembler zu programmieren - Mel wäre mit dem Itanium genau richtig . * 8 ')
Mark Booth

5
@ZJR Dieses neue Jahrhundert klingt aufregend! Ich bin jedoch gespannt, in welcher Sprache die .NET-Laufzeit, Java VM und Linux für diese Mikrocontroller geschrieben wurden. In welcher Sprache wurde die eigentliche Mikrocontroller-Programmierung durchgeführt? Oh ... C oder Assembler auch in diesem Jahrhundert ...

Antworten:


17

Hier sind einige Stapelüberlauf-Antworten, die Ihnen helfen können (dies sind die häufigsten Antworten, akzeptierte Antworten):

Vorteile

/programming/143561/is-there-a-need-to-use-assembly-there-days (nur für 10K-Benutzer) oder Archive

  • Die Montage wird in den frühesten Phasen des Bootloaders verwendet. Wenn die CPU den Stapel nicht einschaltet, ist es schwierig, den C-Compiler davon abzuhalten, Dinge auf dem Stapel zu speichern. Der Großteil des Bootloaders ist jedoch in C geschrieben, sobald die früheste Initialisierung erfolgt ist.
  • Assembly wird zum Schreiben von Mutex-Sperrprimitiven verwendet. Es ist im Grunde unmöglich, einen C-Compiler zu veranlassen, an den erforderlichen Stellen Anweisungen für die Speicherbarriere auszugeben.
  • Routinen wie memset () oder memcpy () werden häufig in der Assembly ausgeführt. Ich habe zum Beispiel ein memset () mit einer großen entrollten Schleife geschrieben, das dynamisch eine Verzweigungsadresse berechnet, um für eine letzte Iteration in die Mitte dieser Schleife zu springen. Die AC-Routine hätte mehr Code generiert, was zusätzliche Fehler mit sich gebracht hätte. Ebenso enthalten CPU-Befehlssätze häufig das Laden von Cache-Zeilen oder andere Befehle, die memcpy () erheblich beschleunigen können, was der C-Compiler nicht nutzt.

Nachteile

/programming/2684364/why-arent-programs-wrritten-in-assembly-more-often

  • ASM ist schlecht lesbar und im Vergleich zu höheren Sprachen nicht wirklich wartbar.
  • Außerdem gibt es viel weniger ASM-Entwickler als für andere gängigere Sprachen wie C.
  • Wenn Sie eine höhere Sprache verwenden und neue ASM-Anweisungen verfügbar werden (z. B. SSE), müssen Sie lediglich Ihren Compiler aktualisieren, und Ihr alter Code kann die neuen Anweisungen problemlos verwenden.

Beispiel

Der letzte Beitrag unten ist ein Stapelüberlauf-Beitrag, der ein Szenario beschreibt, in dem ein Assembly-Beispiel gezeigt wird, das schneller als C ist (wenn dieselbe Funktion ausgeführt wird).

/programming/577554/when-is-assembler-faster-than-c


20
  • C ist einfacher zu programmieren als Assembly. Es gibt offensichtliche Gründe, die es nicht wert sind, nachgewärmt zu werden.

  • C ist benutzerfreundlicher und ermöglicht es Ihnen, Programme schneller zu schreiben. Im Allgemeinen sind diese Programme auch einfacher zu debuggen und zu warten. Darüber hinaus ist es einfacher, große, komplexe Programme in C zu verwalten.

  • Häufig ist Code, der von einem Compiler generiert wird, in Bezug auf Geschwindigkeit und Effizienz genauso gut wie handgeschriebener Assembler - wenn nicht sogar besser.

  • C ist verdammt niedrig und es ist selten, dass Sie viel tiefer gehen möchten. Eine zusätzliche Abstraktionsebene zu haben, ist selten eine schlechte Sache.

  • Wenn Sie nach unten gehen müssen, können Sie Assembly verwenden, andernfalls können Sie C verwenden.

  • Sie können Assembly in C-Code schreiben, aber nicht C in Assembly-Code.


6
Ich würde sagen, vielleicht werden Sie mal sehen, dass C-Compiler-optimierter Maschinencode besser ist als Ihr handgeschriebener Assembler-Code
Benutzer

@crucified - diese Behauptung war bereits Mitte bis Ende der 90er Jahre weit verbreitet (und in der Regel berechtigt). Ein Compiler wendet Optimierungen zuverlässig und systematisch an - nicht nur, wenn er die Gelegenheit wahrnimmt.
Steve314

15

Wechselstromprogramme können für verschiedene Mikroprozessorarchitekturen kompiliert werden.


4

Wir sind in der Mikroprozessorprogrammierung von Assembler auf C umgestiegen. Ich habe Zweifel, dass dies eine gute Idee ist

Fürchte dich nicht, niemand entwickelt mehr neue Programme in 100% Assembler. Heutzutage kann C sogar für die kleinsten und verrücktesten 8-Bit-Architekturen verwendet werden. Allerdings macht einige Assembler wissen , dass Sie einen deutlich besserer C - Programmierer. Ein oder zwei kleine Details in einem Programm müssen immer in Assembler geschrieben werden.

Ich kann sagen, dass die C-Syntax viel einfacher zu erlernen ist als die Assembler-Syntax.

Ja, die Syntax ist sicherlich einfacher. Das Erlernen der gesamten C-Sprache mit all den lästigen Details ist jedoch weitaus komplexer als das Erlernen aller Details eines bestimmten Assemblers. C ist eine viel größere und umfassendere Sprache. Andererseits müssen Sie möglicherweise nicht alle Details lernen.

C ist einfacher zu verwenden, um komplexere Programme zu erstellen.

Tatsächlich bietet C Mechanismen für den modularen Programmaufbau, wie beispielsweise die Kapselung und lokale Bereiche / lokale Variablen. Und C verfügt über eine Standardbibliothek sowie eine enorme Menge an Ressourcen, die in den letzten 30 Jahren geschrieben wurden. Und vor allem ist C portabel.

Das Erlernen von C ist irgendwie produktiver als das Erlernen von Assembler, da sich in C mehr Dinge entwickeln als in Assembler.

C verfügt über zahlreiche vorgefertigte Funktionen, Bibliotheken und Ressourcen, sodass das Rad weniger neu erfunden werden muss. Ansonsten ist Ihre Aussage subjektiv. Ich glaube, es ist eine Frage der persönlichen Präferenz.

Ich bin zum Beispiel ein erfahrener C-Programmierer, der gelegentlich C ++ programmiert. Ich finde mich in C ++ weit weniger produktiv, weil ich diese Sprache nicht so gut kenne wie C. Aber nur weil ich das so empfinde, heißt das nicht unbedingt, dass das Programmieren in C produktiver ist als das Programmieren in C ++. Ein erfahrener C ++ - Programmierer hätte sicherlich die gegenteilige Meinung.

Und es gibt viele Aspekte, um "produktiv" zu sein. Ein sehr wichtiger Aspekt ist die Wartungszeit und insbesondere die Zeit, die benötigt wird, um durch die Wartung verursachte Fehler zu beheben. C ist weitaus einfacher zu warten als Assembler.

Assembler ist eine niedrigere Programmiersprache als C und eignet sich daher gut für die direkte Programmierung auf Hardware.

Die Hardwareprogrammierung kann direkt in beiden Sprachen erfolgen. Das einzige, was Sie in C nicht tun können, ist auf Stapelzeiger und Bedingungsregister usw. des CPU-Kerns selbst zuzugreifen. Wenn Sie also mit Hardwareprogrammierung meinen, mit Ihrer eigenen CPU zu sprechen, dann erlaubt Assembler ein bisschen mehr als C. Wenn Sie damit meinen, auf externe Hardware zuzugreifen, dann hat Assembler keinen Vorteil gegenüber C. Aber vielleicht auch Nachteile, da es oft schwieriger zu schreiben ist generischer Assembler-Code für ein bestimmtes externes Gerät als generischer C-Code.

Ist viel flexibler und lässt Sie mit Speicher, Interrupts, Mikroregistern usw. Arbeiten.

Das ist nicht richtig. Mit C können Sie all das auch tun, obwohl Sie sich möglicherweise auf compilerspezifischen C-Code wie das Interrupt-Schlüsselwort verlassen müssen.


Letztendlich müssen Sie beide Sprachen beherrschen, um MCUs mit Schwerpunkt auf C zu programmieren.


Inwiefern ist die gesamte C-Sprache komplexer als einige der arkaneren Maschinensprachen? Nachdem ich beides gemacht habe, denke ich, dass C ohne die Bibliotheken wesentlich weniger komplex ist. Wenn Sie sich auf die C-Standardbibliothek beziehen, benötigen Sie so etwas auch in Assembler, um etwas Nützliches zu tun. C ist zwar eine größere und umfassendere Sprache, Sie müssen sie jedoch nicht bis ins kleinste Detail kennen. a = b[i] + c;Das Laden, Hinzufügen und Speichern von Befehlen b[i](die Berechnungen cerfordern ) und Registern (die verfügbar gemacht werden müssen) ist viel einfacher als dies.
David Thornley

1
@DavidThornley Je mehr Sie über C lernen, desto mehr erkennen Sie, wie komplex es ist. Kennen Sie alle Hunderte Fälle von undefiniertem / nicht spezifiziertem / implizit definiertem Verhalten? Kennen Sie alle Regeln für implizite Typheraufstufungen im Detail (ganzzahlige Heraufstufungen, übliche arithmetische Umrechnungen)? Alle besonderen Regeln und Syntax in Bezug auf Typspezifizierer? Alle verschiedenen Formen von statischen / dynamischen mehrdimensionalen Arrays, einschließlich Array-Zeigern (nicht zu verwechseln mit Zeigern auf das erste Element eines Arrays) Alle Funktionen von C99 und C11? Und so weiter.

1
@Lundin: Bei C ist es wichtig, dass Sie all diese Fragen stellen und konkrete Antworten finden können. Kompilierer, die dem Standard entsprechen, müssen dokumentieren, wie sie sich für die 62 (nicht "Hunderte") implementierungsdefinierten Verhaltensweisen verhalten. Die schiere Einfachheit von Assembly macht es zu einem Selbstbedienungsangebot, das wiederum die Komplexität, mit der C umgeht, auf Ihren eigenen Code überträgt. Ich könnte Ihrem Argument entgegentreten, indem ich frage, wie viele Gleitkomma-Bibliotheken in Assembly für eine bestimmte Architektur geschrieben wurden und warum ihr Verhalten von der Implementierung abhängt.
Blrfl

1
@Lundin: 62 ist die Anzahl der vom Compiler definierten Verhaltensweisen, die in Abschnitt 4 des GCC-Handbuchs aufgeführt sind. Wenn Sie weglassen, was für eine Bibliothek definiert ist, können Sie Äpfel mit Äpfeln vergleichen, da es keine Standardbibliothek für die Assembly gibt. Die Dokumentationspflicht ist der erste Satz von §J.3. GCC und die Handvoll kommerzieller Compiler, die ich gekauft oder verwendet habe, seit C89 ratifiziert wurde (Intel, Sun, IBM, Portland Group). Wo wir gerade von Standards sprechen: Wie funktioniert das Assemblieren von x86 mit Intel-Syntax auf einem Assembler mit AT & T-Syntax für Sie?
Blrfl

1
@Lundin: Mein Auto ist großartig, danke. Das Lenkrad, das Gaspedal, die Bremse, die Kupplung und der Blinker befinden sich alle an Standardplätzen, haben ein Standardverhalten und die anderen Bedienelemente sind alle deutlich mit ISO-Standardsymbolen gekennzeichnet. Alle implementierungsspezifischen Dinge wie das Unterhaltungssystem, die Klimaanlage, das Navigationssystem, die Geschwindigkeitsregelung usw. sind in einem dicken Buch im Handschuhfach dokumentiert. Die Montage ist wie bei meinem 1973er Plymouth: Es gab nicht viel, aber in roher Form war es nicht annähernd so leistungsfähig wie das, was ich jetzt fahre. Versammlung ist der gleiche Weg; Die Komplexität hängt davon ab, was Sie hinzufügen.
Blrfl

1

Abhängig davon, wie eingebettet Sie sein müssen, wird C große, langsame Programme erstellen. Das wird die Kosten für diesen Teil des Produkts merklich erhöhen. Es könnte ein Tropfen auf den heißen Stein für das gesamte Produkt sein oder das Produkt radikal verändern. Ja, einige könnten sagen, dass der Aufwand für Softwareentwicklung und -wartung billiger ist. Auch das kann wahr oder falsch sein, wenn dies tief eingebettet ist und auf einen Teil abzielt, der so wenig Energie, klein und kostengünstig ist, dass Sie nicht über viel Code sprechen. Dieser Code ist meistens für den jeweiligen Hersteller oder den jeweiligen Chip spezifisch, sodass C keine Portabilitätsvorteile bietet. Sie müssen also ohnehin jedes Ziel neu schreiben. Mit der cortex-m-Serie von ARM können wir C gerade erst mit asm konkurrieren, nicht dass Leute C oder andere höhere Sprachen in ihren eingebetteten Produkten verwendet haben.

Die Debatte zwischen C und ASM läuft professionell immer darauf hinaus, es in C zu schreiben und ASM zu verwenden, wo Sie es rechtfertigen können. Und Sie können es rechtfertigen. In der eingebetteten Welt gibt es Leistung und Größe.

Sie müssen das Ziel in diese Diskussion einbeziehen. Obwohl viele C mit Microchip (die älteren Bilder, nicht das Bild 32, das Mips ist) zu einem enormen Preis verwendet haben, ist es ein schrecklicher Befehlssatz für Compiler, sehr lehrreich und interessant, aber unfreundlich für Compiler. msp430, avr, arm, daumen, mips, alles gut für compiler. 8051 auch schlimm.

Noch mehr als die Sprache der Werkzeuge. Gerade in den Fällen, in denen die Sorge um Codeentwicklung und -verwaltung ein Argument ist, benötigen Sie Tools, um heute und morgen da zu sein. Aus geschäftlicher Sicht ist es riskant, ein Single-Source-Tool zu haben, das sogar einen einzelnen gcc-Mod enthält, der von einer Gruppe verwaltet wird. Sie werden wahrscheinlich mehr als einen Assembler finden, und jeder, der es verdient, in diesem Team zu sein, könnte an einem Wochenende einen Assembler auf die Beine stellen (solange die von Ihnen geschriebene Assembler-Anweisung und das Makro nicht zufrieden sind). Sowohl für asm als auch für C möchten Sie Open-Source-Tools (oder Ihre eigenen Tools) verwenden, bei denen Sie eine bessere Chance haben, Werkzeuge zur Verfügung zu haben, selbst wenn Sie eine virtuelle Maschine zum Ausführen einer 10 Jahre alten Linux-Distribution verwenden das Leben des Produkts.

Im Endeffekt verwenden / lernen / lehren Sie C und asm, beginnen Sie mit C und verwenden Sie asm, wo Sie es begründen können.


Diese Argumente klingen für mich altmodisch. Wenn Sie einen modernen Compiler verwenden, der in den letzten 10 Jahren geschrieben wurde, fällt es Ihnen meiner Meinung nach schwer, ein Assembler-Programm zu schreiben, das wesentlich effektiver ist als ein C-Programm. Wenn Sie nicht vielleicht eine 30 Jahre alte Dinosaurier-Architektur wie PIC oder 8051 verwenden, haben Sie ein langsames Programm, egal was Sie tun ...

Es ist ziemlich trivial, langsame Assemblierungen zu beheben, die mit den modernsten gcc und llvm generiert wurden. Der 4.x gcc erzeugt langsameren, weniger effizienten Code als die 3.x-Serie (für einige Ziele, zumindest die, die ich evaluiert habe, z. B. ARM). Ich denke, es ist wichtig, die Vorstellung zu zerstreuen, dass der Compiler besser abschneidet als die Menschen, weil es nicht so ist. Und selbst wenn es funktioniert, funktioniert es nur, wenn der Mensch weiß, was er tut. "Kennen Sie Ihre Werkzeuge", wenn Sie sie effektiv einsetzen möchten. Beginnen Sie mit C und verwenden Sie ASM, wenn Sie es rechtfertigen können ...
old_timer

Da gcc Open Source ist, ist es ein seltsames Biest. Vielleicht ist dieser bestimmte Port schlecht gemacht. Alle Code-Optimierungen müssen für die jeweilige Plattform durchgeführt werden, das ist keine triviale Aufgabe. Es wäre fairer, die Leistung eines manuellen Assemblers mit der eines kommerziellen Compilers für diese Plattform zu vergleichen.

gcc ist ein Multi-Target-Unternehmen, das im Durchschnitt ziemlich gute Arbeit leistet, für ein bestimmtes Ziel jedoch keine großartige Arbeit leistet. Und genau das wird erwartet. Aber was Sie über einen modernen Compiler in den letzten 10 Jahren sagen, stimmt einfach nicht. Compiler werden nicht besser, was Code angeht, sondern besser, was Sprachen, Ziele und Funktionen angeht, und zwar auf Kosten des erstellten Codes. Die Vorstellung, dass jeder moderne Compiler den bestmöglichen Code ermöglicht, ist einfach falsch. Sehr wahr , dass im Durchschnitt besser ist viel als Hand codierte Assembler, schwierig , ein recht großes Projekt in asm besser zu machen als C
old_timer

Aus diesem Grund sagen die meisten Leute, dass sie C verwenden, bis es ein Problem gibt. Reparieren Sie das Problem dann von Hand in asm, wenn Sie es rechtfertigen können. Benötigen Sie wirklich diesen kleinen Leistungszuwachs? Ist das wirklich der Punkt, an dem sich Ihr Leistungsproblem befindet? Möchten Sie diesen Code mit asm darin beibehalten? Werden Sie weiterhin jeden zukünftigen Compiler überprüfen, um festzustellen, ob seine Ausgabe das Problem repariert oder verringert? auf ein akzeptables Niveau usw.
old_timer

1

Bei der Assemblierung ist ein Kompromiss zwischen Wartbarkeit und Leistung des Codes unvermeidbar. Sie können leicht lesbare / wartbare Assemblys schreiben oder hochoptimierten Code schreiben. aber man kann nicht beides machen.

Bei C verschwindet der Kompromiss nicht ganz, ist aber weitaus weniger auffällig - Sie können einfach zu lesendes / zu wartendes C schreiben, das einigermaßen gut optimiert ist.

Ein ausgezeichneter Assembler-Programmierer ist in der Lage, den Compiler fast immer zu schlagen, aber meistens wird er sich bewusst dafür entscheiden, einfach zu lesenden / zu wartenden Code zu schreiben. und deshalb wird ein ausgezeichneter Assembler-Programmierer die meiste Zeit von einem Compiler geschlagen.

Der clevere Weg ist, sowohl Assembly als auch C zu verwenden (anstatt nur Assembly oder nur C) - verwenden Sie beispielsweise C für Teile des Codes, für die ein ausgezeichneter Assembler-Programmierer verwaltbaren / langsamen Code geschrieben hätte, und verwenden Sie Assembly für das Rest (wo "hochoptimiert und schwer zu pflegen" eigentlich gerechtfertigt ist).


-3
  1. Relativ gut für die Programmiereffizienz.
  2. Es ist einfach, mit der Programmiersprache C zu programmieren, anstatt Assembler zu verwenden.
  3. C-Sprache kann sehr viel schneller sein als Assembler-Sprache.
  4. Es ist möglich, Assemblys in C-Code zu schreiben, nicht jedoch in C-Code.

3
Vorteile nur ....
Kiran Sapkale

3
Dies ist meistens nur eine umformulierte Version von Was sind einige Vor- / Nachteile der Verwendung von C gegenüber Assembly? ; Sie haben der Diskussion hier nichts Neues hinzugefügt.
Martijn Pieters
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.