Forum: PC-Programmierung Welche aufbauende Programmiersprache lernen (Java/HTML5 & co)?


von Ein Gast (Gast)


Lesenswert?

Hallo zusammen :)

Direkt vorweg, ich suche nicht nach einem "Was ist die bessere Sprache, 
Java vs. HTML5" sondern viel mehr, welche Sprache es sich lohnt, für 
meine aktuellen Bedürfnisse zu lernen.

Daher kurz zu meinem Backround.
Ich bin Elektrotechnik-Ingenieur und befasse mich beruflich und auch 
privat mit der Entwicklung von eingebetteten Systemen und der 
hardwarenahen Programmierung. Hierfür nutze ich entsprechend C als 
Sprache der Wahl.

Da ich privat beginne meine entworfenen Lichtansteuerungen und Sensoren 
über Funk (Bluetooth/WLAN) vernetzen zu wollen (Stichwort Home 
Automation), dachte ich mir dass es sinnvoll wäre eine zweite 
Programmiersprache zu lernen.

Was ich machen möchte lässt sich leicht erklären:
Ich möchte in der Lage sein, Desktop oder ggf. auch Smartphone 
Applikationen zu schreiben, um mit meinen Schaltungen über die 
verfügbaren Funk- oder Hardwareschnittstellen wie bspw. USB beim PC, 
kommunizieren und Einstellungen vornehmen zu können.

Eine Idee wäre hier bspw. verschiedene Beleuchtungen über eine 
Desktop-App zu gruppieren und einstellen zu können. Das ganze dann über 
die WLAN-Verbindung oder über eine, per USB an den PC angeschlossene, 
Hauptstation.

Zusätzlich wäre es für mich noch praktisch, wenn ich es auch beruflich 
eventuell einbringen könnte, indem man (Web-) Applikationen schreibt um 
bspw. Tests oder Betriebsmittel verwalten zu können oder Oberflächen für 
Testautomatisierungen zu programmieren welche als Basis auf einem 
Mikrocontroller laufen.

Nach einer kurzen Recherche bin ich dabei auch schnell zu Java tendiert, 
da man hiermit, meines Wissens nach, alle diese Funktionalitäten 
erfüllen kann. Besonders da Java auch recht plattformunabhängig ist.

Doch erinnerte ich mich, dass mir ein Kollege mal erzählte, dass man mit 
HTML5 in Kombination mit CSS und Javascript (HCJ ab jetzt genannt) auch 
viele Applikationen in diese Richtung programmieren könnte.
Da HTML und CSS für mich bis dahin nur Beschreibungssprachen für 
Websites waren, hab ich eine tiefere Recherche durchgeführt, welche mich 
mit mehr Fragen hinterlässt als mir beantwortet wurden.

Nach meiner Recherche ist es nämlich angeblich möglich Desktop-/ 
Smartphone und auch Web-Apps, welche den oben genannten Umfang erfüllen 
sollen, auch mittels HCJ zu entwickeln.
Besonders attraktiv für mich kam mir die Möglichkeit, alle Applikationen 
als Web-App zu designen über welche man spielend von verschiedenen 
Systemen drauf zugreifen könnte und und diese ggf. über Wrapper an 
Native Systeme zu binden, vor.
Zumindest wie ich es verstanden hatte, würde dies alle Funktionalitäten 
abdecken welche für mich von Interesse sind. So könnte eine Web-App 
entwickelt werden welche vom PC ausgeführt wird und über USB/WLAN mit 
den verschiedenen entwickelten Aktoren kommuniziert oder eine 
Smartphone-App, sei es über den Browser oder mittels Wrapper als 
eigenständige App, mit welcher man automatisierte Tests verwalten kann 
indem Daten empfangen und abgelegt werden.

Das Problem dabei ist, dass ich nicht wirklich herausfinden konnte in 
welchem Umfang dies alles möglich ist, weswegen ich gerne hier nach 
Meinungen fragen möchte, ob Java oder HCJ die bessere Wahl für mich ist?

Als Versuch dies herauszufinden habe ich, da ich mich auch für neuronale 
Netzte und Deep Learning interessiere, gesucht, ob dies über HCJ möglich 
wäre. Auch hier wurde ich fündig, dass Deep Learning über HCJ-Apps und 
passenden Libraries gar kein Problem wäre...

Meine Freizeit ist leider etwas begrenzt weswegen ich nicht die 
zeitlichen Ressourcen habe mich in 2 Sprachen einzuarbeiten.

Meine Fragen daher:
1. Welche Sprache ist für meine Anforderungen wohl besser geeignet?
2. Kann man über HCJ wirklich auch komplexe Programme mit etwas 
tiefgehenderen Algorithmen für bspw. neuronale Netzte entwickeln?

Ich entschuldige mich für den langen Post, hoffe auf ein paar 
konstruktive Beiträge und freue mich auf eure Antworten.

Viele Grüße
Ein Gast :)

von tttrty (Gast)


Lesenswert?

Für dich wäre für eine Webapp HTML5 und Javascript interessant. Falls du 
das ganze noch Stylen willst kannst du auch gerne noch zu CSS 
greifen.Alle Sprachen sind nicht so schwer und es gibt auch jede menge 
Artikel im Internet darüber.

von Ein Gast (Gast)


Lesenswert?

Hallo und danke für die Antwort :)

Wäre es mit diesen Tools denn auch möglich Desktop-Apps und eventuell 
auch ein umfangreicheres Programm für neuronale Netzte, Deep Learining, 
oder Messdatenverarbeitung zu schreiben?

Ich möchte ja eine Applikation schreiben welche nicht nur geschlossen im 
Web agiert sondern mit welcher ich auch Sensoren und 
Mikrocontrollerschaltungen ansteuern kann (Funkkommunikation oder bspw. 
seriell über USB ComPort).

Viele Grüße
Ein Gast

von Εrnst B. (ernst)


Lesenswert?

Lerne erstmal programmieren. z.B. mit dem vorgeschlagenen Javascript.

Wenn du programmieren kannst, ist der Wechsel von einer zu einer anderen 
Programmiersprache einfach.

Und ja, mit Javascript+HTML kann man Desktop und Händie-Apps erstellen 
(-> Electron, cordova, ...)

Man kann neuronale Netze trainieren (deeplearn.js/tensorflow.js)

Man kann IOT-Sachen ansteuern (über MQTT, Websocket, XHR, ...)

Man kann sogar µC damit programmieren (https://www.espruino.com/)

: Bearbeitet durch User
von Pandur S. (jetztnicht)


Lesenswert?

HTML, CSS, Javascript, usw sind Websprachen, optimiert zur Darstellung. 
Die grad genannten sind nicht entweder-oder, sondern zwingend UND. Es 
gibt allerdings auch Erweiterungen, im Sinne von Libraries, die eine 
Kommunikation mit einem Serialport erlauben. Dazu muesste man zu den 
Libraries noch AJAX koennen. Dieses Alles wuerd ich mir aber nicht aufs 
Mal antun wollen.

Dann besser die Webseite grad auf dem Controller generieren. Obwohl, 
dann ist man ja auch wieder bei den Websprachen.

Ein Programmablauf einer Websprache ist allerdings sehr verschieden zu 
einem Programmablauf auf einem PC oder sonstigen computer.

von Ein Gast (Gast)


Lesenswert?

Εrnst B. schrieb:
> Wenn du programmieren kannst, ist der Wechsel von einer zu einer anderen
> Programmiersprache einfach.
>
> Und ja, mit Javascript+HTML kann man Desktop und Händie-Apps erstellen
> (-> Electron, cordova, ...)

Hallo und Danke für die Antworten :)

Also würdet ihr mir im allgemeinen schon raten die genannte Kombination 
aus HTML, CSS, Javascript und ggf. Ajax zu lernen, anstatt mich mit der 
Java-Programmierung auseinander zu setzen?

