Forum: Mikrocontroller und Digitale Elektronik hardwarenah, objektorientiert programmiert


von Bild (Gast)


Lesenswert?

lässt sich für einen Software-Entwurf eines Microcontrollers sagen, dass 
man hardwarenah, objektorientiert programmiert hat?

von c-hater (Gast)


Lesenswert?

Bild schrieb:

> lässt sich für einen Software-Entwurf eines Microcontrollers sagen, dass
> man hardwarenah, objektorientiert programmiert hat?

Na klar, wenn es denn tatsächlich so ist...

Sagen kann man es auch dann, wenn es nicht so ist. Nur muss man dann 
halt damit rechnen, dass diese Aussage widerlegt wird...

von Lolita (Gast)


Lesenswert?

Wenn Du z.B. für Deine Ports ne Klasse geschrieben hast,
die die ganze Bitpfrimelei kapselt, hast Du objektorientiert
hardwarenah programmiert.
Dasselbe gilt natürlich auch für die Benutzeroberfläche.

Wenn Du das Ganze dann noch mittels UML entwickelt hast,
bist du der King und ich bin stolz auf Dich. ;-)


mfg

von M.C. (Gast)


Lesenswert?

Bild schrieb:
> lässt sich für einen Software-Entwurf eines Microcontrollers
> sagen, dass man hardwarenah, objektorientiert programmiert hat?

Definiere Hardware-Nähe!
Je abstrakter das Ganze, je mehr Software-Schichten dazwischen desto 
Hardware-ferner.

von A. S. (Gast)


Lesenswert?

Lies Dir eine Dir genehme und anerkannte Definition oder Beschreibung 
von oop durch und setze es entsprechend um.

Ich habe schon objektorientierte SW in Assembler gesehen und 
Spaghetti-Code in C++. OOP ist keine Frage der Sprache, sondern der 
Umsetzung.

von MaWin (Gast)


Lesenswert?

Bild schrieb:
> lässt sich für einen Software-Entwurf eines Microcontrollers
> sagen, dass man hardwarenah, objektorientiert programmiert hat?

Selten.

Das klassische objektorientierte Programm besteht aus Konstruktoren (und 
Destruktoren) in Klassen, also dynamischen Speicheranforderungen, und 
quasi alle robust funktionierenden hardwarenahen Programme vermeiden 
Speicheranforderungen (malloc) wie der Teufel das Weihwasser. Es kommt 
halt doof, wenn deine Armbanduhr sagt: Memory full (excessive 
fragmentation).

Man kann aber auch bei objektorientierter Programmierung nur statische 
Objekte anlegen, und sich auch sonst Mühe geben, daß kein 
Maschinenbefehl mehr erzeugt wird, als für die Lösung der Aufgabe nötig. 
Damit sind aber 99% der objektorientierten Prorammierer heillos 
überfordert.

von M.C. (Gast)


Lesenswert?

A. S. schrieb:
> objektorientierte SW in Assembler

Sollte damit die verwendete Programmiersprache und nicht das Dekompilat 
gemeint sein wüsste ich gerne wie man das anstellt. Soll man ein 
Unterprogramm mit zugehörigen Daten etwa als Objekt bezeichnen?

von A. S. (Gast)


Lesenswert?

M.C. schrieb:
> Soll man ein Unterprogramm mit zugehörigen Daten etwa als Objekt
> bezeichnen?

Das wäre arg kurzgegriffen. Eher Strukturen mit jeweils einem Set von 
Funktionen und Nachrichten. Inclusive Überladung der Funktionen. Dass 
man dabei z.b. den thispointer mit übergeben muss (explizit oder 
implizit) ist vielleicht lästig, aber OK.

von rbx (Gast)


Lesenswert?

Einfach so sagen kann man das nicht, die hardwarenahe Programmierung 
müsste man schon irgendwie begründen können.
Gegenseitig ausschließen tun sich die Betrachtungsweisen nicht.

Vom Sprachansatz macht es aber keinen Sinn. Was man aber z.B. zu Haskell 
sagen kann, das ist, es ist eigentlich nur wieder (mal) ein neues Lisp.
Der Mangel an Standardisierung - und das Problem hat eben auch die 
Assembler/Hexcode - Welt: -> lieber C

Vom technischen her schaut man eher auf den Übersetzer, 
Peephole-Optimierung, Datentypenpräferenzen, Alignements, MC-Typ u.ä.
( https://en.wikipedia.org/wiki/Peephole_optimization ) (z.B.)

von Dergute W. (derguteweka)


Lesenswert?

Moin,

Bild schrieb:
> lässt sich für einen Software-Entwurf eines Microcontrollers
> sagen, dass
> man hardwarenah, objektorientiert programmiert hat?

Aber selbstverstaendlich kann man das sagen.
Bei mir haette es einen aehnlichen Effekt, wie wenn jemand sagen wuerde, 
er haette seinen µC-Softwareentwurf maximal disruptiv mit 
Blockchaintechnologie aus der Cloud programmiert.

Gruss
WK

von Axel S. (a-za-z0-9)


Lesenswert?

Bild schrieb:
> lässt sich für einen Software-Entwurf eines Microcontrollers sagen, dass
> man hardwarenah, objektorientiert programmiert hat?

Die Frage ist vollkommen sinnlos. Allgemein kann man sowas schon mal gar 
nicht sagen, man muß immer eine konkrete Software betrachen.

Dazu kommt noch, daß schon bei "objektorientiert" kein Konsens darüber 
besteht, was man denn alles dazu zählen möchte und was nicht. Mal ganz 
davon abgesehen, daß OOP ein Mittel ist und kein Zweck. Folgerichtig 
erlaubt z.B. C++ das Mischen von prozeduralem und OO Code. Wieviel OO 
muß in einem Programm sein, damit man es "objektorientiert" nennen kann? 
Reicht eine überladene Funktion oder eine zur class "geadelte" 
struct ?

Bei "hardwarenah" ist es noch viel schlimmer. Was soll das denn sein? 
Gibt es überhaupt ein Gegenteil? Auf einem µC? Und wie sieht es aus, 
wenn man ein (eigenes) Abstraktionslayer verwendet, um Anwendungslogik 
und Hardware voneinander zu entkoppeln?

von Bild (Gast)


Lesenswert?

ich habe meine Antwort bekommen: jeder hat eine andere Meinung, also 
werde ich meine auch begründet bekommen =)

Vielen Dank

von M.C. (Gast)


Lesenswert?

A. S. schrieb:
> M.C. schrieb:
> Soll man ein Unterprogramm mit zugehörigen Daten etwa als Objekt
> bezeichnen?
>
> Das wäre arg kurzgegriffen. Eher Strukturen mit jeweils einem Set von
> Funktionen und Nachrichten. Inclusive Überladung der Funktionen. Dass
> man dabei z.b. den thispointer mit übergeben muss (explizit oder
> implizit) ist vielleicht lästig, aber OK.

Warum zum Teufel sollte man das in Asm realisieren wollen!
Das klingt und ruft geradezu nach Hochsprache.

Axel S. schrieb:

> Bei "hardwarenah" ist es noch viel schlimmer. Was soll das denn sein?

Ohne irgendwelche Abstraktions-Layer.
Bare Metal.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Ohne irgendwelche Abstraktions-Layer.
> Bare Metal.

Abstraktion?
Ist das nicht der Hauptzweck der OOP, gleich neben der Kapselung?!?!

von Olaf (Gast)


Lesenswert?

> Man kann aber auch bei objektorientierter Programmierung nur statische
> Objekte anlegen, und sich auch sonst Mühe geben, daß kein
> Maschinenbefehl mehr erzeugt wird, als für die Lösung der Aufgabe nötig.

Objektorientierte Programmierung im Embedded Umfeld heisst ja vermutlich 
C++.
Die Sprache ist mittlerweile so komplex das vermutlich nur ein kleiner 
Teil wirklich zu 100% versteht was man damit machen kann. Ich selbst 
schaetze mich z.B irgendwo bei 30-50% ein.
Aber nur wenn man nahe 100% ist kann man sicher immer die Sachen 
vermeiden die man vermeiden sollte.

> Damit sind aber 99% der objektorientierten Prorammierer heillos
> überfordert.

Das ist genau mein Eindruck.

Also gibt es es wohl folgende Ansaetze:

1. Man nutzt Mikrocontroller die sowohl von der Rechenleistung wie auch 
vom Ram stark ueberdimensioniert sind. Solange man nichts baut wo es auf 
jedes mW ankommt ist das heute ja moeglich. Dann macht es nichts wenn 
die Faehigkeiten des Programmierers nur knapp ueber Arduino-Copy-Level 
liegt.

2. Man nutzt neue Sprachen wo man das einfacher macht damit auch 
Durschnittprogrammierer damit klarkommen. Will sich aber nicht so recht 
durchsetzen obwohl da viel Wind gemacht wird.

3. Man stellt sich der Erkenntnis das es in Firmen viel alten Code und 
viele alte Programmierer gibt die da nicht mitkommen und die man 
schlecht (sowohl Leute wie Code) mit 50 in Rente schicken kann und gibt 
auf.

Olaf

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> M.C. schrieb:
> Ohne irgendwelche Abstraktions-Layer.
> Bare Metal.
>
> Abstraktion?
> Ist das nicht der Hauptzweck der OOP, gleich neben der Kapselung?!?!

Deshalb hat OOP ihre eigenen Maßstäbe für "Hardware-Nähe", weiter 
entfernt davon, der Hardware wirklich nah zu sein :)

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> ihre eigenen Maßstäbe
Verstehe ich nicht ...
Sehe keine Messlatte!

(macht aber auch nix)

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Sehe keine Messlatte!

Messlatte ist ganz grob das Abstraktions-Niveau.
Und ganz praktisch: Setz den Ausgang im zugehörigen Hardware-Register 
und über die entsprechende Methode Deiner Klasse XY - dann vergleiche 
die Ausführungszeit!

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Setz den Ausgang im zugehörigen Hardware-Register
> und über die entsprechende Methode Deiner Klasse XY - dann vergleiche
> die Ausführungszeit!

Das ist u.A. mein täglich Brot.
Und kann dir sagen mit OOP,Templates und den Compileroptimierungen 
gerade die Registermanipulation zu ASM Statements zusammenfällt, die 
auch ein ASM Programmierer kaum knapper hin bekommt.

Deine Messlatte versagt.

von A. S. (Gast)


Lesenswert?

M.C. schrieb:
> Warum zum Teufel sollte man das in Asm realisieren wollen!
> Das klingt und ruft geradezu nach Hochsprache.

??

Ich habe weder geschrieben, dass man sowas in Assembler machen sollte, 
noch dass es in den letzten 20 Jahren sinnvoll war.

Es gab aber Mal eine Zeit, wo Assembler für Performance wirklich wichtig 
war. Und wenn man Assembler programmiert, sollte es trotzdem kein 
Spaghetticode werden.

von M.C. (Gast)


Lesenswert?

A. S. schrieb:
> Ich habe weder geschrieben, dass man sowas in Assembler machen sollte,
> noch dass es in den letzten 20 Jahren sinnvoll war.

A. S. schrieb:
> Ich habe schon objektorientierte SW in Assembler gesehen

Arduino Fanboy D. schrieb:
> Deine Messlatte versagt

Zu den Asm-Statements muss man aber auch erst mal gelangen. Das bei OOP 
meist ein weiter Weg , vor allem wegen

MaWin schrieb:
> daß kein
> Maschinenbefehl mehr erzeugt wird, als für die Lösung der Aufgabe nötig.
> Damit sind aber 99% der objektorientierten Prorammierer heillos
> überfordert.

Ich glaube aber daß das restliche Prozent Deine Behauptung beweisen kann 
und OOP kein prinzipielles Hindernis darstellt.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Ich glaube aber daß das restliche Prozent Deine Behauptung beweisen kann
> und OOP kein prinzipielles Hindernis darstellt.

Schön!

Damit kann man den Beweis als geführt ansehen.
OOP ist kein Hindernis.

Die Hemmschuhe stecken im Kopf und sind damit ein Problem jedes 
einzelnen.
Kein prinzipielles Problem.

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Die Hemmschuhe stecken im Kopf und sind damit ein Problem jedes
> einzelnen.

Tja so einfach ist es dann doch nicht.
Diese Hemmschuhe lösen sich schneller wenn das Kopf-richtige (=bessere) 
Werkzeug verwendet wird. Da sind diverse OOP Sprachen mit ihrer 
Komplexität leider eher Last als Lust.

Zuweilen wird gerne vergessen, daß das Werkzeug dem Menschen angepasst 
sein sollte und nicht umgekehrt. Der Anspruch von OOP, einen 
intuitiveren Zugang zur effizienten Lösung von 
Programmier-Aufgabenstellungen zu bieten ist doch bei sehr vielen Köpfen 
gescheitert.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Der Anspruch von OOP, einen
> intuitiveren Zugang zur effizienten Lösung von
> Programmier-Aufgabenstellungen zu bieten ist doch bei sehr vielen Köpfen
> gescheitert.

Den Anspruch, dass eine Herztransplantation Leben rettet, können auch 
nur sehr wenige Menschen erfüllen.
Selbst unter den Ärzten.

Heißt das jetzt, dass das Werkzeug ungeeignet ist?
Ist der Apfel sauer, weil er so hoch hängt?

Merke:
Manche Annahmen sind so dermaßen falsch, dass noch nicht mal das 
Gegenteil richtig ist.

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Heißt das jetzt, dass das Werkzeug ungeeignet ist? Ist der Apfel sauer,
> weil er so hoch hängt?

Aus der Frage spricht eine Menge Unverständnis.
Du scheinst nicht begreifen zu wollen daß "Eignung" in diesem Fall keine 
objektive Eigenschaft ist sondern ziemlich subjektiv auch von demjenigen 
abhängt der ein solches Denk -Werkzeug verwendet. Wenn sich nun 
tatsächlich 99% der OOP Verwender heillos überfordert sehen damit 
effizient zu programmieren- für und gegen was spricht das denn Deiner 
Meinung nach?

Arduino Fanboy D. schrieb:
> Und kann dir sagen mit OOP,Templates und den Compileroptimierungen

Gut daß es dazu noch viele einfachere Alternativen gibt.

von M.C. (Gast)


Lesenswert?

M.C. schrieb:
> Wenn sich nun
> tatsächlich 99% der OOP Verwender heillos überfordert sehen damit
> effizient zu programmieren

Und ich möchte mir nicht ausmalen, was das für die Code-Qualität 
bedeutet. Vermutlich hängen auch viele Medien- prominente 
Software-Fehler damit zusammen.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> für und gegen was spricht das denn Deiner
> Meinung nach?

Ich weiß nicht, ob deine Fragestellungen und Behauptungen zielführend 
sind.
Denn ich kenne dein Ziel nicht.

Ich könnte dich jetzt fragen:
Welch Ziele stehen hinter deiner OOP/C++ Diffamierungsaktion?
Was ist deine Absicht?

Aber das tue ich nicht.
Zumindest erwarte ich keine Antwort.


Aus meiner Sicht, gibt es verschiedenste Talente.
Ein paar davon scheinen für gute Programmierer wichtig zu sein.
Ich nenne es gerne das "Programmierer Gen".

Dann gibts natürlich die Vorgeschichte des Einzelnen.
Wer mit Assembler und/oder C anfängt, tut sich mit OO Sicht auf die 
Dinge recht schwer.

Meine Empfehlung:
Mit einer OOP Sprache beginnen.
Denn der Weg aus der OOP zum Prozeduralen ist leichter, als umgekehrt.

Auch sollte man das urteilen über die Qualität eines 
Werkzeugs/Strategie/Sichtweise denen überlassen, die sich damit 
auskennen und, von mir aus, täglich einsetzen.
Oftmals verteufeln diejenigen die OOP am stärksten, welche am wenigsten 
damit am Hut haben.
(was der Bauer nicht kennt, das frisst er nicht)

Gibts Argumente für ASM?
Klar!
Gibts welche dagegen?
Ebenso klar.

Man kann also die Frage "Nehme ich ASM?" von den konkreten Anforderungen 
und persönlichen Vorlieben abhängig machen.

Das gilt natürlich für alle Sprachen und alle Situationen!
Man muss nur ein bisschen aufpassen, dass man die eigenen Erfahrungen 
und Vorlieben nicht auf andere projiziert.

von Peter D. (peda)


Lesenswert?

Das beste OOP nützt nichts, wenn der Programmablaufplan nichts taugt. 
Mit schlecht strukturiertem PAP kommt selbst der 1000 mal schnellere 
32Bit-Bolide ins Keuchen, wo bei gut durchdachtem PAP der 8Bitter noch 
Däumchen dreht.

Anders gesagt, OOP kann einem in keinen Fall das Denken abnehmen. Zu 
überlegen, wie man ein Programm sinnvoll strukturiert, d.h. wann und wie 
oft eine Funktion wirklich aufgerufen werden muß und wieviel CPU-Zeit 
sie benötigt, interessiert das OOP nicht die Bohne.
Ob man das Ergebnis einer lang dauernden Berechnung für die weitere 
Verarbeitung erstmal zwischenspeichern muß, kann nur der Mensch 
entscheiden.

von Einer K. (Gast)


Lesenswert?

Peter D. schrieb:
> Anders gesagt, OOP kann einem in keinen Fall das Denken abnehmen.
Ja!

von rbx (Gast)


Lesenswert?

Bild schrieb:
> ich habe meine Antwort bekommen: jeder hat eine andere Meinung, also
> werde ich meine auch begründet bekommen =)

Auf jeden Fall.. für mich selbst hatte die Frage etwas von einem 
Kippbild (irgendein Beispiel): 
https://www.welt.de/kmpkt/article181612648/Optische-Illusion-Was-du-hier-als-Erstes-siehst-ist-von-deinem-Alter-abhaengig.html

