Programiersprache für Anfänger



  • tfa schrieb:

    Wenn man in C++ einen Nullpointer (oder Zeiger ins Nirvana) derefenziert, bekommt man eine Schutzverletzung, Segmentation Fault, Core Dump, was auch immer (jedenfalls war das so, als ich mich noch damit beschäftigen durfte).

    Wie auch schon von sothis_ erwähnt, muss das nicht sein.
    Ich habe, als ich noch mit einen Compiler gearbeitet habe der so gut wie von keiner Bibliothek mehr unterstützt wurde, Smartpointern selbst geschrieben. Und diese hatten, die auch von Java und C# üblichen NULL-Prüfungen, sowie das Exceptionhandling eingebaut.

    Es kommt immer darauf an wie man C++ verwendet, und was man für Zielsetzungen hat.

    tfa schrieb:

    In Sprachen mit Managed Code kann ich solche Fehler auffangen und behandeln.

    Besser ist es, wenn man von vorne herein auch die Exception ausschließen kann. Und NULL-Prüfungen kann man auch in C++ machen.

    tfa schrieb:

    Bezogen auf Java: Vorteilhaft ist auch das Angebot an ... unterstützenden Frameworks (Spring, Hibernate).

    Das kann wieder genau ein Nachteil sein. Sicher, das Angebot von kompatiblen Bibliotheken/Frameworks ist ein Vorteil, aber gleichzeitig auch ein Nachteil (unterschiedliche Stile etc.). Dies ist beispielsweise unter C++ ein großer Vor-/Nachteil: Die extreme Anzahl unterschiedlicher.

    cu André



  • asc schrieb:

    Und was "fehleranfälligen Pointer" angeht: Die Häufigsten Fehlermeldungen die ich aus C#/Java kenne sind die Null-Pointer Exceptions. Da man dort sehr wohl mit Zeigern arbeitet (Ja, gewisse Fallstricke werden durch eine Referenzsyntax vermieden, aber im Gegenzug eine höhere Sicherheit vorgegaukelt). Und mir ist egal ob diese dann Null-Referenz oder wie auch immer genannt wird.

    Naja ok, Du musst ein neues Objekt mit new anlegen, schön. Viel mehr gibt es nicht zu tun. Die Garbage Collection kümmert sich um den Rest.



  • asdflllsss schrieb:

    Naja ok, Du musst ein neues Objekt mit new anlegen, schön. Viel mehr gibt es nicht zu tun. Die Garbage Collection kümmert sich um den Rest.

    Unter C++ doch genauso, nur dass du nicht mit new/delete arbeitest, sondern mit schlauen Zeigern und Containern. Einmal angelegt, RAII besorgt den Rest.



  • sothis_ schrieb:

    tfa schrieb:

    In Sprachen mit Managed Code kann ich solche Fehler auffangen und behandeln. Ich kann ein Fehlerreport generieren, wo drin steht, welche Variable in welcher Methode welcher Klasse (mit Zeilennummer) null war.

    das kann man auch mit sprachen die nativen code erzeugen

    naja, null-pointer schon, aber wenn der pointer sonstwohin zeigt, läuft dein code seltsam anders und du wunderst dich. in sprachen mit managed code gibts nur zwei fälle: entweder es geht, oder es crashed. aber niemals zerbröselt es daten an anderen stellen.
    🙂



  • Badestrand schrieb:

    Unter C++ doch genauso, nur dass du nicht mit new/delete arbeitest, sondern mit schlauen Zeigern und Containern. Einmal angelegt, RAII besorgt den Rest.

    Wenn es nur Smart-Pointer gäbe, wäre das ja ok. Aber man hat immer wieder mit alten oder externen Code zu tun, in dem eben nicht alles mit Smart-Pointern realisiert ist.



  • Bei altem Code hat man aber leider nicht die Wahl der Programmiersprache. Ein Vergleich C++ vs. Java ist nur für neue Projekte sinnvoll.



  • asdflllsss schrieb:

    Badestrand schrieb:

    Unter C++ doch genauso, nur dass du nicht mit new/delete arbeitest, sondern mit schlauen Zeigern und Containern. Einmal angelegt, RAII besorgt den Rest.

    Wenn es nur Smart-Pointer gäbe, wäre das ja ok. Aber man hat immer wieder mit alten oder externen Code zu tun, in dem eben nicht alles mit Smart-Pointern realisiert ist.

    Ahja, weil eine Sprache den Anwender die Verantwortung abnimmt, ist sie automatisch besser? Und seit wann gibt es bitte schön C++ und seit wann Java und Co? Das Konzept der Smartpointer ist schon alt genug um Anwendungen komplett damit zu pflastern.

    Warum macht man dies nicht?
    a) Unwissen
    b) Performanceabwegungen (Manchmal weiß man das bestimmte Fälle nicht eintreten können - Hardwarefehler mal ausgeschlossen)
    ...

    Was ich an C++ gut finde ist gerade die Möglichkeit zu wählen. Das dies dem Programmierer eine höhere Verantwortung auferlegt, ist klar. Zudem gibt es viele Fälle in denen man mit Referenzen arbeiten kann (und in C++ sind diese immer ungleich 0, wenn man nicht mit brachialer Gewalt dort etwas umbiegt).

    cu André



  • asc schrieb:

    Warum macht man dies nicht?
    a) Unwissen
    b) Performanceabwegungen (Manchmal weiß man das bestimmte Fälle nicht eintreten können - Hardwarefehler mal ausgeschlossen)
    ...

    c) Weil die Sprache es nicht forciert.
    d) Weil es nicht die naheliegendste Lösung ist. Welcher Anfänger lädt sich Boost herunter, installiert es und hantiert dann mit std::tr1::shared_ptr <Objekt> herum, wenn man doch einfach Objekt* schreiben kann?

    asc schrieb:

    Was ich an C++ gut finde ist gerade die Möglichkeit zu wählen. Das dies dem Programmierer eine höhere Verantwortung auferlegt, ist klar.

    Mit anderen Worten, ein verpflichtender Intelligenztest für angehende C++-Programmierer wäre vielleicht erwägenswert 😃



  • audacia schrieb:

    ...Weil es nicht die naheliegendste Lösung ist. Welcher Anfänger lädt sich Boost herunter, installiert es und hantiert dann mit std::tr1::shared_ptr <Objekt> herum, wenn man doch einfach Objekt* schreiben kann?...

    Sprechen wir jetzt von "Anwendungen" oder von Anfängern? Zumal ich annehme das std::tr1::shared_ptr tatsächlich in nicht mehr allzu weiter Zukunft auch seinen Buch in Grundlagenbücher findet (Mit C++0x). Ganz davon abgesehen das aktuelle Kompiler den TR1 teilweise mitbringen.

    audacia schrieb:

    Mit anderen Worten, ein verpflichtender Intelligenztest für angehende C++-Programmierer wäre vielleicht erwägenswert 😃

    Böse Gesprochen: Eine gewisse Intelligenz sollte man für die Verwendung in einer x-beliebigen Programmiersprache mitbringen. Den was der Anfänger in C++ falsch macht, das rächt sich auch in C#/Java, wenn gleich dort ggf. mit Exception.



  • Der TR1 und somit shared_ptr & Co. werden heute in jedem aktuellen und vernünftigen C++-Buch behandelt (z.B. in denen von Scot Meyers). Manche Anfängerbücher gehen neben TR1 sogar schon teilweise auf C++0x ein (wie das von Ulrich Breymann). Wer also heute mit C++ anfängt, bekommt Smartpointer gleich mit beigebracht.

    Und Boost muß man heute bei den aktuellen Mature-Compiler auch nicht mehr runter laden, um TR1 nutzen zu können. Der aktuelle GCC hats drin, der MinGW 4.3 (den ich hier parallel mit benutze) hat auch TR1 drin. Und wer MSVS2008 hat, bekommt den TR1 mit dem kostenlosen Feature Pack Upgrade von MS auch noch mit dazu! Und MS hat genug Blogs, Videos (auf channel9) und MSVS-Startseite über TR1... da bekommts auch der letzte mit.

    Wer da noch ne Ausrede hat, das er irgendwie TR1 und Smartpointer verpasst hat, der verpasst auch alles andere und hat somit ein anderes grundsätzliches Problem.



  • Wenn Performance das ABSOLUT wichtigste ist, dann nimmt man noch immer pure Zeiger.



  • asdflllsss schrieb:

    Naja ok, Du musst ein neues Objekt mit new anlegen, schön. Viel mehr gibt es nicht zu tun. Die Garbage Collection kümmert sich um den Rest.

    Ganz so einfach ist es nicht. Speicherlecks sind auch in Java möglich. Der Entwickler muss schon dafür sorgen, dass nicht mehr benötigte Objekte nicht mehr referenziert werden (oder weak references benutzen).

    Badestrand schrieb:

    Unter C++ doch genauso, nur dass du nicht mit new/delete arbeitest, sondern mit schlauen Zeigern und Containern. Einmal angelegt, RAII besorgt den Rest.

    Wenn ich das richtig verstanden habe, funktioniert dieses Konzept nur im Scope der entsprechenden Variable. Was passiert, wenn ich ein Objekt anlege und es in z.B. eine Liste/Hashtabelle o.ä. einfüge und erst Stunden später wieder lösche? Das ist doch dann auch Handarbeit. Ein GC ist da schon mächtiger.



  • HansiHinterseher schrieb:

    Der TR1 und somit shared_ptr & Co. werden heute in jedem aktuellen und vernünftigen C++-Buch behandelt (z.B. in denen von Scot Meyers). Manche Anfängerbücher gehen neben TR1 sogar schon teilweise auf C++0x ein (wie das von Ulrich Breymann). Wer also heute mit C++ anfängt, bekommt Smartpointer gleich mit beigebracht.

    Soweit die idealisierte Theorie. Für die Praxis sieh dir bitte das C++-Subforum an.



  • asc schrieb:

    Böse Gesprochen: Eine gewisse Intelligenz sollte man für die Verwendung in einer x-beliebigen Programmiersprache mitbringen. Den was der Anfänger in C++ falsch macht, das rächt sich auch in C#/Java, wenn gleich dort ggf. mit Exception.

    nett gesprochen: eine programmiersprache kann jeder durchschnittlich intelligente mensch lernen. aber während der Java/C#-Anfänger bereits erste erfolgserlebnisse feiert, weil er z.b. bunte kästchen durch ein grafik-window hüpfen lässt, quält sich der c++-einsteiger noch mit den grundlagen rum (und kommen boost und stl hinzu, hat er noch länger damit zu tun). schnelle erfolge sind für anfänger sehr wichtig. und das bietet c++ nicht, ausser, jemand lässt sich dadurch motivieren, dass er gelernt hat, wie wirre fehlermeldungen entschlüsselt werden.
    hier ist z.b. einer, der's mit c++ versucht hat: http://www.courageunfettered.com/stuf/cpp/
    🙂



  • tfa schrieb:

    Badestrand schrieb:

    Unter C++ doch genauso, nur dass du nicht mit new/delete arbeitest, sondern mit schlauen Zeigern und Containern. Einmal angelegt, RAII besorgt den Rest.

    Wenn ich das richtig verstanden habe, funktioniert dieses Konzept nur im Scope der entsprechenden Variable. Was passiert, wenn ich ein Objekt anlege und es in z.B. eine Liste/Hashtabelle o.ä. einfüge...

    Da die Variable dann in der Liste/Hashtable ihren Scope hat, gibt es kein Problem (std::tr1::shared_ptr ist ein Referenzzählender Smartpointer, den man auch in Listen stopfen kann). Das ist dem Prinzip des GC schon recht nahe.



  • ~fricky schrieb:

    ...quält sich der c++-einsteiger noch mit den grundlagen rum (und kommen boost und stl hinzu, hat er noch länger damit zu tun)...

    Wenn du mit STL die Standardbibliothek meinst, gehört diese zu den Grundlagen. Und wenn mit schnellen Erfolgen auch Erfoge außerhalb der Klicki-Bunti Welt gemeint sind, kann man diese auch mit C++ recht zügig haben. In Java/C# geht das zwar schneller, aber bei einen sinnvollen Buchaufbau hat auch der C++ Einsteiger ab dem ersten Kapitel sichtbare Erfolgserlebnisse.

    cu André



  • ~fricky schrieb:

    asc schrieb:

    Böse Gesprochen: Eine gewisse Intelligenz sollte man für die Verwendung in einer x-beliebigen Programmiersprache mitbringen. Den was der Anfänger in C++ falsch macht, das rächt sich auch in C#/Java, wenn gleich dort ggf. mit Exception.

    nett gesprochen: eine programmiersprache kann jeder durchschnittlich intelligente mensch lernen. aber während der Java/C#-Anfänger bereits erste erfolgserlebnisse feiert, weil er z.b. bunte kästchen durch ein grafik-window hüpfen lässt, quält sich der c++-einsteiger noch mit den grundlagen rum (und

    Schön für den Hobby-Programmierer. Aber beruflich könnte sojemand bei uns in den Projekten nichts anfangen. Er würde bei den Mindestanforderungen für OSGi und Eclipse-RPC im Boden eingestampft werden.

    So sieht dir Realität aus! Und nicht "er kann Java, wenn er in Swing ein paar Fenster bauen kann.". Nein, dann kann er immer noch kein Java und keine echten Java-Projekte durchziehen/mitmachen.
    Also hat er das gleiche Problem wie in C++.



  • asc schrieb:

    aber bei einen sinnvollen Buchaufbau hat auch der C++ Einsteiger ab dem ersten Kapitel sichtbare Erfolgserlebnisse.

    das halte ich für ein gerücht. im ersten kapitel lernt der einsteiger grundlagen wie verschiedene datentypen, operatoren, kontrollstruktoren, etc. alles recht trocken. was kann er nach dem letzen kapitel? maximal ein konsolenprogramm, z.b. einen taschenrechner programmieren, der überladene operatoren benutzt. sowas haut heute keinen mehr vom hocker.
    🙂



  • ~fricky schrieb:

    asc schrieb:

    aber bei einen sinnvollen Buchaufbau hat auch der C++ Einsteiger ab dem ersten Kapitel sichtbare Erfolgserlebnisse.

    das halte ich für ein gerücht. im ersten kapitel lernt der einsteiger grundlagen wie verschiedene datentypen, operatoren, kontrollstruktoren, etc. alles recht trocken. was kann er nach dem letzen kapitel? maximal ein konsolenprogramm, z.b. einen taschenrechner programmieren, der überladene operatoren benutzt. sowas haut heute keinen mehr vom hocker.
    🙂

    Und in einem Java/C#-Buch lernt er im ersten Kapzeil, wie er ganz einfach sein erstes ERP-Programm mit GUI und RDBMS-Anbindung baut, ohne trockene Operatoren & Co.
    Damit ist er bestens gerüstet, für seine erfolgreiche Entwicklerlaufbahn.

    Mensch, sind wir alle doof, die umsonst gelernt haben, was elementare Datentypen, Operatoren, Kontrollstrukturen usw. sind.



  • HansiHinterseher schrieb:

    Schön für den Hobby-Programmierer. Aber beruflich könnte sojemand bei uns in den Projekten nichts anfangen. Er würde bei den Mindestanforderungen für OSGi und Eclipse-RPC im Boden eingestampft werden.

    mensch Artchi, es geht darum, dass er 'bei der stange bleibt'. jemand, der von vorn herein spass an einer sache empfindet (und das funktioniert bei den meisten menschen nur über sichtbare erfolgserlebnisse), wird mit freude weiter machen und will immer mehr darüber wissen. die chance ist viel höher, dass so jemand, irgendwann später, professionell programme schreibt, als bei einem, der sich mühsam den stoff reinquält und kaum reale ergebnisse hat. sicherlich gibt es auch leute, die höchste glücksgefühle haben, wenn sie sich mit total abstrakten dingen beschäftigen. aber die sollten vielleicht besser philosophen oder mathematiker werden.
    🙂


Anmelden zum Antworten