Das der Ablauf verschieden zu dem Programmablauf auf dem PC ist, wäre 
für mich vorerst kein Hindernis. Da ich so oder so eine neue 
"Programmier-Denkweise" lernen müsste. Bei Java halt die 
Objektorientierung und bei HTML & co. den Web-Aspekt.

Bin weiterhin dankbar für Antworten :)

VG
Ein Gast

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

HTML/CSS sind keine Programmiersprachen, sie dienen zur Beschreibung
einer Seite zur Anzeige im Browser.

Ansonsten: C. Ich wühle mich gerade in C++ rein und fühle mich wie
in den Mühlen der deutschen Bürokratie ...

von M.K. B. (mkbit)


Lesenswert?

Aus meiner Erfahrung würde ich dir zu einem Webinterface als Oberfläche 
raten. Es läuft in allen Browsern und damit z.B. auch einfach auf einem 
Tablet. Du kannst es problemlos über LAN/WLAN verteilen und über VPN 
sogar übers Netz. Die Protokolle sind schon da, es ist also einfacher, 
als selbst etwas auf TCP/IP auszubauen.
Damit bist du automatisch bei HCJ.

Jetzt braucht man noch eine Gegenstelle, die die statischen Dateien der 
Webseite ausliefert und eine dynamische Schnittstelle für die 
Steuerbefehle/Abfragen bietet. Diese würden dann auf deinem 
Steuerrechner als Server laufen. Hier kann man im Prinzip jede Sprache 
verwenden, aber auch hier kann man JavaScript verwenden (node.js) und 
muss damit nicht noch eine weitere Sprache lernen. Ernst hatte ja hier 
eine paar Bibliotheken genannt.

Selbst wenn du direkt am Steuerrechner arbeiten willst, kannst du auch 
dort einfach mit dem Browser auf localhost zugreifen.

Nachdem du ja in C Programmieren kannst, würde ich an deiner Stelle mal 
ein JavaScript Tutorial machen. Von der Logik sind die Sprachen gar 
nicht so unterschiedlich, aber in JavaScript macht man es doch meistens 
etwas anders. Außerdem kommt dann noch die Verknüpfung mit dem HTML 
Dokument Baum dazu.
Kleine Testprojekte kann du auch immer lokal im Browser machen, die 
haben in den Entwicklertools auch mittlerweile gute Debugger für 
JavaScript.
Erst wenn du dich dort gut eingearbeitet hast, dann würde ich mich um 
den Serverteil mit JavaScript kümmern.

Für mein bisher einziges ernsthaftes Projekt habe ich das express 
Framework für den Server und React für das Frontend zusammen mit npm 
benutzt. Man kann das auch alles selbst machen, aber mittlerweile würde 
ich dort immer ein Framework einsetzen, außer das Projekt soll 
garantiert nie fertig werden (macht ja auch Spaß :-) ).

von Wühlhase (Gast)


Lesenswert?

Ich würde dir auf jeden Fall raten, ein Buch aus der 
Von-Kopf-Bis-Fuß-Reihe zu lesen. Es gibt sowohl für JavaScript, HTML und 
CSS, HTML5 sowie Java ein Buch aus der Reihe.
Solltest du dich für Java entscheiden würde ich dir auch dringend 
Entwurfsmuster von Kopf bis Fuß dazu empfehlen.

von Jobst Q. (joquis)


Lesenswert?

Ein Gast schrieb:
> Ich bin Elektrotechnik-Ingenieur und befasse mich beruflich und auch
> privat mit der Entwicklung von eingebetteten Systemen und der
> hardwarenahen Programmierung. Hierfür nutze ich entsprechend C als
> Sprache der Wahl.
>
> Da ich privat beginne meine entworfenen Lichtansteuerungen und Sensoren
> über Funk (Bluetooth/WLAN) vernetzen zu wollen (Stichwort Home
> Automation), dachte ich mir dass es sinnvoll wäre eine zweite
> Programmiersprache zu lernen.

Auf dem Gerät, das die Hardware anspricht, würde ich bei C bleiben.

Für die Bedienung ist allerdings ein Webinterface ideal. Damit eignet 
sich dann jedes Gerät mit Browser( also PC, Tablet oder Smartphone) als 
Kontroll- und Bedienelement.

Ich würde dir also empfehlen, dich mit HTML, CSS und Javascript zu 
beschäftigen. Mit C kannst du dann Programme schreiben, die diese 
Dateien generieren und die Eingaben auswerten. So etwas mache ich gerade 
für eine Messwerterfassung und Steuerung auf einem "headless" Raspi.

von Heinz B. (Firma: Privat) (hbrill)


Lesenswert?

Vielleicht ist auch das für dich interessant :

https://www.b4x.com/b4j.html

Läuft zwar auch auf JAVA raus, man hat aber viele
Libraries (Serial, Bluethooth, usw.) schon dabei.

von Robert P. (Firma: Hochschule Hannover) (profrp)


Lesenswert?

Als Ausbilder von (angehenden) Ingenieuren stellen wir uns fast jedes 
Semester erneut die Frage, was wir den Studenten aufgrund neuer 
Entwicklungen als "wichtige" Technik beibringen sollen. Dabei nimmt oft 
die Verunsicherung mit der Tiefe der Recherche zu, denn die Marktmacht 
großer Konzerne (Google, Amazon, etc.) setzt Trends und sie stellen 
entsprechende Möglichkeiten zur Teilnahme bereit. Hier können/dürfen wir 
allerdings nicht kritiklos solchen Trends folgen.

Die Sprache C wird an der Hochschule Hannover (Elektro- und 
Informationstechnik) bereits im ersten Semester gelehrt. Für das 5./6. 
Semester bieten wir in der Vertiefungsrichtumg "Elektronik" Labore zur 
Anwendung von Mikrocontrollern an, die sich zum großen Teil an der 
Arduino-Umgebung orientieren und damit auf C/C++ aufsetzen. Es wird 
allerdings nicht verlangt, C++ zu beherrschen, sondern die Möglichkeiten 
der GNU-Compiler (IDE ist Eclipse) zu nutzen, mit C anzufangen und 
schrittweise (bei Bedarf) auf C++ zu erweitern. Da fängt man zunächst 
mit einfachen Klassen an und lernt in kleinen Schritten (learning by 
doing) dazu.

Gelehrt wird ebenfalls das Zusammenspiel netzwerkfähiger Geräte 
(Mikrocontroller mit LAN/WLAN, Smartphones, Tablets, etc.) für sog. 
cyber-physische Systeme und das Internet der Dinge, wobei konkrete 
Anwendungen auch die Heimautomatisierung betreffen. Hier wird Android 
Studio zur Entwicklung von APPs eingesetzt, was im Regelfall die Sprache 
Java voraussetzt (Möglichkeiten zur Nutzung von C/C++ für APPs werden 
gerade recherchiert). In den entsprechenden Laboren wird allerdings Java 
auch nicht vorausgesetzt, sondern es werden von den Studenten lauffähige 
Beispielprogramme (identische Anwendungen in C/C++ für MC und in Java 
für APPs zum Vergleich) für eigene Anwendungen erweitert.
Man muss hier einfach den Umstand berücksichtigen, dass zum Verstehen 
und Anwenden der vielfältigen (grafischen) Objekte aus der 
Android-Umgebung ein deutlich höherer Aufwand erforderlich ist, als zum 
Erlernen der Sprache Java selbst.

So gesehen kommen unsere Absolventen (Elektronik) also bez. der 
Programmiersprachen mit den Schwerpunkten C/C++ und Java ins 
Berufsleben.
Für typische Web-Server stehen ihnen bei den Laboren entsprechende 
Bibliotheken in den beiden Sprachen zur Verfügung. In diesem Rahmen 
kommen sie auch mit PHP in Berührung, basierend auf den Umgebungen LAMP 
(Linux) und XAMPP (Windows).

