Ist Objektorientierung schlecht für embedded-Systeme, und warum?
Viele embedded-Anwender nutzen c++, aber einige argumentieren, es ist schlecht, weil es die "Objekt-orientiert"?
Ist es wahr, dass der Objekt-orientierten macht es schlecht für embedded-Systeme, und wenn ja, warum ist das wirklich der Fall?
Edit: Hier eine Kurzanleitung für diejenigen, die fragte:
damit wir
die Menschen lieber nicht zu benutzen, teilen ..., malloc ..., oder ein anderes Objekt
orientierte Praxis, dass große
Strafe.
Ich denke, die Frage ist, sind Objekte, die als Schwergewicht im Rahmen einer embedded-system? Einige der Antworten hier vorschlagen, dass Sie sind und einige sind der Meinung Sie sind es nicht.
- Noch nie gesehen. Können Sie ein Beispiel geben?
- Sie vielleicht wollen, markieren Sie diese Frage community wiki, da ist es mehr eine Umfrage als eine Frage mit einer echten Antwort.
- Seit Wann gibt malloc nichts mit OOP?
- Ich wusste gar nicht, dass teilen und malloc waren Objekt-orientierte Praktiken, die trugen große Strafen!
- mögliche Duplikate von C++ - Verwendung in embedded-Systemen
- (siehe auch stackoverflow.com/questions/880603/..., stackoverflow.com/questions/812717/..., etc.)
- Der Autor fügte der Arbeit "anderen" durch Fehler (wahrscheinlich dachte Sie, es Klang besser).
- Nicht vermeiden, C++, denn es ist Objekt-orientiert, vermeiden Sie es, denn es ist C++. Es ist eine gewaltige Sprache. Es ist schwer zu lernen; schwer zu mieten; und hart zu benutzen, selbst wenn Sie sich zu einem Experten. Es gibt OO-Sprachen, die so schnell wie C, aber einfacher zu Programmieren, mit.
InformationsquelleAutor cooper | 2010-07-18
Schreibe einen Kommentar Antworten abbrechen
Du musst angemeldet sein, um einen Kommentar abzugeben.
Während ich bin nicht sicher, es beantwortet deine Frage kann ich zusammenfassen, dass die Gründe meiner früheren Firmen-source-code war reiner C.
Es ist Erstens lohnt sich eine Zusammenfassung der situation:
Gegeben arbeiteten wir komplett in C, und auch dann nur eine eingeschränkte Menge von C 89. Der resultierende code war sehr portabel. Wir oft verwendet Objekt-orientierten Konzepte obwohl.
In diesen Tagen von "embedded" ist eine sehr weite definition. Es deckt alles von 8-bit-Mikroprozessoren ohne RAM oder C-Compiler bis zu, was im wesentlichen high-end-PCs (wenn auch nicht mit Microsoft Windows) - ich weiß nicht, wo Ihr Projekt/Unternehmen sitzt in diesem Bereich.
Nehmen Ihr Angebot zum Nennwert, dynamische Speicherverwaltung komplett separates Konzept von object-oriented software design, so ist es geradezu falsch. Sie können Objekt-orientierte design und die dynamische Speicherverwaltung.
In der Tat, Sie tun können, OO in C, die einen Teil (das ist, was Linux-kernel enthält). Die real Grund, dass viele embedded-Entwickler nicht wie C++ ist, dass es sehr Komplex und es ist schwer zu schreiben geradlinig und vorhersehbar-code in es. Linus hat eine gute den letzten rant auf, warum er nicht wie C++ (es ist besser, und mehr begründet, als seine alte, ich verspreche). Wahrscheinlich sind die meisten Leute einfach nicht artikulieren es sehr gut.
using
Erklärungen, C++ Programmierer (mich eingeschlossen) können und tun, schreiben Sie einfachconnect
: (1) in dersctp
- Modul; (2) wennconnect
ist ein Mitglied der aktuellen Klasse oder einer Basis-Klasse; (3) (seltener), wennconnect
gefunden werden, der von ADL. C++ hat mehr Komplexes name-lookup als C. Es ist nicht "schlecht" C++", oder ungewöhnliche, zu benutzen, aber es gibt viele Fälle, in denen mehr als eineconnect
vorhanden ist, und der code kompiliert. Vielleicht Linus Bedürfnisse spezialisiert sind, ist dieser Grund für die Vermeidung einer C++ - spezifisch ist für ihn, aber ich denke, der Punkt ist fair. Es würde für jede Sprache mit virtuellen fordert.Was macht Sie sagen, dass C++ objektorientiert? C++ is multiparadigm, und nicht alle features, die C++ bietet, sind nützlich für den embedded-Markt, aufgrund Ihrer Gemeinkosten. (So... Nur nicht Sie diese features! Problem gelöst!)
Objekt-Orientiert ist ideal für embedded-Systeme. Es konzentriert sich viel auf die Kapselung, data hiding und code-sharing. Kann man haben, objektorientierte embedded-Systeme ohne Geschäftsbereich oder die dynamische Speicherverwaltung.
Division und die dynamische Speicherverwaltung sind die Feinde der embedded-Systemen unabhängig von der Objekt-Orientierten -, Daten-Orientierte oder prozedurale Programmierung. Diese Konzepte kann oder kann nicht verwendet werden, die bei der Umsetzung der Objekt-Orientierten designs.
Objektorientierte ermöglicht eine UART-Klasse zu übertragen Instanzen von Message-Objekten ohne Kenntnis des Inhalt der Message-Objekte. Eine Nachricht könnte die base-Klasse und mehreren abgeleiteten Klassen.
Der C++ - Sprache trägt zur sicheren Programmierung in embedded-Systemen, indem die Konstruktoren, copy-Konstruktoren und-Destruktoren, die würde nur daran erinnert, in der höchsten diszipliniert C-Sprache eingebettete Systeme.
Ausnahmebehandlung ist auch ein Schmerz zu bekommen arbeiten in der C-Sprache. Die C++ bietet eine bessere Ausstattung, eingebettet in die Sprache.
Die Sprache C++ bietet Vorlagen für das schreiben von gemeinsamen Kodex für den Umgang mit verschiedenen Datentypen. Ein klassisches Beispiel ist ein ring-Puffer oder kreisförmigen Warteschlange. In der C-Sprache, die man hätte verwenden "Zeiger auf void", so dass jedes Objekt weitergegeben werden konnten. C++ bietet eine Vorlage, so kann man schreiben, ein Circular_Queue Klasse, die arbeitet mit unterschiedlichen Datentypen verwendet werden und hat bessere Typüberprüfung während der Kompilierung.
Vererbung ermöglicht eine bessere code-sharing. Der freigegebene code ist einkalkuliert in einer Basis-Klasse und der Kind-Klassen erstellt werden können, teilen die gleiche Funktionalität; durch Vererbung.
Die Sprache C profides Funktionszeiger. Die C++ - Sprachen bietet Einrichtungen, die für die Funktion der Objekte (Funktions-Zeiger mit Parametern).
Sorry, aber ich weiß einfach nicht, wie die Menschen, die limit-embedded-Systemen in C-Sprache, weil Gerüchte und wenig Kenntnisse und Erfahrung mit C++.
Nichts über 'Objekt-orientiert' ist schlecht für embedded-Systeme. OO ist nur eine Art des Denkens über die software.
Was ist schlecht für eingebettete Systeme ist, dass, im Allgemeinen, Sie haben weniger ausgefeilte Debugger und C++ hat eine Menge von crazy stuff "hinter Ihrem Rücken", so zu sprechen. Diese Stücke von hart-zu-erhalten-Zugang-code wird fahren Sie Nüsse.
Objekt-orientiertes design an sich nicht schlecht. Die Antwort liegt in deinem Zitat. Vor allem in embedded-Echtzeit-Systeme, die Sie möchten, um Ihren code so leicht und effizient wie möglich. Die Dinge in Ihrem Angebot (Objekte, division, dynamic memory allocation, kaufpreisallokation) sind relativ Schwergewicht und kann in der Regel ersetzt werden durch einfachere alternativen (zB. mit bit-manipulation, um die Ungefähre Aufteilung, Zuteilung von Speicher auf dem stack oder mit statischen pools) zur Verbesserung der Leistung in zeitkritischen Systemen.
malloc()/new
. Nicht, dass dies ein entscheidender Faktor ist, ich bin pro-OO/C++ für die meisten embedded-Systeme selbst, und habe intensive Koaleszenz-dynamische Speicherverwaltung auf 32-bit-Cortex-M3-mikrocontroller mit keine Probleme, aber ich dachte, das war erwähnenswert.C++ wurde mit der Philosophie der nicht für das bezahlen, was Sie nicht verwenden. Also abgesehen von dem Mangel an guten embedded-Compiler, gibt es keinen wirklichen Grund.
Vielleicht CFront hätte kompilierte C++ in C, die hat eine Vielzahl von Compilern...Edit: Der Comeau-compiler wandelt C++ in plain C, so dass die no-compiler-argument nicht zu halten.
Als andere haben darauf hingewiesen, 'embedded' umfasst eine Breite und vielfältige Palette von hardware - /software-Optionen. Aber...
Das Zitat, das Sie geben, geben-microcontroller-embedded-Arten Schauer. Die dynamische Zuordnung ist ein no-no, wenn Sie einen Fehler aufweisen, wird Sie das system zum Absturz, die auf unvorhersehbare Weise. Gräben sind stark entmutigt, denn Sie nehmen immer in der Ausführung. Objekte sind nur entmutigt, soweit Sie dazu neigen zu tragen eine Menge "Zeug" mit sich herum, all das "Zeug" nimmt Platz und mikrocontroller haben keine.
Ich glaube, der eingebettet als Projekte, die klein sind und bestimmte, Sie don ' T sorgen viel über die Erweiterbarkeit oder Portabilität. Sie schreiben sauberen code, der in C, das tut nur und genau das, was Sie wollen, Ihr Gerät zu tun, zuverlässig. Wählen Sie einen chip-Familie, so dass Sie verschieben können, Ihr (fast) gleichen code unter verschiedenen hardware-Optionen mit geringfügigen änderungen an der Schnittstelle, an die Ihr auch das schreiben oder die Initialisierung der Konfiguration sicherungen.
So, brauchen Sie nicht zu definieren
Da du nur an Toyotas. Und der Unterschied in der Beschleunigung zwischen einem Camry und Corolla sind, werden als Konstanten in ein register.
Programmierung immer darum, mit dem richtigen Werkzeug für den job. Gibt es keine pat Antworten, und das ist insbesondere in der embedded-Welt. Wenn Sie zu qualifizierten in der embedded Entwicklung werden Sie nur als eng familier mit C, wie Sie mit C++.
Wie gesagt, es ist das, was Objekt-orientierte /malloc /math tun hinter Ihrem Rücken, trägt eine Strafe - sowohl in der code-Größe und CPU-Zyklen, die sind in der Regel in kurzer Versorgung in eingebettet.
Als ein Beispiel, einschließlich der sqrt () - Funktion in einer Schleife Hinzugefügt, so viel Aufwand in rekursive Berechnungen, die wir hatten, um es zu entfernen und zu arbeiten, eine schnelle Angleichung um es, mit Hilfe einer lookup-Tabelle, wenn ich mich richtig erinnere.
Verwenden Sie tools/Sprachen, die Sie mögen, aber Sie müssen zumindest in der Lage, heben Sie den Deckel und überprüfen Sie, wie viel zusätzlicher code erzeugt wird, die hinter Ihrem Rücken.
Zuerst nehmen wir das auseinander:
Division und
malloc
sind nicht eindeutig zu Objekt-orientierten Programmierung sind Sie in prozeduralen Sprachen auch (und vermutlich auch funktionell, und was auch immer andere Paradigmen, die Sie vielleicht denken).Division und
malloc
kann ein problem auf einem embedded system, wenn auf dem system ausreichend Ressourcen beschränkt, so viel ist wahr, aber Sie wird ein problem sein, egal welche Programmier-Paradigma, das Sie verwenden.Auf die wichtigste Frage "Ist Objekt-Orientierung schlecht für embedded-Systeme?".
Erstens, 'Objekt-Orientierung' ist ein ziemlich breites Spektrum. Manche Menschen haben widersprüchliche Vorstellungen darüber, was es eigentlich bedeutet. Es gibt eine minimalistische definition, wo ein Objekt ist im Grunde nur ein Bündel von Funktionen (oder 'Methoden') und Daten, und es gibt ein 'purist' definition, die auch features wie Vererbung und Polymorphismus.
Wenn Sie nehmen Sie die minimalistische definition von OOP dann nicht - OOP ist nicht schlecht für embedded-Systeme. Es hängt nicht von der Sprache, aber es ist durchaus möglich, für die Verwendung von Objekten zu sein, genauso Billig wie die nicht-Verwendung Objekte (und eventuell günstiger in manchen Situationen). In C++ ein Objekt (ohne
virtual
Methoden, welche ich in einem moment) nimmt nicht mehr Speicher als seine einzelnen Felder würden, wenn Sie nicht Teil eines Objekts sind. In C++, (die Größe) eines Objekts ist gleich der Summe der (von der Größe) teilen.Allerdings, wenn Sie nehmen Sie die 'puritanischen' Ansicht von OOP und darauf zu bestehen, einschließlich Vererbung und Polymorphie, dann ist die Antwort 'ja, es ist schlecht'. Vererbung ist vielleicht weniger problematisch (je nach Sprache), sondern Polymorphismus über
virtual
Methoden ist eine eindeutige Speicher-chewer.virtual
Funktionen sind in der Regel umgesetzt durch die Aufrechterhaltung einer 'vtable' (eine virtual Methode table) speichert die Zeiger auf die richtigen Funktionen, und muss jedes Objekt speichern einen Zeiger auf die vtable-zum aktivieren der dynamischen dispatch (das aufrufen von virtuellen Funktionen), um richtig zu arbeiten. Es gibt Umstände, in denen die Vererbung können mehr Arbeitsspeicher verwenden als die Lösungen, die erfordern nicht die Vererbung - in der Regel beim Vergleich von Vererbung, Komposition, Komposition manchmal weniger Speicher verbraucht.Einen letzten Punkt, besonders für den Fall von C++ (da es in der Regel, was Menschen meinen, wenn Sie sprechen über die Verwendung von OOP auf embedded Systemen). Die Leute sagen oft, dass "C++ macht seltsame Dinge hinter Ihrem Rücken" - es gilt einige Dinge tun, ohne, dass diese Dinge sofort offensichtlich, wenn man den code, wie zum Beispiel die Herstellung der vtables ich bereits erwähnt, aber es nicht tun, diese Dinge, die "hinter Ihrem Rücken" in einem Versuch zu vereiteln, Sie, es tut diese Dinge, weil Sie einfach die Implementierung der features verwendet wird. Insgesamt gibt es sehr wenig schädliche Dinge, die geschehen 'hinter den kulissen', und die Dinge, die er tut, sind nicht gerade das Arkane oder geheimnisvoll, Sie sind in der Regel Recht gut bekannt, und Sie sind Dinge, die der Programmierer sollte sich bewusst sein, wenn die Programmierung auf einem embedded-system. Wenn Sie nicht über Sie wissen, dann Sie nicht wissen, Ihre Werkzeuge richtig und Sie sollten die Forschung Ihnen einige mehr.
Nachdem alles gesagt, dass, denken Sie daran, dass die Leute frei sind, werden selektiv mit, welche Sprache die Funktionen, die Sie tun,, und nicht verwenden. Es macht absoluten Sinn zu vermeiden, die mehr teure features wie virtuelle Funktionen, aber es macht keinen Sinn auf ein ganzes der Sprache (wie C++) einfach, weil es hat ein paar teure völlig optional Funktionen (wie z.B. virtuelle Funktionen) - das ist nur werfen das Kind mit dem Bade ausschütten.