Warum lassen C/C++ Compiler soviel Müll zu?



  • Basher schrieb:

    volkard schrieb:

    Hast Du den zweiten Konstruktor gesehen? Den, der j nicht an die gemeinsame Variable bindet.

    ja, aber der hat doch nichts damit zu tun, dass sizeof(test) == 1 ist.

    ob 1 oder 0 ist hier egal. es geht um den unterschied zwischen 1/0 und 4. darum, daß die referenz durch den zweiten konstruktor nicht wegoptimierbar ist. darum, daß test::j dann nur überhaupt denkbar sein würde, wenn der zweite konstruktor nicht da wäre. kurzum, es wäre komplizierter als mit einem schlüsselwort, was gemeinsam benutze daten anzeigt.

    mit dem konstruktor wolltest du andeuten, dass man meine methode aushebeln kann?

    Nein.

    aber das ist doch nichts ungewöhnliches für in C++, wo man schnell man unsinn produziert, wenn man sich nicht an bestimmte regeln hält.
    🙂

    Aufpassen muß man in C noch viel mehr, habe ich mir sagen lassen. Und wie man an den vielen Abstürzen und Sicherheitslücken von C-Programmen sieht, klappt es selten.



  • Basher schrieb:

    aber das ist doch nichts ungewöhnliches für in C++, wo man schnell man unsinn produziert, wenn man sich nicht an bestimmte regeln hält.
    🙂

    Das ist nichts ungewoehnliches fuer die meisten Sprachen inklusive Java.



  • volkard schrieb:

    es wäre komplizierter als mit einem schlüsselwort, was gemeinsam benutze daten anzeigt.

    gut, das sehe ich ein. trotzdem finde ich das anlegen von statischen membern in C++ klassen denkbar misslungen. es wäre (für den benutzer) angenehmer, in die klassendefinition z.b. 'static int j = 12;' zu schreiben und weiter nix mehr. um den rest hat sich der compiler zu kümmern.

    volkard schrieb:

    Aufpassen muß man in C noch viel mehr, habe ich mir sagen lassen.

    dann hat man dir quatsch erzählt. C ist schlichter als C++, daher gibt's da auch weniger mögliche fehlerquellen.
    🙂



  • hustbaer schrieb:

    audacia schrieb:

    hustbaer schrieb:

    warum????? schrieb:

    Zeus schrieb:

    Wegen der Rekursion in der Grammatik. IfStatement, WhileStatement sind Statement und hinter dem Kopf darfst du weitere Statements schreiben - recht einfach. Aber verhindert halt nicht, das schreiben vom dummen Code.

    Aber warum braucht C++ Code dann soviel länger zum Compilieren als Java Code, der eigentlich viel eingeschränkter ist?

    weil C++ viel komplizierter zu compilieren ist als Java.

    argument dependent lookup, implizite konvertierungen, templates, overload resolution -> in kombination ist das viel arbeit für einen compiler

    Das machts alles nicht aus; ein guter C++-Compiler kann durchaus die Geschwindigkeit eines Delphi-/Java-/C#-/Whatever-Compilers erreichen. Ausschlaggebend ist primär die Menge.

    Wenn man kaum templates verwendet mag das zutreffen.

    Die Standardbibliotheken sind prall gefüllt mit Template-Code. Du hast zwar insofern Recht, als daß sich die intensive Nutzung von Templates deutlich in den Übersetzungszeiten niederschlägt, aber selbst dann ist der Unterschied der zu übersetzenden Zeilen zwischen einem C++- und vergleichbaren Java-, C#- oder Delphi-Programmen derart deutlich (Faktor 10000?), daß der zusätzliche Aufwand für Templates auch nicht mehr viel ausmacht.

    Die Zeilenzahlexplosion kann man recht gut mit PCHs in den Griff bekommen; wenn der Compiler in der Lage ist, uninstantiierte Templates zu parsen, ebenso das Template-Problem. Allerdings trifft das, glaube ich, gerade mal aufs EDG-Frontend zu (das überall sonst fehlende Two phase name lookup läßt das jedenfalls vermuten).

    knivil schrieb:

    Wo aber sollte man noch sizeof in reinem C++ verwenden?

    Bei Variadic Templates, um die Anzahl der Argumente herauszufinden.

    Basher schrieb:

    trotzdem finde ich das anlegen von statischen membern in C++ klassen denkbar misslungen. es wäre (für den benutzer) angenehmer, in die klassendefinition z.b. 'static int j = 12;' zu schreiben und weiter nix mehr. um den rest hat sich der compiler zu kümmern.

    War, glaube ich, für C++ 0x geplant.



  • Basher schrieb:

    C ist schlichter als C++, daher gibt's da auch weniger mögliche fehlerquellen.

    Entschuldige, aber manchmal habe ich den Eindruck, als wenn du nicht wirklich darüber nachdenkst, was du so schreibst. Folgt aus einer "schlichteren" Programmiersprache wirklich, dass es weniger mögliche Fehlerquellen gibt, wenn man sie verwendet? Wohl kaum!

    Ich habe jahrelang fast ausschließlich in C programmiert, bevor ich mich C++ zugewendet habe. Und tatsächlich hatte ich die Gelegenheit, dasselbe Projekt zuerst in C und dann in C++ zu programmieren. Das C++-Projekt hat das C-Projekt in Sachen Qualität um Längen geschlagen. Das wirft doch wohl erhebliche Zweifel am Wahrheitsgehalt deiner Aussage auf, meinst du nicht? Allein OOP und Exceptions sind Meilensteine in der Software-Entwicklung. Gerade im Hinblick auf Software-Qualität.

    Mag sein, dass eine Sprache wie C++ schwerer zu erlernen ist als C. Darüber möchte ich nicht streiten. Aber "Schlichtheit" als a priori Garantie für Fehlerarmut ist einfach dummes Zeug.

    Stefan.



  • Basher schrieb:

    trotzdem finde ich das anlegen von statischen membern in C++ klassen denkbar misslungen. es wäre (für den benutzer) angenehmer, in die klassendefinition z.b. 'static int j = 12;' zu schreiben und weiter nix mehr. um den rest hat sich der compiler zu kümmern.

    Das ist doch Quatsch! Mit 'static int j = 12;' wird doch nur eine Variable deklariert. Im Header, der bekanntlich von mehreren Übersetzungseinheiten inkludiert wird, wird kein Speicherplatz besorgt. Genau wie in C. Deswegen meinte ich ja, daß Du das schnell kapiertst.
    Allerdings, eine Konstante, 'static int const j = 12;' in einer Klassendefinition wäre etwas ganz anderes.



  • Basher schrieb:

    volkard schrieb:

    Aufpassen muß man in C noch viel mehr, habe ich mir sagen lassen.

    dann hat man dir quatsch erzählt. C ist schlichter als C++, daher gibt's da auch weniger mögliche fehlerquellen.
    🙂

    Komisch. Ada ist noch deutlich komplizierter als C++. Trotzdem macht man darin komischerweise meist weniger Fehler. 🙂



  • DStefan schrieb:

    Aber "Schlichtheit" als a priori Garantie für Fehlerarmut ist einfach dummes Zeug.

    Logisch.
    Siehe Brainfuck.

    "Auszug aus einem größeren Programm"
    >+++[->++++<]>[-<++++>]<[-<+>]<.[-]<
    


  • volkard schrieb:

    DStefan schrieb:

    Aber "Schlichtheit" als a priori Garantie für Fehlerarmut ist einfach dummes Zeug.

    Logisch.
    Siehe Brainfuck.

    "Auszug aus einem größeren Programm"
    >+++[->++++<]>[-<++++>]<[-<+>]<.[-]<
    

    Hübsch -- Wie der Name schon sagt 😉 😉



  • volkard schrieb:

    DStefan schrieb:

    Aber "Schlichtheit" als a priori Garantie für Fehlerarmut ist einfach dummes Zeug.

    Logisch.
    Siehe Brainfuck.

    "Auszug aus einem größeren Programm"
    >+++[->++++<]>[-<++++>]<[-<+>]<.[-]<
    

    Ob es Zufall ist, dass man mit der Brainfuck Syntax einen Fisch zeichnen kann?



  • Troll-Liebhaber schrieb:

    volkard schrieb:

    DStefan schrieb:

    Aber "Schlichtheit" als a priori Garantie für Fehlerarmut ist einfach dummes Zeug.

    Logisch.
    Siehe Brainfuck.

    "Auszug aus einem größeren Programm"
    >+++[->++++<]>[-<++++>]<[-<+>]<.[-]<
    

    Ob es Zufall ist, dass man mit der Brainfuck Syntax einen Fisch zeichnen kann?

    Kann man mit C auch.

    int O;
    
    O++<              // <-
                      //      warum lassen compiler so einen müll zu? 
    1;                // <-
    

    Aber der Name "C++" sieht sogar schon ein wenig wie ein Fisch aus. 💡



  • DStefan schrieb:

    Folgt aus einer "schlichteren" Programmiersprache wirklich, dass es weniger mögliche Fehlerquellen gibt, wenn man sie verwendet? Wohl kaum!

    aber ja. gerade C und C++ sind die besten beispiele dafür. weil C eine teilmenge von C++ ist, kannst du in C++ alle fehler machen, die auch in C möglich sind. umgekehrt aber nicht: du kannst in C keine C++ fehler machen.

    DStefan schrieb:

    Ich habe jahrelang fast ausschließlich in C programmiert, bevor ich mich C++ zugewendet habe. Und tatsächlich hatte ich die Gelegenheit, dasselbe Projekt zuerst in C und dann in C++ zu programmieren. Das C++-Projekt hat das C-Projekt in Sachen Qualität um Längen geschlagen.

    dazu müssteste erstmal erzählen, was du mit qualität meinst. aber wenn dein erstes C++-projekt wirklich gleich so ein erfolg war: hut ab, du musst ein abolut programmiererisches ausnahmetalent sein.

    DStefan schrieb:

    Aber "Schlichtheit" als a priori Garantie für Fehlerarmut ist einfach dummes Zeug.

    nö, das ist eine tatsache: wo wenig ist, kann wenig schief laufen. leider kann man mit 'wenig' auch wenig machen, deshalb muss ein guter kompromiss her.

    Ada ist noch deutlich komplizierter als C++. Trotzdem macht man darin komischerweise meist weniger Fehler.

    vielleicht kommt's dir nur so vor, weil du mit C++ mehr vertraut bist.
    🙂



  • C++ fehler machen

    Was sind C++ Fehler? Wenn man ideomatisch in C++ programmiert, so kommt man gar nicht erst in die Naehe von C Fehlern.



  • Basher schrieb:

    DStefan schrieb:

    Folgt aus einer "schlichteren" Programmiersprache wirklich, dass es weniger mögliche Fehlerquellen gibt, wenn man sie verwendet? Wohl kaum!

    aber ja. gerade C und C++ sind die besten beispiele dafür. weil C eine teilmenge von C++ ist, kannst du in C++ alle fehler machen, die auch in C möglich sind. umgekehrt aber nicht: du kannst in C keine C++ fehler machen.

    In beiden Sprachen kann man abzählbar viel Mist bauen. In C ist es aber wahrscheinlicher, weil die Features, die in C++ dazugekommen sind vorwiegend der besseren Übersicht und Fehlervermeidung dienen. Aber das wußtest Du bereits.



  • knivil schrieb:

    C++ fehler machen

    Was sind C++ Fehler?

    hier ein klitzekleiner auszug: http://www.horstmann.com/cpp/pitfalls.html

    In beiden Sprachen kann man abzählbar viel Mist bauen. In C ist es aber wahrscheinlicher, weil die Features, die in C++ dazugekommen sind vorwiegend der besseren Übersicht und Fehlervermeidung dienen.

    ich finde fehler in C-programmen sind sehr einfach aufzuspüren. und vor fiesen, logischen fehlern kann einen C++ auch nicht bewahren. die features, die mit c++ dazugekommen sind, helfen C-typische fehler zu umgehen, bringen aber eigene fehlerquellen mit, so dass unterm strich ein schlechteres ergebnis steht als vorher.
    🙂



  • Ich wuerde sagen, diesen Fehler ruehren daher, das C++ nicht ideomatisch verwendet wurde. Hier ein kleiner Auszug: http://en.wikibooks.org/wiki/More_C%2B%2B_Idioms .

    logischen fehlern kann einen C++ auch nicht bewahren

    Doch, ein gutes Beispiel ist die ist boost::mpl. Ich finde die Idee genial.



  • "Schlichtheit" ist nicht gleich "Schlichtheit" ...

    Ob "Schlichtheit" als Kriterium für Fehlerarmut taugt, hängt davon ab, was genau am betrachteten Formalismus "schlicht" sein soll.

    "Schlichtheit" im Sinne von "niedriger Abstraktionsgrad/'dummer' Formalismus" kann idR zu mehr Fehlern führen. Siehe BF oder Maschinencode in Binärdarstellung.

    "Schlichtheit" im Sinne von "der Formalismus ist auf wenigen, aber mächtigen Abstraktionen aufgebaut/ 'kluger' Formalismus" kann im Ggteil aber zu weniger Fehlern führen. Siehe OOP.

    Denn mit den überflüssigen Details werden eben auch deren potentielle Fehlerquellen wegabstrahiert.

    Was wirklich Fehler vermeiden hilft, ist mMn ein "kluger" Formalismus, der für den Anwender "mitdenkt" und der sich gut dem jeweiligen Programmierproblem anpaßt.

    my EUR 0.02



  • Basher schrieb:

    so dass unterm strich ein schlechteres ergebnis steht als vorher. 🙂

    Nö, besser, wenn man C++ kann und schlechter, wenn man C++ nicht kann.
    Aber mit diesem Argument kannste auch C bashen und sagen, in C mancht man mehr Fehler als in Basic, wenn man C nicht kann, man macht aber weniger Fehler, wenn man C kann. Wobei das auch schon wieder überholt ist, weil Visual Basic recht gut ist.



  • Basher schrieb:

    Ada ist noch deutlich komplizierter als C++. Trotzdem macht man darin komischerweise meist weniger Fehler.

    vielleicht kommt's dir nur so vor, weil du mit C++ mehr vertraut bist.
    🙂

    Ulkig, und das, wo ich beruflich doch fast nur Ada programmiere.



  • volkard schrieb:

    Basher schrieb:

    so dass unterm strich ein schlechteres ergebnis steht als vorher. 🙂

    Nö, besser, wenn man C++ kann und schlechter, wenn man C++ nicht kann.
    Aber mit diesem Argument kannste auch C bashen und sagen, in C mancht man mehr Fehler als in Basic, wenn man C nicht kann, man macht aber weniger Fehler, wenn man C kann.

    Womit man wieder zum Punkt kommt, daß C++ derart komplex ist, daß seine Beherrschung ggf. eine höhere Qualifikation erfordert als die von Java/C#. Darin sind wir uns vermutlich so gut wie einig, mit dem Unterschied, daß ich nicht so sicher bin wie du, ob das auch gut so ist.

    (Der Satz war kein linguistisches Meisterwerk :()

    volkard schrieb:

    Wobei das auch schon wieder überholt ist, weil Visual Basic recht gut ist.

    Da meinst du aber VB.NET, oder?


Anmelden zum Antworten