Damit stellen wir gewissermaßen die Grundlagen zur Verfügung, um bei dem 
Megatrend "Digitalisierung" mit ausreichend Know-how eigene Konzepte 
entwickeln zu können und nicht von irgendwelchen Trends abhängig zu 
sein.

Für die praktische Anwendung ist es wichtig, einige grundlegende 
Randbedingungen festzulegen, "bevor" man sich für eine Technologie 
entscheidet. Weil man sonst oft gar nicht mehr zurück kann und viele 
Kröten schlucken muss, die sich erst später offenbaren.

Dazu ein paar Hinweise (für Ingenieure, die selbst Geräte 
programmieren):
- Soll meine Anwendung vom Internet abhängig sein oder auch ohne 
funktionieren?
- Will ich von Herstellern unabhängig sein?
- Soll die Anlage dezentral arbeiten (ohne Basis-Station)?
- Sollen meine Geräte auch autark arbeiten (Grundfunktionalität)?
- Will ich nur eine Fernsteuerung von Geräten oder mehr (intelligente 
Geräte)?
- etc.

Wenn man also erst das Konzept seiner Anlage (z.B. Heimautomatisierung) 
und die zugehörigen Randbedingungen definiert und dann nach den 
technischen Möglichkeiten recherchiert, ist das Tohuwabohu um die 
Technologien schnell eingegrenzt.

von M.K. B. (mkbit)


Lesenswert?

Jobst Q. schrieb:
> Auf dem Gerät, das die Hardware anspricht, würde ich bei C bleiben.

Das würde ich pauschal nicht so sehen.

Handelt es sich dabei um einen Bare-Metal Controller, dann ja.
Sobald es aber eine besserer Rechner (z.B. Raspberry Pi) ist, würde ich 
eine höhere Sprache verwenden (Python, JavaScript, Java). Nach meiner 
Erfahrung kommt man damit schneller zum Ergebnis, weil man sich seine 
Logik aus verschiedenen Bibliotheken zusammenbauen kann und damit 
schneller zum Ziel kommt.
Der Umstieg dahin ist allerdings erstmal anstregend. Ich fand zum 
Beispiel Python am Anfang schwierig, weil das ganze nicht so richtig mit 
den mir aus C bekannten Konzepten zusammenpasste.

von Jobst Q. (joquis)


Lesenswert?

M.K. B. schrieb:
> Jobst Q. schrieb:
>> Auf dem Gerät, das die Hardware anspricht, würde ich bei C bleiben.
>
> Das würde ich pauschal nicht so sehen.
>
> Handelt es sich dabei um einen Bare-Metal Controller, dann ja.
> Sobald es aber eine besserer Rechner (z.B. Raspberry Pi) ist, würde ich
> eine höhere Sprache verwenden (Python, JavaScript, Java).

Das war auch nicht pauschal gemeint, sondern als Rat für den 
Fragesteller, bei dem ich davon ausgehe, dass er C beherrscht, andere 
Sprachen aber noch nicht.

Es geht um den Lernaufwand und den Bezug zum Nutzen. Ein Webinterface 
mit HTML,CSS und Javascript ist auf jeden Fall vielseitiger,unabhängiger 
und zukunftssicherer als spezielle APPs, die man mit Java erstellen 
könnte.

Solche Dateien mit C zu erzeugen, hat keine solche Komplexität, dass 
Java oder Python große Vorteile bringen würden. Im wesentlichen ist es 
eine Aneinanderreihung von fprintf-Aufrufen.

von Ein Gast (Gast)


Lesenswert?

Hallo zusammen und erneut vielen Dank für die vielen und ausführlichen 
Antworten :)

Kurz zu dem Punkt mit der Programmiersprache für die Hardware:
Hier möchte ich eigentlich auf jedenfall bei C bleiben. Da ich besonder 
überwiegend mit den "Bare-Metal"-Controllern arbeite bietet sich C 
einfach ideal an :)
@Robert Patzke
So ähnlich sah mein Grundlagenstudium auch aus, nur dass nach der 
C-Programmierung und der Mikrocontroller der Fokus mehr in Richtung 
Hardware und nicht auf die möglichen Kommunikationsmöglichkeiten gelegt 
wurde. Demnach kam ich auch nicht mit den objektorientierten 
Programmiersprachen in Berührung.

Daher soll die 2. Sprache/Sprachen mir lediglich die Möglichkeit geben 
auch mal eigenständige Software-Applikationen bspw. für Neuronale Netzte 
zu schreiben, oder halt Programme und Interfaces mit welchen ich über 
die zahlreichen Schnittstellen mit den Controllern kommunizieren kann.

Als grobes Beispiel vielleicht ein STM Mikrocontroller welcher 
verschiedene Sensoren ausliest und LEDs ansteuern kann. Dieser wird 
mittels eines ESP-Boards in ein WLAN Netzwerk oder mittels eines 
seriellen USB ComPorts mit dem Desktop-PC verbunden auf welchem wiederum 
ein Programm läuft womit man verschiedene Parameter ändern, Werte 
auslesen/einspeisen kann oder Funktionsgruppen festlegen welche dann 
alle eingefügten Sensormodule ansprechen.

Nach den bisherigen Beiträgen würde ich aktuell zu der 
HTML/CSS/JavaScript-Lösung tendieren da ich dort am flexibelsten 
aufgestellt zu sein schein.
Ich werd mir, wie von euch vorgeschlagen, in meiner freien Woche mal ein 
JavaScript und HTML Tutorial zu Gemüte führen.

Jetzt aber noch 2. Abschlussfragen:
1. Es hört sich so an als ob man alles was man aktuell in Java 
programmiert auch mit den entsprechenden HTML/CSS/JavaScript Frameworks 
realisieren könnte. Wo genau läge da dann noch der Vorteil Java zu 
lernen?

2. Welche Variante schätzt ihr mit mehr Gesamtaufwand ein bis man erste 
Prototypen und funktionsfähige Programme mittleren bis kleinen Umfangs 
realisieren kann? In Anbetracht der bereits bekannten 
Programmierkenntnisse in C.

Ich bedanke mich vorab und wünsche noch ein schönes Wochenende.

VG
Ein Gast

von Andi (Gast)


Lesenswert?

Ein Gast schrieb:
> Ich werd mir, wie von euch vorgeschlagen, in meiner freien Woche mal ein
> JavaScript und HTML Tutorial zu Gemüte führen.

Dann schau dir in dem Atemzug auch gleich das Trio
Typescript/NodeJS/AngularJS an.
Hat den Vorteil dass du sowohl am Server als auch am Client die gleiche 
Sprache hast.

> Jetzt aber noch 2. Abschlussfragen:
> 1. Es hört sich so an als ob man alles was man aktuell in Java
> programmiert auch mit den entsprechenden HTML/CSS/JavaScript Frameworks
> realisieren könnte. Wo genau läge da dann noch der Vorteil Java zu
> lernen?

Von C kommend? keiner ;)

Auch bei Java kommst du um das HTML/CSS-Gespann nicht herum. Bleibt also 
nur Java versus Javascript/Typescript in den Überlegungen übrig.

> 2. Welche Variante schätzt ihr mit mehr Gesamtaufwand ein bis man erste
> Prototypen und funktionsfähige Programme mittleren bis kleinen Umfangs
> realisieren kann? In Anbetracht der bereits bekannten
> Programmierkenntnisse in C.

Aus eigener Erfahrung ist der Umstieg auf Java deutlich heftiger zu 
bewältigen.

von Wühlhase (Gast)


Lesenswert?

Andi schrieb:
> Von C kommend? keiner ;)
Oh je, oh je...

