Ist C++ wirklich so schlecht?
-
ob
if(!func_call()) // fehler behandlung
oder
try { func_call(); } catch(const efunc_call & e) { // fehler behandlung }
gewöhnungs sache? das try & catch kann man sogar besser lesen, weil man sieht sofort es ist eine fehler behandlung und man sieht genau was behandlet wird
bei den if müss es nicht fehler behandlung sein und man muss auch in die docu kucken um zu erfahren um welchen fehler es sich handelt
was ich aber schlecht finde, den lib schreiben wird es zu leicht gemacht, oh hier gibts ein problem, throwen wir mal was, soll sich der user um das problem kümmern
und der user erstickt in try & catches,
-
Original erstellt von Dimah:
**obif(!func_call()) // fehler behandlung
oder
try { func_call(); } catch(const efunc_call & e) { // fehler behandlung }
gewöhnungs sache? das try & catch kann man sogar besser lesen, weil man sieht sofort es ist eine fehler behandlung und man sieht genau was behandlet wird
**Eine Funktion liefert einen sinnvollen Wert zurück. Wenn die Funktion fehl schlägt fliegt ne Exception. dafür brauch ich aber kein try catch - da der caller erstmal garnix machen kann. erst viel später wird die exception gefangen, ausgewertet und uU darauf reagiert.
wieviele try catches hast du denn in deinen Programmen? ich meistens EINS. ab und zu kommt ein 2. oder 3. an zentralen punkten dazu... das wars schon.
auf welche lib spielst du an? nimm mal die STL - außer bei at() wirft die nie.
-
Original erstellt von Shade Of Mine:
**erst viel später wird die exception gefangen, ausgewertet und uU darauf reagiert.
**Funktioniert aber in Java nicht, weil es keine Destruktoren gibt, die beim Stack Unwinding aufgerufen werden. Also brauchst du doch zumindest try..finally. Und so gut kenn ich Java nun nicht, dass ich sagen könnte, ob catch (mit weiterwerfen der Exception) in dem Fall benötigt wird oder nicht.
BTW: In Lisp wird der Handler *vor* dem Unwinding aufgerufen.
Edit: Quote ausgebessert
[ Dieser Beitrag wurde am 21.01.2003 um 15:22 Uhr von Bashar editiert. ]
-
Original erstellt von Bashar:
Also ist C so gut wie alles andere.Kaum. Beim Umsetzten eines Verfahrens in eine Programmiersprache sollte man auch denken.
C unterstützt nun mal einige Fehler sehr gut und direkt. Zum Beispiel Bufferoverflows. Es gibt AFAICS kein gutes Verfahren um diese aufzuspüren (zumal manchmal Pufferüberschreitungen auch [pseudo-]legal sind). Andere Sprachen schalten diese Fehlerklassen eben von vorneherein fast komplett aus.
-
Daniel E.:C++ mit den richtigen Techniken zum Beispiel.
Es geht mir nicht um C vs. Ada oder SPARK oder was weiß ich, sondern um die Behauptung, C++ sei noch unsicherer als C.
[ Dieser Beitrag wurde am 21.01.2003 um 16:28 Uhr von Bashar editiert. ]
-
Original erstellt von Shade Of Mine:
Eine Funktion liefert einen sinnvollen Wert zurück. Wenn die Funktion fehl schlägt fliegt ne Exception. dafür brauch ich aber kein try catch - da der caller erstmal garnix machen kann. erst viel später wird die exception gefangen, ausgewertet und uU darauf reagiert..machen den java programmierer try & catches aus spass oder auch wenn sie nicht daruf reagieren können?
Original erstellt von Shade Of Mine:
**wieviele try catches hast du denn in deinen Programmen? ich meistens EINS. ab und zu kommt ein 2. oder 3. an zentralen punkten dazu... das wars schon.auf welche lib spielst du an? nimm mal die STL - außer bei at() wirft die nie.**
meine programme sind aber etwas realitäts fremd und ignorieren oft mögliche fehler, aber ich kann mir vorstellen das mit wenigen try & catches es schwerer ist ein Programm nach einer Exception wieder zum laufen zu bringen (Nur zum Fehler melden sind Exception zu schade, IMHO)
das mit der lib habe ich irgend wo aufgeschnapt
-
Original erstellt von Dimah:
**meine programme sind aber etwas realitäts fremd und ignorieren oft mögliche fehler, aber ich kann mir vorstellen das mit wenigen try & catches es schwerer ist ein Programm nach einer Exception wieder zum laufen zu bringen (Nur zum Fehler melden sind Exception zu schade, IMHO)
**du sollst auch wenn möglich so programmieren das keine exceptions entstehen, dann brauchst du auch keine try {} catches mehr.
-
Nur mal so als Info:
Ich habe mir eben ein kleines Programm geschrieben, was alle "try", "catch" und "finally" in meinem Projekt zählt. Das Ergebnis ist:
try : 17
catch : 33
finally : 0Das Projekt umfaßt mehr als 7000 Zeilen (ohne Leerzeilen und ohne Kommentare).
Das macht somit nichtmal 1% des Codes aus.
-
kein finally?
das haut meine ganze Theorie über den Haufen - also vergesst was ich gesagt habe.
-
kein finally?
das haut meine ganze Theorie über den HaufenIn dem Moment wo du kritische Resourcen angefordert hast (und auch wieder freigeben willst), brauchst du auch ein finally (wenn du nicht alles doppelt machen willst).
So habe ich es zumindest an der Uni gelernt und so sehe ich es auch in Java-Büchern und Artikeln.
-
Ich gebe zu, dass ich in dem Projekt bisher so gut, wie keine ernsthafte Ausnahmebehandlung mache. Es werden also früher oder später noch ein paar "finally" dazukommen. ...es werden auch noch ein paar "try" und "catch" dazukommen (zum Beispiel bei möglichen Plätzen für OutOfMemoryExceptions). Das ändert aber nichts daran, dass sich das im Großen und Ganzen nahezu garnicht auf die Codegröße auswirkt.
-
Original erstellt von Bashar:
[Es geht] um die Behauptung, C++ sei noch unsicherer als C.Auf jeden Fall formal sehr viel schwieriger zu verifizieren, weil viel komplexer.
Die 'richtigen Techniken' können auch mal das Falsche tun.
-
Java is also between 30% and 200% more productive, in terms of lines of code per minute.
zu deutsch: "in java braucht man fuer alles 30 bis 200 prozent mehr zeilen"
und "7 jahre c++ erfahrung" im verhaeltnis zu "paar wochen java" klingt imposanter als es ist. mit einer sprache lernt man programmieren, das dauert eine weile, fuer alle weiteren braucht man dann halt nur noch paar wochen. insbesonderen bei der aehnlichkeit von java und c++. also kann man sagen, der konnte beides gleich gut.
und wie man bei einem experiment mit einer (1!) versuchsperson zu einer konfidenz von 95% kommen kann ist mir schleierhaft.c/c++ erreicht fast assembler nahe geschwindigkeit.
4. C++-Programme werden in der Regel schneller als Assembler-Programme ausgeführt, weil die Compiler besser optimieren können, als es der Mensch kann.
hm. dann wurden die compiler wohl von einem compiler entwickelt?
ganze am anfang wurde gefragt, was man mit java klassen machen kann, was man mit c++ klassen nicht kann: einen anderen konstruktor der selben klasse aufrufen. und super ist auch manchmal nicht schlecht.
meine meinung zu java: klobig, fuehlt sich fast an wie pascal. ich kann mir eine welt ohne templates nicht mehr vorstellen. damit kann man mit einer einzigen zeile quasi unendlich produktiv sein.
-
zu deutsch: "in java braucht man fuer alles 30 bis 200 prozent mehr zeilen"
...lern mal Englisch. Ich habe gehört, dass das ganz nützlich sein soll!
hm. dann wurden die compiler wohl von einem compiler entwickelt?
Hast du schonmal nen Menschen gesehen, der mp3s abspielen kann? mp3-Player wurden schließlich auch von Menschen entwickelt.
meine meinung zu java: klobig, fuehlt sich fast an wie pascal. ich kann mir eine welt ohne templates nicht mehr vorstellen. damit kann man mit einer einzigen zeile quasi unendlich produktiv sein.
Ich habe von dir mal ein paar Fragen im Java-Forum gesehen. Ich habe dich da mehrfach darauf hingewiesen, dass du offenbar versuchst, Java wie C++ zu verwenden. Es ist klar, dass das nicht gut geht und, dass einem Java dann absolut schlecht vorkommt. Wenn du Java so verwendet hättest, wie man Java verwenden sollte, dann wäre dir Java auch nicht klobig und so vorgekommen. Java ist IMHO eine sehr mächtige und sehr schöne Sprache. C++ ist noch mächtiger, dafür aus meiner Sicht aber absolut hässlich.
Soo ähnlich sind sich Java und C++ nicht und es geht nicht so schnell, umzusteigen. Man findet vielleicht leicht in die andere Sprache hinein (da Syntax und Konzepte teilweise übereinstimmen), das heißt aber noch lange nicht, dass man bald gut in der anderen Sprache programmieren kann. Es dauert ja allein schon eine gewisse Zeit, bis man weiß, wo man was in der jeweils neuen Standardbibliothek finden kann und was überhaupt da ist.
-
meine meinung zu java: klobig, fuehlt sich fast an wie pascal
Java ist IMHO eine sehr mächtige und sehr schöne Sprache. C++ ist noch mächtiger, dafür aus meiner Sicht aber absolut hässlich.
Seht ihr. Das war der Grund warum ich folgende Aussage formuliert habe:
Ich kann dazu keine *fachliche* Aussage treffen. Nur meine Meinung kundtun. Und diese ist dann eher auf Emotionen, denn auf Wissen begründet. Keine gute Ausganslage um sinvoll zu diskutieren.
Scheinbar bin ich nicht der Einzige hier, der vor diesem Problem steht.
Ich habe den Text zwar schon mal gebracht, als Konter gefällt er mir hier aber sehr sehr gut
Java, the virtual success. Java improves on C++, adding some fundamental features such as
garbage collection, tightly integrated thread support, and the ever popular
"Write Once, Debug Everywhere" model. But while Java managed to get a few things right,
or at least better, it hugely misses the boat in some very fundamental areas:
there is just enough type checking to get in your way, but not enough to ensure your safety.
There is no genericty (templates or similar), there is no support for invariant assertions
(as in Eiffel), it's not as flexible as Objective C or Smalltalk, not as elegant as Eiffel,
and not as fast as C++. This isn't meant to be a lengthy bash at Java, but as one pundit
put it "Java has the blazing speed of Smalltalk and the elegant simplicity of C++."Die Punkte type checking, templates und invariant assertions (bzw. Pre-Postconditions: siehe Probleme mit Template Method und Interfaces) sehe ich wirklich als *fachliche* Kritikpunkte.
-
Original erstellt von Gregor:
**...lern mal Englisch. Ich habe gehört, dass das ganz nützlich sein soll!
**Nicht mit dem Finger zeigen, da weisen 4 Finger der gleichen Hand auf Dich!
Lies seine Aussage noch mal _ganz_ _genau_ und Du wirst sehen, daß er sehr wohl Englisch kann, aber Probleme mit Aussagen von Werbetextern hat.
-
Original erstellt von Marc++us:
**Nicht mit dem Finger zeigen, da weisen 4 Finger der gleichen Hand auf Dich!
**Mach doch mal ein Foto, wie Du entweder den Daumen in sehr stumpfem Winkel zum Zeigefinger hältst, oder zeig deine sechsfingrige Hand.
-
Trefferblitz
-
Die Punkte type checking, templates und invariant assertions (bzw. Pre-Postconditions: siehe Probleme mit Template Method und Interfaces) sehe ich wirklich als *fachliche* Kritikpunkte.
Invariant Assertions: Naja! Assertions gibt es zumindest in Java: http://java.sun.com/j2se/1.4/docs/guide/lang/assert.html
Erklär mir bitte, warum der Mangel von "invariant Assertions" so schwerwiegend sein soll? ...ich kannte den Begriff so bisher noch nicht. Die sind für Eigenschaften gedacht, die als Precondition und Postcondition gelten müssen, oder? Das wären dann in Java halt 2 Zeilen, statt eine.Templates: Daran wird wohl gearbeitet. Ist IMHO aber in Java nicht so wichtig, wie in C++, da es eine gemeinsame Superklasse gibt. Zugegeben: Templates sind mächtiger.
Type Checking: Wird IMHO überbewertet, zudem wird es mit den Generics auch mehr Typsicherheit geben. Ich hatte zumindest noch nie Probleme, weil ich von einem falschen Typ ausgegangen bin. Man schmeißt ja auch nicht alle Objekte in einen großen Topf, rührt ein paarmal um und greift dann wahllos irgendeins heraus.
-
@Gregor
Wie sieht es mit dem DP Template Method aus? Das ist doch zweifellos ein sinnvolles Design Pattern für die Prüfung von Pre- und Postconditions.
In Java habe ich damit zwei Probleme:
1. In Java schaffe ich es nicht die "Hook"-Methode private zu machen. Ok. Mach ich sie halt protected. Ist zwar nicht schön, aber natürlich auch kein Beinbruch.2. Mir ist völlig unklar wie man das mit Interfaces machen kann. Dort kann ich ja keine final-Methode drin definieren. Also bin ich auf eine Basisklasse fixiert.
Ich schreibe hier extra "ich". Vielleicht gibt es ja (mittlerweile) eine Möglichkeit Template Method in Java ordentlich zu implementieren. Falls ja, nur her damit.
Das ist auf jeden Fall eine Sache die ich in Java sehr unschön finde.
Erklär mir bitte, warum der Mangel von "invariant Assertions" so schwerwiegend sein soll? ...ich kannte den Begriff so bisher noch nicht. Die sind für Eigenschaften gedacht, die als Precondition und Postcondition gelten müssen, oder? Das wären dann in Java halt 2 Zeilen, statt eine.
Letztlich geht es hier doch um das "Design by contract"-Konzept. Dieses Konzept ist natürlich primär auf Design-Ebene und hat nicht direkt etwas mit Implementation zu tun. Es ist aber doch bekanntlich so, dass es einer Sprache sehr hoch angerechnet wird, wenn sie die Implementation wichtiger Design-Konzepte vereinfacht. Am Besten so, dass man sie 1:1 übernehmen kann.
Wäre dem nicht so, könnte wir auch alle weiterhin C programmieren und neimand hätte jemals das Schlüsselwort class erfinden müssen.Templates sind mächtiger.
Vorallem wenn man Templates nicht als Feind der OOP bzw. der Laufzeitpolymorphie sieht. Es ist eine Ergänzung. Man bekommt auch statische Polymorphie. Das ist in Sprachen mit einer gemeinsamen Wurzelklasse zwar nicht ganz so wichtig, in meinen Augen aber trotzdem auch hier eine sehr nette Zugabe.
Type Checking: Wird IMHO überbewertet
Wie heißt es doch so schön: Perfekte Programmierer brauchen keine Typüberprüfung