Hallo zusammen,
ich bin einen C++ Programmierer und vor kurzen habe ich die Aufgabe
bekommen in Embedded Bereich einzusteigen.
In C Bereich habe ich während das Studium mit einem Atmega 8 was gemacht
aber das war vor 10 jahre.
Meine Frage an euch: Lohnt es sich überhaupt in C Welt was zu machen
oder soll ich weiterhin embedded mit C++ programmieren?
Wie ist eure Erfahrung mit C++ in Embeddedwelt?
danke
ManuelGast schrieb:> Wie ist eure Erfahrung mit C++ in Embeddedwelt?
Definieren "Embeddedwelt"?
Meinst du damit einen Attiny mit 4k Flash oder einen Rechenboliden mit
Linux?
> Definieren "Embeddedwelt"?
Und definiere "lohnen"! :-)
Es ist intellektuell eine Verbesserung wenn man auch Embedded in C++
programmiert, besonders wenn man es schon kann und dann einfacher lernt
was man nicht machen sollte.
Aber 95% aller Programme im Bereich Embedded duerften in C geschrieben
sein, 50% der Programmierer duerften nur C koennen und weitere 40%
duerften behaupten C++ zu koennen, programmieren darin aber nur C. Von
daher scheint es eher lohnenswert nur C zu programmieren weil die du
damit Kollegen und Projektkompatibel wirst.
Olaf
ManuelGast schrieb:> Meine Frage an euch: Lohnt es sich überhaupt in C Welt was zu machen> oder soll ich weiterhin embedded mit C++ programmieren?
Kommt auf die Plattform an ... C++ verwendet viel dynamische allozierten
Speicher und das funktioniert auf Plattformen ohne richtiger
Speicherverwaltung nicht.
Außerdem ist zB die STL Library zu groß, als dass man sie sinnvoll auf
zB einem ATMEGA8 verwenden könnte.
Ich würde sage, sobald man ein richtiges Betriebssystem (wie zB Linux)
hat, kann man sich in vollem Umfang in C++ austoben.
ManuelGast schrieb:> Lothar M. schrieb:>> Definieren "Embeddedwelt"?>> genau gesagt der STM32
Ich vermute daher kein Linux?
Wie geschrieben, kannst du machen, du musst aber auf alles verzichten,
was dynamisch allozierten Speicher verwendet.
ManuelGast schrieb:> Wie ist eure Erfahrung mit C++ in Embeddedwelt?
Bin, als Arduino Fan, eng mit C++ verbandelt.
Persönlich, eigentlich eher mit der OOP. Egal, welche Sprache.
Nutze die Vorteile von C++ möglichst weitgehend.
Trotzdem sehen die Programme am Ende oft sehr C artig aus.
Viele Features von C++ (z.B. die STL) huddeln viel mit Speicher rum.
Auch new vermeide ich weitestgehend.
Also "C++ in Embeddedwelt" ein klares JA, von mir!
Die kostenlosen Features mitnehmen.
Vorsicht mit der dynamischen Speicherverwaltung!
(aber das gilt für c genau so)
ManuelGast schrieb:> Meine Frage an euch: Lohnt es sich überhaupt in C Welt was zu machen> oder soll ich weiterhin embedded mit C++ programmieren?
Ja,
allein schon wegen Namespaces und typensichere Enums. Deswegen benutze
ich auch für kleine µC den C++-Compiler.
Aber ansonsten sehen meine C++-Programme meistens aus wie normales C.
C++ bietet einiges was bereits zur Kompilezeit aufgelöst wird und somit
keinen negativen Effekt auf die Programmlaufzeit hat.
Lothar M. schrieb:> Du meinst die Subklasse von C++, die für den Arduino implementiert ist?
Nein!
Es gibt keine "Subklasse von C++, die für den Arduino implementiert
ist".
Arduino nutzt z.Zt. C++11.
Und das ist doch recht aktuell, und recht vollständig implementiert.
Aus meiner Sicht ist das fehlen der STL kein Manko der Sprache an sich.
Sondern findet seine Ursache in den begrenzten Ressourcen der µC,
gegenüber eines PC.
Ich meine eher:
Templates
using statt typedef
gleichnamige Funktionen/Methoden, mit unterschiedlicher
Parametersignatur
Das überladen von Operatoren
der weitgehende Verzicht auf defines/Macros
Da lassen sich sicherlich noch mehr Punkte aufführen, welche nette
Features sind, und dabei keinen Speicher fressen.
Und ja, ich stopfe alles in Klassen, soweit mir möglich.
Mampf F. schrieb:> ManuelGast schrieb:>> Lothar M. schrieb:>>> Definieren "Embeddedwelt"?>>>> genau gesagt der STM32>> Ich vermute daher kein Linux?>> Wie geschrieben, kannst du machen, du musst aber auf alles verzichten,> was dynamisch allozierten Speicher verwendet.
Würde ich so nicht sagen. Ich hab hier einen STM32F4 mit 192 kB RAM. Das
ist durchaus genug, um auch mit dynamischem Speicher sinnvoll arbeiten
zu können. Aber man kann auch schon viele C++-Features verwenden, ohne
dazu dynamischen Speicher zu benötigen.
Ich finde C++ dort durchaus sinnvoll, allerdings ist es auch richtig,
dass in der Praxis kaum jemand µCs in C++ programmiert.
Lothar M. schrieb:> Arduino F. schrieb:>> Nutze die Vorteile von C++ möglichst weitgehend.> Du meinst die Subklasse von C++, die für den Arduino implementiert ist?
Vermutlich das, was der g++ für den AVR zur Verfügung stellt, denn den
nutzt Arduino.
> Oder gibt es da auch Exceptions und Typinformationen zur Laufzeit?
Eher nicht. Als ich mir das das letzte mal angeschaut habe, ging das
nicht, weil die libsupc++ nicht für den AVR geeignet war.
Aber man muss ja auch nicht zwingend alle Features von C++ verwenden,
um einen Nutzen gegenüber C zu haben.
Lothar M. schrieb:> Definieren "Embeddedwelt"?> Meinst du damit einen Attiny mit 4k Flash oder einen Rechenboliden mit> Linux?
Spielt das denn eine Rolle?
Mampf F. schrieb:> Kommt auf die Plattform an ... C++ verwendet viel dynamische allozierten> Speicher
Nein. Es ist nicht C++, das dynamische Speicherallokation benutzt,
sondern der jeweilige Programmierer benutzt sie -- oder eben nicht.
> Ich würde sage, sobald man ein richtiges Betriebssystem (wie zB Linux)> hat, kann man sich in vollem Umfang in C++ austoben.
Das ist zwar durchaus richtig, aber man kann viele Vorzüge von C++ auch
ohne Betriebssystem nutzen -- auch auf kleinen Controllern.
Sheeva P. schrieb:> Das ist zwar durchaus richtig, aber man kann viele Vorzüge von C++ auch> ohne Betriebssystem nutzen -- auch auf kleinen Controllern.
So sehe ich das auch!
Man muss ja nicht, nur weil man einen Ferrari unter dem Arsch hat, mit
360km/h durch jedes Wohngebiet preschen.
(Tipp: Nicht alles was hinkt, ist ein Vergleich.)
ManuelGast schrieb:> Wie ist eure Erfahrung mit C++ in Embeddedwelt?
Ich nutze C++ laufend für z.B. Cortex M / ARM Controller. Man muss
wissen, was welches C++ feature kostest und es gibt ein paar Ecken und
Kanten mit der Toolchain. Aber nichts was einem daran hindert, C++
sinnvoll einzusetzen.
Tipp: https://www.gitbook.com/book/arobenko/bare_metal_cpp/details
Ich benutze auch lieber C++ / OOP, gerade die Hardwarekomponenten lassen
sich sehr schön als Objekte darstellen. Teure Sachen wie RTTI und
exceptions lässt man einfach weg, das kann man per Compilerschalter
abklemmen.
Auch 'new' oder 'malloc' würde ich nicht per se verteufeln, man muss nur
aufpassen das man nicht mit hoher Frequenz unterschiedlich grosse
Speicherblöcke holt/freigibt. Wenn man in der Initialisierung benötigten
Speicher holt und leben lässt ist das überhaupt kein Problem. Dann
lassen sich statisch angelegte Arrays mit irgendwelchen Limits
vermeiden.
Auf Mikrocontrollern sind wesentliche Teile von C++ nicht
empfehlenswert, wegen der Speicherverwaltung und Performance.
Templates mag ich persönlich nicht (verwirren mich) und
Operatorüberladung nutze ich nur sehr spärlich weil ich sprechende
Methoden-namen bevorzuge.
Deswegen bleibt für mich von C++ nicht mehr viel brauchbares übrig.
Eigentlich nur die Objekte und die meisten davon sind wiederum
Singletons. Wobei man auch in C objektorientiert programmieren kann.
Manchmal nutze ich C++ auf Mikrocontrollern und es klappt auch gut. Aber
C ist auch gut. Libraries für Schnittstellen bevorzuge in C, weil man
diese Problemlos in beiden Sprachen einsetzen kann.
Die Standard C++ Library ist für mich auf µC jedenfalls Tabu. Für AVR
steht sie ohnehin nicht zur Verfügung, soweit ich weiß.
Wenn man in einem Team steckt, wird man sich an die Firmen/Team
Ausrichtung halten müssen.
Als Hobbybastler ist man da freier.
Ich schätze mal, dass die Programme, welche man in seiner
Lieblingssprache schreibt, im allgemeinen besser gelingen.
Sei es C, oder C++, oder noch ganz was anderes.
Das ultimative KO Kriterium ist immer wieder:
Erfüllt die Anwendung die gestellten Anforderungen?
Arduino F. schrieb:> Wenn man in einem Team steckt, wird man sich an die Firmen/Team> Ausrichtung halten müssen.>> Als Hobbybastler ist man da freier.> Ich schätze mal, dass die Programme, welche man in seiner> Lieblingssprache schreibt, im allgemeinen besser gelingen.> Sei es C, oder C++, oder noch ganz was anderes.>> Das ultimative KO Kriterium ist immer wieder:> Erfüllt die Anwendung die gestellten Anforderungen?
Das sehe ich ganz ähnlich, daher hab ich eigentlich immer C im Einsatz.
Ich sehe für mich am Bastler-Tisch keine Notwendigkeit/Vorteil, C++
einzusetzen. Und in der Firma ist es ähnlich.
Egal für welche Programmiersprache (ASM, C, C++, Bascom) man sich
entscheidet, man muss sich einen roten Faden definieren und dann kommt
man eigentlich mit Sprache auch zurecht.
[1] In C ist es "einfach", Programme zu schreiben, die compiliert werden
können, aber sich zur Laufzeit falsch verhalten.
[2] In C++ "kann" man so programmieren, dass Programme, die die
einfachen Fehler aus [1] enthalten, nicht compiliert werden können.
Ich bevorzuge [2]: Compile-Zeit Fehler sind mit lieber als
Laufzeit-Fehler ...
(... und ohne Overhead zu erzeugen ...)
C++ fängt vielleicht ein paar Anfängerfehler mehr ab als C aber im
Endeffekt sehe ich da keinen großen Gewinn. Besonders wenn man nur
statische und automatische Objekte hat.
Die "STL" ist eine von SGI in den 90ern entwickelte Bibliothek für C++.
Diese wird kaum noch verwendet. Ihr meint wahrscheinlich die "C++
Standard Library", welche von der STL beeinflusst, aber nicht identisch
und viel größer ist. Nur ein kleiner Teil dieser Bibliothek besteht aus
Containern, und auch denen könnte man per Allokator die dynamische
Speicherverwaltung abgewöhnen. Den Großteil kann man ganz problemlos
auch auf Mikrocontrollern verwenden. Was spricht z.B. gegen die Nutzung
von "uint32_t"? Oder von "std::numeric_limits"? Oder "std::max"?
Letzteres ist z.B. etwas, das in C so nicht möglich wäre. templates
ermöglichen ganz neue Arten der Programmstruktur, sind aber etwas schwer
lesbar.
Ich durfte leider feststellen, dass wenn man Leuten gratis ein Embedded
Programm anbietet, die dann nur daran herum kritteln dass es C++ ist.
C++ scheint die Emotionen derart hoch kochen zu lassen, dass die Sicht
auf die Funktionalität versperrt wird. Das ist ein Nachteil...
Beruflich programmiere, bzw skripte, ich hauptsächlich objektorientiert.
Daher nutze ich diesen Ansatz auch gerne bei privaten Projekten.
Objektverschachtelung und Namensräume, wie auch das sinnvolle überladen
von
Operatoren macht meiner Ansicht nach, das Programm lesbarer. Auch direkt
mit Objekten, ohne Zeigerschlacht arbeiten zu können ist von Vorteil.
Auch wenn es nur für mich ist, möchte ich den Code später noch ohne
große Einarbeitungszeit lesen können. In C muss ich mich hier öfters
verrenken.
Ich modifiziere aber auch öfters existierenden Code (privat habe ich
nicht so viel Zeit, das Programm immer selber komplett neu zu
schreiben). Dann verwende ich die Ursprungssprache, was nicht zwingend
immer C sein muss. Wenn ein Arduino-Programm meine Bedürfnisse deckt,
nehme ich auch das als Grundlage.
Folgende Punkte sind m.E. zu berücksichtigen, und zwar ganz unabhängig
von der Sprache:
1) Sattelfestheit in der Sprache
Man sollte in der Sprache möglichst sattelfest sein. Wissen über die
Sprache stützt sich auf Wissen über die Sprache und deren Spezifikation
und nicht auf Reverse-Engineering (Debugging, Simulation, Trial &
Error).
Das "Man" schließt hier alle Entwickler ein, also auch diejenigen, die
Reviewing und Testing durchführen (insbesondere bei White-Box Testing)
und schließlich mit der Wartung der Software betraut werden.
2) Verfügbarkeit und Support der Sprache.
Wie sieht die Entwicklungsumgebung aus: Gibt es professionellen
Support, etwa wenn ein Bug im Compiler oder den Standard-Bibliotheken
gibt? Wie sieht es aus mit Debugger, Simulator, Tools zur statischen
Analyse?
3) Umfeld
Wer wir den Code pflegen und wer führt Reviews durch? Nur dass eine
Sprache mehr Features zur Verfügung stellt, bedeutet noch nicht, dass
man diese adäquat nutzen kann und daraus wartbarer Code entsteht.
Selbst wenn ein Sprachvirtuose die Software komponiert, besteht die
Gefahr, dass die Software als "unwartbar" eingestuft wird, in der Tonne
landet und neu aufgezogen wird, sobald der Virtuose nicht mehr verfügbar
ist. (Manchmal wird das dann so gelesen, Virtuosität sei ein Vehikel, um
sich "unersetzlich" zu machen).
Kernighan: Debugging is twice as hard as writing the code in the first
place. Therefore, if you write the code as cleverly as possible, you
are, by definition, not smart enough to debug it.
4) Wartbarkeit
Verfügbarkeit einer Vielzahl von Paradigmen / Features muss nicht
unbedingt ein Vorteil sein. Die Wartbarkeit hängt nicht nur von der
Sprache ab, sondern vor allem auch vom Design: In einer "alten" Sprache
kann man sehr wohl ein guten Design haben, und eine "neue" Sprache
schützt nicht vor schlechtem Desig.
5) Embedded
Man braucht eine recht konkrete Vorstellung davon, welcher Code
generiert wird — je eingeschränkter die Systemresourcen (Laufzeit,
Speicherverbrauch) in einer konkreten Situation / Modul sind, desto
genauer muss man wissen was man tut, und desto genauer muss man dies
kontrollieren können.
batman schrieb:> Besonders wenn man nur> statische und automatische Objekte hat.
Warum sollte es weniger Sinn machen statische Objekte zu haben? Wenn ein
Gerät z.B. eine Antriebsachse mit Encodern und Endschaltern hat kann ich
das als Objekt abbilden und genau das macht Sinn. Da die Achse immer
vorhanden ist kann das Objekt auch statisch oder auf dem main Stack
gelegt werden, da muss nix dynamisch gemacht werden. Wenn ich zwei
Achsen brauche lege ich zwei Instanzen an, auch statisch, fertig.
Und auch der C++ Compiler baut da nicht eingenmächtig irgendwelche
dynamischen Sachen ein, das in C++ die Speicherveraltung ungeeigneter
sein soll ist eine komische Aussage (von anderen hier). Ich kann immer
noch selber entscheiden wo ein Objekt liegen soll.
Wilhelm M. schrieb:> [1] In C ist es "einfach", Programme zu schreiben, die compiliert werden> können, aber sich zur Laufzeit falsch verhalten.
Öhm, das schafft man mit C++ aber auch wenn man will.
Wilhelm M. schrieb:> [2] In C++ "kann" man so programmieren, dass Programme, die die> einfachen Fehler aus [1] enthalten, nicht compiliert werden können.
-Wall -Werror kann ich da empfehlen.
ManuelGast schrieb:> Lohnt es sich überhaupt in C Welt was zu machen> oder soll ich weiterhin embedded mit C++ programmieren?
Ich würd mal sagen, probiers aus.
Wenn Du mit C++ klarkommst, warum nicht. Ich guck da eher rein, wie ein
Schwein ins Uhrwerk.
Was willst Du denn auf dem µC programmieren. Richtige Harwaresteuerungen
oder auch nur PC-Zeugs (GUI, Netzwerk, Datenträger).
Sheeva P. schrieb:> Mampf F. schrieb:>> Kommt auf die Plattform an ... C++ verwendet viel dynamische allozierten>> Speicher>> Nein. Es ist nicht C++, das dynamische Speicherallokation benutzt,> sondern der jeweilige Programmierer benutzt sie -- oder eben nicht.
Man sieht doch oft überhaupt nicht, ob ein Template aus der zb STL
dynamischen Speicher verwendet, ob er vlt nur einmal alloziert wird oder
ob da wild mit new und deletes jongliert wird.
New und delete komplett zu vermeiden ist erstaunlich schwer ... ich
hatte längere Zeit nach einem zB demarshaller für JSON in C++ gesucht,
der mit einem statischen Block RAM.auskommt.
Oder auch so simple Sachen wie ein outstream ist dynamisch ... Gibt aber
Alternativen (die deprecated sond), die auch mit statischem RAM klar
kommen.
Ich wollte damit sagen, das ist oft nicht ersichtlich, ob dynamischer
Speicher verwendet wird.
Mampf (unterwegs) schrieb:> Ich wollte damit sagen, das ist oft nicht ersichtlich, ob dynamischer> Speicher verwendet wird.
Und das ist in C anders? Bei printf() würde man es auch nicht erwarten,
aber z.B. das printf() der newlib C library benötigt malloc(). Da hilft
bei beiden Sprachen nur, in die Doku zu schauen.
> Nur ein kleiner Teil dieser Bibliothek besteht aus> Containern, und auch denen könnte man per Allokator die> dynamische Speicherverwaltung abgewöhnen.
Ja klar, ich meine primär die Container Klassen und Strings.
> Nur dass eine Sprache mehr Features zur Verfügung stellt, bedeutet> noch nicht, dass man diese adäquat nutzen kann und daraus wartbarer> Code entsteht.
Darüber haben wir gerade im Büro diskutiert. Es kommt darauf an, dass
alle Beteiligten mit dem Code und den Tools zurecht kommen. Das bedeutet
in der Praxis oft, dass man nicht alle Features verwendet.
Peter D. schrieb:> Was willst Du denn auf dem µC programmieren. Richtige Harwaresteuerungen> oder auch nur PC-Zeugs (GUI, Netzwerk, Datenträger).
Es geht eigentlich um beide.
Hardwaresteuerung und dann anhand eine GUI(c++ mit Qt oder LabVIEW)
bestimmten Messdaten darstellen bzw Befehle ausführen und ....
> Es geht eigentlich um beide.
Meine Erfahrung dazu ist: schlechte Idee
Damit die GUI nicht die Steuerung stört, muss man einiges an
Zusatzaufwand rein stecken. Es ist viel einfacher, diese beiden Teile zu
trennen.
Zum Beispiel könntest du die Hardware mit einem Arduino nano Modul (oder
einem größeren 32bit Controller) realisieren. Daneben baust du einen
ESP8266 oder irgend ein anderes Board mit Ethernet, welches eine
Web-Browser basierte GUI bereit stellt. Die beiden unterhalten sich dann
über irgendein serielles Protokoll.
Stefan U. schrieb:> Darüber haben wir gerade im Büro diskutiert. Es kommt darauf an, dass> alle Beteiligten mit dem Code und den Tools zurecht kommen. Das bedeutet> in der Praxis oft, dass man nicht alle Features verwendet.
Das klingt für mich nach er Anleitung zur Abwärtspirale. Damit
orientiert ihr euch doch immer am "schwächsten" Kollegen (im
Zweifelsfall, an dem Kollegen, der frisch von der Uni gekommen ist).
Jeder muss ständig überlegen, ob sein Kollege dieses Feature nun kennt
und versteht, statt seine Aufgaben in maximaler Effektivität zu
erledigen.
Etwas neues lernt man so auch nicht (zumindest nicht von Kollegen). Und
wahrscheinlich gehen die besten Kollegen irgendwann, weil sie keine Lust
mehr haben, ausgebremst mit dem rechten Arm auf den Rücken gebunden zu
arbeiten.
Stefan U. schrieb:> Darüber haben wir gerade im Büro diskutiert. Es kommt darauf an, dass> alle Beteiligten mit dem Code und den Tools zurecht kommen. Das bedeutet> in der Praxis oft, dass man nicht alle Features verwendet.
Man muß ja auch nicht alle Features verwenden. Selbst wenn man nur ein
einziges nützliches Feature einsetzt, spricht das schon für C++.
Torsten R. schrieb:> Stefan U. schrieb:>>> Darüber haben wir gerade im Büro diskutiert. Es kommt darauf an, dass>> alle Beteiligten mit dem Code und den Tools zurecht kommen. Das bedeutet>> in der Praxis oft, dass man nicht alle Features verwendet.>> Das klingt für mich nach er Anleitung zur Abwärtspirale. Damit> orientiert ihr euch doch immer am "schwächsten" Kollegen (im> Zweifelsfall, an dem Kollegen, der frisch von der Uni gekommen ist).> Jeder muss ständig überlegen, ob sein Kollege dieses Feature nun kennt> und versteht, statt seine Aufgaben in maximaler Effektivität zu> erledigen.>> Etwas neues lernt man so auch nicht (zumindest nicht von Kollegen). Und> wahrscheinlich gehen die besten Kollegen irgendwann, weil sie keine Lust> mehr haben, ausgebremst mit dem rechten Arm auf den Rücken gebunden zu> arbeiten.
Das sehe ich genauso, und das ist genau auch die Antwort, die ich hier
schon ab und zu mal im Forum gegeben habe.
Man sollte mal über Abhilfe nachdenken:
https://www.fluentcpp.com/2017/04/04/the-dailies-a-new-way-to-learn-at-work/
> Das klingt für mich nach er Anleitung zur Abwärtspirale.
Nein, das heißt ja nicht, dass man nichts mehr dazu lernen will. Es ist
eher ein Entgegenkommen und gemeinsames Aufsteigen.
Torsten R. schrieb:> Das klingt für mich nach er Anleitung zur Abwärtspirale. Damit> orientiert ihr euch doch immer am "schwächsten" Kollegen (im> Zweifelsfall, an dem Kollegen, der frisch von der Uni gekommen ist).
Nach meiner Erfahrung sind die Kollegen, die frisch von der Uni kommen,
ziemlich fit, kennen auch aktuelle Features recht gut und können sich im
Zweifelsfall auch schnell in Unbekanntes hinein fuchsen, weil sie jung,
ans Lernen gewöhnt und offen für Neues sind. Problematischer ist es oft
mit den älteren Kollegen, die schon seit Jahren im Beruf stehen und dies
oder jenes "schon immer so gemacht" haben.
Das spiegelt sich auch in meinen Erfahrungen bei C++-Diskussionen hier
im Forum: es scheinen eher die Älteren zu sein, die sich mit Händen und
Füßen gegen neue Trends wehren, während viele Jüngere dem gegenüber
offener zu sein scheinen. Möglicherweise liegt das daran, daß das Lernen
neuer Sachverhalte mit zunehmendem Alter immer anstrengender wird, oder
sich mit steigender Erfahrung auch eine gewisse Eingefahrenheit
einstellt.
Mampf (unterwegs) schrieb:> Sheeva P. schrieb:>> Nein. Es ist nicht C++, das dynamische Speicherallokation benutzt,>> sondern der jeweilige Programmierer benutzt sie -- oder eben nicht.>> Man sieht doch oft überhaupt nicht, ob ein Template aus der zb STL> dynamischen Speicher verwendet, ob er vlt nur einmal alloziert wird oder> ob da wild mit new und deletes jongliert wird.
In 95% der Fälle ist es offensichtlich, zum Beispiel bei allen
Containern, denen zur Laufzeit neue Elemente hinzugefügt werden können.
Und bei allen anderen Fällen reduziert es sich darauf, ob man sein
Werkzeug beherrscht.
> New und delete komplett zu vermeiden ist erstaunlich schwer ... ich> hatte längere Zeit nach einem zB demarshaller für JSON in C++ gesucht,> der mit einem statischen Block RAM.auskommt.
Das findest Du dabei aber nicht ernsthaft verwunderlich, oder?
Torsten R. schrieb:> Stefan U. schrieb:>>> Darüber haben wir gerade im Büro diskutiert. Es kommt darauf an, dass>> alle Beteiligten mit dem Code und den Tools zurecht kommen. Das bedeutet>> in der Praxis oft, dass man nicht alle Features verwendet.>> Das klingt für mich nach er Anleitung zur Abwärtspirale. Damit> orientiert ihr euch doch immer am "schwächsten" Kollegen (im> Zweifelsfall, an dem Kollegen, der frisch von der Uni gekommen ist).> Jeder muss ständig überlegen, ob sein Kollege dieses Feature nun kennt> und versteht, statt seine Aufgaben in maximaler Effektivität zu> erledigen.
Wenn im Team gearbeitet wird, denn zählt zunächst die Effektivität des
Teams als Ganzem.
Neues zu lernen ist erstmal eine Bremse. Es braucht Zeit und es braucht
Motivation. Wenn jemand bereits flüssig und sicher in einer Sprache
ist, und muss oder soll zur Lösung eines neuen Problems eine neue
Sprache lernen, in der er unsicher ist und nur langsam voramkommt und
womöglich noch Zeitdruck hat, dann ist das höchst unmotiviered.
Und zum Lernen gehört auch zu, sich mit anderen Lernenden austauschen zu
können, keinen Zeit- oder Projektdruck zu daben, ohne Zweckbindung mit
dem Neuen rumspielen zu können und auch Fehler machen zu dürfen.
Gerade letzteres ist bei "Learning by Doing" nicht gegeben, denn das
Doing ist i.d.R. die Umsetzung eines Projekts. Spätestens wenn die
Fehler beim Kunden oder im Feld angekommen sind, kannst man sich
ausmalen, dass da nicht mit Milde auf den (damals) Lernenden
zurückgeblickt wird, sondern Projekt- und Geschäftsleitung höchst
unerfreut sind. Beim nächsten "Experiment" bleibt man dann bei den
bewährten olle Kamellen.
Wie das genau gehandabt wird häng natürlich von der Unternehmenskultur
oder -nichtkultur ab. Ob sich nun die Fitten abgehängt sind oder die
weniger Fitten sei dahingestellt und hängt auch von persönlichen
Befindlichkeiten und vom Management ab.
Sheeva P. schrieb:> Nach meiner Erfahrung sind die Kollegen, die frisch von der Uni kommen,> ziemlich fit, kennen auch aktuelle Features recht gut und können sich im> Zweifelsfall auch schnell in Unbekanntes hinein fuchsen, weil sie jung,> ans Lernen gewöhnt und offen für Neues sind. Problematischer ist es oft> mit den älteren Kollegen, die schon seit Jahren im Beruf stehen und dies> oder jenes "schon immer so gemacht" haben.
Komisch, hab ich immer genau die gegenteiligen Erfahrungen gemacht.
Hängt wohl von der Perspektive ab.
Sheeva P. schrieb:> Möglicherweise liegt das daran, daß das Lernen> neuer Sachverhalte mit zunehmendem Alter immer anstrengender wird, oder> sich mit steigender Erfahrung auch eine gewisse Eingefahrenheit> einstellt.
Fakt ist eins, wenn man die neuen Features von C++ verwendet kann man
nicht auf einmal Programme schreiben die man ohne nicht schreiben
könnte. Mit anderen Worten, die alten Hasen haben für die üblichen
Problemstellungen längst Lösungen in der Schublade. Und nur zum
Selbstzweck macht man das halt nicht eben mal alles neu nur weil es
eventuell einen eleganteren Weg gibt. In einem anderen Thread hat gerade
jemand eine ltoa-Variante in c++ vorgestellt. Angeblich schneller als
die üblichen in den Libs. Kann ja sein. Allerdings ist das nun ein Roman
geworden der wenigstens 3-5mal so lang im Quellcode geworden ist. Sorry,
aber den Aufwand werde ich nicht treiben. Im Gegenteil, solche Beispiele
sind ein klarer Fall dafür, dass die schöne neue Welt so schön auch
nicht ist. Ob man das nun Eingefahrenheit nennt oder sonst wie ist egal.
Wenn man von Grund auf etwas Neues macht kann man über vieles
Nachdenken, allerdings geht es viel häufiger um Weiterentwicklungen. Und
in der Industrie lässt sich schon gleich niemand zu einer kompletten
Neuentwicklung bewegen nur weil es moderner ist.
Sheeva P. schrieb:>> New und delete komplett zu vermeiden ist erstaunlich schwer ... ich>> hatte längere Zeit nach einem zB demarshaller für JSON in C++ gesucht,>> der mit einem statischen Block RAM.auskommt.>> Das findest Du dabei aber nicht ernsthaft verwunderlich, oder?
Da habe ich das hier benuzt:
https://os.mbed.com/teams/Night-Crue/code/JSON/
und etwas modifiziert, das Json wird einmal instanziiert und dann eine
parse(...) Methode aufgerufen. Es gibt ein new im Konstruktor und zwei
im Code, die kann man aber wegoptimieren wenn der json string im Ram
liegt. Läuft wunderbar auf einem kleinem Cortex-M0 mit 16 kB Flash. Hat
natürlich nicht soooviel Komfort aber immerhin.
Der C-Programmierer lässt den C++ Wrapper weg und nimmt das nackte JSMN,
aber ich finde den Wrapper brauchbar.
Johann L. schrieb:> Neues zu lernen ist erstmal eine Bremse.
Das Erlernen von Neuem ist vor allem eine Investition. Als solche muß
sie sich zunächst amortisieren und sollte sich danach rentieren.
Sheeva P. schrieb:> Das spiegelt sich auch in meinen Erfahrungen bei C++-Diskussionen hier> im Forum: es scheinen eher die Älteren zu sein, die sich mit Händen und> Füßen gegen neue Trends wehren, während viele Jüngere dem gegenüber> offener zu sein scheinen. Möglicherweise liegt das daran, daß das Lernen> neuer Sachverhalte mit zunehmendem Alter immer anstrengender wird, oder> sich mit steigender Erfahrung auch eine gewisse Eingefahrenheit> einstellt.
Das greift mir zu kurz. Ein unbeschriebenes Blatt ist natürlich
flexibler und motivierter, weil es meist eben nicht mit C-Profis
mithalten kann. Und nach ein paar Jahren stellt man fest, dass die guten
jungen Programmierer C++ Wüsten in Write-only-Style hinterlassen haben.
So wie die guten alten in C. Den Produktivcode von heute haben halt die
paar sehr guten Programmierer verantwortet, aufgrund derer die Firma
heute noch lebt. Und nur wenn bei den jungen auch ein paar sehr gute
dabei sind, wird sie die nächsten Jahre mit C, C++ oder auf Rollschuhen
ebenfalls überleben.
Als Fakt sehe ich aber auch an: Die Sprache C ist einfacher als C++.
Einfacher im Sinne des Sprachumfangs. Das erlaubt es bei geschickter
Benamung, Kapselung und Toolchain, einfacher zu modellieren, also
einfacher die Sachverhalte in einer formalen Sprache zu beschreiben. Die
Mähr von der parallel existierenden Spezifikation und der Umsetzung
durch ein Programmierfachkraft ist halt nicht überall wahr oder
sinnvoll. Es wäre irrsinnig, ein Modell in UML/StateFlow/Charts oder was
auch immer zu haben und parallel dazu in einer Programmiersprache.
Achim S. schrieb:> Als Fakt sehe ich aber auch an: Die Sprache C ist einfacher als C++.> Einfacher im Sinne des Sprachumfangs.
Wenn das ein Argument wäre, dann wären die meistgenutzten Programmier-
sprachen heute Brainfuck oder Whitespace [1]. Sind sie aber nicht.
> Das erlaubt es bei geschickter Benamung, Kapselung
Oh Ja. Laß uns doch einfach mal bei Kapselung bleiben. Hat C schlicht
und ergreifend nicht. Und schon hat C++ gewonnen. Ja, ok ist nur ein
Punkt. Aber ein wichtiger.
[1]
https://de.wikipedia.org/wiki/Kategorie:Esoterische_Programmiersprache
Axel S. schrieb:> Oh Ja. Laß uns doch einfach mal bei Kapselung bleiben. Hat C schlicht> und ergreifend nicht. Und schon hat C++ gewonnen. Ja, ok ist nur ein> Punkt. Aber ein wichtiger.
Naja, wenn du alles von der Compilertechnik bzw. Sprache abhängig
machst, hast du schon verloren, würde ich sagen. Konstrukte wie
Kapselung sind da nur Krücken, um schlechte Konzepte möglichst
abzublocken. Man kann aber auch gleich mit gutem Konzepten anfangen,
wenn man es gelernt hat.
batman schrieb:> Konstrukte wie Kapselung sind da nur Krücken,> um schlechte Konzepte möglichst abzublocken.
Ja, nee, ist klar ....
Keine Fragen mehr, alles klar ...
batman schrieb:> Axel S. schrieb:>> Oh Ja. Laß uns doch einfach mal bei Kapselung bleiben. Hat C schlicht>> und ergreifend nicht. Und schon hat C++ gewonnen. Ja, ok ist nur ein>> Punkt. Aber ein wichtiger.>> Naja, wenn du alles von der Compilertechnik bzw. Sprache abhängig> machst, hast du schon verloren, würde ich sagen. Konstrukte wie> Kapselung sind da nur Krücken, um schlechte Konzepte möglichst> abzublocken. Man kann aber auch gleich mit gutem Konzepten anfangen,> wenn man es gelernt hat.
Kapselung IST eins der guten Konzepte!
Konzepte finden nämlich im Abstrakten statt und das ist doch, so die
gängige Haßmeinung, DIE Domäne von C++.
(UpToDate)C++ hat vor allem constexpr, was bei kleinen Tiny's den
Vorteil hat, daß ein Teil des Programms vorab auf dem Intel/AMD-Boliden
gerechnet wird, wo GigaByte und GigaHerz in Hülle und Fülle bereit
stehen, dem kleinen AVR unter die Arme zu greifen.
Carl D. schrieb:> Kapselung IST eins der guten Konzepte!> Konzepte finden nämlich im Abstrakten statt und das ist doch, so die> gängige Haßmeinung, DIE Domäne von C++.
Es ist ein Konzept der Entwicklung, aus Compilersicht ist es nur ein
Unterbinden von bestimmten Zugriffen. Da stellt das Feature also gar
keinen Mehrwert für diejenigen dar, die solche Zugriffe gar nicht auf
dem Plan hatten.
temp schrieb:> Fakt ist eins, wenn man die neuen Features von C++ verwendet kann man> nicht auf einmal Programme schreiben die man ohne nicht schreiben> könnte.
Ja. Man kann aber ähnliche Programme eleganter, wartbarer und in vielen
Fällen plattformunabhängig und standardkonform schreiben -- und man muß
auch nicht alles sofort ändern, umstellen, oder gar neu machen.
Zumindest nicht im Falle von C++, das mit dem etablierten
Industriestandard C doch weitgehend kompatibel ist.
> Mit anderen Worten, die alten Hasen haben für die üblichen> Problemstellungen längst Lösungen in der Schublade.
Ja, genau das meine ich mit "eingefahren": das beliebte "dat hamwer
immer so jemacht". Nur: wer immer alles so macht, wie er es immer schon
gemacht hat, macht zwar nichts falsch, entwickelt sich aber auch nicht
weiter.
> Und nur zum> Selbstzweck macht man das halt nicht eben mal alles neu nur weil es> eventuell einen eleganteren Weg gibt.
Niemand redet davon, "eben mal alles neu" zu machen -- das geht doch gar
nicht, schon gar nicht zum Selbstzweck. Was soll denn das?
> In einem anderen Thread hat gerade> jemand eine ltoa-Variante in c++ vorgestellt. Angeblich schneller als> die üblichen in den Libs. Kann ja sein. Allerdings ist das nun ein Roman> geworden der wenigstens 3-5mal so lang im Quellcode geworden ist.
Tja... wenn das wirklich schneller ist, kann es je nach Anwendungsfall
trotzdem sinnvoll sein, es zu nutzen.
Ansonsten ist es eher unklug, Herangehensweisen anhand einzelner
Beispiele zu beurteilen. Statistische Betrachtungen mit einer
Probengröße von 1 sind eher wertlos.
> Und> in der Industrie lässt sich schon gleich niemand zu einer kompletten> Neuentwicklung bewegen nur weil es moderner ist.
Meine Güte... von einer kompletten Neuentwicklung redet doch keiner, das
ist doch Quatsch. Aber es ist durchaus möglich und eigentlich auch fast
immer sinnvoller, schrittweise vorzugehen.
Achim S. schrieb:> Das greift mir zu kurz. Ein unbeschriebenes Blatt ist natürlich> flexibler und motivierter, weil es meist eben nicht mit C-Profis> mithalten kann.
Das ist der Handel zwischen Erfahrung einer- und Kreativität
andererseits. Ich habe einen jungen Mathematik-Master und eine
mathematisch-technische Softwareentwicklerin im Team, und die schreiben
C- und auch C++-Code, der einfach zum Niederknien schön ist.
> Und nach ein paar Jahren stellt man fest, dass die guten> jungen Programmierer C++ Wüsten in Write-only-Style hinterlassen haben.> So wie die guten alten in C. Den Produktivcode von heute haben halt die> paar sehr guten Programmierer verantwortet, aufgrund derer die Firma> heute noch lebt. Und nur wenn bei den jungen auch ein paar sehr gute> dabei sind, wird sie die nächsten Jahre mit C, C++ oder auf Rollschuhen> ebenfalls überleben.
Zu glauben, ein Unternehmen würde wegen seiner Codequalität überleben,
... das würde mir einige Optionen für die nächste Gehaltsverhandlung
eröffnen, erscheint mir aber etwas unrealistisch. Dafür überleben
nämlich leider zu viele Unternehmen mit einer Codequalität, die mit
"unter aller Sau" noch ausgesprochen wohlwollend beschrieben ist.
Darüber hinaus finde ich Deine Argumentation etwas inkonsistent. Du
sagst ja, daß die "guten alten" "sehr guten Programmierer", eine "Wüste"
in C hinterlassen hätten und die jungen das dann eben in C++ tun würden.
Dabei ist mir allerdings nicht ganz klar, warum eine Code-Wüste in C
besser sei als eine in C++. Möglicherweise siehst Du das ja anders als
ich, aber ich persönlich bevorzuge gar keine Code-Wüsten -- in egal
welcher Sprache.
Vielleicht habe ich ja wirklich Glück gehabt und bisher immer nur gute
Jungspunde getroffen, das kann ich natürlich nicht ausschließen. Aber
was denen an Erfahrung fehlt, machen sie mit aktuellem Knowledge,
Querdenken, neuen Ideen und Engagement wett. Wenn Du solche Leute
jemandem zuordnest, der sie mit seiner Erfahrung unterstützen oder sogar
führen kann, ist das keine schlechte Kombination.
> Als Fakt sehe ich aber auch an: Die Sprache C ist einfacher als C++.
Ja, nein, vielleicht. Kommt darauf an. Und die Sprache Python ist
einfacher als C. Spricht das gegen C, gegen C++, oder gegen Python? ;-)
batman schrieb:> Konstrukte wie Kapselung sind da nur Krücken, um schlechte Konzepte> möglichst abzublocken. Man kann aber auch gleich mit gutem Konzepten> anfangen, wenn man es gelernt hat.
Ja klar. Und Sicherheitsgurte sind auch nur Krücken, um bei Unfällen den
Schaden für die Insassen zu reduzieren. Man kann stattdessen aber auch
einfach keine Unfälle bauen.
Axel S. schrieb:> Oh Ja. Laß uns doch einfach mal bei Kapselung bleiben. Hat C schlicht> und ergreifend nicht. Und schon hat C++ gewonnen. Ja, ok ist nur ein> Punkt. Aber ein wichtiger.
Natürlich hat C Kapselung.
Sheeva P. schrieb:>> New und delete komplett zu vermeiden ist erstaunlich schwer ... ich>> hatte längere Zeit nach einem zB demarshaller für JSON in C++ gesucht,>> der mit einem statischen Block RAM.auskommt.>> Das findest Du dabei aber nicht ernsthaft verwunderlich, oder?
Nein, aber nichtsdestotrotz hab ich so einen Demarshaller benötigt.
Sheeva P. schrieb:> Du sagst ja, daß die "guten alten" "sehr guten Programmierer", eine> "Wüste"
Sorry, die Unterscheidung kommt aus dem bei uns bekannten Statement,
dass es nicht nur gute Programmierer gäbe, ... sondern auch sehr gute.
Und die strategisch wichtigen Dinge wurden von den wirklich sehr guten
Leuten kreiert. Das Problem: während diese Produkte täglich
weiterentwickelt werden, damit auch täglich Kosten, Fehler und Aufwand
produzieren, erscheinen die "guten" ziemlich solide. Niemand traut sich,
hier irgendwas zu verbessern.
Wir haben noch Code hier in Assembler, der wartbarer und gekapselten
ist, als viele C/C++ Wüsten. Und nein Assembler ist nicht portabel und
deshalb seit Jahren raus. Und natürlich ist Code der mit virtuellen
Objekten arbeitet, hoch effizient sein soll, GUI, Ethernet, Web in C++
bei uns. Hochkomplexe embedded Steuerung (nicht Regelung, nicht GUI)
dagegen in C, obwohl OS und Treiber C++ sind. Wobei C halt immer Lint
mit einschließt.
>> Als Fakt sehe ich aber auch an: Die Sprache C ist einfacher als C++.>> Einfacher im Sinne des Sprachumfangs.> Wenn das ein Argument wäre, dann wären die meistgenutzten Programmier-> sprachen heute Brainfuck oder Whitespace [1]. Sind sie aber nicht.
Nun, Java erfreut sich einer auffälligen Beliebtheit. Und Java fühlt
sich für mich wie ein vereinfachtes C++ an (ich muss es wissen, denn ich
verdiene damit seit 15 Jahren mein Brot).
> Laß uns doch einfach mal bei Kapselung bleiben. Hat C schlicht> und ergreifend nicht. Und schon hat C++ gewonnen.
Dann hast du noch nicht gesehen, wie man in C Objektorientiert
programmiert. Namespaces würde man dort vermissen, kann man in der
Praxis jedoch durch eine Namenskonvention ersetzen. Und
objektorientierte Programmierung ist dort durchaus möglich.
Kleiner Tipp dazu: Schau Dir man an, was der C++ Compiler bei
Methoden-Aufrufen mit dem SELF Pointer macht. Dann wirst du sofort
sehen, dass man genau das Gleiche auch in C machen kann - ohne
großartige Tricks.
Nur mal um ein konkretes Beispiel zu nennen:
Für eine Datenmigration von einem alten Cobol System sollte ich eine
HashMap für einen sehr alten IBM Server programmieren. Die Verwendung
von Libraries war dort verboten, es stand nur die Programmiersprache und
die Standard C Library zur Verfügung. Ich habe das in 2 Tagen unter
CygWin umgesetzt - nachdem ich mich bei Wikipedia erstmal einlesen
musste, wie das eigentlich funktioniert. Denn bis dahin hatte ich
HashMaps einfach nur benutzt. Ich gab meine generische HashMap ab und
sie hat auf Anhieb sauber auf dem Zielsystem funktioniert. Dabei habe
ich dieses IBM Betriebssystem und dessen uralten C Compiler bis heute
nie gesehen, geschweige denn erfahren, welche Daten in der HashMap
gespeichert werden.
Ja, C++ hat ein paar coole Features, die C nicht hat. Aber das heißt
noch lange nicht, dass man nur in C++ sauber objektorientiert
programmieren kann.
Mampf (unterwegs) schrieb:> Man sieht doch oft überhaupt nicht, ob ein Template aus der zb STL> dynamischen Speicher verwendet, ob er vlt nur einmal alloziert wird oder> ob da wild mit new und deletes jongliert wird.
...
> Ich wollte damit sagen, das ist oft nicht ersichtlich, ob dynamischer> Speicher verwendet wird.
Das siehst du in der Template Deklaration (Allocator =
std::allocator<T>).
Du kannst dir auch deinen eigenen Allocator schreiben.
Oder du nimmst static Boost Versionen, bspw. boost::static_vector.
Stefan U. schrieb:> Aber das heißt noch lange nicht, dass man nur in C++ sauber> objektorientiert programmieren kann.
OOP ist in c++ auch ein recht kleiner Teil. Auf der anderen Seite kann
OOP in c sehr ekelhaft werden und damit schlecht wartbar.
Stefan U. schrieb:> Dann hast du noch nicht gesehen, wie man in C Objektorientiert> programmiert. Namespaces würde man dort vermissen, kann man in der> Praxis jedoch durch eine Namenskonvention ersetzen. Und> objektorientierte Programmierung ist dort durchaus möglich.
Ich hab das mal gesehen, bei Gtk - und fand es nicht grad schön.
Ellenlange Funktionsnamen, um Namespaces, Klassen und Überladung zu
ersetzen und viel fehlerträchtige Makro-Magie, um das dynamische
Typsystem zu ersetzen.
Mikro 7. schrieb:> Oder du nimmst static Boost Versionen, bspw. boost::static_vector.
Oder halt gleich den Standard-Typ: std::array.
Rolf M. schrieb:> Mikro 7. schrieb:>> Oder du nimmst static Boost Versionen, bspw. boost::static_vector.>> Oder halt gleich den Standard-Typ: std::array.
Ein Vector kann seine Größe ändern, ein Array nicht. Das wird bspw. dann
interessant, wenn du keinen Default Constructor für deine Elemente hast.
Stefan U. schrieb:> Ja, C++ hat ein paar coole Features, die C nicht hat. Aber das heißt> noch lange nicht, dass man nur in C++ sauber objektorientiert> programmieren kann.
Ja, unter anderem Hashmaps ;-) Also 2 Tage in den Sand gesetzt, weil
flasches Werkzeug verwendet.
avr schrieb:> OOP ist in c++ auch ein recht kleiner Teil. Auf der anderen Seite kann> OOP in c sehr ekelhaft werden und damit schlecht wartbar.
Wenn man sich keine Gedanken dazu vorher macht kann OOP auch in C++ sehr
hässlich werden.
Aber mal ernsthaft: Der Thread driftet IMO zu sehr ins C/C++ gebashe ab.
Das führt doch zu nichts. Beide Sprachen haben, auch im Embedded
Bereich, ihre Berechtigung.
So siehts aus. Wenn C++ generell die beste Wahl wäre, gäbe es keine MCU
wie Tiny10, der damit inkompatibel ist. Man muß leider etwas
differenzieren können.
Torsten R. schrieb:> Ja, unter anderem Hashmaps ;-) Also 2 Tage in den Sand gesetzt, weil> flasches Werkzeug verwendet.
Eine der Anforderungen war: "es stand nur die Programmiersprache und die
Standard C Library zur Verfügung".
Nop schrieb:> Torsten R. schrieb:>>> Ja, unter anderem Hashmaps ;-) Also 2 Tage in den Sand gesetzt, weil>> flasches Werkzeug verwendet.>> Eine der Anforderungen war: "es stand nur die Programmiersprache und die> Standard C Library zur Verfügung".
Naja, wenn er C++ genommen hätte, wären die Anforderungen halt: nur die
Programmiersprache und die zugehörige Standard Library...
C hat gegenüber C++ den generellen Vorteil, daß die Sprache kompakter
ist. Die Beziehung zwischen C-Code und dem rausfallenden Maschinencode
ist deutlich einfacher. Das spielt für Anwendungen auf dem PC nicht
unbedingt eine Rolle, aber wenn man hardwarenah programmiert, wird
Abstraktion schnell zu Obfuscation. Dann ist sie nicht hilfreich,
sondern nervig.
Zudem ist C++ wesentlich kontextabhängiger, allein schon wegen
Überladung, so daß man Patches nicht mehr differentiell reviewen kann.
Ein wesentlicher Grund, wieso es im Linuxkernel nicht eingesetzt wird.
Nicht zuletzt gibt es eine Menge C++-Programmierer, die unter "ich kann
C++" verstehen, daß sie wissen, was der Code inhaltlich bewerkstelligt,
aber nicht, was tatsächlich in etwa an Maschinencode herausfällt. Eine
Programmierkultur, wie man sie eher von Java kennt. Diese Art von
Programmierern hält man sich aus seinen Projekten, wenn man C verwendet.
Stefan U. schrieb:>>> Als Fakt sehe ich aber auch an: Die Sprache C ist einfacher als C++.>>> Einfacher im Sinne des Sprachumfangs.>>> Wenn das ein Argument wäre, dann wären die meistgenutzten Programmier->> sprachen heute Brainfuck oder Whitespace [1]. Sind sie aber nicht.>> Nun, Java erfreut sich einer auffälligen Beliebtheit. Und Java fühlt> sich für mich wie ein vereinfachtes C++ an (ich muss es wissen, denn ich> verdiene damit seit 15 Jahren mein Brot).
Sprich mich lieber nicht auf Java an. Das ist eine der grauenhaftesten
Programmiersprachen, die ich gesehen habe. Und ich habe viel gesehen.
>> Laß uns doch einfach mal bei Kapselung bleiben. Hat C schlicht>> und ergreifend nicht. Und schon hat C++ gewonnen.>> Dann hast du noch nicht gesehen, wie man in C Objektorientiert> programmiert.
Bedauerlicherweise habe ich das schon gesehen. Genau daher kommt meine
Beobachtung, daß C keine Kapselung hat. Wenn ich in C++ ein Member einer
Klasse als private deklariere, dann erlaubt mir der Compiler nicht, von
außerhalb darauf zuzugreifen. Das ist Kapselung.
In C kann ich vielleicht einen Kommentar an ein "privates" struct-Member
schreiben. Oder im Bezeichner die Silbe "privat" unterbringen. Aber der
Compiler wird mir nicht mal eine Warnung geben, wenn jemand unbefugt
darauf zugreift. Das ist die Abwesenheit von Kapselung.
Versteh mich recht: ich habe nicht gesagt daß es unmöglich wäre, in C
objektorientiert und strukturiert und mit Kapselung und was auch immer
gerade Mode ist, zu programmieren. Das geht immer. Auch in Assembler
oder Brainfuck (Herr Turing läßt grüßen). Aber es ist doch deutlich
komfortabler und vor allem viel weniger fehlerträchtig, wenn die
Toolchain einen dabei unterstützt.
Axel S. schrieb:> Sprich mich lieber nicht auf Java an. Das ist eine der grauenhaftesten> Programmiersprachen, die ich gesehen habe. Und ich habe viel gesehen.
Und dennoch hält sich diese Sprache hartnäckig über Jahrzehnte und wird
immer erfolgreicher. Soo schlecht kann diese Sprache also auch nicht
sein.
Axel S. schrieb:> In C kann ich vielleicht einen Kommentar an ein "privates" struct-Member> schreiben. Oder im Bezeichner die Silbe "privat" unterbringen. Aber der> Compiler wird mir nicht mal eine Warnung geben, wenn jemand unbefugt> darauf zugreift. Das ist die Abwesenheit von Kapselung.
Dass es nicht wie in C++ funktioniert ist schon klar, man kann es aber
schon so aufbauen, dass es auch eine Kapselung gibt. Dazu muss man
natürlich erstmal klar definieren, was man unter Kapselung versteht.
Axel S. schrieb:> Versteh mich recht: ich habe nicht gesagt daß es unmöglich wäre, in C> objektorientiert und strukturiert und mit Kapselung und was auch immer> gerade Mode ist, zu programmieren.
Ich möchte diesen Punkt aber gerne nochmal ausführen.
Private, geschützte Elemente sind sicher sinnvoll, vor allem wenn man in
Schichten und mit unterschiedlichen Teams programmiert. Ein allgemeines
OS mit offenen Internas wird sicher schnell missbräuchlich verwendet,
was dann bei kleinsten Änderungen fehlschlägt.
Es gibt aber auch mächtige Softwaresysteme, bei denen ein globaler
Kontext (aktoren/sensoren) den Rahmen vorgibt, und bei denen alle
Beteiligten wissen, was sie tun und zu lassen haben. Hier kann selbst
ein "alles ist global"-Ansatz sinnvoll sein.
Vergleiche es mit einem Magazin: Natürlich ist es einfacher und
sicherer, einen Verwalter davor zu setzen, der jede Entnahme prüft und
protokolliert und ggf. nachbestellt. Wenn jedoch alle beteiligten
diszipliniert sind, kann ein offenes Magazin, wo sich jeder bedienen
kann, genauso gut sein.
Axel S. schrieb:> In C kann ich vielleicht einen Kommentar an ein "privates" struct-Member> schreiben. Oder im Bezeichner die Silbe "privat" unterbringen. Aber der> Compiler wird mir nicht mal eine Warnung geben, wenn jemand unbefugt> darauf zugreift. Das ist die Abwesenheit von Kapselung.
Ich kann verstehen wenn viele Leute so ein Monstrum wie QT entwickeln,
dass sie die Internas vor dem Anwender verstecken und schützen wollen.
Da ist Kapselung gut und das Mittel der Wahl. Aber im embedded Bereich?
Gut, in Zukunft ja. Aber nur deshalb weil die Controller immer dicker
werden und die Leute die sich wirklich damit auskennen immer weniger.
Ich wage zu behaupten, dass die Hälfte der Leute die hier im Forum STM32
programmieren das Programmiermanual nie gelesen haben. Anders ist
jedenfalls der exzessive Einsatz der STM-Libs nicht zu erklären.
Fakt ist aber auch eins, solange die Tendenz da ist, dass jede Zeile des
gehypten C++ Codes ungefähr doppelt so lang ist wie mit C läuft was
verkehrt. Ziel ist nicht nur kleinen und effizienten Binärcode zu
erzeugen, sondern auch der Quelltext muss kompakt und lesbar sein.
Leider sehe ich hier immer den Faktor 3 wenn jemand was von C auf C++
umstellt.
Ein positives Beispiel ist in meinen Augen mbed. Hier wird C++ in einer
vernünftigen Art und Weise verwendet. Selbst beim core von Arduino sehe
ich eine sinnvolle Verwendung. Glaubt wirklich jemand die Codebasis von
mbed lässt sich so einfach jedes Jahr neu auf den neusten C++ Stand
bringen? Und wenn ja von frischen Leuten von der Uni? Es darf gelacht
werden!
Wenn man aber mal eine Anwendung hat die über ein blinky hinausgeht,
dann sind meistens auch fremde Libs im Spiel. Da reicht schon ein
Tcp/Ip-Stack und schon haben wir wieder ein Konglemerat aus den
verschiedensten Programmieransätzen. Also macht am Ende ein kleiner
moderner C++ Anteil das Ergebnis noch lange nicht um relevante Größen
schneller, kleiner oder besser wartbar. Deshalb nicht C++ in allen
Facetten um jeden Preis, sondern in vernünftiger Dosierung.
temp schrieb:> Da ist Kapselung gut und das Mittel der Wahl. Aber im embedded Bereich?> Gut, in Zukunft ja. Aber nur deshalb weil die Controller immer dicker> werden
Zwar sind M4 verfügbar, aber die wird man professionell eher nicht
einsetzen, wenn es auch ein M0 täte. Für Hobby ist es ja egal.
Abgesehen davon ist es möglich, in C++ Code zu schreiben, der weder
umfangreicher noch langsamer ist als in C. Das Problem daran ist
allerdings, daß dies nur solchen Programmierern real möglich ist, die
eben nicht nur wissen, was man wozu gebrauchen kann, sondern auch, wie
es unter der Haube implementiert ist. Das ist eine Minderheit.
Diese Programmierer gibt es, klar. Aber die industrielle Realität ist
eine vollkommen andere, nämlich daß die Entwickler bereits mit dem UB in
C überfordert sind und man genau deswegen MISRA-C geschaffen hat. Daß
diese Leute in C++ genauso performanten und kompakten Code abliefern wie
in C, halte ich für vollkommen illusorisch.
> Ich wage zu behaupten, dass die Hälfte der Leute die hier im Forum STM32> programmieren das Programmiermanual nie gelesen haben. Anders ist> jedenfalls der exzessive Einsatz der STM-Libs nicht zu erklären.
Die STM-Libs sind aber nicht in C++, insofern sehe ich hier keine
Verbindung zwischen diesen beiden Phänomen. Wenn überhaupt, dann ist
mein Eindruck, daß gerade die hier schreibenden C++-Programmierer ihre
Hardware gut kennen - jedenfalls, wenn man mal z.B. die Fans der
Arduino-IDE abzieht.
temp schrieb:> Fakt ist aber auch eins, solange die Tendenz da ist, dass jede Zeile des> gehypten C++ Codes ungefähr doppelt so lang ist wie mit C läuft was> verkehrt
Das halte ich für ein unsinniges Argument!
Natürlich ist ein C++ Quellcode alleine durch solche Token, wie public,
private, virtual, using, constexpr usw. länger.
Nein kurze Quellcodes, ist kein primäres Ziel bei der OOP.
Eher Wiederverwendbarkeit.
Lass den Quellcode doch ruhig aufgebläht aussehen...
Meist verbessert es sogar die Lesbarkeit und damit auch die Wartbarkeit.
Dem Kompilat tut das nicht weh.
Arduino F. schrieb:> Nop schrieb:>> jedenfalls, wenn man mal z.B. die Fans der>> Arduino-IDE abzieht.> Was soll das denn jetzt?
Was, das ist doch Tatsache. Wer Sketches für Arduino macht, tut das
genau, um sich nicht mit der Hardware zu befassen. Es ist der ganze
Zweck dieser IDE, µC-basierte Basteleien einem fachfremden Publikum wie
Künstlern, Modell-Eisenbahnern usw. zu ermöglichen.
Da hat man zwar C++ dann, aber keine Hardwarekenntnisse, und außerdem
ist das nichtmal richtiges C++, und obendrein auch noch schlechtes
(Projektstruktur von Sketchen.. haha). Für kleine Hackereien langt es
aber.
Deswegen zähle ich Fans der Arduino-IDE hier nicht zu den
C++-Programmierern, von denen ich den Eindruck habe, daß sie sich auch
auskennen. Auf die IDE habe ich das eingegrenzt, weil man die Arduino-HW
natürlich auch ohne IDE als bare board programmieren kann.
Jetzt klarer?
Nop schrieb:> Jetzt klarer?
Ja!
Es ist klar geworden, dass du dich offensichtlich gut/besser dabei
fühlst, wenn du versuchst deinen Standpunkt zu erhöhen, dadurch, dass du
mich abwertest.
Ja, nehme das persönlich!
Arduino F. schrieb:> Es ist klar geworden
Ist es nicht. Zu der Erklärung, daß die Arduino-IDE sich eben an Laien
richtet und naturgemäß eben solche anzieht, hast Du auch nichts zu
sagen. Stattdessen machst Du jetzt einen auf persönlich. Das sagt
eigentlich auch schon genug aus.
M. K. schrieb:> Axel S. schrieb:>> Sprich mich lieber nicht auf Java an. Das ist eine der grauenhaftesten>> Programmiersprachen, die ich gesehen habe. Und ich habe viel gesehen.>> Und dennoch hält sich diese Sprache hartnäckig über Jahrzehnte und wird> immer erfolgreicher. Soo schlecht kann diese Sprache also auch nicht> sein.
Dafür gibt es viele Gründe, aber sicher nicht, daß Java eine großartige
Programmiersprache wäre. Zum einen hat Java zur Zeit seiner Entstehung
durchaus eine Lücke gefüllt. Es war - der damaligen Mode entsprechend -
objektorientiert [1]. Außerdem plattformunabhängig (was sich in der
Praxis allerdings relativiert hat). Es erlaubt (wichtig!) Code in
Binärform weiterzugeben und damit vor unauthorisierter Nutzung
auszuschließen. Es enthielt (im Gegensatz zum damaligen
Hauptkonkurrenten C++) Bibliotheken für GUI und Threads im
Standard-Sprachumfang.
Und mittlerweile ist die Codebasis so groß, daß sich ein Wechsel weg von
Java aus rein praktischen Gründen verbietet.
Der Vergleich mit VHS oder Microsoft Windows/Office drängt sich auf.
Auch jeweils kein großer Wurf. Aber irgendwie "good enough" und "wir
hatten ja nichts anderes" und schließlich "jetzt können wir nicht mehr
wechseln" bzw. "alle anderen nutzen es, da müssen wir mit".
[1] Sogar zu objektorientiert, wenn du mich fragst. Daß z.B. eine
Funktion wie max() oder main() nicht eigenständig sein darf, sondern als
statische Methode einer ansonsten leeren Klasse implementiert werden
muß, empfinde ich als sprachdesignerische Fehlleistung. Zumal wenn die
totale Objektorientierung an anderer Stelle ganz zwanglos aufgehoben
wird, z.B. um einen Datentyp (kein! Objekt) int neben der Klasse
Integer zuzulassen. Und damit man sich auch ja unwohl fühlt, werden
die Operationen die man typischerweise für Zahlen braucht, hübsch
zwischen beiden aufgeteilt.
Axel S. schrieb:> Dafür gibt es viele Gründe, aber sicher nicht, daß Java eine großartige> Programmiersprache wäre.
Hab ich auch nicht behauptet, dass Java eine großartige
Programmiersprache wäre. Ich sagte nur, dass sie nicht so schlimm sein
kann
Axel S. schrieb:> Und mittlerweile ist die Codebasis so groß, daß sich ein Wechsel weg von> Java aus rein praktischen Gründen verbietet.
Dieser Grund ist IMO, ich sag mal, Unsinn. Wollte man davon weg wäre die
Codebasis ziemlich egal. Aber auf der anderen Seite: Wenn man eine
Codebasis hat, die man für OK findet, warum sollte man zu was anderem
wechseln wollen? Man würde dann ja keinen Vorteil erringen.
Und da sind wir eigentlich am Punkt der Sache: Wenn man vernünftig
programmiert, sich klare Strukturen erarbeitet hat, dann hat auch keine
Programmiersprache einen klaren Vorteil. Daher wird sich die Diskussion
auch stets nur im Kreis drehen können.
M. K. schrieb:> Wollte man davon weg wäre die Codebasis ziemlich egal.
Nein. Das alles in einer anderen Programmiersprache nochmal neu zu
machen kostet Zeit und Geld, ohne daß die Kunden davon was hätten.
Schlimmer noch, mann wirft Jahre an Reiftesten weg. Dafür bezahlt
keiner.
Im Übrigen hätte man bei einer entsprechend alten Codebasis in C++ fast
dasselbe Problem, weil C++98 erheblich anders war als heutiges und das
heutige allgemein als wesentlich besser angesehen wird.
Diese Diskussion hier verläuft eigentlich wie immer, wenn es um das
Thema C vs C++ geht. Man kann sich da gelassen zurück lehnen, und dem
Treiben belustigt zusehen ... es ist immer das gleiche ;-)
Was allerdings m.E. dabei nie genügend beachtet wird, ist die Tatsache,
das C++ eine Multiparadigmen-Sprache ist:
- man kann OOP nutzen
- man kann auch rein prozedural formulieren
- man kann meta-programmatisch arbeiten
- man kann funktional schreiben
Zudem kann man noch Laufzeit- und Compilezeit-Kontext unterscheiden. Und
kann auch noch C-Code einbinden ...
Und bei allem ist man genauso effizient (manchmal effizienter) als im
direkten Vergleich zu C.
Wenn wir jetzt noch den "starship"-Operator und "unified function call
syntax" bekommen, wird es wohl noch schlimmer mit der Diskussion.
Dabei geht es ja wohl nur um die Vorlieben oder Kenntnisstand der
einzelnen Entwickler bzw. das Einsatzgebiet des Softwareartefakts: auf
Maschinen mit vielen Ressourcen wird man wohl eher gerne zu OOP inkl.
Laufzeitpolymorphie greifen. Auf Maschinen mit wenig Ressourcen eher
prozedural bleiben und die Vorteile der Meta-Programmierung nutzen. Wer
gerne abstrakt formuliert, mag sicher den funktionalen Ansatz. Und eine
lange Tool-Kette zum Bauen kann man teilweise verkürzen durch einen
Compilezeit-Kontext.
Das das alles den ein oder anderen verwirrt, kann ich verstehen. Für
mich ist es eher eine Bereicherung, denn ich kann das Paradigma wechseln
ohne eine neue Sprache benutzen zu müssen.
Aber man sollte bei dem Thema C vs C++ nicht vergessen, das es keinen
Zwang gibt, sich so oder so auszurichten. Der Zwang entsteht durch
äußere Einflüsse wie etwa Firmenpolitik oder Team-Skills. Wobei man
beides durchaus weiter entwicklen kann ;-)
Nop schrieb:> Nein. Das alles in einer anderen Programmiersprache nochmal neu zu> machen kostet Zeit und Geld, ohne daß die Kunden davon was hätten.
Deswegen war bei mir ja auch der Konjunktiv drin: "Wollte man davon weg"
Dann beachtet man auch was es einen kostet "alles noch mal neu zu
machen" ;)
Wilhelm M. schrieb:> Was allerdings m.E. dabei nie genügend beachtet wird, ist die Tatsache,> das C++ eine Multiparadigmen-Sprache ist:>> - man kann OOP nutzen> - man kann auch rein prozedural formulieren> - man kann meta-programmatisch arbeiten> - man kann funktional schreiben
Und wenn dann in einem größeren Team kein Subsetting betrieben UND auch
durchgesetzt wird, kriegt man eine Codebasis, in der jeder Beteiligte
seine 30% Vorlieben eingebracht hat. Die arme Sau von
Maintenance-Programmierer, die da drei Jahre nach Projektende ransoll.
Nop schrieb:> Die arme Sau von> Maintenance-Programmierer, die da drei Jahre nach Projektende ransoll.
Ach ja - rekrutiert in einem Umfeld, in dem MISRA-C v.a. deswegen
notwendig wurde, weil UB in C praktisch gesehen schon zu schwierig ist.
Ich kann nicht nachvollziehen, warum in der Diskussion auch immer über
die STL geredet wird, außer dass sie groß und mit dynamischer
Allozierung arbeitet.
Die ist zunächstmal im Gegensatz zu
-Überladung
-virtual
-Vererbung
-enums
kein Paradigma von C++ und daher auch kein Argument für oder gegen.
Auch darauf beschränkt lässt sich das Denken in SW-Modulen und ggf.
Pattern leichter aufteilen.
Nop schrieb:> Wilhelm M. schrieb:>>> Was allerdings m.E. dabei nie genügend beachtet wird, ist die Tatsache,>> das C++ eine Multiparadigmen-Sprache ist:>>>> - man kann OOP nutzen>> - man kann auch rein prozedural formulieren>> - man kann meta-programmatisch arbeiten>> - man kann funktional schreiben>> Und wenn dann in einem größeren Team kein Subsetting betrieben UND auch> durchgesetzt wird, kriegt man eine Codebasis, in der jeder Beteiligte> seine 30% Vorlieben eingebracht hat. Die arme Sau von> Maintenance-Programmierer, die da drei Jahre nach Projektende ransoll.
Also am besten eine Sprache, die weniger kann als C ... am besten eine,
die gar nichts kann, dann passieren keine Fehler und es entsteht kein
Know-How-Problem ...
>>> Ja, unter anderem Hashmaps ;-) Also 2 Tage in den Sand gesetzt, weil>>> flasches Werkzeug verwendet.>> Eine der Anforderungen war: "es stand nur die Programmiersprache und die>> Standard C Library zur Verfügung".> Naja, wenn er C++ genommen hätte, wären die Anforderungen halt: nur die> Programmiersprache und die zugehörige Standard Library...
C++ stand nicht zur Verfügung.
Die Kiste war so alt, da gab es womöglich C++ noch nicht. jedenfalls war
es nicht installiert und wir durften nichts installieren und keine
Fremdsoftware einbringen.
Wilhelm M. schrieb:> Also am besten eine Sprache, die weniger kann als C ... am besten eine,> die gar nichts kann, dann passieren keine Fehler und es entsteht kein> Know-How-Problem ...
Reductio ad absurdum nennt sich diese rhetorische Stilfigur. Logisch ist
sie natürlich nicht zu halten, weil aus "etwas kann zuviel sein" nunmal
nicht folgt "zuwenig ist nicht möglich". Eine inhaltliche Antwort auf
die realen Probleme ist das jedenfalls nicht.
Wilhelm M. schrieb:> Was allerdings m.E. dabei nie genügend beachtet wird, [...]>> - man kann [...]> - man kann [...]> - man kann [...]> - man kann [...]>> Zudem kann man noch [...]> Diese Diskussion hier verläuft eigentlich wie immer, wenn es um das> Thema C vs C++ geht.
Weil es m.E. garnicht um C vs. C++ geht, sondern um die Frage, wie man
als nicht-C++ Programmierer den Graben zu C++ überwinden kann.
> Der Zwang entsteht durch äußere Einflüsse wie etwa Firmenpolitik> oder Team-Skills.
Wo hast du denn C++ gelernt? Bist du in der Industrie in ein Team
gekommen und hast es dort gelernt und auf dein heutiges Niveau gebracht?
Wievel Monate oder Jahre hat das gedauert? Und zurückblickend: Gibt es
Code, von dem du sagen würdest "OMG! Heute würd ich das viel besser
machen und statt XXX besser YYY verwenden?". Oder war alles je
ausprogrammierte "zum niederknien schön", hat tadellos und ohne
Reklamation funktioniert?
Allein in diesem Thread könnte ich 2 Duzend Buzz-Words (oder Paradigmen
oder wie auch immer) von dir zusammenkratzen, wo ich keinen blassen
Schimmer hab, was das ist und wozu ich das brauchen könnte. Und von C++
weiß ich genug, um zu wissen, dass ich diese Sprache niemals auf einem
Niveau beherrschen werde, welches meinen eigenen Maßstäben und
Ansprüchen auch nur annähernd entsprechen würde — und mit jedem
Buzz-Word wird meine Gewissheit darüber größer und nicht etwa kleiner.
Und ja, ich verwende C++, aber nur in einem durch Coding-Rules
definierten Subset, das im Endeffekt "C with Classes" ist; oder in
Fun-Projekten oder irdenwelchen Nerd-Tools. Wenn ich mir anschaue, wie
Qt ein QObject::connect implementiert, dann ist das weiß Gott nicht zum
niederknien schön.
Wenn PeDa oben schreibt, er blickt bei C++ wie'n "Schwein ins Uhrwerk",
dann spricht das Bände.
Man steht eben nicht nach einer C++ Convention über einem Gläschen Sekt
mit anderen Akademikern zusammen und fachsimpelt über das neueste C++
Feature. Der harte Alltag sieht anders aus.
Folgende Analogie: Nimm einen Mediziner, etwa einen sehr guten
Zahnarzt. Bei wem würdest du dich für eine Herz-OP unters Messer legen?
Einem Kardiologen, der Kardiologie und Chirurgie an der Uni vertiefte
und als Harzchirurg erfolgreich gearbeitet hat, oder einem Dentisten,
der Zahnmedizin an der Uni vertiefte, erfolgreich darin gearbeitet hat,
und sich denn per Google und selbst gekaufter Bücher in Kardiologie und
Chirurgie reingestrampelt hat?
Einen solchen Dentisten, der ablehnt dich zu operieren, würde ich nicht
als rückständig oder lernfaul oder nicht-innovativ bezeichnen. Sondern
er kennt einfach seine Grenzen und unterliegt nicht der Hybris zu
glauben, etwas zu können, was er nicht von der Pike auf studiert hat.
Und um wieviel besser oder cooler — gleich in welcher Metrik bemessen —
Kardiologie und Chirurgie im Vergleich zur Zahnmedizin auch sein mögen,
wieviel erfüllender die Arbeit oder auch sein mag; spielt schlicht und
einfach keine Rolle.
> Kenntnisstand der einzelnen Entwickler
Ja. Genau darum geht es. Und wie man über das Uncanny Valley rüber
kommt, oder eben nicht.
> Auf Maschinen mit wenig Ressourcen eher prozedural bleiben und die> Vorteile der Meta-Programmierung nutzen. Wer gerne abstrakt formuliert,
oder verwenden graphische Tools oder Code-Generatoren.
> Tool-Kette zum Bauen
Oder so: Anstatt Software fit zu machen, lässt man die Tools für
200€-500€ pro Zeile aufbohren weil: Die Software ist ja zertifiziert
und abgenommen, die Toolchain wird's richten. Willkommen in der
Realität.
Johann L. schrieb:> Weil es m.E. garnicht um C vs. C++ geht, sondern um die Frage, wie man> als nicht-C++ Programmierer den Graben zu C++ überwinden kann.
Da kann ich keinen Graben zwischen Basis und Erweiterung erkennen. Jeder
nutzt die Features, die er jeweils für sinnnvoll hält. Kann es nicht
noch einen anderen Grund geben, eine handvoll Bytes nicht in der
komplexesten Hochsprache zu programmieren?
Johann L. schrieb:> Weil es m.E. garnicht um C vs. C++ geht, sondern um die Frage, wie man> als nicht-C++ Programmierer den Graben zu C++ überwinden kann.
Naja, wie würdest Du denn vorgehen, um Haskell zu erlernen (sofern das
noch nicht zu Deinen Lieblingssprachen gehört)?
> Wievel Monate oder Jahre hat das gedauert? Und zurückblickend: Gibt es> Code, von dem du sagen würdest "OMG! Heute würd ich das viel besser> machen und statt XXX besser YYY verwenden?".
Selbstvertsändlich. Leider gibt es davon immer mehr, je mehr ich lerne
;-)
> Oder war alles je> ausprogrammierte "zum niederknien schön", hat tadellos und ohne> Reklamation funktioniert?
Mmh, kann mich nicht daran erinnern, das behauptet zu haben.
> Allein in diesem Thread könnte ich 2 Duzend Buzz-Words (oder Paradigmen> oder wie auch immer) von dir zusammenkratzen,
Echt, nur zwei Dutzend ... wusste doch, dass ich das Computerwoche Abo
nicht hätte kündigen sollen. Vielleicht kannst Du sie mir gerade nochmal
zusammenstellen, damit ich mich beim nächsten Mal nicht wiederholen
muss.
> wo ich keinen blassen> Schimmer hab, was das ist und wozu ich das brauchen könnte. Und von C++> weiß ich genug, um zu wissen, dass ich diese Sprache niemals auf einem> Niveau beherrschen werde, welches meinen eigenen Maßstäben und> Ansprüchen auch nur annähernd entsprechen würde — und mit jedem> Buzz-Word wird meine Gewissheit darüber größer und nicht etwa kleiner.
Das finde ich doch gar nicht schlimm - dann lass es doch einfach, wenn
es Dich unglücklich macht ;-)
> Und ja, ich verwende C++, aber nur in einem durch Coding-Rules> definierten Subset, das im Endeffekt "C with Classes" ist;
Wunderbar, wenn Du damit nichts vermisst und auch keine Zeile, kein
Design siehst, die Du besser machen möchtest, ist das für mich auch
absolut ok.
> oder in> Fun-Projekten oder irdenwelchen Nerd-Tools. Wenn ich mir anschaue, wie> Qt ein QObject::connect implementiert, dann ist das weiß Gott nicht zum> niederknien schön.
Kann mich auch nicht erinnern, dass das hier in den Raum gestellt wurde.
Ich glaube auch, dass würde sogar Lars Knoll, et. al. nicht unbedingt
sagen.
> Wenn PeDa oben schreibt, er blickt bei C++ wie'n "Schwein ins Uhrwerk",> dann spricht das Bände.
Das verstehe ich ja nun gar nicht !?
> Folgende Analogie: Nimm einen Mediziner, etwa einen sehr guten> Zahnarzt. Bei wem würdest du dich für eine Herz-OP unters Messer legen?> Einem Kardiologen, der Kardiologie und Chirurgie an der Uni vertiefte> und als Harzchirurg
Harzchirurg ist jetzt aber kein Wortspiel, oder?
> Einen solchen Dentisten, der ablehnt dich zu operieren, würde ich nicht> als rückständig oder lernfaul oder nicht-innovativ bezeichnen.
Absolut: ich wollte Dich auch gar nicht bitten, für mich C++-Code zu
schreiben ;-)
>> Kenntnisstand der einzelnen Entwickler>> Ja. Genau darum geht es. Und wie man über das Uncanny Valley rüber> kommt, oder eben nicht.
Da sind wir uns ja einer Meinung, denn ich gehe davon aus, dass auch Du
Stillstand nicht als Lösung ansiehst. Übrigens hatte ich etwas weiter
oben mal ein Maßnahme dazu erwähnt.
> Willkommen in der> Realität.
Genau, es gibt auch schon wieder Spekulatius 8-()
Wenn man bedenkt in welchen vielfältigen Bereichen man C++ verwenden
kann würde ich einer Privatperson der die Wahl hat empfehlen C++ zu
bevorzugen.
Ich entwickle beispielsweise Desktop Anwendungen mit Qt und programmiere
mit C++ in der Unreal Engine 4.
Für reine 2D Spiele nutze ich gerne die SFML Bibliothek (C++).
Wenn man vielfältige Interessen im IT Bereich hat dann kann man C++
wirklich nur empfehlen.
Das gelernte lässt sich in unterschiedlichen Bereichen nutzen.
Finde ich persönlich besser als C für Embedded, Java oder C# für Desktop
Anwendungen zu lernen. Und bei komplexeren Anwendungen wo es doch sehr
auf die Performance ankommt käme dann auch noch C++ dazu.
Womit ich aber nicht sagen will dass man auf Krampf alles mit C++ machen
sollte. Manchmal sind andere Programmiersprachen besser geeignet.
Moby schrieb im Beitrag #5238859:
> aller Eigenwerbung der ach so eingängigen> Objektorientierung zum Trotz.
OOP: 1 Pin = 1 Objekt. 1 Timer = 1 Objekt. 1 externer Portexpander = 1
Port-Expander-Objekt bestehend aus 1 I²C-Slave-Objekt + 8 Pin-Objekte.
Prozedural: 1 Pin = Zwei Integer plus 23 Funktionen? 1 externer
Portexpander = Zwei Funktions-Ebenen + 3 Integer? Super intuitiv. Es hat
schon einen Grund warum OOP von den meisten Programmiersprachen
unterstützt wird.
Nichts gegen kleine Laufställe und Bauklötzchen!
Alles zu seiner Zeit, und an seinem Ort.
Moby schrieb im Beitrag #5238894:
> Manche mögens einfach, die anderen kompliziert :)
Nunja, ich bin recht zufrieden mit meinem "komplizierten" Kram.
Immerhin läufts auf ESP, AVR und STM32/ARM.
Meist ohne große Portierungswehwehchen.
Selbst auf den großen Kesseln, wie Win/Linux zuckt es, wie es
soll.(naja)
Und wie ist es da mit deinem Assembler Dingens?
Niklas G. schrieb:> Moby schrieb im Beitrag #5238859:>> aller Eigenwerbung der ach so eingängigen>> Objektorientierung zum Trotz.> OOP: 1 Pin = 1 Objekt. 1 Timer = 1 Objekt. 1 externer Portexpander = 1> Port-Expander-Objekt bestehend aus 1 I²C-Slave-Objekt + 8 Pin-Objekte.> Prozedural: 1 Pin = Zwei Integer plus 23 Funktionen? 1 externer> Portexpander = Zwei Funktions-Ebenen + 3 Integer? Super intuitiv. Es hat> schon einen Grund warum OOP von den meisten Programmiersprachen> unterstützt wird.
Da es eher selten ist, dass ein z.B. Portexpander zur Laufzeit die
verwendeten Pins wechselt, macht es keinen Sinn, die Info zu den Pins
oder des verwendeten I2C-Moduls zur Laufzeit zu repräsentieren. So etwas
gehört in den Typ und damit wird dafür auch kein Ram verbraucht.
Wilhelm M. schrieb:> So etwas> gehört in den Typ und damit wird dafür auch kein Ram verbraucht.
Dann müssen aber alle anderen Klassen & Funktionen, die darauf
zugreifen, ebenfalls templates sein. Je nach Programmgröße wird das
ziemlich umständlich.
Niklas G. schrieb:> Wilhelm M. schrieb:>> So etwas>> gehört in den Typ und damit wird dafür auch kein Ram verbraucht.> Dann müssen aber alle anderen Klassen & Funktionen, die darauf> zugreifen, ebenfalls templates sein. Je nach Programmgröße wird das> ziemlich umständlich.
Nein, warum?
Wilhelm M. schrieb:> Auf das umständlich.
Wenn der Pin-Zugriff die unterste Architektur-Ebene ist und mehrere
weitere Ebenen drauf aufsetzen, müssen alle deren Klassen templates
sein. Wenn an einer Stelle ein Array von Pins, die per I²C oder direkt
angesteuert werden können, angelegt werden soll, wird es auch
interessant wenn jedes Element einen anderen Typ hat je nach
Hardware-Interface. Auch dass praktisch immer alles neu kompiliert
werden muss wenn sich ein Detail der untersten Ebene ändert macht es
nicht einfacher.
Niklas G. schrieb:> Wilhelm M. schrieb:>> Auf das umständlich.>> Wenn der Pin-Zugriff die unterste Architektur-Ebene ist und mehrere> weitere Ebenen drauf aufsetzen, müssen alle deren Klassen templates> sein.
Ja klar. Aber wo ist das umständlich?
> Wenn an einer Stelle ein Array von Pins, die per I²C oder direkt> angesteuert werden können, angelegt werden soll, wird es auch> interessant wenn jedes Element einen anderen Typ hat je nach> Hardware-Interface.
Variadische templates.
> Auch dass praktisch immer alles neu kompiliert> werden muss wenn sich ein Detail der untersten Ebene ändert macht es> nicht einfacher.
Da ist mir unklar, was Du meinst.
Wilhelm M. schrieb:> Ja klar. Aber wo ist das umständlich?
Man schreibt sehr oft "template". Plötzlich sind Klassen templates, die
gar nichts mehr mit einzelnen Pins zu tun haben.
Wilhelm M. schrieb:> Variadische templates.
Ja. Super kompliziert. Iteration und wahlfreie Zugriffe sind schwierig.
Generiert sehr viel Code.
Wilhelm M. schrieb:> Da ist mir unklar, was Du meinst.
Wenn sich die template-Parameter an die Pin-Instanzen ändern und
daraufhin auch die Parameter an alle darauf aufbauenden Instanzen,
müssen die komplett neu kompiliert werden. Man hat eine sehr enge
Kopplung.
Niklas G. schrieb:> Wilhelm M. schrieb:>> Variadische templates.> Ja. Super kompliziert.
Wen interessiert schon der nachfolgende Maintenance-Programmierer?
Reicht doch, wenn man write-only-Code schreibt, den man nur noch selbst
durchblickt. Das sichert den Arbeitsplatz.
Niklas G. schrieb:> Wilhelm M. schrieb:>> Ja klar. Aber wo ist das umständlich?> Man schreibt sehr oft "template". Plötzlich sind Klassen templates, die> gar nichts mehr mit einzelnen Pins zu tun haben.
Was ist daran umständlich, ein std::array<std::byte, 10> zu verwenden?
>> Wilhelm M. schrieb:>> Variadische templates.> Ja. Super kompliziert. Iteration und wahlfreie Zugriffe sind schwierig.
Mit fold-expressions m.E. einfacher.
> Generiert sehr viel Code.
Gegenüber was?
> Wilhelm M. schrieb:>> Da ist mir unklar, was Du meinst.> Wenn sich die template-Parameter an die Pin-Instanzen ändern und> daraufhin auch die Parameter an alle darauf aufbauenden Instanzen,> müssen die komplett neu kompiliert werden.
Dafür haben wir doch den Compiler ;-)
> Man hat eine sehr enge> Kopplung.
Die Koppelung zwischen generischen Typen ist m.E. i.a. geringer als bei
anderen Arten der Polymorphie.
Arduino F. schrieb:> Moby schrieb im Beitrag #5239023:>>> Nen Papagei verschluckt?
Dem Typ zu antworten ist das Falsche.
Für ihn gibt es den "Beitrag melden"-Link.
Ein Aspekt wurde hier noch nicht betrachtet den ich mal mit in die Runde
werfe. Macht man sich z.B. eine Template-Klasse für Gpio-Ports ala
GpioPort<PORTA, 5> LedRed;
und hat alle Funktionen der Klasse schön als inline declariert, handelt
man sich während des Debuggens Unannehmlichkeiten ein. Während des
Debuggens mit der Optimierung -O0 macht der Compiler richtige
Funktionsaufrufe und keine inline Funktionen. Klar kann man jetzt beim
Debuggen z.B. -O1 benutzen, damit kann man aber häufig nicht mehr
richtig Debuggen. Hätte man die in C üblichen Makros für die Gpio-Ports
benutzt wäre das Problem nicht vorhanden. Gerade in Interrupt-Routinen
ist so ein Verhalten nervig. Klar kann man das Umschiffen oder
Optimierungs-Pragmas in den Code einbauen, aber schön ist das trotzdem
nicht.
Alles in allem muss man bei C++ als Effekt immer im Auge haben, dass die
Laufzeitunterschiede -O0 zu -O2 in der Regel deutlich größer sind als
unter C. Vielfach stört das nicht, aber wenn dann verflucht man es.
temp schrieb:> Ein Aspekt wurde hier noch nicht betrachtet den ich mal mit in die Runde> werfe. Macht man sich z.B. eine Template-Klasse für Gpio-Ports ala>> GpioPort<PORTA, 5> LedRed;
.
> und hat alle Funktionen der Klasse schön als inline declariert, handelt> man sich während des Debuggens Unannehmlichkeiten ein. Während des> Debuggens mit der Optimierung -O0 macht der Compiler richtige> Funktionsaufrufe und keine inline Funktionen. Klar kann man jetzt beim> Debuggen z.B. -O1 benutzen, damit kann man aber häufig nicht mehr> richtig Debuggen. Hätte man die in C üblichen Makros für die Gpio-Ports> benutzt wäre das Problem nicht vorhanden. Gerade in Interrupt-Routinen> ist so ein Verhalten nervig. Klar kann man das Umschiffen oder> Optimierungs-Pragmas in den Code einbauen, aber schön ist das trotzdem> nicht.> Alles in allem muss man bei C++ als Effekt immer im Auge haben, dass die> Laufzeitunterschiede -O0 zu -O2 in der Regel deutlich größer sind als> unter C. Vielfach stört das nicht, aber wenn dann verflucht man es.
Man kann natürlich auch speziell für's Debuggen vorgesehene Option -Og
benutzen, dann wird das Programm nicht "entstellt", aber auch nicht wie
bei -O0 Registerinhalte immer wieder ohne Grund stupide neu geladen.
Carl D. schrieb:> Man kann natürlich auch speziell für's Debuggen vorgesehene Option -Og> benutzen, dann wird das Programm nicht "entstellt", aber auch nicht wie> bei -O0 Registerinhalte immer wieder ohne Grund stupide neu geladen.
Allerdings hilft es nicht bei dem oben genannten Problem mit dem
Inlining.