Aber bei Emulatoren z.B. da reicht die Begründung oft nicht aus, sondern 
der praktische Nutzen sollte eventuell erkennbar sein.
Wenn z.B. ein Moogfilterplugin für Cubase auch tatsächlich wie ein 
Minimoog klingt oder anders: wie gut muss die Simulation sein, dass man 
wenigstens damit arbeiten kann. Das DosBox so gut/praktisch ist, hat 
sich in den vielen Jahren des Einsatzes gezeigt.
Ein Java-Cpu-Simulator zum Lernen? Sehr schön, aber wie gut lernt es 
sich damit bzw. bringt das tatsächlich was, oder ist man eher bei Proof 
Of Concept und müsste da zumindest die Grenzen benennen, die übertreten 
werden.

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> M.C. schrieb:
> für und gegen was spricht das denn Deiner
> Meinung nach?
>
> Ich weiß nicht, ob deine Fragestellungen und Behauptungen zielführend
> sind.

Nein. Du mogelst Dich um eine Antwort auf die gestellte Frage.

Peter D. schrieb:
> Das beste OOP nützt nichts, wenn der Programmablaufplan nichts
> taugt.

Das sei hier mal vorausgesetzt.

von Stefan F. (Gast)


Lesenswert?

A. S. schrieb:
> OOP ist keine Frage der Sprache, sondern der Umsetzung.

Sehr gut, darauf sollte man immer wieder hinweisen.

Denn manche Bücher über Programmiersprachen tun so, als hätten die 
Entwickler der jeweiligen Programmiersprache die OOP erst erfunden oder 
ermöglicht - was definitiv großer Quatsch ist.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Du mogelst Dich um eine Antwort auf die gestellte Frage.

Welche Frage?
Für wen das spricht?

Auf jeden Fall nicht für den, dessen Gehirnwindungen mit der OOP an sich 
nicht klar kommen und auch nicht für den, den die Besonderheiten kleiner 
µC überfordern.

Für Leute mit dem "Gen" ist das dann eher weniger ein Problem.

M.C. schrieb:
> Wenn sich nun
> tatsächlich 99% der OOP Verwender heillos überfordert sehen damit
> effizient zu programmieren-
Oder das?

Was sollen die 99% da?
99% aller OOPler haben mit µC nix am Hut!
Die meisten bauen große fette Brocken.
Oft portabel
Entwicklungszeit und Wartungskosten

Die "Effizienz" Beurteilung hat in dem 99% Umfeld andere Kriterien

Das eine Prozent reicht also völlig aus.

von Stefan F. (Gast)


Lesenswert?

MaWin schrieb:
> Damit sind aber 99% der objektorientierten Prorammierer heillos
> überfordert.

Sicher? Im Arduino Umfeld ist die objektorientierte Programmierung der 
Normalfall.

Wenn das dort schon normal ist, dann erwarte ich das auch von 
professionellen Programmierern.

von Johannes S. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Sicher? Im Arduino Umfeld ist die objektorientierte Programmierung der
> Normalfall.

Ähem. Es gibt ein paar Objekte im Arduino API, aber nicht konsequent, IO 
werden über Prozeduren gesetzt.
Ein Serial.print() oder SPI.write() ist einfach verständlich, heisst 
aber noch lange nicht das der gemeine Arduino Programmierer jetzt OO 
programmiert. Wenn die Objekte im meterlangen loop() möglichst noch mit 
Goto verwurstet werden, dann hat das nix im entferntesten mit OO 
Paradigmen zu tun.
Das soll nicht heissen das nicht auch mit Arduino ordentlich OO 
programmiert werden kann, eine Anleitung zum Klassen schreiben gibt es 
sogar in der org Doku. Aber ob das jeder Einsteiger gleich macht...
Trotzdem finde ich auch den Ansatz in Objekten zu denken wesentlich 
besser. Das C++ dazu eine komplexe/komplizierte Sprache ist, das ist ein 
anderes Kapitel.

von M.C. (Gast)


Lesenswert?

Peter D. schrieb:
> OOP kann einem in keinen Fall das Denken abnehmen.

Stimmt. Erstmal das Nachdenken über die eigentliche Lösung.
Aber dann noch das Nachdenken, wie man dafür das verfügbare 
Sprachinstrumentarium einspannt/einspannen kann und zu welchem Ergebnis 
das jeweils führt. Inklusive aller Folgeprobleme durch Fehler dabei. Mit 
mehr oder weniger erforderlicher Qualifikation.

Die einfachste Lösung ist meist die Beste.

von Einer K. (Gast)


Lesenswert?

Johannes S. schrieb:
> Es gibt ein paar Objekte im Arduino API, aber nicht konsequent, IO
> werden über Prozeduren gesetzt.

Die Core API ist die am meisten als ineffizient beschimpfte.
Und diese ist fast vollständig in C geschrieben. Ein bisschen ASM.

Nahezu alle Libraries sind in C++ verfasst.
Sowohl die Handvoll mitgelieferten und auch die tausende externen

Johannes S. schrieb:
> Aber ob das jeder Einsteiger gleich macht...
Nöö, offensichtlich nicht.
Aber das lernen der Programmierung dauert auch etwas....
Ein paar Jahre ziehen da schon ins Land.

Johannes S. schrieb:
> Das C++ dazu eine komplexe/komplizierte Sprache ist, das ist ein
> anderes Kapitel.
Ja, die Arduino Jünger nutzen eine der vielseitigsten Sprachen.
Wenn da noch ein bisschen Schaltungsentwicklung zu kommt ....

von Johannes S. (Gast)


Lesenswert?

M.C. schrieb:
> Die einfachste Lösung ist meist die Beste.

Nö. Nicht wenn es um Erweiterbarkeit und Wiederverwendung geht, da ist 
Abstraktion gefragt. Die Erfordert aber eine gewisse 
Programmiererfahrung.
Wenn eine 'einfache' Lösung erweitert wird, dann kann das schnell im 
Chaos enden. Klassen mit mehreren Instanzen sind da schon ein sehr gutes 
Mittel. Einfaches Beispiel: Oled Display. Da gibts hier schöne 
Libraries, aber als Singleton für ein Display. Baue sowas mal auf 
mehrere Displays um, das wird Chaos hoch 10. OOP: eine Klasse, mehrere 
Instanzen.

von foobar (Gast)


Lesenswert?

> ... dass man hardwarenah, objektorientiert programmiert hat?

Denke gerade an die µSupply-Firmware von David (nicht Dave): Du weißt, 
dass du's übertrieben hast, wenn die Identifier durch's Name-Mangling so 
lang geworden sind, dass der Linker mit nem Stack-Overflow absemmelt ;-)

von Mark B. (markbrandis)


Lesenswert?

A. S. schrieb:
> Ich habe schon objektorientierte SW in Assembler gesehen

Zeig mal ein Beispiel?

von Cyblord -. (cyblord)


Lesenswert?

MaWin schrieb:
> Das klassische objektorientierte Programm besteht aus Konstruktoren (und
> Destruktoren) in Klassen, also dynamischen Speicheranforderungen,

Das ist keine Definition von OOP. OOP muss keinen dynamischen Speicher 
bedeuten. Höchstens dynamische (virtuelle) Funktionsadressen.

von c-hater (Gast)


Lesenswert?

Mark B. schrieb:

> Zeig mal ein Beispiel?

Das kannst du dir selber zeigen, wenn du das OO-Konzept verstanden hast.

Ist doch trivial: Funktionen/Prozeduren bekommen einfach einen 
zusätzlichen Parameter mit: den Zeiger auf die Daten der Instanz.

Das ist im Wesentlichen schon der ganze Trick von OO (also diese 
Parameterübergabe durch viel Syntax-Geschwalle zu verbergen). Sie findet 
in der objektiven Realität aber natürlich trotzdem statt. Und kostet 
natürlich auch die entsprechende Rechenzeit!

Der restliche Vorteil von OO besteht in ein paar primitiven (und de 
facto leicht zu umgehenden) Sichbarkeitsregeln. Das ist schon fast 
alles.

Naja, Polymorphie bleibt noch. Ist im Kern nix anderes als eine 
instanzspezifische Liste von Zeigern auf Funktionen. Auch nur durch 
Syntax-Geschwalle verborgen, die Indirektion des Funktionsaufrufs muss 
in der objektiven Realität natürlich trotzdem erfolgen und kostet die 
entsprechende Rechenzeit.

OO ist also im Kern ein Mechanismus, der verbirgt, was wirklich 
passiert.

Trotzdem eine sehr nützliche Sache, wenn man auf Rechenzeit und 
Speicherverbrauch wenig bis keine Rücksicht mehmen muß.

Für kleine µC ist allerdings die klassische OOP-Geschichte ein 
kompletter Schuß in den Ofen. Alles, was da eventuell nützlich ist, sind 
Sachen, die vollständig zur Compilezeit aufgelöst werden können. Das ist 
sozusagen die Rettung des OO-Ansatzes. Allerdings auch wieder erkauft 
mit noch viel mehr schwer durchschaubarem Syntax-Bombast...

von Stefan F. (Gast)


Lesenswert?

OOP ist ein ganzer Baukasten von Konzpten zur Programmierung. Niemand 
ist gezwungen, alle Komponenten des Baukasten zu benutzen.

Insofern ist die Diskussion, was denn jetzt genau OOP ist und was noch 
nicht ziemlich müßig.

von Mark B. (markbrandis)


Lesenswert?

c-hater schrieb:
> Ist doch trivial: Funktionen/Prozeduren bekommen einfach einen
> zusätzlichen Parameter mit: den Zeiger auf die Daten der Instanz.

Trivial? Die Programmiersprache Assembler kennt keine Konstrukte, um von 
einem Objekt X/einer Datenstruktur X eine Menge von Y Instanzen 
anzulegen. ?

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Mark B. schrieb:
> Trivial? Die Programmiersprache Assembler kennt keine Konstrukte, um von
> einem Objekt X/einer Datenstruktur X eine Menge von Y Instanzen
> anzulegen. ?

Eine Instanz von einem Objekt ist im einfachsten Fall (ohne virtuelle 
Methoden) einfach nur eine Ansammlung von Daten.

Wer in Assembler programmiert, weiß wie man auf Daten zugreift und wie 
man sie ggf. kopiert.

von Rainer V. (a_zip)


Lesenswert?

Peter D. schrieb:
> Anders gesagt, OOP kann einem in keinen Fall das Denken abnehmen.

noch anders gesagt...nichts kann einem das Denken abnehmen! Und 
besonders schlimm ist es halt, wenn das Denken irgendwo mittendrin und 
völlig ohne Sinn und Verstand einsetzt. Im Gegensatz zu vielen hier, 
weiß ich, dass Denken "ohne Sinn und Verstand" fast die Tagesordnung ist 
:-)
Gruß Rainer

von Mark B. (markbrandis)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wer in Assembler programmiert, weiß wie man auf Daten zugreift und wie
> man sie ggf. kopiert.

Naja, aber niemand der noch ganz bei Trost ist wird wohl solche 
Datensätze wie Personen mit Adressen und Telefonnummern etc. in 
Assembler verwalten wollen. Da macht es ja mehr Spaß, sich mit einer 
stumpfen Säge das Bein abzuschneiden. ;-)

von Stefan F. (Gast)


Lesenswert?

Mark B. schrieb:
> Naja, aber niemand der noch ganz bei Trost ist wird wohl solche
> Datensätze wie Personen mit Adressen und Telefonnummern etc. in
> Assembler verwalten wollen. Da macht es ja mehr Spaß, sich mit einer
> stumpfen Säge das Bein abzuschneiden. ;-)

Du würdest das offenbar nicht tun, ich auch nicht. Aber frage mal den 
c-hater, der wird das anders sehen. Es kommt doch primär darauf an, mit 
welcher Programmiersprache man am besten vertraut ist.

Wie dem auch sei, Assembler und OOP schließen sich ganz sicher nicht 
aus. Denn wenn das der Fall wäre, gäbe es zwangsläufig auch überhaupt 
keine andere Programmiersprache, die OOP könnte.

von Mark B. (markbrandis)


Lesenswert?

Stefan ⛄ F. schrieb:
> Wie dem auch sei, Assembler und OOP schließen sich ganz sicher nicht
> aus. Denn wenn das der Fall wäre, gäbe es zwangsläufig auch überhaupt
> keine andere Programmiersprache, die OOP könnte.

Die Entstehungsgeschichte war freilich nicht so, dass es Assembler gab 
und man dann in Assembler anfing, OOP Konzepte umzusetzen. Das kam erst 
später.

Assembler-Programmierung ist in aller Regel prozedurale Programmierung. 
Wirklich andere, in Assembler direkt brauchbare und sinnvoll benutzbare 
Paradigmen kennt diese Sprache nicht.

Somit finde ich es etwas fragwürdig zu sagen, dass OOP in Assembler 
möglich sei. Ja, irgendwie möglich ist es schon - in etwa so, als ob man 
ein Haus baut indem man einzelne Moleküle von Kalkstein, Ton und Sand 
zusammensetzt.

von c-hater (Gast)


Lesenswert?

Mark B. schrieb:

> Naja, aber niemand der noch ganz bei Trost ist wird wohl solche
> Datensätze wie Personen mit Adressen und Telefonnummern etc. in
> Assembler verwalten wollen.

Nö, natürlich nicht. Da ist ja normalerweise auch kein Bedarf dafür, 
dass man extrem schnell darauf zugreifen muss.

Aber: es gibt durchaus Anwendungen jenseits primitiver 
Adressdatenbanken. Falls dir das noch nicht aufgefallen sein sollte...

Und, bei nochmaliger Überlegung: selbst so eine primitive 
Adressdatenbank kann u.U. zeitkritisch sein, kommt halt auf die 
Anwendung an...

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
>> Naja, aber niemand der noch ganz bei Trost ist wird wohl solche
>> Datensätze wie Personen mit Adressen und Telefonnummern etc. in
>> Assembler verwalten wollen.
>
> Nö, natürlich nicht. Da ist ja normalerweise auch kein Bedarf dafür,
> dass man extrem schnell darauf zugreifen muss.

Dann frag mal bei einer Versicherung oder einer Bank nach.

von Einer K. (Gast)


Lesenswert?

MaWin schrieb:
> Dann frag mal bei einer Versicherung oder einer Bank nach.

Da wird die Frage von einem fetten Oracle (o.ä.) Brummer beantwortet.
Würde mich wundern, wenn der mit ASM bespielt wird.

von MaWin (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Würde mich wundern, wenn der mit ASM bespielt wird.

Die großen Datenbanken sind im Kern, da wo es auf Performance ankommt, 
hochoptimiert.

von c-hater (Gast)


Lesenswert?

Mark B. schrieb:

> Trivial? Die Programmiersprache Assembler kennt keine Konstrukte, um von
> einem Objekt X/einer Datenstruktur X eine Menge von Y Instanzen
> anzulegen. ?

Natürlich nicht. Aber wenn man versteht, was bei OO wirklich passiert, 
kann man diese Konzepte natürlich auch in Asm nutzen.

Tatsächlich ist das schon vielfach passiert, bevor es dieses 
OO-Paradigma überhaupt gab und entsprechende Sprachen...

von c-hater (Gast)


Lesenswert?

MaWin schrieb:

>> Nö, natürlich nicht. Da ist ja normalerweise auch kein Bedarf dafür,
>> dass man extrem schnell darauf zugreifen muss.
>
> Dann frag mal bei einer Versicherung oder einer Bank nach.

Du hättest noch bis zum Ende lesen müssen...

ADS?

von Stefan F. (Gast)


Lesenswert?

Der erste C++ Compiler, mit dem ich damals unter DOS lernte, erzeugte C 
Quelltext, der von einem C Compiler nach Assembler übersetzt wurde, der 
von einem Assembler in Maschinencode übersetzt wurde. Die Zwischenstufen 
waren alle sichtbar und hatten mir geholfen, zu verstehe, wie Objekte 
letztendlich technisch umgesetzt werden.

Jede Methode hatte in C als ersten Aufrufparameter einen Zeiger auf eine 
Struktur mit den Daten des Objektes. Eigentlich ist das total logisch 
und in jeder Programmiersprache umsetzbar.

Ein zweiter wesentlicher Teil sind bei Virtuellen Methoden die 
indirekten Aufrufe über Zeiger. Auch das ist das total logisch und in 
jeder Programmiersprache umsetzbar.

Wenn man das technische Konzept hinter der Fassade verstanden hat, ist 
es ganz einfach :-)

von MaWin (Gast)


Lesenswert?

c-hater schrieb:
> Du hättest noch bis zum Ende lesen müssen...
>
> ADS?

Das habe ich.
Ich habe dich nur bestätigt.

Beißreflex?

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Wenn man das technische Konzept hinter der Fassade verstanden hat, ist
> es ganz einfach :-)

Ganz genau so ist das. Die Entmystifizierung von OOP. Ich habe auch erst 
über den Umweg der Lektüre des Asm-Codes verstanden, was der Kram 
eigentlich tut.

Ist zwar ca. 25 Jahre her und war in meinem Fall dekompilierter 
Object-Pascal-Code, aber ich kann deinen Fall vollkommen nachvollziehen.

Same stuff.

Was ich bedenklich finde: Wenn man "von oben" rangeht (also ohne Asm- 
Background), dann kann es gut passieren, dass man niemals begreift, was 
da TATSÄCHLICH passiert, selbst wenn man auf dem OO-Abstraktionslevel 
sehr wohl versteht, was da passiert. Das kann nicht gut sein, das ist 
meine feste Meinung.

von Stefan F. (Gast)


Lesenswert?

Deswegen empfehle ich jedem Programmierer, wenigstens ein bisschen 
Assembler zu lernen und ab und zu mal gucken, was der C-Compiler so 
generiert hat. Manchmal ist das sehr hilfreich.

Ich konnte so schon einige Programmierfehler in meinem C Quelltext 
aufklären, die ich (Blindfisch) dort einfach nicht sehen konnte. Im 
Assembler Code war dann aber offensichtlich, wo der Fehler liegt.

Das muss man nicht gleich am Anfang lernen, aber so nach einem Jahr 
würde ich es doch empfehlen.

Beitrag #6228279 wurde vom Autor gelöscht.
von M.C. (Gast)