Also ich fluche jedes Mal wenn ich in C was machen muß und wieder in 
diese beschissene prozedurale Denke rein muß. Objektorientiert 
programmiert es sich doch deutlich angenehmer.

von Sheeva P. (sheevaplug)


Lesenswert?

Wühlhase schrieb:
> Andi schrieb:
>> Von C kommend? keiner ;)
> Oh je, oh je...
>
> Also ich fluche jedes Mal wenn ich in C was machen muß und wieder in
> diese beschissene prozedurale Denke rein muß. Objektorientiert
> programmiert es sich doch deutlich angenehmer.

Auch in C kann man objektorientiert arbeiten. Es erfordert zwar 
wesentlich mehr Disziplin und einige Klimmzüge, aber es geht. 
Tatsächlich gilt, was in der OOP als Datenkapselung bezeichnet wird, 
auch in C als guter Stil.

von Wühlhase (Gast)


Lesenswert?

Das würde ich ja gerne mal sehen. OOP besteht auch, aber nicht nur, aus 
Datenkapselung.

von Karl Käfer (Gast)


Lesenswert?

Wühlhase schrieb:
> Das würde ich ja gerne mal sehen.

Dann schau Dir einfach GTK+ an.

> OOP besteht auch, aber nicht nur, aus Datenkapselung.

"OOP to me means only messaging, local retention and protection and 
hiding of state-process, and extreme LateBinding of all things." (Dr. 
Alan Kay)

Geht alles auch in C. Mal mehr, mal weniger aufwändig, und bei Weitem 
nicht so komfortabel wie in C++ und anderen Sprachen, die OOP direkt mit 
eigenen Sprachmitteln unterstützen, aber: es geht.

von ~Mercedes~ (Gast)


Lesenswert?

Karl Käfer wurde nicht gefragt... :-)

Wen es interessiert:

C im 21. Jahrhundert, O'reilly, von Ben Klemens
ISBN 978-3-95561-692-2

mfg

von Sheeva P. (sheevaplug)


Lesenswert?

~Mercedes~ schrieb:
> Karl Käfer wurde nicht gefragt... :-)
>
> Wen es interessiert:
>
> C im 21. Jahrhundert, O'reilly, von Ben Klemens
> ISBN 978-3-95561-692-2

Hab' die englischsprachige Version, sehr empfehlenswert. Das beschäftigt 
sich aber eher mit der Entwicklungsinfrastruktur und Werkzeugen und ist 
daher eher was für Leute die C schon können.

von Weinga U. (weinga-unity)


Lesenswert?

Hallo,

ich kann folgende Kombination wirklich empfehlen: C am Mikrocontroller, 
der Rest (nicht REST) mit JavaScript, HTML und CSS.

Dabei kann man mit node.js PC Anwendungen und Server mit JavaScript 
schreiben (auch mit Hardwareanbindung für fast alles, siehe npm).

Client (Browser) seitig dann auch JavaScript, HTML und CSS.

Ich habe vor ca. 2 Monaten vue.js und das quasarFramework gefunden. In 
Kombination kann man so extrem schnell professionelle 
Benutzeroberflächen erstellen. Wobei hier vue.js wirklich der Schlüssel 
zum Erfolg ist.

Natürlich sollte man sich auch mit AJAX, HTTP Requests, Proxies usw. 
auch beschäftigen.

Lg.

von Weinga U. (weinga-unity)


Lesenswert?

Hier noch einige Links dazu:

https://nodejs.org/en/
http://quasar-framework.org/
https://vuejs.org/

Minimal Demo: http://jsfiddle.net/yyx990803/vjvMp/1/
Todo Demo: https://jsfiddle.net/ayoisaiah/v4p20ekz/

Diagramme und Zeigerinstrumente:
https://ecomfe.github.io/echarts-examples/public/index.html


Achtung!!! Browser mögen es nicht, wenn nicht HTML Tags wie z.B. <q 
.../>
direkt mit /> beendet werden. Da muss man <q ...></q> schreiben. Diese 
Erkenntnis hat mich fast eine Woche gekostet!

von Wühlhase (Gast)


Lesenswert?

Karl Käfer schrieb:
> "OOP to me means only messaging, local retention and protection and
> hiding of state-process, and extreme LateBinding of all things." (Dr.
> Alan Kay)
>
> Geht alles auch in C. Mal mehr, mal weniger aufwändig, und bei Weitem
> nicht so komfortabel wie in C++ und anderen Sprachen, die OOP direkt mit
> eigenen Sprachmitteln unterstützen, aber: es geht.

Und was ist mit Vererbung? C kriegt die Beziehung "... ist eine Art von 
..." schlicht nicht hin, gerade damit werden viele Kniffe aber erst 
möglich (siehe Dekoratormuster).

Klar kann man in C etwas formulieren dessen Kompilat dem eines richtigen 
C++-Programms ähnelt, mit objektorientierter Programmieren hat das 
meines Erachtens aber nichts zu tun.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Wühlhase schrieb:
> Klar kann man in C etwas formulieren dessen Kompilat dem eines richtigen
> C++-Programms ähnelt, mit objektorientierter Programmieren hat das
> meines Erachtens aber nichts zu tun.

Muß es das ?

Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
Ich schmeiß den Kram noch an die Wand ... ;(

von Cyblord -. (Gast)


Lesenswert?

Joachim D. schrieb:
> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.

Nein. Es gibt durchaus einen Unterschied zwischen struct und class

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Abradolf L. schrieb:
> Joachim D. schrieb:
>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
>
> Nein. Es gibt durchaus einen Unterschied zwischen struct und class

Klar ... ;)

von Stefan F. (Gast)


Lesenswert?

Ich möchte ergänzen, dass Java (konkret OpenJDK und Oracle JDK) keine 
Funktionen zum Zugriff auf Hardware hat. Es gibt nur Bildschirm, 
Tastatur, Netzwerk und Filesystem.

Für alles Weitere, insbesondere serielle Ports, benötigt man zusätzliche 
Libraries die in C (!) geschrieben sind. Zum Beispiel RxTx 
(http://rxtx.qbang.org/wiki/index.php/Download).

Gleiches Gilt übrigens soweit ich weiß auch für Python, nur dass dort 
schon die Unterstützung einiger Hardware Schnittstellen im Lieferumfang 
enthalten sind. Bei Java ist das leider nicht der Fall.

Anders sieht es allerdings bei Android aus. Das Android SDK enthält Java 
Klassen für so ziemlich jede Funktion und Schnittstelle, die von Android 
Geräten bereit gestellt wird.

von Cyblord -. (Gast)


Lesenswert?

Joachim D. schrieb:
> Klar ... ;)

Doch, Stichwort Default Sichtbarkeit.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Abradolf L. schrieb:
> Joachim D. schrieb:
>> Klar ... ;)
>
> Doch, Stichwort Default Sichtbarkeit.

Ok, aber wozu ?

Ich habe mal mit Maschinencode/Assembler angefangen und bin
irgendwann bei C gelandet. Über teutsche Verwaltungsgläubigkeit
habe ich mich schon immer aufgeregt - jetzt C++. Oha !

Der Rechner soll das machen was ich will und der Compiler das
so übersetzen daß die Maschine es versteht. Da brauche ich
eigentlich keine 7 Durchschläge.

Ich habe jetzt 2 Tage damit verplempert damit mir G++ eine
SQLite Datenbank überhaupt mal anlegt, "Callback" hurra.
In C einfach, in C++ mache ich es auch so wie in C. Globale
Veriable damit ich im callback drankomme. Überall im WWW wird
von callback abgeraten und es werden teilweise wildeste
Konstruktionen als Ersatz dafür propagiert. Echt ein Fortschritt.

Grüße Joe.

PS: Ich bekomme das schon irgendwie hin ;)

von Sheeva P. (sheevaplug)


Lesenswert?

