C vor C++ ?



  • Der Beste Weg™, Programmierung zu erlernen, ist wahrscheinlich sehr individuell. Ich kann von meinen Erfahrungen erzählen, aber inwieweit es dir genauso erginge, wenn du den selben Weg nähmst, kann ich nicht beurteilen.

    Ich habe seinerzeit C vor C++ gelernt, und ich kann diesen Weg nicht empfehlen. Es hat lange gedauert, bis ich vernünftig C++ schreiben konnte -- vor allem deshalb, weil das Vorwissen in C mich glauben ließ, ich wüsste mehr, als ich tatsächlich wusste. Es ist leicht, in die "C++ ist nur eine C-Erweiterung"s-Falle zu tappen und seine eigene Lernresistenz auf diese Art künstlich zu erhöhen. Jetzt ist diese Problematik nicht spezifisch zwischen C und C++ - beispielsweise schreiben Leute, die von Java herkommen und Reflection gewohnt sind, in C++ gerne furchtbare dynamic_cast-Ungeheuer - aber sie ist hier besonders stark ausgeprägt, weil nahezu alles, was in C möglich ist, auch in C++ möglich, dort aber oft eine ausgesprochen dämliche Idee ist.

    Womöglich wäre es sinnvoll (an Meinungen hierzu bin ich sehr interessiert), die Sprachen auf der Lernliste weiter zu streuen. Ich denke dabei daran, mit Sprachen anzufangen, die eher akademischer als praktischer Natur sind - beispielsweise Scheme oder Smalltalk. Diese lehren nützliche Denkmuster, erlauben (vergleichsweise) wenig dreckige Hackerei, und sie sind weit genug von Produktionssprachen entfernt, dass schlechte Angewohnheiten sich nur mühsam übertragen lassen sollten.

    In jedem Fall sollte man keine zu hohen Erwartungen haben. Es gibt keine Sprache X, für die man sagen kann: "Wenn du Sprache X einmal erlernt hast und dann zu C++ wechselst, hast du C++ in zwei Wochen gemeistert." Nicht für X ≠ C++.



  • seldon schrieb:

    ...Jetzt ist diese Problematik nicht spezifisch zwischen C und C++ ...

    Das kann ich bestätigen - mir fällt es z.B. schwer, nicht in die "C++ in Java programmieren"-Denke zu verfallen, weil ich in C++ relativ sattelfest bin, aber ab&an Java schreibe.

    Ich muss mir immer wieder sagen "Das sind 'different animals'!" und "Vergiß, wie du es in C++ lösen würdest und lerne (!!!), wie man es in Java löst!".
    Ist aber nicht leicht.

    Gruß,

    Simon2.



  • Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?



  • knivil schrieb:

    Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?

    - Garbagecollector
    - Mehrfachvererbung
    - Zeiger

    Um unterschiede zu nennen.



  • HighLigerBiMBam schrieb:

    - Garbagecollector

    Gibts zum Glück nicht. Dafür was viel besseres SmartPointer. 🙂
    Macht aber vom programmieren her nicht den Unterschied.

    HighLigerBiMBam schrieb:

    - Mehrfachvererbung

    Wird im allgemeinen abgeraten von. Lässt sich aber auch in Java realisieren, ich denk da nur an interface .

    HighLigerBiMBam schrieb:

    - Zeiger

    Die gibt es nun leider doch in Java und das ist auch die böse Falle, in die ein Java-Entwickler tappen wird, der plötzlich C++ programmieren will. Dabei wird ihm der fehlende GC erst mal weniger auf die Füße fallen. Es ergeben sich aber auch Überraschungen für den C++ Entwickler.



  • Nick Unbekannt schrieb:

    ...

    Genau deshalb sind dies Unterschiede in der Implementierung.



  • Haben sich doch wohl ein paar zusammen gefunden, die Lust hatten was zu schreiben 🙂
    Klingt auch alles sehr logisch und war so ziemlich das, was ich mir gedacht hatte nur detaillierter und zum Teil mit mehr Fachwissen.
    Sehe ich das richtig, dass ein Unterschied zwischen Java und C++ auch darin besteht, dass man für C++ mehrer Programmierparadigmen anwenden kann und für Java außschließlich OO ?

    Und was macht C mehr zur low-level Sprache ? Z.B das Benutzen von C-Strings statt einer komplett entwickelten std::string Klasse ? Was noch ?



  • Felixxx schrieb:

    Und was macht C mehr zur low-level Sprache ?

    Ich behaupte jetzt einfach mal: Ihre Struktur. C gilt als ein "besseres Assembler", weil es prinzipiell das Gleiche macht, nur etwas schöner und abstrakter: Zugriff auf einzelne Speicherzellen, einfache Kontrollstrukturen wie konditionelle Entscheidungen und Schleifen (die im Prinzip auch nur eine Kombination aus Entscheidung und Sprung sind), simple Typen (die ihre Nähe zu einzelnen Speicherzellen nur schwer verbergen können: selbst beim C-String muss man immer daran denken, wie die Daten im Speicher liegen), einfache Arithmetik, meist auf Bit-Ebene.

    C ist in etwa das Äquivalent zu einer mechanischen Maschine, und auch beim Einsatz in einem Microcontroller man kann eine gewisse Entscheidungslogik noch nachvollziehen: Wenn Knopf A gedrückt und Sensor B diese und jene Daten hat, dann mach Lampe C an und drehe Motor D.

    Den High-Level-Sprachen würde ich dann die größere Intelligenz zuschreiben (nicht, dass man nicht das meiste auch in C machen könnte, nur vieles vermutlich schwieriger), so Sachen wie Bild- und Stimmenerkennung, Bewegung im Raum (Matrizen!), selbstlernende Roboter, Fuzzy-Logic, Wettersimulation usw. Da kann man besser mit komplexeren mathematischen Modellen arbeiten, die sich weit jenseits von if-then befinden und bei denen sich C (und sicher auch C++) recht schwer tut.

    Wenn C die Addition von Teilflächen wäre, dann wäre eine high-level-Sprache das Integral. So mal ganz grob meine Einschätzung.



  • Nick Unbekannt schrieb:

    Macht aber vom programmieren her nicht den Unterschied.

    RAII und Garbage Collector sind ziemlich verschiedene Konzepte. Beispielsweise hat man mit dem GC keine deterministischen Destruktoren und muss Nicht-Speicher-Ressourcen manuell freigeben. Dazu kommt der Sprachunterschied bezüglich Objekt- und Referenzsemantik.

    Nick Unbekannt schrieb:

    Wird im allgemeinen abgeraten von. Lässt sich aber auch in Java realisieren, ich denk da nur an interface .

    Von MI wird höchstens präventiv abgeraten, weil sie viele falsch einsetzen. Aber das trifft auf einfache Vererbung mindestens ebenso zu.

    Java ermöglicht keine Mehrfachvererbung mit status- oder funktionalitätsbehafteten Klassen.

    Felixxx schrieb:

    Sehe ich das richtig, dass ein Unterschied zwischen Java und C++ auch darin besteht, dass man für C++ mehrer Programmierparadigmen anwenden kann und für Java außschließlich OO ?

    C++ gewährt dem Programmierer generell mehr Freiheit. Für eine ausführlichere Gegenüberstellung siehe hier.



  • knivil schrieb:

    Die Unterschiede zw. C++ und Java fallen mir beim Programmieren nicht auf. Was mache ich falsch? koennt ihr Beispiele geben, wo man es in C++ grundsaetzlich anders implementiert als in Java?

    Beispiele:
    - Reflection
    - value semantik
    - RAII

    Also ich stolpere immer wieder einmal über die unterschiedliche "Denke": Während in Java unglaublich viel in die Laufzeit verlegt wird, versucht man in (gutem) C++ möglichst viel zur Compilezeit entschieden zu haben. Das merkt man z.B. daran, dass explizites Casting in Java ganz normales Alltagsgeschäft ist ("Na dann fliegt halt eine bad-cast-exception"), während in C++ alle Alarmglocken schellen, wenn man mal explizit casten muss.
    Wenn man (z.B. hier im Forum) mal schaut, was die typischen Fragen von "Komme-von-Java"-C++-Neueinsteigern ist, drehen sich 90% darum, dass sie
    a) Reflection (bzw. allg. "Typbestimmung zur Laufzeit") gewohnt sind und das in C++ vermissen und/oder
    b) mit der value semantik ("auto Objekte" im Gegensatz zu solchen, auf die mit Pointern/Referenzen verwiesen wird).

    Des Weiteren habe ich den Eindruck, dass in der Javawelt der Fokus viel stärker auf dem einen Weg liegt. Da wird sehr stark auf Vorhandenem aufgebaut - überspitzt gesagt: Ein Javaprogramm ist nur ein Stückchen Konfiguration für eine Laufzeitumgebung, die dann die eigentliche Arbeit macht.
    Vorteil: Mit überschaubarem Aufwand wird schnell was auf die Beine gestellt, was allgemein"verständlich" ist.

    In C++ wird viel stärker an sehr speziell zugeschnittenen Lösungen gearbeitet. Das drückt sich auch in der größeren Vielfalt der Programmiermittel (OO UND Funktionen, Laufzeit- UND Compielzeitpolymorphie, high- UND lowlevel-Programmierung, ...).
    Überspitzt gesagt: Für jeden Weg das Rad neu erfunden.
    Vorteil: Klarer definierte und besser passende Programme und universellere Konzepte.

    Wenn ich denn mal in die Javawelt eintauche, bin ich einerseits begeistert von all dem, was es schon gibt - andererseits verblüfft über die Vertrauensseligkeit.
    Ein typischer Satz für einen C++-Programmierer: "Ich definiere meine Schnittstelle so, dass jeden Anwender sofort klar ist, was sie tut und er sie nur richtig verwenden kann." (und damit ist nicht der Funktionsname oder die Dokumentation gemeint)
    Der Javaprogrammierer würde vllt. eher sagen: "Ich definiere meine Schnittstelle so, dass sie funktioniert und ich sie möglichst nicht mehr ändern muss."

    Gruß,

    Simon2.


Anmelden zum Antworten