Lesenswert?

Johannes S. schrieb:
> M.C. schrieb:
> Die einfachste Lösung ist meist die Beste.
>
> Nö. Nicht wenn es um Erweiterbarkeit und Wiederverwendung geht, da ist
> Abstraktion gefragt.

Natürlich schließt die einfache Lösung Erweiterbarkeit und 
Wiederverwendung ein wenn es denn gefordert ist. Das lässt sich 
allerdings auch in prozeduralen Sprachen sicherstellen.

> Klassen mit mehreren Instanzen sind da schon ein sehr gutes
> Mittel. Einfaches Beispiel: Oled Display. Da gibts hier schöne
> Libraries, aber als Singleton für ein Display. Baue sowas mal auf
> mehrere Displays um, das wird Chaos hoch 10. OOP: eine Klasse, mehrere
> Instanzen.
.
Na wär auch abenteuerlich der breit angewandten OOP die Berechtigung für 
ihre sinnvollen Einsatzzwecke
abzusprechen. Da gehört das Handling großer Datenstrukturen sicher dazu. 
Generell stellt sich aber immer die Overhead- oder Wasserkopf-Frage: 
Steht der Verwaltungsaufwand, steht die Komplexität der Sprachmittel 
(samt Folgeproblemen) immer in einem sinnvollen Verhältnis zur 
Aufgabenstellung bzw. der letztendlichen Lösung? Klare Antwort: Nein.

Nächstes Problem Abstrahierung: Kann das Zwischenschalten immer neuer 
Softwareschichten die Effizenz und den Ressourcenverbrauch unangetastet 
lassen? Klare Antwort: Nein.

Die Eignung von OOP und Abstraktion für "menschliche Hirnwindungen" war 
bereits angesprochen. Auch hier die klare Antwort und ganz im Gegenteil 
zur ursprünglichen Absicht: Nein, sie ist nicht für jeden Kopf 
kompatibel. Aller Lernbemühung zum Trotz kommen wenn dann nur wenige auf 
100% Beherrschung. Das kann aber nur in mittelmäßiger und 
fehleranfälliger Software münden. Man hört oft davon!

Halten wir also fest: Viele Versprechungen sind durch OOP nicht 
eingelöst worden. Hält sich vielleicht auch deshalb hartnäckig die 
Vielfalt prozeduraler Sprachen? Bis hin zu Assembler! Und das 2020 :)

von Olaf (Gast)


Lesenswert?

> Die Eignung von OOP und Abstraktion für "menschliche Hirnwindungen" war
> bereits angesprochen. Auch hier die klare Antwort und ganz im Gegenteil
> zur ursprünglichen Absicht: Nein, sie ist nicht für jeden Kopf
> kompatibel.

Das wuerde ich noch nicht mal sagen. Allerdings ist der Aufwand 
erheblich. So erheblich das sich vielleicht mancher der damit nicht 
jeden Tag 8h zutun hat fragt ob es sich lohnt.
Und dann gibt es noch ein weiteres Problem. Die deutsche Fachliteratur 
gefaellt sich darin bewusst und uebertrieben mit Elfenbeinturm-sprech zu 
arbeiten.  Das liesst man nicht mal eben so wenn man nicht sowieso schon 
Informatik studiert. Wie oft empfiehlt es sich da natuerlich auf 
englischsprachige Buecher auszuweichen. Aber natuerlich, man lernt dann 
etwas complexes in einer fremden Sprache. Macht es nicht einfacher. .-)

Olaf

von M.C. (Gast)


Lesenswert?

Olaf schrieb:
> Allerdings ist der Aufwand
> erheblich. So erheblich das sich vielleicht mancher der damit nicht
> jeden Tag 8h zutun hat fragt ob es sich lohnt.

Womit Du unmittelbar ein Folgeproblem der hohen Sprachkomplexität 
ansprichst. Schon deshalb wird C++ und Konsorten nie die breite Masse 
erreichen und werden die Spalten der Stellenanzeigen für (entsprechende) 
Programmierer voll bleiben.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Schon deshalb wird C++ und Konsorten nie die breite Masse
> erreichen
Ich sach nur "Arduino" ...

............

M.C. schrieb:
> immer in einem sinnvollen Verhältnis zur
> Aufgabenstellung bzw. der letztendlichen Lösung? Klare Antwort: Nein.

Ist das Pferd ein gutes Reittier?
NEIN!
Es kann nur wenig Last tragen und ist schnell erschöpft.

Ist der Elefant ein gutes Reittier?
NEIN!
Der frisst so viel, und ist zu hoch.

Ist der Esel ein gutes Reittier?
NEIN!
Der scheiß Passgang, der nervt, und störrisch ist ein Esel auch.


------------

Du merkst?

Offensichtlich hast du keinen Bock auf OOP reiten.

Weil dir das nicht schmeckt, möchtest du es als "Dreck" klassifizieren 
und allen anderen madig machen.

Sorry, dass ich dir das sagen muss:
Du bist ein Priester auf verlorenem Posten.


Merke Zwei:
Untersuche andere Sprachen!
Bei jeder wirst du Haare in der Suppe finden.

Tipp:
Wenn du eine solche, egal welche, Sprache nutzen möchtest, dann 
konzentriere dich auf die Möglichkeiten, welche sie bietet.
So kommt man zu Lösungen.

Konzentrierst du dich auf die Haare in der Suppe, zeigt es nur, dass du 
diese Sprache ablehnst. So offenbarst du eine verzerrte Wahrnehmung, 
weit von jeder Objektivität entfernt.

Deine Ablehnung sagt mehr über dich aus, als über die Sprache.

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ich sach nur "Arduino" ...

Das hat ja nun mit vollwertiger C++ Programmierung herzlich wenig zu 
tun.

> Weil dir das nicht schmeckt, möchtest du es als "Dreck" klassifizieren
> und allen anderen madig machen.

Ja es ist natürlich unangenehm wenn Schwachstellen benannt werden. Habe 
ich es deshalb als "Dreck" klassifiziert? Natürlich nicht.

> Konzentrierst du dich auf die Haare in der Suppe

Schön! Auch in der OOP-Suppe schwimmen also Haare. Mehr Zugeständnis 
kann man einem OOP-Priester wie Dir wohl an dieser Stelle nicht abringen 
:)

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Das hat ja nun mit vollwertiger C++ Programmierung herzlich wenig zu
> tun.
Wie beurteilst du das?
Meine kleinen AVR Arduinos werden z.Zt. mit C++17 bespielt.

M.C. schrieb:
> Auch in der OOP-Suppe schwimmen also Haare.
Natürlich!

Wer suchet, der findet!

> Wer will, findet Wege.
> Wer nicht will, Gründe.

M.C. schrieb:
> einem OOP-Priester wie Dir
Mir ist es komplett scheißegal, wer welche Sprache nutzt.
Mein Bedarf Leute zu bekehren ist, wenn vorhanden, dann nur marginal.
Also nix Priester.


Übrigens:
Der Thread heißt:
>  hardwarenah, objektorientiert programmiert
Und du jallerst die ganze Zeit darauf rum, welcher Mist das doch ist.
Anstatt Wege aufzuzeigen ....


So wie du dich gibst, könnte ich vermuten, dass der Apfel zu hoch am 
Baum hängt, und deine Gehirnwindungen zu kurz sind, um da ran zu kommen.
Also hast du beschlossen, dass der Apfel faul, oder zu sauer ist.

Und jetzt nutzt du das Forum dazu um deine irrationale Entscheidung auf 
alle anderen zu projizieren.

von M.C. (Gast)


Lesenswert?

@ufuf: Wenn Dir hier nichts anderes mehr übrig bleibt als auf
diesem Niveau zu "argumentieren" spricht das auch für sich.

Ein Wort noch zum Thema vielgerühmter OOP-Produktivität. Die hätte ich 
gerne mal im Verhältnis zu gescheiterten OOP Projekten generell und zu 
erzielten Ergebnissen gesehen. Gibt es da irgendwelche Statistiken? Wenn 
ich mir jedenfalls manche lahme Software auf meinem PC so anschaue frage 
ich mich schon, ob  diese in OOP Manier längst zu komplex gestrickt ist, 
warum sie einen Riesen- Platz belegt und man auch auf Fehlerbehebung 
ewig wartet. AtmelStudio wär da so ein Kandidat...

von Olaf (Gast)


Lesenswert?

> Ich sach nur "Arduino" ...

Und ich lieg vor lachen auf dem Boden.

Und jetzt? Sorry, bloss weil da zufaellig ein C++ Compiler
genutzt wird und man dort theoretisch in C++ voll krasse Projekte 
durchziehen koennte, heisst das ja nicht das es einer macht.

Ich seh bei Arduino immer nur C irgendwie zusammenkopiert. Eigentlich 
ist gerade Arduino ein schoenes beispiel das die objektorientierte Denke 
die breite Masse der Nutzer eben nicht erreicht. Und nein, es hilft da 
nicht wenn du irgendwo ein vereinzeltes Beispiel auftreibst das zeigt 
das es technisch moeglich ist.

Olaf

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Übrigens:
> Der Thread heißt:
>  hardwarenah, objektorientiert programmiert

Richtig. Ein prominentes Beispiel dafür, daß sich beide Eigenschaften 
weniger gut vertragen, findet sich im großen Markt automobiler 
Steuergeräte-Software. Da hat sich das ach so großartige OOP eben gerade 
nicht durchsetzen können. Da bleibt C bis heute die Sprache der Wahl, 
wenn auch im verschärften MISRA-Standard.

von Einer K. (Gast)


Lesenswert?

Olaf schrieb:
> Ich seh bei Arduino immer nur C irgendwie zusammenkopiert.
Niemand, auch du nicht, sieht die Realität.
Sondern nur ein durch Erfahrung gefiltertes Bild, generiert durch eine 
beschränkte Wahrnehmung/Sinne.

Soviel zu dem "immer"!

Olaf schrieb:
> Und nein, es hilft da
> nicht wenn du irgendwo ein vereinzeltes Beispiel auftreibst das zeigt
> das es technisch moeglich ist.
OK, Gegenargumente sind per Definition unerwünscht....
Das macht natürlich einen Dialog nicht gerade einfacher.


Vielleicht solltest du zur Kenntnis nehmen, dass Arduino nicht so sehr 
für gelernte Programmierer gedacht ist, sondern eher für die breite 
Masse, also eher für Fachfremde.
Man kann nicht erwarten, dass Fachfremde sofort/instant genialen Code 
raus hauen.
Und wenn du das erwartest, solltest du evtl. deine Haltung überprüfen.


Dir begegnen, z.B. hier im Forum hauptsächlich Anfänger.
Deren Code siehst du hier und auch in tausenden weiteren Ecken im Netz.

Wie lange braucht es, bis man ein fähiger Programmierer ist?
3 Jahre, oder eher 5?
Bis man ein einigermaßen sattelfester Hardwareentwickler ist?
3 Jahre, oder eher 5?

Plus, für jede Sprache, für µC, usw, nochmal ein paar Monate.

Nach der Zeit sagen wir mal 10 Jahre, könnte der Lernende sich zu der 
Ausnahme entwickelt haben, die du gerne sehen möchtest.

Aber genau der/die/das benötigt kein Forum mehr für seine Fragen.
Du siehst also eigentlich nur die Anfänger.

von Stefan F. (Gast)


Lesenswert?

Ein Punkt, wo OOP scheitert, sind die alltäglichen Sonderlocken. Die OOP 
Lehrbücher zeigen immer schön, wie man Eigenschaften und Regeln vererbt. 
Aber sie zeigen nicht, wie man Sonderlocken umsetzt, die sich über 
mehrere Ebenen der ganzen Objekt-Hierarchie verteilen. Mit dem 
Überschreiben einzelner Methoden ist es oft nicht getan.

Ich musste schon "kleine" Änderungen umsetzen, die sich durch 20 
Quelltext-Dateien durchzogen. Da kommt schnell die Bemerkung auf, dass 
das Programm schlecht strukturiert sei. Aber damit ist niemandem 
geholfen. Programme, die mit voller Absicht von einem anderen 
Kundenprojekt geforkt wurden und dann 12 Jahre lang gewachsen sind, 
sehen eben furchtbar aus. Wer billig will, bekommt auch billig, dessen 
kann ich mich als Entwickler nicht verweigern. Ich kann nicht mal eben 
200.000 Zeilen Code umschreiben, nur um eine kleine Änderung mit 2 PT 
Umsatz schöner zu machen.

Dennoch möchte ich nicht auf OOP verzichten.

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Niemand, auch du nicht, sieht die Realität.
> Sondern nur ein durch Erfahrung gefiltertes Bild, generiert durch eine
> beschränkte Wahrnehmung/Sinne.

Klasse. Nun lieg ich aber auch am Boden vor lachen.
Was für eine wohlfeile Erklärung. Zwischen den Zeilen steht wohl daß da 
jemand durchblickt der kein Anfänger mehr ist :)

> OK, Gegenargumente sind per Definition unerwünscht....

Wer definiert das? Davon abgesehen ist von sachlichen Gegenargumenten 
bei Dir weit und breit nichts zu sehen.

> Vielleicht solltest du zur Kenntnis nehmen, dass Arduino nicht so sehr
> für gelernte Programmierer gedacht ist, sondern eher für die breite
> Masse, also eher für Fachfremde.

Vielleicht solltest Du zur Kenntnis nehmen daß gerade deshalb Arduino 
kein Argument für den Erfolg vollwertiger C++ Programmierung ist.

> Du siehst also eigentlich nur die Anfänger.

Soll man das jetzt als Sach-"Argument" verstehen?

