Programiersprache für Anfänger



  • 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.
    🙂



  • ~fricky schrieb:

    ~john schrieb:

    Warum sollte dies langsam sein?

    weil vor vielen rechenoperationen abgefragt werden müsste, ob ein undefiniertes ergebnis entstehen kann (und eine arithmetic-exception o.ä. müsste losgetreten werden).

    Korrekt betrachtet müßte man dies immer tun, da nur so die korrekte Funktionsweise des Programm gewährleistet ist. Für einige dieser Probleme z.B. div 0 bieten die meisten CPUs Hardware Interrupts an, so daß man ohne jeden Geschwindigkeitsnachteil so einen Test einbauen kann.



  • muemmel schrieb:

    Ich lese hier immer, daß Programmentwicklung mit C# oder Java so viel schneller gehen soll als mit C++.

    Die Frameworks für Java sind sehr viel umfangreicher als für C++, und die IDEs erzeugen massenweise Code für diese Frameworks auf Knopfdruck. Früher hat man GUIs ohne GUI-Builder geschrieben, in dem man schön von Hand den Code eingetippt hat. Heute würde niemand mehr auf diese Idee kommen. So ähnlich sieht es in vielen anderen Bereichen aus. Während man in den meisten C++ Projekten sich einen Wolf programmiert, gibt es für Java fertige Lösungen die relativ einfach integriert werden können. Der Nachteil ist suboptimaler Code der viel Speicher verbraucht. Allerdings sollte man einen großen Nachteil von C++ Templates nicht verschweigen, wenn man nicht aufpaßt kommt da zwar immer noch hoch optimierter Code heraus, aber die Compilezeit wächst astronomisch.



  • ~john schrieb:

    Allerdings sollte man einen großen Nachteil von C++ Templates nicht verschweigen, wenn man nicht aufpaßt kommt da zwar immer noch hoch optimierter Code heraus, aber die Compilezeit wächst astronomisch.

    Anderseits erlauben Generics & Co nicht mal Ansatzweise das, was C++ Templates erlauben. Ich gebe dir aber recht, das man das Argument der Compilezeit nicht ganz übersehen darf, wobei dem Kunden eher die Laufzeit interessiert (Aus Programmierersicht mag es wieder anders aussehen ;p).



  • tfa schrieb:

    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.

    Nein, mit einem GC hat man exakt das gleiche Problem. Man muß sich immer Gedanken darüber machen, wie die Lebenszeit eines Objekt aussehen soll. Wenn ich in einer Liste ein Objekt referenziere, dann bleibt dies unabhängig von Reference Counting oder GC am Leben und wird nicht abgeräumt. Viele Programmierer machen sich bei Sprachen mit eingebautem GC nicht mehr die Mühe, über die Lebensdauer von Objekten nachzudenken, so daß hier Resourcenlecks entstehen.

    Nur bei zirkulären Strukturen hat ein GC echte Vorteile. Ansonsten kommt es darauf an, welchen konkreten Code man sich anschaut. Manchmal ist RC schneller manchmal GC, das kommt auf den Kontext an.



  • Was habt ihr eigentlich die ganze Zeit mit dem Garbage Collector? Wem sowas in C++ fehlt, der soll sich den dazulinken und gut! Immerhin kann ich mir da aussuchen ob ich einen will oder nicht.



  • die sprache java ist langsam weil sie nur interpretiert wird. das muss hier auch mal gesagt werden. die reihenfolge ist so: asm -> c -> c++ -> java -> visual basic. das muss einem anfänger auch klar sein...



  • Eine Sprache kann nicht langsam oder schneller als eine andere sein. Begreift das endlich.



  • Was haben C++ Entwickler eigentlich mit ihren Templates? Ich finde sie absolut sinnlos. So wie ich das sehe sind Templates fuer 2 Sachen gut, zum einen als Typplatzhalter und zum anderen um den Compiler als Taschenrechner zu misbrauchen. Die Rolle der Typplatzhalter ist in einer stark typesierten Sprache irgendwie seltsam und um etwas auszurechnen brauche ich den Compiler nicht.

    Wieso forciert der Compiler die Typen so strikt, const-correctness, dynamic_cast und static_cast anstelle von (int)x und (foo*)x, printf() ist boese, usw. Aber auf der anderen Seite kann ich einer Funktion template <class T> T max(T a, T b) {} alles moegliche uebergeben, eine String-Klasse, eine Hashmap, int, float, char. Klar beschwert sich der Compiler nach 10min uebersetzen, dass das Interface falsch ist und liefert mir eine 10 Zeilen lange Fehlermeldung. Aber wieso kann man dann nicht gleich den Typen eingrenzen?



  • Nun als Hobbyprogrammierer, der mit C# angefangen und nun hauptsächlich mit C++ weitergemacht hat will ich mal aus meiner bescheidenen Erfahrung sprechen:
    1. Immer wenn jemand als Vorteil von C++ gegenüber C# oder Java den Performancevorteil nennt will ich gegen die Wand springen.. Das mag für manche Projekte zutreffen, aber für die breite Masse nicht. Wenn ihr euch ständig Gedanken über die Performance macht geht doch Maschienencode schreiben.
    2. Das was mir an C++ gefällt ist, dass so viele Dinge erlaubt werden. Ich habe dadurch auch viele Dinge gelernt und meinen Horizont in Richtung objektorientierter bzw. multiparadigmischer Sprachen stark erweitert. Viele Dinge, die z.B. oft geraten werden erscheinen aber perfektionistisch(auch wenn es die Syntax nicht ist) und in der Praxis zahlt es sich oft nicht aus. Ich denke auch, dass das größte Problem von C++ der Mangel an einheitlichen guten Bibliotheken ist(Die Standardbibliothek und Boost haben zwar eine sehr gute Qualtität, aber wie siehts mit GUI aus? Da gibts nix.) und man braucht oft ein wenig mehr Code um das selbe zu erreichen, weswegen Javaprojekte wohl schneller fertig werden.
    3. Der Grund warum ich hauptsächlich C++ benutze ist, das meine Projekte zwar keine Spiele sind, aber meistens etwas damit zu tun haben und da kommt für mich Java eigtl. weniger in Frage. XNA kann man unter Linux vergessen, also -> C++

    Aus Programmierersicht mag es wieder anders aussehen ;p

    http://xkcd.com/303/


Anmelden zum Antworten