Wühlhase schrieb:
> Karl Käfer schrieb:
>> "OOP to me means only messaging, local retention and protection and
>> hiding of state-process, and extreme LateBinding of all things." (Dr.
>> Alan Kay)
>>
>> Geht alles auch in C. Mal mehr, mal weniger aufwändig, und bei Weitem
>> nicht so komfortabel wie in C++ und anderen Sprachen, die OOP direkt mit
>> eigenen Sprachmitteln unterstützen, aber: es geht.
>
> Und was ist mit Vererbung?

Das ist ein Feature vieler Implementierungen von OO, aber nach Dr. Alan 
Kay eben kein Kernbestandteil derselben. Auch Kristen Nygaard, der 
Schöpfer der ersten objektorientierten Programmiersprachen Simula 1 und 
Simula-67, bestand zeitlebens darauf "that some OOP could be done 
without inheritance". Nachdem die beiden die Väter dessen sind, was wir 
heute "objektorientiert" nennen -- der Eine der Technik, der Andere des 
Namens -- sind das IHMO die ultimativen Referenzen zu dieser Frage. ;-)

Andererseits ist so etwas wie Vererbung durchaus auch in C möglich, 
wenngleich... naja, urteile selbst [1]. ;-)

[1] 
https://www.codeproject.com/Articles/108830/Inheritance-and-Polymorphism-in-C

von Sheeva P. (sheevaplug)


Lesenswert?

Joachim D. schrieb:
> Ich schmeiß den Kram noch an die Wand ... ;(

Wo hakt es denn, wenn ich fragen darf?

von Sheeva P. (sheevaplug)


Lesenswert?

Stefanus F. schrieb:
> Ich möchte ergänzen, dass Java (konkret OpenJDK und Oracle JDK) keine
> Funktionen zum Zugriff auf Hardware hat. Es gibt nur Bildschirm,
> Tastatur, Netzwerk und Filesystem.
>
> Für alles Weitere, insbesondere serielle Ports, benötigt man zusätzliche
> Libraries die in C (!) geschrieben sind. Zum Beispiel RxTx
> (http://rxtx.qbang.org/wiki/index.php/Download).
>
> Gleiches Gilt übrigens soweit ich weiß auch für Python, nur dass dort
> schon die Unterstützung einiger Hardware Schnittstellen im Lieferumfang
> enthalten sind. Bei Java ist das leider nicht der Fall.
>
> Anders sieht es allerdings bei Android aus. Das Android SDK enthält Java
> Klassen für so ziemlich jede Funktion und Schnittstelle, die von Android
> Geräten bereit gestellt wird.

Entschuldige bitte, aber die Standardinterpreter von Python und Java 
sind selbst in C bzw. C++ geschrieben -- und nutzen ausgiebig das 
Konzept der Shared Objects (*.so) oder Dynamic Link Libraries (*.dll):
1
sheeva@plug:~$ file /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
2
/usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java: ELF 64-bit LSB executable
3
[...]
4
sheeva@plug:~$ ldd /usr/lib/jvm/java-8-openjdk-amd64/jre/bin/java
5
        linux-vdso.so.1 =>  (0x00007ffe397ab000)
6
[...]
7
sheeva@plug:~$ file /usr/bin/python2.7
8
/usr/bin/python2.7: ELF 64-bit LSB executable, x86-64, [...]
9
sheeva@plug:~$ ldd /usr/bin/python2.7
10
        linux-vdso.so.1 =>  (0x00007fffa158d000)
11
        libpthread.so.0 => /lib/x86_64-linux-gnu/libpthread.so.0 
12
[...]

Insofern verstehe ich ehrlich gesagt nicht, was Dein Punkt ist. Tatsache 
ist: das Java Native Interface (JNI) und die C-Schnittstellen von Python 
existieren und werden nicht nur für Hardwarezugriffe vielfältig genutzt. 
Tatsache ist auch, daß der Code egal ob in Java oder in Python irgendwie 
nativ auf der CPU ausgeführt werden muß, und solange es keine Java- oder 
Python-Implementierung in Hardware gibt, sind die Interpreter nun einmal 
darauf angewiesen, daß der native Code irgendwoher kommt -- der fällt ja 
leider nicht vom Himmel.

von Sheeva P. (sheevaplug)


Lesenswert?

Joachim D. schrieb:
> Ich habe jetzt 2 Tage damit verplempert damit mir G++ eine
> SQLite Datenbank überhaupt mal anlegt, "Callback" hurra.

Entschuldige, aber glaubst Du wirklich, daß das der Richtige Weg (tm) 
ist, eine neue Programmiersprache mit einem neuen Paradigma zu lernen? 
Tut mir leid, aber wenn Datenbankprogrammierung das Erste ist, was Du in 
C++ machst, wundert es mich kein bisschen, wenn das frustrierend ist. 
Dies nicht zuletzt auch, weil SqLite meines Wissens gar keine C++-API 
hat und stattdessen auch für C++ die vorhandene C-API empfiehlt.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Ich will ein Programm schreiben das funktioniert. C++
ist da ein sehr steiniger Weg ...

Heraus kommt eh Maschinencode, egal wie. Brauch ich dazu
unbedingt ein "Paradigma" ?

Ich bekomme das schon noch raus. C lernt man auch nicht
in einem Tag ;)

von Stefan F. (Gast)


Lesenswert?

Wer in Java auf dem PC hardware nah programmieren möchte muss sich eher 
früher als später mit C und dem JNI beschäftigen. Deswegen ist es keine 
Zeitverschwendung, mit C anzufamgen.

von Sheeva P. (sheevaplug)


Lesenswert?

Joachim D. schrieb:
> Ich will ein Programm schreiben das funktioniert. C++
> ist da ein sehr steiniger Weg ...

Nein, überhaupt nicht. Man muß es nur erst einmal lernen.

> Heraus kommt eh Maschinencode, egal wie. Brauch ich dazu
> unbedingt ein "Paradigma" ?

Ja, unbedingt. Dieses andere Paradigma ist der Schlüssel zur OOP.

> Ich bekomme das schon noch raus. C lernt man auch nicht
> in einem Tag ;)

Richtig -- und auch in C fängt man üblicherweise erst einmal an mit 
einem "Hello World!\n" und tastet sich dann weiter voran. Wer sich als 
erstes Programm in C gleich einen Datenbank-Client vornimmt, wird eine 
ähnliche Frustration erleben wie Du; bei manchen mündet diese 
Frustration sogar in eine grundsätzliche Abneigung gegen die Sprache. 
Dabei hat das gar nichts mit der Sprache zu tun, sondern nur mit einer 
Herangehensweise, die in zu kurzer Zeit zu viel erreichen will.

Kurz gesagt, überforderst Du Dich selbst. Das kann und wird auf die eine 
oder andere Weise schief gehen: entweder gibst Du früher oder später 
auf, oder Du wirst die Sprache nicht richtig lernen und darum niemals 
richtig sicher, flüssig, produktiv und glücklich damit.

Nix für ungut, nur so ein Tipp.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Sheeva P. schrieb:
> Kurz gesagt, überforderst Du Dich selbst. Das kann und wird auf die eine
> oder andere Weise schief gehen: entweder gibst Du früher oder später
> auf, oder Du wirst die Sprache nicht richtig lernen und darum niemals
> richtig sicher, flüssig, produktiv und glücklich damit.

Nein. Das wird funktionieren, es wird ein Mailproxy.
Das meiste funktioniert schon.

von M.K. B. (mkbit)


Lesenswert?

Joachim D. schrieb:
> In C einfach, in C++ mache ich es auch so wie in C. Globale
> Veriable damit ich im callback drankomme. Überall im WWW wird
> von callback abgeraten und es werden teilweise wildeste
> Konstruktionen als Ersatz dafür propagiert. Echt ein Fortschritt.