von M.C. (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:
> Ein Punkt, wo OOP scheitert, sind die alltäglichen Sonderlocken.
> Die OOP Lehrbücher zeigen immer schön, wie man Eigenschaften und Regeln
> vererbt. Aber sie zeigen nicht, wie man Sonderlocken umsetzt, die sich
> über mehrere Ebenen der ganzen Objekt-Hierarchie verteilen. Mit dem
> Überschreiben einzelner Methoden ist es oft nicht getan.
> Ich musste schon "kleine" Änderungen umsetzen, die sich durch 20
> Quelltext-Dateien durchzogen.

Das klingt auch nicht gerade nach Produktivität. Leider befeuert 
Komplexität immer auch den Teufel im Detail.
Deshalb: Keep it simple!

> Dennoch möchte ich nicht auf OOP verzichten.

Ich möchte hier nicht falsch verstanden werden.
Niemand will Konzepte der OOP madig machen.
Aber alles hat eben Vorteil und Preis.

von Stefan F. (Gast)


Lesenswert?

M.C. schrieb:
> Deshalb: Keep it simple!

Das ist der Stil, den ich bevorzuge, wo immer ich darf. In jeder 
Projektbesprechung thematisiere ich das mit deutlich positiven 
Ergebnissen.

Mein Chef tickt da genau so. Das Problem sind angeblich erfahrene 
Consulter, die unser GF Monatelang alleine an einem Projekt fummeln 
lässt. Die versauen  einzelne teile oft mit ihren überkomplexen 
akademischen Lösungen.

Und natürlich ist einer unserer größten Feine die Idee, man könne 10 
Jahre alte Programme als Basis für ein neues nehmen und weitere 10 Jahre 
weiter bauen, ohne mal über die Struktur und Aktualität der Methoden und 
Bibliotheken nachzudenken. Zugleiche verkauft man dem Kunden auf dem 
Papier selbstverständlich stets allerneueste Technologie. Das hasse ich.

Ich brauche keineswegs immer die allerneuesten Sachen, aber alten Käse 
mehrfach überbacken und das dann "neu" zu nennen, geht mir zu weit.

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Davon abgesehen ist von sachlichen Gegenargumenten
> bei Dir weit und breit nichts zu sehen.

Bei dir auch nicht.
Kein einziges!

Nur Behauptungen, ohne Begründungen.
Auf Nachfragen reagierst du gar nicht.

Danke und Tschüss,

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Nur Behauptungen, ohne Begründungen.

Dazu muß man eine Begründung und Beispiele überhaupt erstmal sehen 
wollen. Du mußt lernen, daß es mit den prinzipiellen Möglichkeiten 
einer Sprache eben nicht allein getan ist. Der gelungene 
Entwicklungsprozeß samt gutem Ergebnis hat viele Zutaten, ist 
anwendungsabhängig und muss möglichst reibungsfrei durch die vorhandenen 
Hirnwindungen flutschen ?

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Dazu muß man eine Begründung und Beispiele überhaupt erstmal sehen
> wollen. Du mußt lernen, daß es mit den prinzipiellen Möglichkeiten
> einer Sprache eben nicht allein getan ist. Der gelungene
> Entwicklungsprozeß samt gutem Ergebnis hat viele Zutaten, ist
> anwendungsabhängig und muss möglichst reibungsfrei durch die vorhandenen
> Hirnwindungen flutschen ?

Was soll das bedeuten?

Sprichst du hier der gesamten Arduino Gemeinde die Lernfähikeit ab?
Oder der Sprache C++ die Lernbarkeit?

Welches Ziel verfolgst du mit deinen Ansagen?

von A. S. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Bei dir auch nicht.
> Kein einziges!
>
> Nur Behauptungen, ohne Begründungen.
> Auf Nachfragen reagierst du gar nicht.
>
> Danke und Tschüss,

Da der TO ja eh raus ist: Wenn Ihr OOP thematisieren wollte, müsstet ihr 
euch erstmal einig sein, welchen Aspekt ihr überhaupt diskutieren wollt 
und wo Konsens besteht. Es wechselt wild zwischen OOP als Konzept, 
OOP-Unterstützung durch Sprachen, Effizienz, Wartbarkeit, etc.

Noch dazu, wo jeder von Euch ein anderes Set an OOP-Merkmalen im Kopf 
hat. Und z.B. Autosar und Datenbanken zeigen es so plakativ:

Autosar ist überwiegend in plain C, die Konzepte (Objekte mit Methoden 
und Nachrichten) können aber sehr wohl als OO verstanden werden.

Typische Datenbanken können gerne in OOP programmiert sein, die 
Datenbank selber ist aber genau das Gegenteil von OO.

Konsens sollte zuerst darüber erzielt werden, dass es Gebiete gibt, wo 
OOP super ist, und welche, wo es deplaziert ist. Und dann könnt ihr ja 
gerne (zu unser aller nutzen) die Trennlinie ausloten.

Dass es daneben gute und schlechte Software gibt, Prozedural und OOP, 
geschenkt.

Dass Verallgemeinerung erst dann Sinn macht, wenn man Verallgemeinern 
kann (also mehr als 2 unterschiedliche Fälle überblicken kann oder 
kennt), sollte jedem einleuchten. Dass ein Anfänger seinen Bubblesort 
nicht sofort als DLL Threadfest programmiert, auch.

von Einer K. (Gast)


Lesenswert?

A. S. schrieb:
> Da der TO ja eh raus ist: Wenn Ihr OOP thematisieren wollte, müsstet ihr
> euch erstmal einig sein, welchen Aspekt ihr überhaupt diskutieren wollt
> und wo Konsens besteht. Es wechselt wild zwischen OOP als Konzept,
> OOP-Unterstützung durch Sprachen, Effizienz, Wartbarkeit, etc.

Das wäre mal was!

Wobei das mit der Einigkeit wohl nicht so läuft.....

Was mich betrifft, mag ich die OOP Konzepte.
Die Sprache ist mir dabei recht egal.

C++ halte ich für eine eher hässliche Sprache.
Bin allerdings ein Fan der Templates, bzw. der Möglichkeiten, die damit 
einher gehen.
z.B. dass man so viel dem Kompiler überlassen kann
Je kleiner der µC desto interessanter ist das.


Effizenz und Wartberkeit kommt mit der Zeit.
Ist auch eine Frage der Anforderungen.
Ich sehe da keine pauschalen Ansagen leuchten.

von Adam (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Bin allerdings ein Fan der Templates, bzw. der Möglichkeiten, die damit
> einher gehen.
> z.B. dass man so viel dem Kompiler überlassen kann
> Je kleiner der µC desto interessanter ist das.

Erläutere das doch mal an einem Beispiel.
Wo da bei kleinen MCs der Vorteil gegenüber konventioneller 
Programmierung liegt. Und was dem Compiler überlassen wird.

von Einer K. (Gast)


Lesenswert?

Adam schrieb:
> Erläutere das doch mal an einem Beispiel
Ein für mich relevantes Beispiel, ist die Arduino Pin Nummerierung.

Die kann man mögen, oder hassen.
Aber sie ist auf jedem Board aufgedruckt.
Und damit ein unvermeidliches Dingen, wenn man sich mit anderen Arduino 
Jüngern unterhält.

Allerdings ist dieses recht teuer.
Sie kostet Arrays im Flash und die Funktionen sind, naja, langsam.

Das lässt sich über Templates und andere C++ Sprachmitteln angehen.

Adam schrieb:
> Vorteil
Weniger Flash Bedarf
Kein RAM Bedarf (die original Arduino Funktionen benötigen Stack)
Bessere Performance
Weniger Schreibarbeit im Projekt, damit weniger Flüchtigkeitsfehler
Lesbarer, als direkte Portmaipulationen

Naja....
Ist das ein Beispiel?

von A. S. (Gast)


Lesenswert?

Na, mit Templates sind wir dann aber vollkommen weg von OOP. Und beim 
Thema, welch Programmiersprache (oder Konzept) äquivalentes zu bieten 
hat.

von Adam (Gast)


Lesenswert?

Ich sollte dazu sagen daß ich konventionell in C programmiere und von 
OOP keinen Schimmer habe.

Arduino Fanboy D. schrieb:
> Ein für mich relevantes Beispiel, ist die Arduino Pin Nummerierung.

Was ist das Problem dabei?

> Das lässt sich über Templates und andere C++ Sprachmitteln angehen.

Wie wird das obige Problem damit denn nun genau gelöst. Was mich dabei 
besonders interessiert: Welchen Vorzug bieten diese Sprachmittel? Mach 
doch mal etwas Werbung dafür! Um noch gezielter zu fragen:

> Weniger Flash Bedarf

Was braucht gegenüber wem weniger Flash?

> Kein RAM Bedarf (die original Arduino Funktionen benötigen Stack)

Bestünde der mit purem C?

> Bessere Performance

Was hat gegenüber wem bessere Performance und warum?

> Weniger Schreibarbeit im Projekt, damit weniger Flüchtigkeitsfehler

Magst Du ein Beispiel geben was genau eingespart wird?

> Lesbarer, als direkte Portmaipulationen

Dito. Ein Beispiel bitte.

von MaWin (Gast)


Lesenswert?

Adam schrieb:
> Welchen Vorzug bieten diese Sprachmittel?

Ich glaube kaum, dass man das in einem mikrocontroller.net-Post kurz 
(oder auch lang) beschreiben kann.

Sprachen, die moderner sind als C, bieten dem Programmierer eine 
Vielzahl von Möglichkeiten und Techniken, die der Programmierer nutzen 
kann.
Es geht dann auch tatsächlich nicht primär darum, dass diese 
Möglichkeiten immer und überall besser sind als bekannte C-Techniken. 
Aber es kann schon zu einem saubereren und lesbareren Programm 
beitragen. Natürlich kann man mit komplexen Techniken und Paradigmen ein 
Programm auch unlesbarer und schlechter machen.

Es kommt immer darauf an, was der Programmierer beherrscht und wie gut 
er es beherrscht. Die Programmiersprache ist nur ein Werkzeug. Eine 
CNC-Maschine ist nicht besser als ein Hammer. Aber man kann mit einer 
CNC-Maschine Dinge tun, die mit einem Hammer sehr umständlich sind.

von Einer K. (Gast)


Lesenswert?

Adam schrieb:
> Was ist das Problem dabei?
Habe ich genannt!

Adam schrieb:
> Was braucht gegenüber wem weniger Flash?
Die Template + OOP Lösung gegenüber der Standard Arduino API

Adam schrieb:
> Bestünde der mit purem C?
Wenn in C Funktionen aufgerufen werden wird der Stack beansprucht.
Das macht keinen Unterschied zu C++
Am Rande: Die originalen sind C Funktionen

Adam schrieb:
> Dito. Ein Beispiel bitte.
Ich empfinde
> led.toggle();
lesbarer als
> PINB = (1<<PB5);

Einen Teil der anderen Fragen beantwortet:
Beitrag "Re: Geschwindigkeit IO-Zugriff"

von Adam (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Adam schrieb:
> Was ist das Problem dabei?
>
> Habe ich genannt!

Ich verstehe es nicht. Du sprichst in Rätseln.
>
> Adam schrieb:
> Was braucht gegenüber wem weniger Flash?
>
> Die Template + OOP Lösung

Ebenso unklar was das nun meinen soll.

> Wenn in C Funktionen aufgerufen werden wird der Stack beansprucht.
> Das mach keinen Unterschied zu C++
> Am Rande: Die originalen sind C Funktionen

Also würde ich mit OOP hier RAM sparen können !?

> Ich empfinde
> led.toggle();
>
> Als lesbarer als
> PINB = (1<<PB5);

Da gebe ich Dir schon Recht aber das lässt sich im Rahmen von C oder mit 
einem Makro ebenso erreichen

> Beitrag "Re: Geschwindigkeit IO-Zugriff"

Darin finde ich aber nichts was mir den Vorteil von OOP gegenüber C 
erklären würde...

von Einer K. (Gast)


Lesenswert?

Adam schrieb:
> Darin finde ich aber nichts was mir den Vorteil von OOP gegenüber C
> erklären würde...
Aha...

Adam schrieb:
> Da gebe ich Dir schon Recht
Also dioch.

Adam schrieb:
> das lässt sich im Rahmen von C oder mit
> einem Makro ebenso erreichen
Ja, wenn Makro der Heilsbringer ist...

Zeige doch mal in C, ohne Makros.
Bin interessiert wie das dann aussieht!
Wie du da ein digitalWrite(13,!digitalRead(13)); zu einem PINB = 
(1<<PB5); welches in 1 ASM Statement zerfällt, umformst.

von Adam (Gast)


Lesenswert?

MaWin schrieb:
> Es geht dann auch tatsächlich nicht primär darum, dass diese
> Möglichkeiten immer und überall besser sind als bekannte C-Techniken.

Oh. Darauf hatte ich schon gehofft!

> Aber es kann schon zu einem saubereren und lesbareren Programm
> beitragen. Natürlich kann man mit komplexen Techniken und Paradigmen ein
> Programm auch unlesbarer und schlechter machen.

Ja die Kosmetik nimmt sich also in beiden Fällen nichts? Denn man kann 
es überall gut oder schlecht schreiben?

> Die Programmiersprache ist nur ein Werkzeug. Eine
> CNC-Maschine ist nicht besser als ein Hammer. Aber man kann mit einer
> CNC-Maschine Dinge tun, die mit einem Hammer sehr umständlich sind.

Daher nochmal meine Frage:

Adam schrieb:
> Arduino Fanboy D. schrieb:
> Bin allerdings ein Fan der Templates, bzw. der Möglichkeiten, die damit
> einher gehen.
> z.B. dass man so viel dem Kompiler überlassen kann
> Je kleiner der µC desto interessanter ist das.
>
> Erläutere das doch mal an einem Beispiel.
> Wo da bei kleinen MCs der Vorteil gegenüber konventioneller
> Programmierung liegt. Und was dem Compiler überlassen wird.

Welchen Vorteil bietet die "CNC Maschine" OOP gegenüber dem "Hammer" C 
auf kleinen MCs?

von Adam (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ja, wenn Makro der Heilsbringer ist...
>
> Zeige doch mal in C, ohne Makros.
> Bin interessiert wie das dann aussieht!
> Wie du da ein digitalWrite(13,!digitalRead(13)); zu einem PINB =
> (1<<PB5); welches in 1 ASM Statement zerfällt, umformst.

Das würde ich in C als Funktion definieren.
Ich bevorzuge aber Makros. Was ist dagegen einzuwenden? Wegen dieser 
Schreibkosmetik würde ich jetzt ungern OOP lernen...

von MaWin (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wie du da ein digitalWrite(13,!digitalRead(13)); zu einem PINB =
> (1<<PB5); welches in 1 ASM Statement zerfällt, umformst.

Generell mittels ganz normaler Funktionen und Link Time Optimization 
(LTO).
Wenn die Funktionen nur eine Portzuweisung enthalten, werden die 
automatisch inlined und zerfallen in eine einzige asm-Instruktion.

In diesem konkreten Beispiel müsste man aber ein PORTB read/write in ein 
PINB write umformen. Das geht mit C++ genauso wenig wie mit C.

von A. S. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ich empfinde
>> led.toggle();
> lesbarer als
>> PINB = (1<<PB5);

Ein C-aquivalent wäre aber eher

LedToggle(led);

Und das auch nur, wenn es mehrere LEDs gibt. Sonst würde man auch 
einfach led.toggle() nehmen, auch wenn der Overhead in C ein wenig 
größer ist.

von MaWin (Gast)


Lesenswert?

Adam schrieb:
> Ja die Kosmetik nimmt sich also in beiden Fällen nichts? Denn man kann
> es überall gut oder schlecht schreiben?

Ja. Kommt halt auf den konkreten Fall an.
Und bedenke auch, dass im Fall von C++ auch immer so gut wie alles 
möglich ist, was in C möglich ist. Man hat halt zusätzliche 
Möglichkeiten.

> Welchen Vorteil bietet die "CNC Maschine" OOP gegenüber dem "Hammer" C
> auf kleinen MCs?

Welchen Vorteil bieten Äpfel gegenüber Birnen in Obstkörben?

von MaWin (Gast)


Lesenswert?

Adam schrieb:
> Das würde ich in C als Funktion definieren.
> Ich bevorzuge aber Makros. Was ist dagegen einzuwenden? Wegen dieser
> Schreibkosmetik würde ich jetzt ungern OOP lernen...

Ob man Funktionen, Makros, Templates oder was auch immer verwendet, hat 
überhaupt gar nichts mit OOP zu tun.

von Carl D. (jcw2)


Lesenswert?

Adam schrieb:
> Welchen Vorteil bietet die "CNC Maschine" OOP gegenüber
> dem "Hammer" C auf kleinen MCs?

Nicht OOP bietet die nützlichsten Vorteile, sonder Templates und 
constexpr (wenn man einen Compiler benutzt, der C++17 kann). Damit 
berechnet der Compiler Dinge, die man bisher notdürftig durch Macros 
erledigte, die man ihm in C++-Code beschreiben kann.
Wenn ich z.B. den Wert WGM eines AVR-Timers setzen will, dann sorgen 
Templates dafür, daß die auf 2Register verteilten WGM-Bits richtig 
einsortiert werden. Ich schreibe
1
Timer::Wgm = Timer::WGM::CTC;
2
Timer::Cs = Timer::CS::DIV_8;
Und der Compiler macht daraus
1
 ldi r16,0xii
2
 out 0xnn,r16
3
 ldi r16,0xjj
4
 Out 0xmm,r16

Auch wenn mehrbittige IO-Werte, die "layoutoptimiert" auf die IO-Pins 
verteilt sind, können so gebaut werden. Änderungen an der Pin-Belegung 
können gravierende Änderungen am Assemblercode notwendig machen, die mir 
der GCC in typisch unter einer Sekunde erledigt. Viel Spaß mit dem 
Hammer.

Wobei ich zugeben muß, daß mich daran auch interessiert, daß es geht und 
ich nicht davon leben muß. Beim Programmieren für's Leben wünsche ich 
mir aber manchmal die Templates von C++.

von Einer K. (Gast)


Lesenswert?

MaWin schrieb:
> In diesem konkreten Beispiel müsste man aber ein PORTB read/write in ein
> PINB write umformen. Das geht mit C++ genauso wenig wie mit C.

led.toggle();
Ist eins...
Machts mit PINB

led.set(1);
led.set(0);
zerfallen zu PORTB Zugriffen

C++ Zucker:
led = 1;
led = 0;
if(led) tuwas();

Dafür muss man sich in C schon die Ärmchen ausreißen.
Nehme ich mal an...

von Johannes S. (Gast)


Lesenswert?

Es ging Eingangs Irgendwie um die Frage Hardwarenah, Objektorientiert.
Man kann die Hardwarefeatures eines uC als Objekte betrachten: uart, 
SPI, I2C, Ports, usw. Die haben Eigenschaften wie Speed, Bitbreite, 
Modi,... und Methoden wie read/write/...
Das wird in einem Objekt zusammengefasst, bei diesen Hardwareresourcen 
sollte man sich das leicht vorstellen können.
Objekte sind Neue Typen, man kann wie bei einer Variablen viele eines 
Typs anlegen. Wenn ein anderes Objekt wie zB ein Sensor ein 
Schnittstellen Objekt braucht kann das dem Sensor als Zeiger oder 
Referenz mitgegeben werden. Das sieht im Code wesentlich eleganter aus 
und C++ ist strenger als C bei der Typprüfung, damit kann man schon 
einige Fehler vermeiden.
Das sind für mich schon genug Gründe lieber OOP und C++ vs. C 
einzusetzen.

von Adam (Gast)


Lesenswert?

Carl D. schrieb:
> Nicht OOP bietet die nützlichsten Vorteile,

Schade. Da hatte ich mir jetzt von "objekt-programmiert" mehr erhofft. 
Irgendwelche Pin-Belegungsänderungen sehe ich jetzt nicht als Problem, 
möglicherweise sind meine AVRMegaController + Programme auch zu klein 
dafür :->

von Carl D. (jcw2)


Lesenswert?

Und wenn man nur Arduino betrachtet, dann findet man Serial.print() in 
einer Hand voll Overloads für diverse Typen, statt z.B.
serial_print_char()
serial_print_string()
serial_print_flash_string()
serial_print_int16()
serial_print_float()
...

: Bearbeitet durch User
von Stefan F. (Gast)


Lesenswert?

Mich stören bei C/C++ die zahlreichen Fallstricke. Zum Beispiel, dass 
unter bestimmten Bedingungen der falsche Standard Konstruktor oder 
Destruktor aufgerufen wird, wenn ich ihn nicht durch einen eigenen 
leeren virtuellen(!) überschreibe. Da wäre es vielleicht besser gewesen, 
gar keine impliziten Konstruktoren und Destruktoren zu haben.

Andererseits habe ich überhaupt kein Problem, Speicher selber zu 
verwalten und Zeiger zu benutzen. Keine Ahnung warum, aber das fällt mir 
ganz leicht.

Leztzendlich hat jede Programmiersprache ihre Tücken. Ich kann auch kaum 
darüber beklagen, dass ein Hammer blöd ist, weil man sich damit auf den 
Daumen schlagen kann. Ist halt so. Klar kann man Hammer oft durch 
weniger gefährliche Werkzeuge ersetzen, aber nicht immer.

von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> Und wenn man nur Arduino betrachtet,
Da finden sich schon einige Dinge, welche mit C nicht oder nur 
umständlicher möglich sind.
z.B. die EEPROM Abhandlung
Mal abgesehen von den eher primitiven read und write Methoden

Gibs noch get und put, welche beliebige Datentypen verwursten

Oder die Operatoren Überladung:
1
byte egal = EEPROM[22];
2
EEPROM[22] = 42;
3
EEPROM[22]++;

von Carl D. (jcw2)


Lesenswert?

Adam schrieb:
> Carl D. schrieb:
>> Nicht OOP bietet die nützlichsten Vorteile,
>
> Schade. Da hatte ich mir jetzt von "objekt-programmiert" mehr erhofft.
> Irgendwelche Pin-Belegungsänderungen sehe ich jetzt nicht als Problem,
> möglicherweise sind meine AVRMegaController + Programme auch zu klein
> dafür :->

Naja, wenn man das Problem wild verteilter Bits nicht kennt, dann bringt 
einem sowas nichts.
Statt D4..D7 eines 4-Bit-Lcd auf PB0..3 nun auf PC1/PD3/PB3/PB2, weil es 
das Layout erfordert. Neu schreiben oder neu kompilieren. Und in jedem 
Fall die kürzest mögliche Version des Binärcodes, als bei PB0..3 einfach 
PORTB = ( PORTB & 0xFF ) | lcd_data;
Im anderen Fall deutlich komplizierter.
Dazwischen einmal make

von Carl D. (jcw2)


Lesenswert?

Arduino Fanboy D. schrieb:
> Carl D. schrieb:
>> Und wenn man nur Arduino betrachtet,
> Da finden sich schon einige Dinge, welche mit C nicht oder nur
> umständlicher möglich sind.
> z.B. die EEPROM Abhandlung
> Mal abgesehen von den eher primitiven read und write Methoden
>
> Gibs noch get und put, welche beliebige Datentypen verwursten
>
> Oder die Operatoren Überladung:
>
1
> byte egal = EEPROM[22];
2
> EEPROM[22] = 42;
3
> EEPROM[22]++;
4
>

Es ging mir nur um das allereinfachste, das mitgeliefert wird. In der 
Sprache kann man eben Dinge schreiben die bei anderen Sprachen als 
Spezialfall in der Sprachdefinition stehen müssen. Pascal WRITE verhält 
sich genau so, kann aber in Pascal nicht formuliert werden.

Wobei das Serial.print mit Hilfe von variadic templates auch eine 
variable Anzahl von unterschiedlich typisierten Parametern verarbeiten 
kann.
Aber letztendlich ist das wie mit Autos. Man kann mit jedem von A nach B 
fahren, aber manche (ich) machen das lieber smooth in Ledersitzen flach 
über dem Boden sitzend. Komfort kann man genießen, muß aber nicht.

von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> Komfort kann man genießen, muß aber nicht.

280 auf der Bahn geht mit einem A8 viel entspannter, als in einem Lotus.
Ist eine Frage der Prioritäten.

Eins meiner Lieblingsbeispiele:
(auch wenn Peda gleich wieder aufschreit)
OK, das ist jetzt kein Speicher Sparwunder, eher ein Beispiel für 
schnelle Entwicklung, oder auch Lesbarkeit, wenn man sich an den Stil 
gewöhnt hat
1
/**
2
 * Basisprogramm: 
3
 * Das Blink Beispiel aus der Arduino IDE
4
 * 
5
 * Zusaetzliche nebenlaeufige Funktionalitaet: 
6
 * Eine Ablaufsteuerung
7
 * 
8
 * Nach betaetigen des Schalters startet die Absaugung und danach
9
 * die Maschine. Nach abschalten stoppt erst die Maschine und danach die 
10
 * Absaugung
11
 * 
12
 * 
13
 *    Ablaufdiagramm - Zeitdiagramm
14
 *    
15
 *        schalter  _----------_____  Schalterstellung
16
 *        absaugung _-------------__  Verzoegertes abschalten
17
 *        maschine  ____-------_____  Verzoegertes einschalten
18
 *        
19
 *        Der Schalter arbeitet invers und ist entprellt
20
 *
21
*/
22
23
#include <CombieTimer.h>
24
#include <CombiePin.h>
25
#include <CombieTypeMangling.h>
26
27
using namespace Combie::Pin;
28
using namespace Combie::Timer;
29
using namespace Combie::Millis;
30
31
TasterGND<2> schalter; // zwischen Pin und GND(invertierend)
32
OutputPin<3> absaugung;
33
OutputPin<4> maschine;
34
35
36
EntprellTimer    entprell { 20_ms};  // Schalter entprellen
37
RisingEdgeTimer  ton      {500_ms};  // steigende Flanke wird verzoegert
38
FallingEdgeTimer toff     { 3_sec};  // abfallende Flanke wird verzoegert
39
 
40
void setup(void) 
41
{
42
  schalter.initPullup();
43
  absaugung.init();
44
  maschine.init();
45
  pinMode(LED_BUILTIN, OUTPUT); // unveraendert aus Blink.ino
46
}
47
48
void yield(void) 
49
{
50
  bool schalterMerker  =  entprell  =  schalter; 
51
  absaugung  =  toff  =  schalterMerker;
52
  maschine   =  ton   =  schalterMerker;
53
}
54
55
void loop(void) // unveraendert aus Blink.ino
56
{
57
  digitalWrite(LED_BUILTIN, HIGH);   // turn the LED on (HIGH is the voltage level)
58
  delay(1000);                       // wait for a second
59
  digitalWrite(LED_BUILTIN, LOW);    // turn the LED off by making the voltage LOW
60
  delay(1000);                       // wait for a second
61
}

von Carl D. (jcw2)


Lesenswert?

Arduino Fanboy D. schrieb:
> Carl D. schrieb:
>> Komfort kann man genießen, muß aber nicht.
> 280 auf der Bahn geht mit einem A8 viel entspannter,
> als in einem Lotus. Ist eine Frage der Prioritäten.
>

Aus dem Lotus-Land gibt es auch Rückenschonenderes

>
> EntprellTimer    entprell { 20_ms};  // Schalter entprellen
> RisingEdgeTimer  ton      {500_ms};  // steigende Flanke wird
> FallingEdgeTimer toff     { 3_sec};  // abfallende Flanke wird
>

Ja, userdefined literals, ganz vergessen, meine Timer laufen auch 10_ms 
oder 1_kHz oder auch 0.125_MHz

: Bearbeitet durch User
von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> userdefined literals
Syntaktischer Zucker, der allerfeinsten Sorte.

von Carl D. (jcw2)


Lesenswert?

Arduino Fanboy D. schrieb:
> Carl D. schrieb:
>> userdefined literals
> Syntaktischer Zucker, der allerfeinsten Sorte.

Wieso?
Weil ich mir dann den Kommentar sparen kann?
Oder einen Timer nur mit einem Intervall oder einer Zeit geladen werden 
können?
Typsicherheit statt "der macht was komisches, kann jemand helfen".

von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> Weil ich mir dann den Kommentar sparen kann?
Ja

500_ms oder 3_sec ist intuitiv erfassbar

Carl D. schrieb:
> Typsicherheit
Da muss man sich schon mehr kümmern, als nur das Suffix definieren.
Ansonsten: Ja!
Typsicherheit ist Gold wert.

von Carl D. (jcw2)


Lesenswert?

Arduino Fanboy D. schrieb:
> Carl D. schrieb:
>> Weil ich mir dann den Kommentar sparen kann?
> Ja
>
> 500_ms ist intuitiv erfassbar
>
> Carl D. schrieb:
>> Typsicherheit
> Da muss man sich schon mehr kümmern, als nur das Suffix definieren.
> Ansonsten: Ja!
> Typsicherheit ist Gold wert.

Meine Fragen waren dem "Syntaktischen Zucker" geschuldet. Gerade das ist 
nämlich die typische Antwort derer, die den wahren Wert der UDLs gar 
nicht verstehen.

von Jemand (Gast)


Lesenswert?

Carl D. schrieb:
> Wieso?
> Weil ich mir dann den Kommentar sparen kann?
> Oder einen Timer nur mit einem Intervall oder einer Zeit geladen werden
> können?
> Typsicherheit statt "der macht was komisches, kann jemand helfen".

Hätte eine simple Funktion nicht das Gleiche geschafft?
UDLs scheinen mir bloß eine Aufblähung der Sprachkomplexität zu sein.

von Einer K. (Gast)


Lesenswert?

2 Fliegen mit einer Klappe, lassen sich so erwischen.
Lesbarkeit + Typesicher

Erhebliche Kosten bei der Entwicklung der Libraries.

Einfache Anwendung.
Kein Laufzeitnachteil.

von Carl D. (jcw2)


Lesenswert?

Arduino Fanboy D. schrieb:
> 2 Fliegen mit einer Klappe, lassen sich so erwischen.
> Lesbarkeit + Typesicher
Full ack

> Erhebliche Kosten bei der Entwicklung der Libraries.
Naja, mein Zeiten/Frequenzen in F_CPU ticks abgebildet war jetzt keine 
meisterliche Anstrengung.

> Einfache Anwendung.
> Kein Laufzeitnachteil.
full ack

von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> war jetzt keine meisterliche Anstrengung.
Ach, deine Gehirnwindungen haben die passende Form, das ist alles.

Ein militanter C oder ASM Jünger versteht gar nicht worüber du redest.

von Stefan (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ein militanter C oder ASM Jünger versteht gar nicht worüber du redest.

Und weil er es nicht versteht muß es bekämpft werden.

von Einer K. (Gast)


Lesenswert?

Stefan schrieb:
> Und weil er es nicht versteht muß es bekämpft werden.
Das ist natürlich.
So wie auch Unkraut.

Alles unbekannte könnte gefährlich sein.

Mit dem Hammer einmal feste drauf, und es beißt nicht mehr.
(dabei ist es völlig egal, ob es überhaupt Zähne hat)

von Carl D. (jcw2)


Lesenswert?

Stefan schrieb:
> Arduino Fanboy D. schrieb:
>> Ein militanter C oder ASM Jünger versteht gar nicht worüber du redest.
>
> Und weil er es nicht versteht muß es bekämpft werden.

Es wäre schön wenn die Kandidaten so verwirrt wären, daß sie gar nicht 
antworten können.

von Bild (Gast)


Lesenswert?

ich bin traurig und überrascht, was ich losgetreten habe

von Dennis S. (eltio)


Lesenswert?

A. S. schrieb:
> Ich habe schon objektorientierte SW in Assembler gesehen und
> Spaghetti-Code in C++. OOP ist keine Frage der Sprache, sondern der
> Umsetzung.

Hat ja auch keiner behauptet... ;-)

Das Ganze ist auch ein Äpfel-Birnen-Vergleich, schließlich ist OOP ein 
Paradigma und HW-Nähe nicht.

von Einer K. (Gast)


Lesenswert?

Bild schrieb:
> ich bin traurig und überrascht, was ich losgetreten habe

Alles OK.

Von Übereinstimmung, bis Grabenkämpfe, alles dabei.

Beitrag #6230022 wurde von einem Moderator gelöscht.
von Carl D. (jcw2)


Lesenswert?

WohnraumLenkung schrieb im Beitrag #6230022:
> Meine Wohnung ist so klein, -ich muss hardwarenah programmieren.

Räumlich HW-nah und C++ geht gut zusammen. Läuft alles auch auf kleinen 
Notebooks.  ;-)

Beitrag #6230033 wurde von einem Moderator gelöscht.
von Carl D. (jcw2)


Lesenswert?

WohnraumLenkung schrieb im Beitrag #6230033:
> Carl D. schrieb:
>
>> Räumlich HW-nah und C++ geht gut zusammen.
>
> C++ ??
>
> Nein, das ist mir eine Nummer zu groß. Selbst C ohne ++ kriege ich hier
> nicht unter.

Daß solche Wohnverhältnisse überhaupt erlaubt sind....

von Einer K. (Gast)


Lesenswert?

Carl D. schrieb:
> Es wäre schön wenn die Kandidaten so verwirrt wären, daß sie gar nicht
> antworten können.

Hach...
Das wird nicht klappen.

Der Grund:
Was außerhalb der Wahrnehmung liegt, kann nicht zur einer Verwirrung 
beitragen.

von Minus M. (Firma: irre) (minusman)


Lesenswert?

Ich hasse OOP
Ich hasse Arduino
Ein anderes Wort für Templates: Abschaum!

von MaWin (Gast)


Lesenswert?

Minus M. schrieb:
> Ich hasse OOP
> Ich hasse Arduino
> Ein anderes Wort für Templates: Abschaum!

Dann hätten wir das ja auch endlich mal geklärt.

von Adam (Gast)


Lesenswert?

Wenn ein Kenner hier mal die Güte hätte:
Was sind überhaupt Templates, ganz einfach erklärt?

von Einer K. (Gast)


Lesenswert?

Adam schrieb:
> Was sind überhaupt Templates, ganz einfach erklärt?

Erste Näherung:
Codegeneratoren, welche im Kompiler laufen, bzw. von diesem verwurstet 
werden.

Der zweite Schritt:
Eine Turing vollständige Maschine, innerhalb von C++.
(welches erst nach der Erfindung der Templates erkannt wurde)

von Adam (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Adam schrieb:
> Was sind überhaupt Templates, ganz einfach erklärt?
>
> Erste Näherung:
> Codegeneratoren, welche im Kompiler laufen, bzw. von diesem verwurstet
> werden.

Mit welchem Sinn? Für was?
Bri diesem Fremdwort habe ich on diverser Literatur immer den Eindruck 
dass es nur mit weiteren Fremdworten erklärt werden kann und es aus 
diesem wechselseitigen Bezug kein Entrinnen gibt :)

von Einer K. (Gast)


Lesenswert?

Eine allgemeine Form:
1
template<typename T>
2
bool vergleich(T &a,T& b)
3
{
4
 return a<b;
5
}

Jeder vergleichbare Type, also, für den es den Vergleichsoperator < 
gibt, lässt sich so vergleichen.
Auch wenn der DatenType jetzt noch nicht bekannt ist (Morgen erfunden 
wird).

Selbst Äpfel und Birnen kann man so vergleichen, wenn sie als Wägbar 
definiert sind.



Ein C Programmier müsste für jeden Datentyp eine eigene Funktion 
schreiben.
Das erledigt der Kompiler für uns C++ Heinis.



--------
Oder zählen der Arrayelemente eines beliebigen Arrays.
Egal welcher Datentype von dem Array gehalten wird.
1
// drop in Ersatz fuer sizeof() Konstrukte
2
template<typename ArrayType, size_t count> 
3
constexpr size_t arrayCount(const ArrayType (&)[count])
4
{
5
  return count;
6
}
Dieses natürlich zur Kompilezeit.
Da wird kein Byte Code erzeugt.

von Sheeva P. (sheevaplug)


Lesenswert?

MaWin schrieb:
> Das klassische objektorientierte Programm besteht aus Konstruktoren (und
> Destruktoren) in Klassen, also dynamischen Speicheranforderungen,

Nö.

von Sheeva P. (sheevaplug)


Lesenswert?

Axel S. schrieb:
> Bild schrieb:
>> lässt sich für einen Software-Entwurf eines Microcontrollers sagen, dass
>> man hardwarenah, objektorientiert programmiert hat?
>
> Die Frage ist vollkommen sinnlos. Allgemein kann man sowas schon mal gar
> nicht sagen, man muß immer eine konkrete Software betrachen.

Es geht doch anscheinend um eine konkrete Software.

> Dazu kommt noch, daß schon bei "objektorientiert" kein Konsens darüber
> besteht, was man denn alles dazu zählen möchte und was nicht.

Alan Kay sollte es wissen, denn der hat's erfunden: “OOP to me means 
only messaging, local retention and protection and hiding of 
state-process, and extreme late-binding of all things.”

von Sheeva P. (sheevaplug)


Lesenswert?

Arduino Fanboy D. schrieb:
> Ich weiß nicht, ob deine Fragestellungen und Behauptungen zielführend
> sind.
> Denn ich kenne dein Ziel nicht.

Er ist an der OOP gescheitert, deswegen ist sie doof. ;-)

von Sheeva P. (sheevaplug)


Lesenswert?

Peter D. schrieb:
> Das beste OOP nützt nichts, wenn der Programmablaufplan nichts taugt.

Das ist erstens nicht Aufgabe der OOP und gilt zweitens für jedes andere 
Paradigma ganz genauso.

> Anders gesagt, OOP kann einem in keinen Fall das Denken abnehmen. Zu
> überlegen, wie man ein Programm sinnvoll strukturiert, d.h. wann und wie
> oft eine Funktion wirklich aufgerufen werden muß und wieviel CPU-Zeit
> sie benötigt, interessiert das OOP nicht die Bohne.

Das ist ja auch nicht ihr Job, und gilt, wie gesagt, auch für alles 
andere. Allerdings helfen gängige OO-Techniken, den Code besser und 
übersichtlicher zu strukturieren, den Code wiederverwendbarer zu 
gestalten und viele beliebte Fehler bereits zur Compilezeit erkennen 
(und idealerweise beheben) zu können.

von Sheeva P. (sheevaplug)


Lesenswert?

Arduino Fanboy D. schrieb:
> MaWin schrieb:
>> Dann frag mal bei einer Versicherung oder einer Bank nach.
>
> Da wird die Frage von einem fetten Oracle (o.ä.) Brummer beantwortet.

Meistens liegt sowas in Hana, Redis oder Ähnlichem.

von Sheeva P. (sheevaplug)


Lesenswert?

MaWin schrieb:
> Arduino Fanboy D. schrieb:
>> Würde mich wundern, wenn der mit ASM bespielt wird.
>
> Die großen Datenbanken sind im Kern, da wo es auf Performance ankommt,
> hochoptimiert.

Ja, aber sie sind trotzdem zu langsam. Zusicherungen wie 
Transaktionssicherheit, Referentieller Integrität, MVCC, Write Ahead 
Logs, Query Optimization etc. haben nunmal ihren Preis. Deswegen 
erfreuen sich heute die NoSQL-Datenbanken wie etwa CouchDB, MongoDB, 
Elasticsearch, oder hochperformante In-Memory-Datenbanken wie Gridgain / 
Apache Ignite, Redis et al., welche solche Garantien nicht anbieten, 
zunehmender Beliebtheit.

von Sheeva P. (sheevaplug)


Lesenswert?

M.C. schrieb:
> Natürlich schließt die einfache Lösung Erweiterbarkeit und
> Wiederverwendung ein wenn es denn gefordert ist. Das lässt sich
> allerdings auch in prozeduralen Sprachen sicherstellen.

Nach Larry Wall ist die Faulheit eine der Kardinaltugenden guter 
Entwickler. Darum designen die guten Entwickler ihren Code nicht nur 
dann wiederverwendbar, wenn das im Pflichtenheft steht...

Und ja, in prozeduralen Sprachen ist das nicht unmöglich, aber 
aufwändiger.

> Na wär auch abenteuerlich der breit angewandten OOP die Berechtigung für
> ihre sinnvollen Einsatzzwecke
> abzusprechen. Da gehört das Handling großer Datenstrukturen sicher dazu.

Es ist einfach eine hervorragende Idee, Daten und die Funktionen, die 
sie be- und verarbeiten, zu Objekten zusammenzufassen.

> Generell stellt sich aber immer die Overhead- oder Wasserkopf-Frage:
> Steht der Verwaltungsaufwand, steht die Komplexität der Sprachmittel
> (samt Folgeproblemen) immer in einem sinnvollen Verhältnis zur
> Aufgabenstellung bzw. der letztendlichen Lösung? Klare Antwort: Nein.

Genau. Deswegen sind OO-Programme sehr oft kürzer und lesbarer als 
prozedurale.

> Nächstes Problem Abstrahierung: Kann das Zwischenschalten immer neuer
> Softwareschichten die Effizenz und den Ressourcenverbrauch unangetastet
> lassen? Klare Antwort: Nein.

Es ist ja keine Softwareschicht, sondern nur eine andere Art, den 
Quellcode zu organisieren. Im Mikrocontrollerbereich ist es sogar so, 
daß jeder halbwegs gute Compiler die OOP schlicht wegoptimiert und das 
Kompilat hinterher identisch ist zu einem äquivalenten prozeduralen 
Code.

> Die Eignung von OOP und Abstraktion für "menschliche Hirnwindungen" war
> bereits angesprochen. Auch hier die klare Antwort und ganz im Gegenteil
> zur ursprünglichen Absicht: Nein, sie ist nicht für jeden Kopf
> kompatibel.

Du solltest wirklich nicht von Dir auf andere schließen, ist kein guter 
Stil. Bitte hör' jetzt auf mit dem Getrolle, vielen Dank.

von Sheeva P. (sheevaplug)


Lesenswert?

Olaf schrieb:
> Und ich lieg vor lachen auf dem Boden.
>
> Und jetzt? Sorry, bloss weil da zufaellig ein C++ Compiler
> genutzt wird und man dort theoretisch in C++ voll krasse Projekte
> durchziehen koennte, heisst das ja nicht das es einer macht.

Aber ja doch. Die meisten Arduinoprojekte nutzen C++, und zwar auch 
dann, wenn sie keine eigenen Klassen definieren. Die Arduino-Libraries 
sind nahezu alle in C++ geschrieben, und wer sie benutzt, der benutzt 
automatisch C++ -- auch wenn er das nicht bemerkt oder nicht versteht.

von Sheeva P. (sheevaplug)


Lesenswert?

A. S. schrieb:
> Konsens sollte zuerst darüber erzielt werden, dass es Gebiete gibt, wo
> OOP super ist, und welche, wo es deplaziert ist. Und dann könnt ihr ja
> gerne (zu unser aller nutzen) die Trennlinie ausloten.

Wo wäre es denn zum Beispiel deplatziert? Für ein bisschen Pingewackel 
auf einem kleinen Tiny13? Da ist
1
#include <Pin.hpp>
2
3
int main(void) {
4
    InputPin  btn( PINDEF(B, 0) );
5
    OutputPin led( PINDEF(B, 1) );
6
    
7
    while(1) {
8
        if(btn.isHigh()) {
9
            led.setLow();
10
        } else {
11
            led.setHigh();
12
        }
13
    }
14
    return 0;
15
}

immer noch lesbarer als die äquivalente C-Implementierung. Sogar jemand, 
der nur minimale Programmiererfahrungen und gar keine mit AVRs hat, kann 
leicht verstehen, was dieses Miniaturprogramm tut. Und wenn man es mit 
dem gcc übersetzt, ist das Kompilat exakt identisch mit jenem eines 
äquivalenten C-Programms, das direkt auf DDRB arbeitet.

Insofern erscheint es mir -- genau wie Dir -- sinnvoller, sich erst 
einmal darüber zu einigen, was OO überhaupt ist, anstatt einfach zu 
behaupten, daß es in bestimmten Domänen keinen Platz habe. OO hat zum 
Beispiel nichts mit dynamischer Allokation, Exceptionhandling oder der 
Standard Template Library von C++ zu tun...

von Sheeva P. (sheevaplug)


Lesenswert?

Adam schrieb:
> Arduino Fanboy D. schrieb:
>> Das lässt sich über Templates und andere C++ Sprachmitteln angehen.
>
> Wie wird das obige Problem damit denn nun genau gelöst. Was mich dabei
> besonders interessiert: Welchen Vorzug bieten diese Sprachmittel? Mach
> doch mal etwas Werbung dafür! Um noch gezielter zu fragen:

Templates in C++ sind Anweisungen an den Compiler, wie er eine bestimmte 
Klasse oder Funktion erzeugen soll, das hat aber im Kern nichts mit OOP 
zu tun. Ein Beispiel ist ein simples Funktionstemplate für eine Funktion 
max():
1
template <typename T>
2
T max(T a, T b) {
3
    T rv;
4
    if( a < b ) {
5
        rv = b;
6
    } else {
7
        rv = a;
8
    }
9
    return rv;
10
}

Durch die Verwendung dieses Template habe ich jetzt max()-Funktionen, 
die ich auf alle möglichen Typen anwenden kann -- auf alle, die den 
Operator '<' unterstützen. Das können generische Typen wie char, int, 
float oder auch double sein, aber auch selbstdefinierte Typen (Klassen), 
die mit diesem Operator verglichen werden können.

von A. S. (Gast)


Lesenswert?

Sheeva P. schrieb:
> Wo wäre es denn zum Beispiel deplatziert? Für ein bisschen Pingewackel
> auf einem kleinen Tiny13?

Für sowas ist OOP gut. Und C++ durch seinen Focus auf beliebige 
Ersetzungen zur Compilerzeit eher effektiver.

Alle Pins des uC auf x verschiedene Weisen nutzen zu können, da ist OOP 
gut. Negativ wird es, wenn man unerwartet in RTTI läuft, wenn der 
Kontrollfluss verloren geht, wenn ein Bezeichner aus 20 namespaces 
kommen könnte, ... .

von Carl D. (jcw2)


Lesenswert?

A. S. schrieb:
> Sheeva P. schrieb:
>> Wo wäre es denn zum Beispiel deplatziert? Für ein bisschen Pingewackel
>> auf einem kleinen Tiny13?
>
> Für sowas ist OOP gut. Und C++ durch seinen Focus auf beliebige
> Ersetzungen zur Compilerzeit eher effektiver.
>
> Alle Pins des uC auf x verschiedene Weisen nutzen zu können, da ist OOP
> gut. Negativ wird es, wenn man unerwartet in RTTI läuft, wenn der
> Kontrollfluss verloren geht, wenn ein Bezeichner aus 20 namespaces
> kommen könnte, ... .

Es "nicht auf die Reihe bekommen" ist keine Eigenschaft der Sprache.

von Sheeva P. (sheevaplug)


Lesenswert?

A. S. schrieb:
> Sheeva P. schrieb:
>> Wo wäre es denn zum Beispiel deplatziert? Für ein bisschen Pingewackel
>> auf einem kleinen Tiny13?
>
> Für sowas ist OOP gut. Und C++ durch seinen Focus auf beliebige
> Ersetzungen zur Compilerzeit eher effektiver.
>
> Alle Pins des uC auf x verschiedene Weisen nutzen zu können, da ist OOP
> gut. Negativ wird es, wenn man unerwartet in RTTI läuft, wenn der
> Kontrollfluss verloren geht, wenn ein Bezeichner aus 20 namespaces
> kommen könnte, ... .

Unerwartet in RTTI laufen? Den Kontrollfluß verlieren? Bezeichner aus 20 
Namespaces? Was redest Du da bitte für einen, entschuldige, Unsinn? 
Unerwartete Dinge geschehen nur, wenn der Entwickler sein Werkzeug nicht 
beherrscht.

von Asm'ler (Gast)


Lesenswert?

Sheeva P. schrieb:
> Für ein bisschen Pingewackel
> auf einem kleinen Tiny13? Da ist
> #include <Pin.hpp>
>
> int main(void) {
>     InputPin  btn( PINDEF(B, 0) );
>     OutputPin led( PINDEF(B, 1) );
>
>     while(1) {
>         if(btn.isHigh()) {
>             led.setLow();
>         } else {
>             led.setHigh();
>         }
>     }
>     return 0;
> }
>
> immer noch lesbarer als die äquivalente C-Implementierung.

Na da haste ja gleich das schönste Beispiel ausgesucht.
In Assembler ist das herrlich simpel
1
sbi DDRB,1
2
marke: sbis PINB,0
3
cbi PORTB,1
4
sbic PINB,0
5
sbi PORTB,1
6
rjmp marke

Wer die I/O-Befehle "persönlicher" will kann sie noch durch ein Makro 
ersetzen. Es geht also auch wesentlich kürzer ohne gewaltigen 
Syntax-Bombast, Klammern-Irrgärten und Riesen-Zeilenverbrauch. Kurz, 
knapp und gerade deshalb verständlich. Nichts essentielles bleibt 
verborgen. Vor allem ist der Anwender dazu angehalten mit dem Datenblatt 
seines Controllers zu arbeiten statt >1000 seitige Hochsprachenbibeln zu 
pauken. In letzteren  steht nämlich auch nicht drin welche 
Hardware-Features einen besonders effizienten Code auf dem ausgesuchten 
Controller ermöglichen würden. Das, liebe Päpste der kompliziert- 
intransparenten OOP Programmierung, nennt man wirklich zielführend... 
Das und nichts anderes ist Hardware-Nähe.
Wenn hier "verständlichere Schreibweise" mit einem dicken Rucksack 
voller zuätzlicher Sprachbürokratie verkauft wird ist das doch einfach 
nur lächerlich.

von M.C. (Gast)


Lesenswert?

Sheeva P. schrieb:
> Unerwartet in RTTI laufen? Den Kontrollfluß verlieren? Bezeichner aus 20
> Namespaces? Was redest Du da bitte für einen, entschuldige, Unsinn?
> Unerwartete Dinge geschehen nur, wenn der Entwickler sein Werkzeug nicht
> beherrscht.

... um mal ein praktisches Beispiel zu demonstrieren wie schwer diese 
komplexen Sprachen zu beherrschen sind :)

von Roland F. (rhf)


Lesenswert?

Hallo,
Sheeva P. schrieb:
> Durch die Verwendung dieses Template habe ich jetzt max()-Funktionen,
> die ich auf alle möglichen Typen anwenden kann -- auf alle, die den
> Operator '<' unterstützen. Das können generische Typen wie char, int,
> float oder auch double sein, aber auch selbstdefinierte Typen (Klassen),
> die mit diesem Operator verglichen werden können.

Das heißt also, das der Compiler den obigen Quell-Text durch die jeweils 
zuständige Methode der entsprechenden Klasse ersetzt?

rhf

von Johannes S. (Gast)


Lesenswert?

Roland F. schrieb:
> Das heißt also, das der Compiler den obigen Quell-Text durch die jeweils
> zuständige Methode der entsprechenden Klasse ersetzt?

nicht unbedingt, nimm das einfache max Beispiel von Sheeva. Streiche die 
Zeile mit dem template und ersetze T durch int. Wenn du das max jetzt 
für float haben möchtest, kopierst du die Funktion und ersetzt int durch 
float. Genau das wird durch das template (Vorlage, Schablone) 
vereinfacht. Wenn max eine komplexere Funktion ist und die geändert 
werden muss, dann macht man die Änderung nur im template und alle 
Instanzen nehmen die Änderung mit.

von Einer K. (Gast)


Lesenswert?

Sheeva P. schrieb:
> Den Kontrollfluß verlieren?

Ich weiß nicht genau, was "verlieren" hier bedeutet....

Aber es ist schon so, dass sich gestandene prozedurale Programmierer im 
OOP Kontrollfluss verlieren können.
Oder anders: Ihnen der Kontrollfluss eines OO Programms sich nicht 
sofort offenbart.

Eine Ursache:
Meist wird vom prozeduralen Programmierer ein Programmlaufplan gemalt, 
ein Flussdiagramm.
Das Flussdiagramm ist eine Art Pseudocode.
Dann wird das Flussdiagramm mit echtem Sprachcode geflutet.
Im Anschluss hat man dann ein Programm, welches den Kontrollfluss aus 
dem Diagramm fast/möglichst 1:1, abbildet.


In der OOP sieht das meist etwas anders aus.
Dort werden die Klassen und Objekte zueinander in Beziehung gesetzt.

Einerseits gibt es dort die Vererbung, welches eine Form der Beziehung 
darstellt. Das führt zu Baum artigen Bildern.

Dann gibt es die Beziehungen zwischen den Objekten. Diese haben eher den 
Charakter von "Nachrichten". Und im Zuge dieser Benachrichtigungen, wird 
der Kontrollfluss von Objekt zu Objekt weiter gereicht. Z.B. die UML 
Diagramme sind geeignet um diesen Benachrichtigungsfluss bildlich 
darzustellen.
An der Stelle kümmert man sich eher um die Interfaces der Klassen.
Um das Vererbungsinterface, und das öffentliche Interface.

Dieses "in Beziehung setzen" führt dazu, dass der Kontrollfluss nicht 
offen zu Tage tritt, sondern eher wie beim Staffellauf weiter gereicht 
wird.
Klarer: Der Kontrollfluss ergibt sich automatisch aus den modellierten 
Beziehungen zwischen den Objekten.

Erst innerhalb von Methoden liegt der Kontrollfluss offen vor einem.

Es kann also gut sein, dass ein ungeübter OOPler, oder ein gestandener 
Prozeduraler, ein OO Programm untersucht, und sich lange damit abmüht 
den Kontrollfluss zu verstehen und aufzumalen.
Sich eben genau dabei verirrt, oder verheddert.
Denn der Programmierer des Wunderwerks hat sich gar nicht wirklich um 
den Kontrollfluss gekümmert, sondern eigentlich nur Interfaces 
geschaffen, welche miteinander kommunizieren.

Allgemein:
In der prozeduralen Programmierung liegt der Fokus eher auf dem 
Kontrollfluss.
In der OOP liegt der Fokus eher auf den Beziehungen zwischen den 
Objekten.

von Carl D. (jcw2)


Lesenswert?

Asm'ler schrieb:
> Controller ermöglichen würden. Das, liebe Päpste der kompliziert-
> intransparenten OOP Programmierung, nennt man wirklich zielführend...
> Das und nichts anderes ist Hardware-Nähe.
> Wenn hier "verständlichere Schreibweise" mit einem dicken Rucksack
> voller zuätzlicher Sprachbürokratie verkauft wird ist das doch
> einfach nur lächerlich.

Moby geh deine Pillen nehmen.

von c-hater (Gast)


Lesenswert?

Stefan ⛄ F. schrieb:

> Ein Punkt, wo OOP scheitert, sind die alltäglichen Sonderlocken.

Kommt drauf an. Wenn sie wirklich "alltäglich" sind, dann hat der 
Programmierer seinen Job schlecht gemacht, wenn er sie nicht bereits in 
der Basisklasse mit eingeplant hat.

Allerdings: Gerade die Notwendigkeit, sowas schon in der Basisklasse mit 
einzuplanen, zeigt tatsächlich die Schwächen von OOP als Konzept.

Dagegen wurden dann die Interfaces erfunden. In praktisch jeder 
OO-Sprache sind sie der einzige Weg, die streng hierarchische Vererbung 
zu umgehen. C++ als eierlegende Wollmilchsau (und u.a. deshalb praktisch 
vollkommen unlesbar sei mal außen vor).

> Aber sie zeigen nicht, wie man Sonderlocken umsetzt, die sich über
> mehrere Ebenen der ganzen Objekt-Hierarchie verteilen. Mit dem
> Überschreiben einzelner Methoden ist es oft nicht getan.

Das ist einfach: man lernt, wirklich programmieren zu können. Dann kann 
man auch Sachen umsetzen, die Änderungen an ganzen Klassen-Hierarchien 
erfordern. Das ist allerdings nix für die Hipster-Generation und die 
"agilen" Entwicklungsmodelle, die den Chefs so gefallen, weil sie da 
billige, austauschbare, geistig minderbemittelte "Programmierer" 
beschäftigen können...
Sowas erfordert halt den Überblick über's Gesamtwerk und eine peinlich 
detaillierte Planung der nötigen Eingriffe mit Rücksichten auf mögliche 
"Seiteneffekte".

> Programme, die mit voller Absicht von einem anderen
> Kundenprojekt geforkt wurden und dann 12 Jahre lang gewachsen sind,
> sehen eben furchtbar aus. Wer billig will, bekommt auch billig

Das ist ein wahres Wort. Deswegen läuft das bei mir auch anders. Es gibt 
Backends (die von Kunde zu Kunde immer nur geringfügig modifiziert oder 
erweitert werden) und Frontends, die für jeden Kunden bestenfalls nur 
stark angepaßt werden (z.B. die "Stammdatenpflege") oder sogar komplett 
neu entwickelt werden (die eigentlichen Anwendungen).

> kann ich mich als Entwickler nicht verweigern. Ich kann nicht mal eben
> 200.000 Zeilen Code umschreiben, nur um eine kleine Änderung mit 2 PT
> Umsatz schöner zu machen.

Was ist "PT"? Peta-Teuro?

Also für Peta-Teuro kriegt jeder Kunde von mir (nach Prüfung der 
Bonität) natürlich eine ideale Anwendung. Da wird nix recycled, da sind 
sogar alle Optimierungen im Preis inbegriffen. Nur leider: so viel 
wollte echt noch niemand zahlen...

von Carl D. (jcw2)


Lesenswert?

c-hater schrieb:
>
> Was ist "PT"? Peta-Teuro?
>

PersonenTage ist die Einheit, in der Profis ihre Zeit an Kunden 
verrechnen. Die wissen was das ist.

von c-hater (Gast)


Lesenswert?

Adam schrieb:

> Wenn ein Kenner hier mal die Güte hätte:
> Was sind überhaupt Templates, ganz einfach erklärt?

Im Kern sind es eigentlich extrem aufgeblasene und sehr komplexe Makros. 
Sie heißen nur sehr verschämt nicht mehr so...

Es handelt sich eigentlich um eine Sprache innerhalb einer anderen 
Sprache. Sprich: das Problem wird statt wie in C in zwei in drei 
Anläufen kompiliert.

Scheint ein supertoller neuer Trick zu sein. Ist es aber nicht. Denn: 
nahezu jeder Makroassembler durchläuft auch zumindest zwei Iterationen 
auf Quelltextebene, bevor es an die Codegenerierung geht. Ja mehr noch: 
es gibt viele Assembler, die bei Bedarf auch noch mehr Iterationen 
machen können und damit zumindest das theoretische Potential haben, noch 
effizienteren Code zu erzeugen. Tatsächlich ist aber IMMER eher die 
Fähigkeit des Programmierers bestimmend für die Codeeffizienz...

Beitrag #6231738 wurde von einem Moderator gelöscht.
von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> .....
Mach dir mal keine Sorgen, du bist nicht der einzige, der sich mit den 
C++ Templates etwas schwer tut.

Wikipedia sagt zu Templates:
https://de.wikipedia.org/wiki/Template_(C%2B%2B)
Ein C++ Buch sollte tiefer gehen, und mehr mögliche Anwendungen zeigen.

Etwas trocken, das Thema
https://en.cppreference.com/w/cpp/language/template_parameters

von A. S. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> In der prozeduralen Programmierung liegt der Fokus eher auf dem
> Kontrollfluss.
> In der OOP liegt der Fokus eher auf den Beziehungen zwischen den
> Objekten.

Genau. Und es gibt Bereiche, in denen der kontrollfluss wichtiger ist, 
als die Beziehungen. Und dort sind oop halt second best. Dass man mit 
C++ auch anders könnte ist ja kein Argument für OO.

Die Grenze läuft oft entlang der Steuerungstechnik und zwischen 
konkreten und rein virtuellen Objekten.

von c-hater (Gast)


Lesenswert?

Carl D. schrieb:

> PersonenTage ist die Einheit, in der Profis ihre Zeit an Kunden
> verrechnen. Die wissen was das ist.

Also, ich mache den Job jetzt seit 30 Jahren. Von dieser Einheit höre 
ich wirklich das erste Mal.

Kann es sein, dass du bei irgendeinem dieser unsäglichen Consulter 
beschäftigt bist? Bosch? Telekom-Systems? Oder ähnliches Gelichter auf 
kleinerer Ebene?

Wenn die Leute zu mir kommen, ist die Situation i.d.R. so, dass sie 
mindestens eines von diesen in Zusammenarbeit mit diesem Gelichter 
vollständig gescheiterteten Projekten vorweisen können. Design-Ziel 
nicht annähernd erreicht. Oft genug nichtmal die geforderte 
Funktionalität in vollem Umfang implementiert (das läßt sich immerhin 
einklagen). Und in aller Regel wurde sowohl Budget als auch Projektzeit 
massiv überschritten. Der agile Ansatz hat nur dafür gesorgt, dass fast 
alles Geld des Kunden weg ist, er nach wie vor aber ohne funktionierende 
Software da steht...

Ja, OK, vieles davon liegt auch in der Inkompetenz des Kunden begründet. 
Nur hat dem niemand der teuren Consulter das nach teuerer Analyse 
gesagt...

Wir fangen einfach mal an...

von Stefan F. (Gast)


Lesenswert?

c-hater schrieb:
> Also, ich mache den Job jetzt seit 30 Jahren. Von dieser Einheit höre
> ich wirklich das erste Mal.

Das finde ich sehr merkwürdig. Alle Kommerziellen Projekte, an denen ich 
mitgewirkt habe, wurden in Personentagen abgerechnet. Ich dachte, das 
macht jede Firma so.

https://de.wikipedia.org/wiki/Personenstunde#Andere_Einheiten
https://www.duden.de/rechtschreibung/Personentag

Ich finde deine Lästereien über andere Entwickler unangemessen.

von Jemand (Gast)


Lesenswert?

c-hater schrieb:
> Also, ich mache den Job jetzt seit 30 Jahren. Von dieser Einheit höre
> ich wirklich das erste Mal.

Aber sicherlich hast du schon mal das verwandte man-hours gehört.

von c-hater (Gast)


Lesenswert?

Jemand schrieb:

> Aber sicherlich hast du schon mal das verwandte man-hours gehört.

Das ja.

von A. S. (Gast)


Lesenswert?

Mann-Tage, MT, ja. Mann-Jahre, -Stunden, alles ja. Personen soll wohl 
gegendert sein, gehört hab ich es noch nie.

von Carl D. (jcw2)


Lesenswert?

c-hater schrieb:
> Carl D. schrieb:
.
>> PersonenTage ist die Einheit, in der Profis ihre Zeit an Kunden
>> verrechnen. Die wissen was das ist.
.
> Also, ich mache den Job jetzt seit 30 Jahren. Von dieser Einheit höre
> ich wirklich das erste Mal.
.
> Kann es sein, dass du bei irgendeinem dieser unsäglichen Consulter
> beschäftigt bist? Bosch? Telekom-Systems? Oder ähnliches Gelichter auf
> kleinerer Ebene?
.
> Wenn die Leute zu mir kommen, ist die Situation i.d.R. so, dass sie
> mindestens eines von diesen in Zusammenarbeit mit diesem Gelichter
> vollständig gescheiterteten Projekten vorweisen können. Design-Ziel
> nicht annähernd erreicht. Oft genug nichtmal die geforderte
> Funktionalität in vollem Umfang implementiert (das läßt sich immerhin
> einklagen). Und in aller Regel wurde sowohl Budget als auch Projektzeit
> massiv überschritten. Der agile Ansatz hat nur dafür gesorgt, dass fast
> alles Geld des Kunden weg ist, er nach wie vor aber ohne funktionierende
> Software da steht...
>
> Ja, OK, vieles davon liegt auch in der Inkompetenz des Kunden begründet.
> Nur hat dem niemand der teuren Consulter das nach teuerer Analyse
> gesagt...
>
> Wir fangen einfach mal an...

Ich bin überrascht, wie zwei Personen mit sehr ähnlicher Vita sich so 
unterschiedlich entwickeln können. Da hab ich echt Glück gehabt.

von A. S. (Gast)


Lesenswert?

Frederik Brooks: vom Mythos des Personen-Monats.

von Einer K. (Gast)


Lesenswert?

A. S. schrieb:
> Dass man mit C++ auch anders könnte ist ja kein Argument für OO.
Aber auch kein Argument gegen C++.
Oder gegen die Verwendung von Templates.

Betrachtet man nur das prozedurale Paradigma, dann ist C++ nahezu auf 
gleichen Niveau mit C.



Arduino Fanboy D. schrieb:
> Allgemein:
> In der prozeduralen Programmierung liegt der Fokus eher auf dem
> Kontrollfluss.
> In der OOP liegt der Fokus eher auf den Beziehungen zwischen den
> Objekten.
Eigentlich wollte ich damit recht deutlich zum Ausdruck bringen, dass 
man sein Denken auf OOP umstellen darf, wenn man in der OO Welt klar 
kommen will.
Die Prozedurale Sichtweise, will ich damit keineswegs abwerten.
Sie hat ihren Sinn in einer prozeduralen Welt. Auch beim Bau von 
Methoden durchaus hilfreich, sind sie ja eigentlich auch nur Funktionen 
mit/in ihrem Objekt Kontext.

In der Planungs-/Modellierungsphase ist die prozedurale Denke eher ein 
Hemmschuh.

Meine Erfahrung:
Diejenigen, welche am wenigsten ihre Denke auf die OO Sicht umstellen 
können/wollen schimpfen am lautesten gegen die OOP.

Es ist ein bisschen so, wie mit der Rekursion.
> Wer die Rekursion verstehen will, muss vorher die Rekursion verstanden haben.

Dieser "Umstellung des Denkens" stehen oft Jahre gute/erfolgreiche 
prozedurale Erfahrung entgegen. Es ist ein Trieb, diese mitzuschleppen. 
Total menschlich. Aber hinderlich.

Diesen Weg nicht zu gehen, ist keinesfalls ein Makel.
Aber abwerten, ohne zu kennen, worüber man herzieht, ist schon eine 
Macke.


Einige sagen, auch in C oder ASM, könne man OO programmieren.
Ja!
Zumindest kann man die OO Sicht zur Anwendung bringen.
Aber da diese Sprache eigentlich jede Unterstützung/Sprachmittel dafür 
vermissen lassen, ist das ein recht steiniger Weg, und muss auch nicht 
hübsch aussehen.

von c-hater (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:

> Zumindest kann man die OO Sicht zur Anwendung bringen.
> Aber da diese Sprache eigentlich jede Unterstützung/Sprachmittel dafür
> vermissen lassen, ist das ein recht steiniger Weg, und muss auch nicht
> hübsch aussehen.

Sieht sie sicher nicht aus. Ist im Gegenteil i.d.R. sogar kaum 
erkennbar.

Zum Glück ist es aber bei PC-Software auch nur sehr selten nötig, soweit 
herabzusteigen bei der Optimierung. Ich kenne das eigentlich nur noch im 
Bereich image processing.

Bei kleinen µC hingegen ist es die ultima ratio. Jedenfalls, wenn man 
sie wirklich ausnutzen will. Wer hier mit C oder C++ hantiert, 
verschenkt massiv Potential. So einfach ist das eigentlich...

Nicht schön für Leute, die halt nur dies können, aber die objektive 
Wahrheit...

Ich raste immer nur dann aus, wenn diese Leute das abstreiten...

von Tech Noir (Gast)


Lesenswert?

https://www.geeksforgeeks.org/differences-between-procedural-and-object-oriented-programming/?ref=rp
https://resources.saylor.org/wwwresources/archived/site/wp-content/uploads/2013/02/CS101-2.1.2-AdvantagesDisadvantagesOfOOP-FINAL.pdf
https://www.csetutor.com/advantages-and-disadvantages-of-object-oriented-programming-language/

Eigentlich bin ich der Ansicht "...es hängt davon ab...";-)

Wem halt die Programmierschnauze prozedural gewachsen ist, der wird eben 
lieber so seine Ansätze und Lösungen formulieren und so programmieren 
wollen. Diejenigen, die die Vorzüge von OOP in die Praxis umsetzen 
wollen, tun es halt eben auf ihre Art.

Jeder muss also auf seine Art glücklich werden. Solange der Chef es 
bezahlt ist ja alles in Ordnung;-)

Und ist es wirklich so ein großes persönliches Versagen, zugeben zu 
müssen, dass man aus der Zwangsjacke von Prozedural nicht heraus kann? 
Wer jahrzehntelang damit umging und es so gelernt hat, der wird es in 
der Mehrzahl der Fälle schwer haben ein guter OOP Architekt zu werden 
und soll eben in einer Firma arbeiten oder als Hobby dort bleiben wo man 
sich wohl fühlt. Prozedurales Denken ist für die meisten Menschen in 
Fleisch und Blut drin und lässt sich nicht so leicht entfernen.

Man muss sich doch als Anhänger verschiedener Programmierparadigmen 
nicht andauernd gegenseitig in die Suppe spucken müssen und sich 
gegenseitig als Jünger verschiedener Methoden anerkennen und mit der 
Rechthaberei und Religionsstreit aufhören. Das ist nämlich kindisch. Die 
dokumentierten Vor- und Nachteile von OOP und PP sind ja schon lange der 
Schnee von gestern und man braucht sich nicht mehr darüber auslassen und 
muss man eben je nach den Umständen entsprechend abwägen.

Wenn die Anwendung so läuft wie sie soll ist es doch eigentlich Schnuppe 
wie es unter der Motorhaube programmiert wurde. Nicht alle Anwendungen 
sind so kompliziert, als dass OO Denken unumgänglich notwendig wäre. 
Auch in der prozeduralen Welt lassen sich Probleme genau und effizient 
formulieren. In vielen Anwendungen ist Polymorphialität auch gar nicht 
soooo wichtig. Ist eher angenehm. Wer diszipliniert mit seinen 
Werkzeugen umgeht wird auch in der Nicht-OO Welt gut funktionierende 
Geräte und sauberen Quell Code entwickeln können.

Also: Toleranz, Jungs! Die Welt ist groß genug für beide Faktionen.

von Exilant (Gast)


Lesenswert?

Noch nichts von "Geister in der Maschine" gehört?

von c-hater (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:

> Mach dir mal keine Sorgen, du bist nicht der einzige, der sich mit den
> C++ Templates etwas schwer tut.

Wenn du glaubst, daß im mich Templates schwer tue, hast du definitiv 
nicht verstanden, was ich geschrieben habe...

Und; viel schlimmer: nicht verstanden, was tatsächlich dahinter 
steckt.

von Sheeva P. (sheevaplug)


Lesenswert?

Asm'ler schrieb:
> In Assembler ist das herrlich simpel

Wurde Dein Hausverbot denn schon aufgehoben, Moby?

von Sheeva P. (sheevaplug)


Lesenswert?

Roland F. schrieb:
> Sheeva P. schrieb:
>> Durch die Verwendung dieses Template habe ich jetzt max()-Funktionen,
>> die ich auf alle möglichen Typen anwenden kann
>
> Das heißt also, das der Compiler den obigen Quell-Text durch die jeweils
> zuständige Methode der entsprechenden Klasse ersetzt?

Nicht ganz. Tatsächlich schaut der Compiler, auf welche Datentypen ich 
die max()-Funktion anwende, und erzeugt für jeden dieser Typen die 
passende Funktion.

von Einer K. (Gast)


Lesenswert?

c-hater schrieb:
> nicht verstanden, was tatsächlich dahinter
> steckt.

Ja, das ist die Frage, wer was nicht versteht...
(oder auch nicht)

c-hater schrieb:
> Im Kern sind es eigentlich extrem aufgeblasene und sehr komplexe Makros.
> Sie heißen nur sehr verschämt nicht mehr so...

Unverschämter Weise ist diese Template Maschine Turing-Vollständig.
Ist das dein Makro Apparat auch?
Wenn nein, dann ist das schon eine erheblicher qualitativer Unterschied.

von Sheeva P. (sheevaplug)


Lesenswert?

Arduino Fanboy D. schrieb:
> Sheeva P. schrieb:
>> Den Kontrollfluß verlieren?
>
> Ich weiß nicht genau, was "verlieren" hier bedeutet....
>
> Aber es ist schon so, dass sich gestandene prozedurale Programmierer im
> OOP Kontrollfluss verlieren können.
> Oder anders: Ihnen der Kontrollfluss eines OO Programms sich nicht
> sofort offenbart.

Da sind wir aber wieder bei "sein Werkzeug beherrschen" und drehen uns 
im Kreis. Meine Güte, wenn die Prozeduralen die OOP nicht lernen wollen 
oder können, dann sollen sie es halt lassen, ist doch ihre Sache. Es ist 
halt nur ein bisschen dämlitsch, wenn sie die OOP nur aufgrund ihrer 
eigenen Unwilligkeit oder Unfähigkeit in Bausch und Bogen verdammen. 
"\(".)/"

von Sheeva P. (sheevaplug)


Lesenswert?

Tech Noir schrieb:
> Wem halt die Programmierschnauze prozedural gewachsen ist, der wird eben
> lieber so seine Ansätze und Lösungen formulieren und so programmieren
> wollen. Diejenigen, die die Vorzüge von OOP in die Praxis umsetzen
> wollen, tun es halt eben auf ihre Art.

Verzeihung, aber das ist Unfug. OO-Entwickler beherrschen natürlich auch 
die prozedurale Entwicklung und können daher jederzeit die der 
Problemstellung angemessene, ideale Herangehensweise wählen. Nur ein 
paar wenige, besonders engstirnige und / oder verbohrte 
Prozeduralentwickler wehren sich gegen die Objektorientierung und sind 
in ihren Möglichkeiten beschränkt.

von M.C. (Gast)


Lesenswert?

Tech Noir schrieb:
> Prozedurales Denken ist für die meisten Menschen in
> Fleisch und Blut drin und lässt sich nicht so leicht entfernen.

So ist das. Warum sollte man auch. Das ist gleichbedeutend mit einem 
schweren Mangel des OOP Werkzeugs gegenüber einfacheren 
Herangehensweisen. Das ausufernde OOP 
Verwaltungs/Organisations/Sprachinstrumentarium schafft neben der 
eigentlichen programmlogischen zudem eine zusätzliche künstliche 
Fehlerebene.

von M.C. (Gast)


Lesenswert?

Sheeva P. schrieb:
> Nur ein
> paar wenige, besonders engstirnige und / oder verbohrte
> Prozeduralentwickler wehren sich gegen die Objektorientierung und sind
> in ihren Möglichkeiten beschränkt.

Ich würde mal behaupten das ist engstirnig!

> die der
> Problemstellung angemessene, ideale Herangehensweise wählen

OOP kommt als ideale Herangehensweise höchstens für das eine Prozent 
der Entwickler infrage die diese auch 100%ig beherrschen. Sonst ist da 
nämlich nur mit mittelmäßigem ressourcenfressenden Code zu rechnen.

von Johannes S. (Gast)


Lesenswert?

M.C. schrieb:
> OOP kommt als ideale Herangehensweise höchstens für das eine Prozent der
> Entwickler infrage die diese auch 100%ig beherrschen. Sonst ist da
> nämlich nur mit mittelmäßigem ressourcenfressenden Code zu rechnen.

OMG. Glaubst du dein Gesülze wenigstens selbst?
Keine Arbeit mehr und sauer weil man keine veralteten C Programmierer 
mehr braucht? Oder wieder nur der übliche Moby Müll?

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Warum sollte man auch.
Wenn du nicht weißt, warum du das solltest, oder nicht solltest, dann 
ist das dein Problem.
Ganz persönlich, deine Entscheidung.

Aber diese deine Entscheidung/Meinung, zu verallgemeinern und auf andere 
zu projizieren, ist einfach nur Blödsinn.

Was hast du davon, die OOP so madig zu machen?
Was ist dein Motiv?

von M.C. (Gast)


Lesenswert?

Johannes S. schrieb:
> OMG. Glaubst du dein Gesülze wenigstens selbst?

Genau. Antworten diesen Kalibers ersetzen dann fehlende Argumente. Der 
Anwender bekommt genügend Beispiele für lahme und platzfressende OOP 
Software vorgesetzt.

von Einer K. (Gast)


Lesenswert?

Bla bla...
Wirre Behauptungen ohne Substanz.

Du erinnerst mich an das Trump Gesülze.

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Wirre Behauptungen ohne Substanz.

Natürlich. Aber was man nicht wahrhaben will...
Diese Art der Realitätsverweigerung hat was von Sekte.

 > Du erinnerst mich an das Trump Gesülze.

Ja und Du mich an den Herrn zuvor.
Gleiches Kaliber :(

von Roland F. (rhf)


Lesenswert?

Hallo,
Sheeva P. schrieb:
> Nicht ganz. Tatsächlich schaut der Compiler, auf welche Datentypen ich
> die max()-Funktion anwende, und erzeugt für jeden dieser Typen die
> passende Funktion.

Aber wie macht der Compiler das? Für Datentypen wie Integer, Char, und 
Float kann ich das noch nachvollziehen, aber was ist z.B mit einem 
Datentyp "Verkehrsflugzeug"? Woher weiß der Compiler welches 
Verkehrsflugzeug "maximaler" ist?
Ich stelle mir vor, das es in der Klasse "Verkehrsflugzeug", eine 
Methode existiert, die z.B. bestimmte Eigenschaften des verschiedener 
Verkehrsflugzeug-Objekte mit einander vergleicht und sich der Compiler 
dann beim Aufruf der max()-Funktion mit dem Datentyp "Verkehrsflugzeug" 
dann dieser Methode bedient.

rhf

von Roland F. (rhf)


Lesenswert?

Hallo,
Sheeva P. schrieb:
> Es ist halt nur ein bisschen dämlitsch, wenn sie die OOP nur
> aufgrund ihrer eigenen Unwilligkeit oder Unfähigkeit in Bausch
> und Bogen verdammen.

Naja, zumindest die mir bekannten (deutschen) Lehrmaterialien fördern 
auch nicht gerade die Lust und Bereitschaft sich mit einem vollkommen 
neuartigen Programmierparadigma auseinanderzusetzen.

rhf

von Johannes S. (Gast)


Lesenswert?

Roland F. schrieb:
> Ich stelle mir vor, das es in der Klasse "Verkehrsflugzeug", eine
> Methode existiert, die z.B. bestimmte Eigenschaften des verschiedener
> Verkehrsflugzeug-Objekte mit einander vergleicht und sich der Compiler
> dann beim Aufruf der max()-Funktion mit dem Datentyp "Verkehrsflugzeug"
> dann dieser Methode bedient.

Richtig, man kann in C++ Operatoren wie < oder > definieren und damit 
beliebige Objekte vergleichbar machen. Und dann funktioniert auch das 
max template.

von Sheeva P. (sheevaplug)


Lesenswert?

Tech Noir schrieb:
> Prozedurales Denken ist für die meisten Menschen in
> Fleisch und Blut drin und lässt sich nicht so leicht entfernen.

Das ist mir jetzt etwas zu kurz gedacht. Bei den meisten Menschen ist 
nämlich zuerst einmal das objektorientierte Denken drin, mithin: ein 
Objekt (sic!) mit den Methoden (sic!) zu benutzen, die es bietet. 
Prozedurale Denke muß man sich erstmal angewöhnen, und manchen fällt die 
Rückbesinnung dann leider schwer.

M.C. schrieb:
> Das ist gleichbedeutend mit einem schweren Mangel des OOP Werkzeugs
> gegenüber einfacheren Herangehensweisen. Das ausufernde OOP
> Verwaltungs/Organisations/Sprachinstrumentarium schafft neben der
> eigentlichen programmlogischen zudem eine zusätzliche künstliche
> Fehlerebene.

Ah, Moby again.

von Sheeva P. (sheevaplug)


Lesenswert?

Roland F. schrieb:
> Sheeva P. schrieb:
>> Nicht ganz. Tatsächlich schaut der Compiler, auf welche Datentypen ich
>> die max()-Funktion anwende, und erzeugt für jeden dieser Typen die
>> passende Funktion.
>
> Aber wie macht der Compiler das? Für Datentypen wie Integer, Char, und
> Float kann ich das noch nachvollziehen, aber was ist z.B mit einem
> Datentyp "Verkehrsflugzeug"? Woher weiß der Compiler welches
> Verkehrsflugzeug "maximaler" ist?
> Ich stelle mir vor, das es in der Klasse "Verkehrsflugzeug", eine
> Methode existiert, die z.B. bestimmte Eigenschaften des verschiedener
> Verkehrsflugzeug-Objekte mit einander vergleicht und sich der Compiler
> dann beim Aufruf der max()-Funktion mit dem Datentyp "Verkehrsflugzeug"
> dann dieser Methode bedient.

Mir erschließt sich gerade nicht, wie ein allgemeingültiger 
Größenvergleich für Verkehrsflugzeuge aussehen sollte, aber wenn man 
einen implementieren würde (als Methode mit dem speziellen Namen 
"operator<", Stichwort: Operatorenüberladung), würde das natürlich so 
gehen. Ich persönlich würde allerdings vermuten, daß es sich bei so 
einer Implementierung aus den vorgenannten Gründen um einen Designfehler 
handelt -- nur weil etwas möglich ist, muß man es ja noch lange nicht 
machen, das kennt wohl jeder erfahrene Entwickler.

von Johannes S. (Gast)


Lesenswert?

Flugzeuggröße könnte man Anhand von Eigenschaften wie Spannweite oder 
Passagierzahl festmachen. Aber sowas muss intuitiv sein, überladene 
Operatoren soll man nicht einfach einsetzen nur weil man es kann.
Trotzdem macht sowas Sinn weil zb generische Listen dann Objekte nach 
Größe sortieren können.

von Einer K. (Gast)


Lesenswert?

Roland F. schrieb:
> Ich stelle mir vor, das es in der Klasse "Verkehrsflugzeug", eine
> Methode existiert, die z.B. bestimmte Eigenschaften des verschiedener
> Verkehrsflugzeug-Objekte mit einander vergleicht und sich der Compiler
> dann beim Aufruf der max()-Funktion mit dem Datentyp "Verkehrsflugzeug"
> dann dieser Methode bedient.
Der Vergleichsoperator kann innerhalb einer Klasse vorliegen oder als 
"freier" Operator.

Siehe z.B.:
https://en.cppreference.com/w/cpp/language/operators

von Sheeva P. (sheevaplug)


Lesenswert?

Roland F. schrieb:
> Sheeva P. schrieb:
>> Es ist halt nur ein bisschen dämlitsch, wenn sie die OOP nur
>> aufgrund ihrer eigenen Unwilligkeit oder Unfähigkeit in Bausch
>> und Bogen verdammen.
>
> Naja, zumindest die mir bekannten (deutschen) Lehrmaterialien fördern
> auch nicht gerade die Lust und Bereitschaft sich mit einem vollkommen
> neuartigen Programmierparadigma auseinanderzusetzen.

Deutschsprachige Lehrmaterialien kenne ich nicht und kann daher wenig 
dazu sagen; als ich seinerzeit mit OOP in C++ angefangen habe, hatte ich 
ein kleines Bändchen für den GCC (mit dem djgcc von DJ Bernstein auf 
Diskette ;-)) in englischer Sprache, das aber hauptsächlich C und nur 
sehr wenig C++ behandelt hat. Neugierig geworden, hab ich mich durch die 
Bücher von Bjarne Stroustrup gearbeitet, erst durch "The C++ Programming 
Language" und danach durch "The Design and Implementation of C++", beide 
auch auf Englisch, wobei vor allem letzteres wirklich großartig 
hinsichtlich eines tieferen Verständnisses gewesen ist... aber das ist 
schon lange her, und damals gab es ziemlich wenig bis keine 
deutschsprachige Literatur.

Von jüngeren Kollegen habe ich allerdings gehört, daß "C++ für Dummies" 
[1] von Arnold Willemer (RWTH Aachen) recht gut sein soll; seine Website 
findest Du hier: [2]. Auch von Rainer Grimm habe ich im Linux-Magazin im 
Laufe der Zeit einige didaktisch hervorragend aufbereitete Artikel 
gelesen, vielleicht sind auch dessen Bücher ein guter Einstieg, sofern 
Du es nochmal versuchen möchtest. HTH, YMMV!

[1] https://www.amazon.de/exec/obidos/ASIN/3527717471/willemersinfo-21
[2] http://www.willemer.de/informatik/cpp/

von Sheeva P. (sheevaplug)


Lesenswert?

Johannes S. schrieb:
> Flugzeuggröße könnte man Anhand von Eigenschaften wie Spannweite oder
> Passagierzahl festmachen.

Ja, klar, das meinte ich ja: Du bietest ja auch schon zwei Möglichkeiten 
an, und mir würden da noch Höhe, Rumpflänge, umbauter Raum, Gewicht, 
Zuladung, etc. einfallen... nur Moby weiß, wie so ein allgemeingültiger 
Vergleich aussehen muß... oder so. ;-)

