Ist C++ wirklich so schlecht?
-
Hallo,
also ich halte es für ein riesen Grücht (oder einen Marketing-Trick), dass Java Programme per se leichter zu warten sind oder das Java leicht zu erlenen ist.Wer einmal so richtig miese Java-Programme gesehen hat, wird sicher zugeben, dass auch Java erlernt werden muss und das auch dies nicht über Nacht geschieht.
Das C++ noch schwerer ist würde ich allerdings niemals bezweifeln. Allerdings wundere ich mich schon ein bischen. Wenn C++ wirklich so scheiße wäre, wie ihr teilweise behauptet, dann frage ich mich warum es immer noch für *neue* Projekte eingesetzt wird. Hinter C++ steckt keine Riesenfirma die irgendwas pusht und ich habe auch noch nie einen "C++ Werbespot" gesehen.
Zum Thema Produktivität. Was soll das eigentlich sein? Was genau will man messen?
C. Jones hat mal ausführlich begründet (als Antwort auf den Artikel "No silver bullet" von F.P. Brooks), warum Qualität letztlich ein viel besserer Maß als Produktivität ist.Und im Punkto Qualität steht C++ in meinen Augen Java keinesfalls nach (auch wenn das vielleicht nur für C++ Experten gilt). Nur wenige Sprachen bieten soviele und so reichhaltige Ausdrucksmittel. Man muss halt nur wissen, wie man diese richtig einsetzt.
-
also ich halte es für ein riesen Grücht (oder einen Marketing-Trick), dass Java Programme per se leichter zu warten sind oder das Java leicht zu erlenen ist.
1. Keiner hat gesagt, dass Java leicht zu erlernen ist. Es wurde nur gesagt, dass es deutlich leichter als C++ zu erlernen ist.
2. Ich halte es nicht für ein Gerücht. Ich denke, dass das die geringere Komplexität impliziert.
Wer einmal so richtig miese Java-Programme gesehen hat, wird sicher zugeben, dass auch Java erlernt werden muss und das auch dies nicht über Nacht geschieht.
Ich habe noch kein richtig mieses Java-Programm gesehen (auch kein wirklich tolles), trotzdem gebe ich dir Recht, dass jemand, der nicht gelernt hat, zu programmieren, wohl nicht programmieren kann. Java hat (so hört man) sehr viel stärker mit Leuten zu kämpfen, die denken, sie könnten gut programmieren, als C++. Da Java leichter zu lernen ist, als C++, wird es stärker von Programmierern genutzt, die nicht gut programmieren können.
dann frage ich mich warum es immer noch für *neue* Projekte eingesetzt wird.
Das frage ich mich allerdings bei vielen Projekten auch. Es wundert mich etwas, dass du dir die Frage stellst und nicht die Antwort präsentierst. Ich denke, du gehörst hier zu den Leuten, die am meisten Ahnung von C++ haben. Da solltest du doch die Vorteile von C++ am ehesten kennen und begründen können, oder?
Zum Thema Produktivität. Was soll das eigentlich sein? Was genau will man messen?
C. Jones hat mal ausführlich begründet (als Antwort auf den Artikel "No silver bullet" von F.P. Brooks), warum Qualität letztlich ein viel besserer Maß als Produktivität ist.Ich sehe eher ein Problem, Qualität zu messen. Was soll das eigentlich sein und wie soll man das messen. In der Studie oben wird Produktivität in Codezeilen gemessen. Wenn C++-Programme deutlich kürzer als Java-Programme wären, dann würde es diw ganze Studie relativieren. Allerdings zweifele ich das doch ganz stark an und behaupte eher das Gegenteil. Da es sich bei der Studie nur um einen Programmierer gehandelt hat, ist anzunehmen, dass bei beiden Projekten eine ähnliche Qualität herauskam.
Und im Punkto Qualität steht C++ in meinen Augen Java keinesfalls nach (auch wenn das vielleicht nur für C++ Experten gilt). Nur wenige Sprachen bieten soviele und so reichhaltige Ausdrucksmittel. Man muss halt nur wissen, wie man diese richtig einsetzt.
1. Wer ist schon C++-Experte? Davon gibt es doch eher wenige, oder? Insofern deute ich deine Aussage als ein "Man kann auch mit C++ Qualität produzieren, auch wenn die meisten es wohl nicht schaffen!".
2. Viele und reichhaltige Ausdrucksmittel implizieren IMHO viele verschiedene Fehler, die alle sehr unterschiedlich sein können. Keine Frage: Sie erlauben auch elegante Lösungen, die ohne diese Ausdrucksmöglichkeiten nicht zu Stande kommen würden.
-
Es wundert mich etwas, dass du dir die Frage stellst und nicht die Antwort präsentierst. Ich denke, du gehörst hier zu den Leuten, die am meisten Ahnung von C++ haben. Da solltest du doch die Vorteile von C++ am ehesten kennen und begründen können, oder?
Falsch gedacht. Ich bin Informatik-Student kein Projektleiter, Software-Techniker, Programmierer oder sonste was. Meine Ahnung von C++ beschränkt sich auf ein klein wenig theoretische Kentnisse. Diese beschränken sich aber auch *Standard*-C++. Ich habe keine Ahnung von der realen Welt.
Das ist auch der Grund, warum ich selten bei solchen Diskussionen mitrede. 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.Ich habe noch kein richtig mieses Java-Programm gesehen
Das wundert mich aber doch sehr. Java *zwingt* einen zur OOP und nur ganz wenige haben OOP wirklich verstanden. Die meisten besitzen ein hundsgemeines und gefährliches Halbwissen. Einige haben schlicht weg überhaupt keinen Plan. Und daraus resultieren dann (in meinen Augen) die miesesten Programme. Unwartbar, riesen Abhängigkeiten, scheiß Performance und was es sonst noch schönes gibt. In der Uni hatte ich z.B. letztens ein Beispielprogramm in dem ein High-Level-Package von *allen* Low-Level-Packages abhing. Ich wiederhole: Von allen!
Der Programmierer kannte zwar die Syntax von Java, nur wie man die Sprache effektiv einsetzt, dass wusste er scheinbar nicht.Wenn C++-Programme deutlich kürzer als Java-Programme wären
Also meine C++ Programme sind immer deutlich kürzer als die entsprechenden Java-Programme. Allein schon weil ich nicht andauernd 752 try-catch-Blöcke aufschreiben muss. Aber ACHTUNG: Wie oben bereits erwähnt, ich bin Student kein Programmierer. Es kann also gut sein, dass meine Programme nicht repräsentativ sind.
Wer ist schon C++-Experte? Davon gibt es doch eher wenige, oder?
Och ich denke da gibt's ne ganze Menge. Nur wahrscheinlich nicht halbsoviele wie selbsternannte oder Möchtegernexperten.
Man kann auch mit C++ Qualität produzieren, auch wenn die meisten es wohl nicht schaffen!".
Wäre nicht meine Aussage. Ich bin nur der Meinung, dass Qualität nicht vom Himmel fällt. Du (allgemein. Nicht Gregor) kannst den Leuten nicht dauernd verklickern, dass Programmierern was für Doofe ist und echte Könner (im Sinne von Informatikstars) niemals programmieren und dann erwarten, dass die Doofen tolle Qualität hervorbringen. So nach dem Motto: Ich mache das Modell und den Rest macht der Bleistift. Und wenn das nicht klappt, dann ist die verwendete Sprache scheiße. So läuft das in meinen Augen nicht.
-
Ich stimme dir in jedem Fall zu, dass Programmieren keine Beschäftigung für dumme Leute ist. Wer gut programmieren will muss ne ganze Menge wissen und muss dieses Wissen auch anwenden können. Es ist also nicht nur Intelligenz notwendig, sondern auch Wissen.
Also meine C++ Programme sind immer deutlich kürzer als die entsprechenden Java-Programme. Allein schon weil ich nicht andauernd 752 try-catch-Blöcke aufschreiben muss.
Naja! Die Exceptions beschränken sich bei Java größtenteils auf die schon vorgegebenen Exceptions aus der Standardbibliothek. IMHO treten bei größeren Projekten in Java garnichtmal so viele try-catch-Blöcke auf. In meinem Projekt ist glaube ich eine von 148 Klassen eine Exception und die ist eigentlich auch unnötig und wird wohl irgendwann beseitigt. Außerdem haben, bei mir zumindest, die wenigsten Klassen viel mit der Standardbibliothek zu tun.
...genauso, wie du bei C++ kein try-catch brauchst, brauchst du bei Java kein delete. Um zu sehen, welcher Code größer ist, müßte man wohl ein nicht ganz kleines Prohekt in C++ und in Java schreiben und dann vergleichen. Fänd ich eigentlich ganz interessant.
-
delete brauchts Du in gutem c++ auch nicht - oder zumindest nicht direkt bzw. selten.
Aber wie machst Du ein Java-Programm exception-sicher ohne try-catch-finally
Normalerweise dürften c++-Programme aber ne ganze Menge mehr Code haben. Wegen der Header.
[ Dieser Beitrag wurde am 21.01.2003 um 10:12 Uhr von kartoffelsack editiert. ]
-
ich glaube wir sollten den thread umbennen in C++ vs. Java
ich denke jeder sollte das verwenden mit dem er am beste klar kommmt. c++ is halt nunmal nicht für jeden geeignet, aber als richtiger programmierer sollte man wenigstens eine hochsprache beherschen sei es nun java oder c++.
-
Original erstellt von Gregor:
**
Naja! Die Exceptions beschränken sich bei Java größtenteils auf die schon vorgegebenen Exceptions aus der Standardbibliothek. IMHO treten bei größeren Projekten in Java garnichtmal so viele try-catch-Blöcke auf. In meinem Projekt ist glaube ich eine von 148 Klassen eine Exception und die ist eigentlich auch unnötig und wird wohl irgendwann beseitigt. Außerdem haben, bei mir zumindest, die wenigsten Klassen viel mit der Standardbibliothek zu tun....genauso, wie du bei C++ kein try-catch brauchst, brauchst du bei Java kein delete. Um zu sehen, welcher Code größer ist, müßte man wohl ein nicht ganz kleines Prohekt in C++ und in Java schreiben und dann vergleichen. Fänd ich eigentlich ganz interessant.**
delete p;
ist eine Zeile lang
ausserdem kann man sich mit smart pointer das delete auch sparen :ptry
catch
finally
schon 3 zeilen. und man braucht zum catchen und zum finallyien auch noch code.naja, aber ich kenn Java nicht besonders gut, wenn der aufbau aber ähnlich wie C# ist (wovon ich ausgehe), dann gibt es doch massenweise try catch finally blocks oder?
in meinen C++ Programmen habe ich EINEN try block mit 2-3 catch hinten dran...
in C# habe ich an jeder ecke und ende diese blöcke - OK, kann daran liegen dass ich C# nicht gut kann...also, wieviele try-blöcke kommen bei dir so vor?
-
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.