Ich kann verstehen, dass man mit der Einstellung von C in anderen 
Sprachen aneckt. Meiner Meinung nach fehlt dann aber die Bereitschaft 
oder auch Zeit sich mit dem Ansatz der anderen Sprache vertraut zu 
machen.
Zugegeben ist es am Anfang frustrierend, aber ich fand es am Ende echt 
interessant, wenn man feststellt, dass man ein Problem je nach Sprache 
anders und damit leichter oder schwieriger lösen kann.

Für mich war z.B. am Anfang Python exotisch und sobald man versucht 
etwas wie in C zu machen wird es kompliziert. Hat man aber die 
Grundideen der Sprache besser verstanden, dann geht es ohne Probleme und 
manchmal sogar einfacher.

Dein Beispiel würde ich dann sogar als Vorteil vom C -> C++ Umstieg 
sehen. Man kann Sachen erst mal so machen, wie man es von C gewöhnt ist 
und nach und nach neue Sachen in C++ ausprobieren und den alten C Code 
weiter nutzen.

von Sheeva P. (sheevaplug)


Lesenswert?

Stefanus F. schrieb:
> Wer in Java auf dem PC hardware nah programmieren möchte muss sich eher
> früher als später mit C und dem JNI beschäftigen. Deswegen ist es keine
> Zeitverschwendung, mit C anzufamgen.

Jetzt geht es nur noch um Java, früher auch um Python. Ok, Python hat in 
der Boost-Sammlung natürlich Boost.Python, mit dem man C++-Binaries 
einfach in Python einbinden kann -- während Javas JNI zwar primär auf C 
zielt, aber auch mit C++ bedient werden kann.

Ich wiederhole mich nicht gerne, aber: Was ist Dein Punkt?

von Sheeva P. (sheevaplug)


Lesenswert?

Joachim D. schrieb:
> Das wird funktionieren, es wird ein Mailproxy.

Mit SqLite? Spannend. Wie handhabst Du denn da die Gleichzeitigkeit?

von Sheeva P. (sheevaplug)


Lesenswert?

Joachim D. schrieb:
> Sheeva P. schrieb:
>> Kurz gesagt, überforderst Du Dich selbst. Das kann und wird auf die eine
>> oder andere Weise schief gehen: entweder gibst Du früher oder später
>> auf, oder Du wirst die Sprache nicht richtig lernen und darum niemals
>> richtig sicher, flüssig, produktiv und glücklich damit.
>
> Nein. Das wird funktionieren, es wird ein Mailproxy.
> Das meiste funktioniert schon.

Wenn ich keine Ohren hätte, würde ich jetzt rundum grinsen. ;-)

Sorry, aber: daß Du einen C++-Compiler benutzt, bedeutet leider nicht, 
daß Du tatsächlich auch OO-Code in C++ schreibst.

Das war übrigens in den Anfangszeiten von C++ ein besonders "Problem": 
die alten C-Entwickler haben im Prinzip immer noch in C entwickelt, und 
das war dann aus deren Sicht C++-Code, weil sie zum Übersetzen einen 
C++-Compiler benutzt haben.

von Wilhelm M. (wimalopaan)


Lesenswert?

Joachim D. schrieb:

> Ich habe jetzt 2 Tage damit verplempert damit mir G++ eine
> SQLite Datenbank überhaupt mal anlegt, "Callback" hurra.

Der g++ legt die Datenbank genauso wenig an wie der gcc. Vielleicht hast 
Du neben OO in C++ auch das Compilationsmodell nicht verstanden?

von Stefan F. (Gast)


Lesenswert?

> Nein. Das wird funktionieren, es wird ein Mailproxy.
> Das meiste funktioniert schon.

Das sollte ein Witz sein, oder?

Ich glaube, die Ironie in diesem Beitrag war nicht deutlich genug 
erkennbar. Außerdem wirkt es so, als ob du der TO (Ein Gast) wärst.

von Wühlhase (Gast)


Lesenswert?

@Sheeva:
Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre 
Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu 
ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk 
der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte 
fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil 
aus. Zumindest bei heutigen Anwendungen.

von Wühlhase (Gast)


Lesenswert?

Joachim D. schrieb:
> Wühlhase schrieb:
>> Klar kann man in C etwas formulieren dessen Kompilat dem eines richtigen
>> C++-Programms ähnelt, mit objektorientierter Programmieren hat das
>> meines Erachtens aber nichts zu tun.
>
> Muß es das ?
>
> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
Structs und Klassen sind nicht annähernd dasselbe.

Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von 
primitiven Datentypen. Mehr als Datenhalten können die nicht.

Klassen beinhalten keine Daten (zumindest ist das nicht ihr Hauptzweck), 
sondern bilden ein Verhalten nach. Dafür sind zwar auch interne 
Variablen nötig, irgendwie müssen die Zustandswerte ja gespeichert 
werden (und deshalb kann man die auch vor der Öffentlichkeit verbergen).

Du solltest wirklich mal ein Buch über OOP lesen nicht nur über C++ als 
reine Sprache. In letzteren steht zwar wie man eine Klasse definiert und 
das man was public und private machen kann, wozu das aber gut sein soll 
wird eher in ersteren dargestellt.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Ich hebe jetzt Zug für Zug erstmal alles auf C++ um und
lasse mir Zeit. Die ersten 2 Wochen C waren sehr viel schlimmer
(da war der PC einige Male kurz vor dem Flug durchs offene
Fenster).

Kriterien, was ich in eine Klasse packen kann und wo es Sinn
macht werden sich ergeben. Vielleicht wird das Leben dann
einfacher ;)

Alles braucht seine Zeit ...

von Vincent H. (vinci)


Lesenswert?

Wühlhase schrieb:
> @Sheeva:
> Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre
> Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu
> ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk
> der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte
> fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil
> aus. Zumindest bei heutigen Anwendungen.

Das besagte Buch der GoF ist bald 25 Jahre alt. Vieles was man heute 
Vererbung vorziehen würde gabs damals schlichtweg nicht. Lambdas, 
Type-Erasure und TMP zum Beispiel...

Ein meiner Ansicht nach recht großes Problem ist, dass man C++ noch 
lehrt wie vor 25 Jahren. Auch die Beispiele im Internet sind voll davon.

"Sie erstellen eine Klasse für ein Moped und einen Kampfpanzer. Beide 
Klassen Erben von der Klasse der Dieselfahrzeuge, welche wiederrum von 
der Klasse der Landfahrzeuge erbt, die von der Klasse Fahrzeug erbt."

Und dabei wollte man eigentlich nur die "fahr()" Funktion für Moped und 
Panzer aufrufen...

Interessant diesbezüglich ist übrigens folgender Talk:
https://www.infoq.com/presentations/gof-patterns-c-plus-plus-boost



Wühlhase schrieb:
> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von
> primitiven Datentypen. Mehr als Datenhalten können die nicht.

Das is maximal eine von dir erdachte Sichtweise. Mit der Realität hat 
das aber nix zu tun.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

C++ Beispiele gibt es im Weltweiten säckeweise. Ist aber
anscheinend so wie be Computerbüchern: Einer schreibt vom
andern ab, leider incl. der Fehler.

von Ein Gast (Gast)


Lesenswert?

Hallo zusammen :)

Ich bedanke mich nochmal für die hilfreichen Antworten und werde mich in 
den nächsten Wochen mit HTML, CSS & Javascript beschäftigen.

Da sich hier so langsam ein Eigenleben entwickelt, möchte ich mich an 
dieser Stelle ausklinken.

Es hat mich gefreut so schnell konstruktive Antworten bekommen zu haben 
:)

Ich wünsche allen noch eine schöne Restwoche.

VG
Ein Gast

@weinga-unity
Danke für die Links ich hab sie mir für später schon mal abgespeichert 
:)