> Aber sowas muss intuitiv sein, überladene
> Operatoren soll man nicht einfach einsetzen nur weil man es kann.
> Trotzdem macht sowas Sinn weil zb generische Listen dann Objekte nach
> Größe sortieren können.

Ja, natürlich. Die Möglichkeiten von -- nicht nur, aber auch -- C++ sind 
sehr mächtig, aber wie alle mächtigen Werkzeuge muß man sie mit Bedacht 
einsetzen. Aber selbst wenn man seine Funktionen nur an seine 
Datenobjekte bindet, ist das schon ein eindeutiger Fall von OOP -- 
selbst wenn das zB. in C geschieht... ;-)

von M.C. (Gast)


Lesenswert?

Sheeva P. schrieb:
> Ja, klar, das meinte ich ja: Du bietest ja auch schon zwei Möglichkeiten
> an, und mir würden da noch Höhe, Rumpflänge, umbauter Raum, Gewicht,
> Zuladung, etc. einfallen...

... sicher nicht auf Mikrocontrollern.
Bitte mal das Eingangs-Posting beachten und bei der Sache bleiben.

Beitrag #6232125 wurde vom Autor gelöscht.
Beitrag #6232126 wurde vom Autor gelöscht.
von Sheeva P. (sheevaplug)


Lesenswert?

