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.
Antworten:
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
Nachteile
/programming/2684364/why-arent-programs-wrritten-in-assembly-more-often
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
quelle
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.
quelle
Wechselstromprogramme können für verschiedene Mikroprozessorarchitekturen kompiliert werden.
quelle
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.
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.
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.
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.
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.
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.
quelle
a = b[i] + c;
Das Laden, Hinzufügen und Speichern von Befehlenb[i]
(die Berechnungenc
erfordern ) und Registern (die verfügbar gemacht werden müssen) ist viel einfacher als dies.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.
quelle
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).
quelle
quelle