von Wilhelm M. (wimalopaan)


Lesenswert?

Wühlhase schrieb:

>>
>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
> Structs und Klassen sind nicht annähernd dasselbe.
>
> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von
> primitiven Datentypen. Mehr als Datenhalten können die nicht.

struct und class unterscheiden sich nur durch die 
default-access-specifier: ein struct ist eine all-public class.

Mit beidem definiert man Datentypen (im Sinne eines ADT): 
user-defined-types (UDT). Und C++ hat ja die nette Eigenschaft, 
primitive DT und UDT (fast) gleich zu behandeln (einer der Unterschiede 
ist die default-initialisation). Und das wiederum ist die Grundlage für 
die Effektivität von templates.

: Bearbeitet durch User
von Nop (Gast)


Lesenswert?

Wühlhase schrieb:

> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von
> primitiven Datentypen. Mehr als Datenhalten können die nicht.

Sicher können sie - Funktionszeiger kann man da auch unterbringen. So 
ein OOP in C hab ich auch schon embedded gesehen. Im Linuxkernel wird 
auf diese Weise ebenfalls OOP in C gemacht.

Was allerdings nicht geht:
- RAII, aber das nimmt man embedded eh selten, weil dynamische 
Allokation an sich ungünstig ist
- Zugriffsrechte (public / private).

von Wilhelm M. (wimalopaan)


Lesenswert?

Nop schrieb:
> Wühlhase schrieb:
>
>> Structs sind einfach nur selbstdefinierte Datentypen bzw. Bündel von
>> primitiven Datentypen. Mehr als Datenhalten können die nicht.
>
> Sicher können sie - Funktionszeiger kann man da auch unterbringen. So
> ein OOP in C hab ich auch schon embedded gesehen. Im Linuxkernel wird
> auf diese Weise ebenfalls OOP in C gemacht.

So wie ich ihn verstanden hatte, meinte er C++.

> Was allerdings nicht geht:
> - RAII, aber das nimmt man embedded eh selten, weil dynamische
> Allokation an sich ungünstig ist
> - Zugriffsrechte (public / private).

Selbstverständlich geht das.

Die Unterschiede zwischen class und struct:

Member:
struct: default public
class: default private

Vererbung:
struct: default public
class: default private

template-Präambel:
für template-type-parameter und template-template-parameter kein struct 
als keyword möglich, wohl aber class oder typename

: Bearbeitet durch User
von Wühlhase (Gast)


Lesenswert?

Nein, ich meinte schon C, mit C++ hab ich mich noch nie befasst. Das man 
Funktionszeiger in Structs unterbringen kann hab ich völlig vergessen. 
Liegt wohl daran, daß ich in C nie einen Funktionszeiger genutzt habe.

Es scheint in C wirklich deutlich mehr in Richtung OOP zu gehen als ich 
dachte-aber ich bin dennoch froh, andere Sprachen wie Java dafür zu 
haben. Immerhin, wieder was gelernt. Danke. :)

von Stefan F. (Gast)


Lesenswert?

> Es scheint in C wirklich deutlich mehr in Richtung OOP zu gehen

Der Umgang mit Files (z.B. bei fprintf()) ist auch ein 
Objektorientierter Ansatz in C.

Man hat Funktionen, die für Files geschrieben wurden. Und ihnen übergibt 
man als ersten Parameter das File. In diesem Fall könnte man die 
Struktur auch Objekt nennen.

von Nop (Gast)


Lesenswert?

Wilhelm M. schrieb:

> Selbstverständlich geht das.

Und wie macht man das in C, daß man die Sichtbarkeit in structs auf 
private bekommt? Und wie geht RAII in C-Structs?

von Wilhelm M. (wimalopaan)


Lesenswert?

Wühlhase schrieb:
> Nein, ich meinte schon C, mit C++ hab ich mich noch nie befasst. Das man
> Funktionszeiger in Structs unterbringen kann hab ich völlig vergessen.

Das war für mich nicht zu erkennen, denn der Kontext war:


>> Ich lerne gerade C++, struct nennt sich halt jetzt Klasse.
> Structs und Klassen sind nicht annähernd dasselbe.

Und dann kam noch jemand mit RAII. Daher nahm ich an, es gehe um C++.

von Wilhelm M. (wimalopaan)


Lesenswert?

Nop schrieb:
> Wilhelm M. schrieb:
>
>> Selbstverständlich geht das.
>
> Und wie macht man das in C, daß man die Sichtbarkeit in structs auf
> private bekommt? Und wie geht RAII in C-Structs?

Man übersetzt sein C-Quelle mit einem C++-Compiler ;-)

von Sheeva P. (sheevaplug)


Lesenswert?

Wühlhase schrieb:
> @Sheeva:
> Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre
> Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu
> ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk
> der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte
> fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil
> aus. Zumindest bei heutigen Anwendungen.

Die GoF hat "nur" einige Muster beschrieben, wie man die OO mit den 
Mitteln der verfügbaren Werkzeuge für bestimmte Standardsituationen 
nutzen kann. Daß die meisten verfügbaren OO-Werkzeuge die Vererbung 
unterstützen -- ich kenne jedenfalls keines, das das nicht tut -- führt 
dann im Umkehrschluß dazu, daß die GoF dieses Feature in ihren Patterns 
eben auch benutzen. Darin sehe ich keinen Widerspruch zu den Aussagen 
der Väter der OO, die die Vererbung eben nicht für zwingend notwendig 
halten.

von Sheeva P. (sheevaplug)


Lesenswert?

Wühlhase schrieb:
> Klassen beinhalten keine Daten (zumindest ist das nicht ihr Hauptzweck),
> sondern bilden ein Verhalten nach.

Hm... ich würde eher sagen, daß Klassen letztlich sowohl Zustände 
abbilden als auch das Verhalten, das diese Zustände ändert.

von Wilhelm M. (wimalopaan)


Lesenswert?

Stefanus F. schrieb:
>> Es scheint in C wirklich deutlich mehr in Richtung OOP zu gehen
>
> Der Umgang mit Files (z.B. bei fprintf()) ist auch ein
> Objektorientierter Ansatz in C.
>
> Man hat Funktionen, die für Files geschrieben wurden. Und ihnen übergibt
> man als ersten Parameter das File. In diesem Fall könnte man die
> Struktur auch Objekt nennen.

Ja, klar, so wird das ja letztlich auch von einem C++-Compiler 
realisiert: man hat einen versteckten this-Zeiger.

Allerdings kann man aus der Tatsache, dass man man mit C ein 
objektorientiertes Verhalten durch poor-man-Polymorphie nachbauen kann, 
noch nicht darauf schließen, dass C objektorientierte Sprachmerkmale 
hätte. Dann könnte man auch behaupten, dass Assembler objektorientierte 
Merkmale besäße. Denn schließlich kann man auch ein C++ Programm in ein 
reines C Programm überführen (der clang ++ hatte mal ein C-Backend).

: Bearbeitet durch User
von Wilhelm M. (wimalopaan)


Lesenswert?

Sheeva P. schrieb:
> Wühlhase schrieb:
>> @Sheeva:
>> Interessant. Ich will mir keinesfalls anmaßen den Vätern der OOP ihre
>> Kompetenz absprechen. Allerdings frag ich mich doch, wie die beiden zu
>> ihrer Einstellung kommen? Denn wie gesagt-ohne Vererbung würde vom Werk
>> der GoF nicht viel übrig bleiben, aber die Möglichkeit solche Konzepte
>> fahren zu können macht OOP doch zumindest zu einem beachtlichen Teil
>> aus. Zumindest bei heutigen Anwendungen.
>
> Die GoF hat "nur" einige Muster beschrieben, wie man die OO mit den
> Mitteln der verfügbaren Werkzeuge für bestimmte Standardsituationen
> nutzen kann. Daß die meisten verfügbaren OO-Werkzeuge die Vererbung
> unterstützen -- ich kenne jedenfalls keines, das das nicht tut -- führt
> dann im Umkehrschluß dazu, daß die GoF dieses Feature in ihren Patterns
> eben auch benutzen. Darin sehe ich keinen Widerspruch zu den Aussagen
> der Väter der OO, die die Vererbung eben nicht für zwingend notwendig
> halten.