M.C. schrieb:
> Sheeva P. schrieb:
>> Ja, klar, das meinte ich ja: Du bietest ja auch schon zwei Möglichkeiten
>> an, und mir würden da noch Höhe, Rumpflänge, umbauter Raum, Gewicht,
>> Zuladung, etc. einfallen...
>
> ... sicher nicht auf Mikrocontrollern.

Aber ja doch, warum denn nicht? Man kann das sogar wunderbar 
kombinieren, sogar mit Fuzzy Logic auf einer winzigen 16-Bit-MCU wie dem 
Motorola 68HC12. Wirklich schade, daß Du so wenig Ahnung hast. ;-)

> Bitte mal das Eingangs-Posting beachten und bei der Sache bleiben.

Bitte mal was zur Sache beitragen.

von M.C. (Gast)


Lesenswert?

Sheeva P. schrieb:
> Bitte mal was zur Sache beitragen.

Wirklich schade wenn man vor lauter missionarischer OOP Verblendung 
nicht mehr erkennt was Sache ist :(

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> wenn man vor lauter missionarischer OOP Verblendung

Wer ist hier "Verblendet"?
Mir ist es doch scheißegal, welche Sprache du nutzt.
Du bist hier der Priester, welche die OOP madig machen will.

Warum?
Was ist dein Ziel?
Nenne dein Motiv!

von Zombie (Gast)


Lesenswert?

Johannes S. schrieb:
> [...] Sowas muss intuitiv sein, überladene
> Operatoren soll man nicht einfach einsetzen nur weil man es kann.

Genau so! Bei einem Flugzeug würde ich das definitiv nicht machen.

Ich würde stattdessen sowas schreiben
1
struct Flugzeug {
2
   double spannweite;
3
   double gewicht;
4
5
   struct SpannweiteComperator {
6
      bool operator()(const Flugzeug &a, const Flugzeug &b) const noexcept {
7
         return a.spannweite < b.spannweite;
8
      }
9
   }
10
11
   struct GewichtComperator {
12
      bool operator()(const Flugzeug &a, const Flugzeug &b) const noexcept {
13
         return a.gewicht < b.gewicht;
14
      }
15
   }
16
}
17
18
template<class T, class COMP = std::less<T>> 
19
const T& max(const T& a, const T& b, const COMP &comp = COMP()) {
20
    return (comp(a, b)) ? b : a;
21
}
22
23
int main() {
24
   Flugzeug a;
25
   Flugzeug b;
26
27
   // ...
28
29
   Flugzeug c = max(a, b, Flugzeug::SpannweiteComperator());
30
}
Ungetestet! Und zugegebenermassen, für diesen Einsatz unnötig 
kompliziert. Aber man kann die Komperatoren auch für sortierte Container 
wie std::set oder std::map nutzen. Dann wird es erst interessant!

von Roland F. (rhf)


Lesenswert?

Hallo,
Sheeva P. schrieb:
> Von jüngeren Kollegen habe ich allerdings gehört..

Vielen Dank, das werde ich mir auf jeden Fall mal ansehen.

rhf

von Roland F. (rhf)


Lesenswert?

Hallo,
Zombie schrieb:
> Genau so! Bei einem Flugzeug würde ich das definitiv nicht machen.

Der von mir ins Spiel gebrachte Flugzeugvergleich war nur als Beispiel 
gedacht, um eine Erklärung zu erhalten wie der Compiler bei der 
Anwendung von Templates entsprechenden Code erzeugt, wenn es um Objekte 
geht, die nicht so offensichtlich vergleichbar sind wie z.B. Zahlen.
Das das gewählte Vergleichsbeispiel ziemlich unsinnig ist, ist (selbst 
mir als OOP-Unkundiger) völlig klar.

rhf

von Einer K. (Gast)


Lesenswert?

Roland F. schrieb:
> um eine Erklärung zu erhalten wie der Compiler bei der
> Anwendung von Templates entsprechenden Code erzeugt,
Ein interessanter Aspekt, die Codegeneratoren.

Das jonglieren mit Datentypen halte ich für noch viel interessanter, als 
die Codegenerierung.

von M.C. (Gast)


Lesenswert?

Zombie schrieb:
> Und zugegebenermassen, für diesen Einsatz unnötig
> kompliziert.

Ein klassisches OOP Merkmal an den meisten Einsatzorten der 
MC-Programmierung!

Arduino Fanboy D. schrieb:
> Warum?
> Was ist dein Ziel?
> Nenne dein Motiv!

Setze Dich doch bitte endlich mal mit den von mir  gebrachten Beispielen 
für Kosten und Auswirkungen dieser komplexen (beschönigend: mächtigen) 
Programmiertechniken auseinander statt ewig hilflos im Nebel 
angenommener böser Motive herumzustochern. Fällt Dir das schwer? Weil 
das vielleicht nicht immer rein technisch erklärt werden kann? Weil wir 
hier von einem Denk Werkzeug und nicht etwa von einem Hammer oder 
einer CNC Maschine sprechen?

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> Setze Dich doch bitte endlich mal mit den von mir  gebrachten Beispielen
Du hast ein konkretes Beispiel genannt?
Wo?

von M.C. (Gast)


Lesenswert?

Arduino Fanboy D. schrieb:
> Du hast ein konkretes Beispiel genannt?
> Wo?

Ich stelle fest: Du bist einfach unfähig oder unwillig. Zu lesen, 
wahrzunehmen, über den technischen Tellerrand hinauszuschauen. 
Entschuldigung. Ein Hardcore-Scheuklappenträger. Denen ist ob ihrer 
Betriebsblindheit schwer zu helfen. Um Dir auf die Sprünge zu helfen, 
ich rede nicht von Code-Beispielen!

Immerhin bemühst Du Dich auf Deinem Spezial-Gebiet zu helfen. Das möchte 
ich ausdrücklich anerkennen. Den meisten dürfte das aber kaum 
überzeugend zum Einstieg verhelfen. Liegt in der Natur der Sache 
(zumindest bei den Mikrocontrollern).

von Einer K. (Gast)


Lesenswert?

Also kein konkretes Beispiel.

Welche Motive verfolgst du?

PS:
Du hast schon bemerkt, dass du am zeigen eines einfachen, nachprüfbaren, 
Beispiels jämmerlich versagt hast......

von Einer K. (Gast)


Lesenswert?

M.C. schrieb:
> ich rede nicht von Code-Beispielen!

Irgendwas nachprüfbares, würde ja schon reichen....
Irgendwas....


Merke:
Behauptungen, ohne Nachweis, sind wertlos bis irreführend.

Dutzende solcher Behauptungen hast du bisher abgelassen.

Welche Motive verfolgst du?

von Carl D. (jcw2)


Lesenswert?

Arduino Fanboy D. schrieb:
>
> Welche Motive verfolgst du?

Na welche schon. Bestimmt nicht über das Thema diskutieren, sondern eher 
den eigenen Horizont zu demonstrieren. Man muß sich da einfach 
durchringen diese "Mit"streiter zu ignorieren. Manchmal ergeben sich 
auch interessante Diskussionen in anderen Threads, wenn diese sich am 
Honigtopf laben.

von M.C. (Gast)


Lesenswert?

Carl D. schrieb:
> Man muß sich da einfach
> durchringen diese "Mit"streiter zu ignorieren.

Was weder Dir noch anderen gelingt.
Fragt Euch doch mal warum :)

Wie die Katzen schleichen gewisse Missionare um den heißen Brei 
bösartiger "Behauptungen"...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.