Ich denke, es wäre wichtig, den Unterschied zwischen Polymorphie und 
Vererbung klar zu machen: normalerweise möchte man Typen polymorph 
benutzen, ob das mit Vererbung realisiert wird, ist nur ein Detail. 
Oder: ohne Vererbung wäre Polymorphie noch schöner. Z.B. führt Vererbung 
eben zu einer Koppelung der beteiligten Typen bzw. man schafft sich 
"unbeabsichtigte Datenstrukturen" durch die damit verbundene 
Referenz-Semantik.

Hier ein Talk von Bjarne, in dem er das high-level verdeutlicht (vor 
einem offensichtlich nicht so kundigem Auditorium):

Bjarne Stroustroup:
https://www.youtube.com/watch?v=xcpSLRpOMJM

Hier ein Talk von Sean, der das Problem im Detail erläutert:

Sean Parent:
https://www.youtube.com/watch?v=QGcVXgEVMJg

Mit concepts (ab g++-6.3 bzw. ab C++20) und templates wird die Bedeutung 
von Vererbung als Realisierungsdetail für Polymorphie weiter verringert 
werden.

: Bearbeitet durch User
von Wühlhase (Gast)


Lesenswert?

Wilhelm M. schrieb:
> Oder: ohne Vererbung wäre Polymorphie noch schöner. Z.B. führt Vererbung
> eben zu einer Koppelung der beteiligten Typen bzw. man schafft sich
> "unbeabsichtigte Datenstrukturen" durch die damit verbundene
> Referenz-Semantik.
Spielst du auf Mehrfachvererbung an (ich kann mir deine Videos gerade 
nicht anschauen), so daß man mehrere Vererbungsbäume in einer Klasse 
zusammenwürfeln kann?

Java unterstützt das nicht, da ist jede Klasse stets von der Art ihrer 
Superklasse. Wenn man zwei Klassen aus verschiedenen Vererbungsbäumen 
die gleiche Fähigkeit verleihen will gibt es dafür ein Interface und 
eine Methode kann prüfen, ob ein Objekt das Interface implementiert hat.

Das funktioniert zwar ähnlich wie Vererbung und bringt auch alle 
Vorteile mit, ist aber keine Vererbung im eigentlichen Sinne. Daher 
werden Interfaces auch meist als ...fähig (able) benamst um auszudrücken 
das es eine Zusatzfähigkeit ist. Z.B. das Interface runnable wird 
benutzt, wenn eine Klasse in einem eigenen Thread laufen soll.

Im o.g. Beispiel kann man in einer Klasse Schwimmpanzer, die man von der 
Superklasse Landfahrzeuge abgeleitet hat, das Interface 'schwimmfähig' 
implementieren. Das Ding ist nach wie vor ein Landfahrzeug-aber eben ein 
schwimmfähiges Landfahrzeug.
Eine Methode kann jetzt Objekte entgegennehmen, die schwimmfähig sind. 
Das kann auch ein Wasserflugzeug (von einer Art Luftfahrzeuge) sein, 
solange es eben das Interface 'schwimmfähig' implementiert.

Was ich damit sagen will: Das Problem von dem ich glaube daß du das 
meinst, hat weniger was mit Vererbung an sich, sondern eher mit der 
Implementierung derselben in der Sprache zu tun wobei ich allerdings 
nicht sicher bin, ob man bei Interfaces noch von Polymorphie im 
eigentlichen Sinne sprechen kann, denn mit einem Interface ist ein 
Objekt ja wieder typisiert.

Meines Erachtens einer der entscheidenden Unterschiede zwischen C++ und 
Java, wobei ich mir aber sicher bin das C++ da mittlerweile auch was in 
der Richtung anbietet. Die Mehrfachvererbung wird C++ aber wohl nicht 
mehr los, jedenfalls nicht ohne abwärtskompatibel zu bleiben. Oder irre 
ich da?

von Wilhelm M. (wimalopaan)


Lesenswert?

Wühlhase schrieb:
> Wilhelm M. schrieb:
>> Oder: ohne Vererbung wäre Polymorphie noch schöner. Z.B. führt Vererbung
>> eben zu einer Koppelung der beteiligten Typen bzw. man schafft sich
>> "unbeabsichtigte Datenstrukturen" durch die damit verbundene
>> Referenz-Semantik.
> Spielst du auf Mehrfachvererbung an (ich kann mir deine Videos gerade
> nicht anschauen), so daß man mehrere Vererbungsbäume in einer Klasse
> zusammenwürfeln kann?

Nein, hat damit gar nichts zu tun.

> Java unterstützt das nicht, da ist jede Klasse stets von der Art ihrer
> Superklasse. Wenn man zwei Klassen aus verschiedenen Vererbungsbäumen
> die gleiche Fähigkeit verleihen will gibt es dafür ein Interface und
> eine Methode kann prüfen, ob ein Objekt das Interface implementiert hat.

Naja, in Java hat man die Mehrfachvererbung kastriert: eine Basisklasse, 
viele Interfaces.

> Das funktioniert zwar ähnlich wie Vererbung

es ist im eigentlichen Sinne Vererbung, nur hat man dort Java gegenüber 
C++ mal wieder vereinfacht.

> und bringt auch alle
> Vorteile mit, ist aber keine Vererbung im eigentlichen Sinne. Daher
> werden Interfaces auch meist als ...fähig (able) benamst um auszudrücken

> Was ich damit sagen will: Das Problem von dem ich glaube daß du das
> meinst, hat weniger was mit Vererbung an sich, sondern eher mit der
> Implementierung derselben in der Sprache zu tun wobei ich allerdings
> nicht sicher bin, ob man bei Interfaces noch von Polymorphie im
> eigentlichen Sinne sprechen kann, denn mit einem Interface ist ein
> Objekt ja wieder typisiert.

Das Problem ist die Vererbung, da sie zu einer engen Koppelung der 
Klassen führt. Bei Java hat man die Notlösung eingebaut, dass alles 
implizit von Object erbt. Damit sind alle Klassen gekoppelt.

In C++ ist das nicht so: hat man fremde Klassen, so kann man sie nicht 
mehr einem Interface unterordnen. Man hat keine Möglichkeit, die enge 
Koppelung über eine Basisklasse (Interface) herzustellen. Und eigentlich 
will man diese enge Koppelung ja auch gar nur, man würde durch die 
Vererbung nur dazu gezwungen.

Aber eigentlich möchte man nur ausdrücken, dass zwei Klassen eine 
gemeinsame Eigenschaft besitzen, etwa eine Elementfunktion draw(...) 
besitzen. Dass kann man mit Vererbung machen, muss man aber nicht. Also 
ist Vererbung nur ein Weg, Polymorphie zu realisieren.

> Meines Erachtens einer der entscheidenden Unterschiede zwischen C++ und
> Java, wobei ich mir aber sicher bin das C++ da mittlerweile auch was in
> der Richtung anbietet.

Wie immer bietet C++ hier mehr an als Java. Ich verstehe nicht genau was 
Du meinst, aber natürlich gibt es in C++ Interfaces und abstrakte 
Klassen.

> Die Mehrfachvererbung wird C++ aber wohl nicht
> mehr los, jedenfalls nicht ohne abwärtskompatibel zu bleiben. Oder irre
> ich da?

Will man ja auch gar nicht, denn man braucht sie!

: Bearbeitet durch User
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.