Mit welcher Sprache anfangen?
-
Ohje der arme McKing wird keine der beiden Sprachen anfassen, wenn ihr so weiter macht..

<auchmalgernflamenmöchte> Wozu braucht C++ nen gc? es gibt doch den gcc </möchtegernflameende>

-
Ich plädiere dafür, das die Wörter Java und C++ zensiert werden, sobald sie in einem Posting auftauchen.

-
Artchi schrieb:
Ich plädiere dafür, das die Wörter Java und C++ zensiert werden, sobald sie in einem Posting auftauchen.

-
Artchi schrieb:
Simon2! Niemand will eine Mauer bauen. ...

Ich glaube, zu diesen "XvsY"-Flamewars kommt es eher, weil Dinge mißverstanden werden ... und teilweise auch mißverstanden werden w/sollen.Ich habe überhaupt nicht über C++ oder Java gesprochen (und auch GC nur als Beispiel genommen).
Ich wage halt nur zu bezweifeln, dass man heutzutage noch große Schwierigkeiten als Programmierer bekommt, wenn man das Programmieren ohne GC nicht gewohnt ist.
Anders gesagt: Ist es wirklich noch wichtig, "Programmieren ohne GC" gelernt zu haben ?
Bis vor einiger Zeit hätte ich das noch absolut bejaht ... aber inzwischen bin ich da zunehmend skeptischer.
(Und das sage ich als jemand, der das so gelernt - und fast noch nie einen GC benutzt hat)Gruß,
Simon2.
-
Simon2! Dann hast du mein Posting nicht verstanden. Ich habe dich doch in deiner Frage sogar bestärkt! Nein, ich habe dir sogar einen Lösungsweg gezeigt. tntnet hat sogar geschrieben, das er seine Objekte nicht mehr selber aufräumt, in dem er zwei andere Lösungen genannt hat.
Lösungswege in C++, um seine Objekte nicht mehr selber aufzuräumen: 3.
Wer da immer noch über eigenes verpflichtendes Objekt-Management motzt, ist blind.Also, um deine Frage noch mal zu beantworten: Nein, niemand muß heute lernen, selber Objekte aufzuräumen.
Und das völlig Sprachübergreifend gesehen.

-
Artchi schrieb:
...ich habe dir sogar einen Lösungsweg gezeigt...
Ich hatte doch nichtmal ein "zu lösendes Problem".
Und tntnet hat eben das Statement aufgestellt, das ich hinterfragte und dem Du widersprichst mit:Artchi schrieb:
...
Also, um deine Frage noch mal zu beantworten: Nein, niemand muß heute lernen, selber Objekte aufzuräumen.
Und das völlig Sprachübergreifend gesehen.
Dann ist doch alles gut, oder ?

Gruß,
Simon2.
-
Simon2 schrieb:
Ich wage halt nur zu bezweifeln, dass man heutzutage noch große Schwierigkeiten als Programmierer bekommt, wenn man das Programmieren ohne GC nicht gewohnt ist.
ich glaube schon...
-
Artchi schrieb:
Ich plädiere dafür, das die Wörter Java und C++ zensiert werden, sobald sie in einem Posting auftauchen.

seconded!
-
tntnet schrieb:
Und zum Schluß nochmals die Bitte: macht keinen Flame-war draus.
Zu einem Flamewar gehören immer mehrere Leute und i.d.R. reagiere ich nur. Ich stelle vergleichende Aussagen von anderen Leuten in Frage oder sage dazu meine Meinung. Vielleicht solltest Du Dir also lieber selbst an die Nase fassen, wenn Du plötzlich derartige vergleichende Aussagen bringst. Wenn überhaupt, dann wärst DU der Auslöser des Flamewars. Wenn Du eine Meinung vertittst, dann musst Du auch damit rechnen, dass jemand darauf reagiert und die gegenteilige Meinung vertritt. Da bringt auch ein "Aber das soll jetzt kein Flamewar werden" nichts mehr. Glaubst Du, Du kannst durch so eine Aussage andere dazu bringen, eine Meinung einfach so stehen zu lassen, obwohl sie den Sachverhalt möglicherweise ganz anders sehen?
BTW: Die Frage nach der Nutzung von "new" usw.. ist eigentlich keine Frage danach, von wo man kommt, sondern eher eine Frage danach, wann man sich C++ beigebracht hat. Guck Dir mal ältere C++ Bücher an. Die Art, C++ zu programmieren, hat sich über die Jahre hinweg massiv weiterentwickelt. ...durchaus in eine sehr interessante Richtung. Entsprechend kann man auch vergleichende Codestücke in der Javainsel oder so sehen: Die sind von Buchversion zu Buchversion einfach mitgezogen worden, ohne dass sie nochmal besonders beachtet oder verändert wurden. Und: In welcher Reihenfolge sich der Autor mit den beiden Sprachen beschäftigt hat, ist mir nicht auf Anhieb klar. Ich vermute eher, dass er C++ früher gemacht hat als Java. ...aber ok: Lassen wir das.
-
@Gregor: und ich soll Deine Kommentare unkommentiert lassen? Das kannst Du nicht erwarten. Wir sind hier schliesslich in einem Diskussionsforum.
Ich versuche, meine Aussagen stets sachlich und ohne Seitenhiebe, wie z. B. "...umgekehrt stimmt das übrigens auch." zu formulieren (oh - das könnte ein Seitenhieb gewesen sein
).Daß Java-Programmierer ihre liebe Not damit haben, sich das new abzugewöhnen, ist meine persönliche Erfahrung. Das wollte ich hier einfach mal einwerfen. Ich glaube nicht, daß das unbedingt einen Flame-war auslösen muß.
Wobei ich diesen Thread gar nicht so auffassen möchte. Hier kommt doch wieder einmal eine sachliche Diskussion rüber, die den originalen Frager, der sich über verschiedene Programmiersprachen informieren möchte, helfen sollte.
Und nun wieder zum Flame-war. Oh sorry - ich meinte natürlich zum Thema.
Was ich an C++ sehr schätze sind Destruktoren. Die gab es auch schon von anfang an. Daher ist die Verwendung von "new" ausserhalb von engen Grenzen (eine Klasse nämlich) in der Regel nicht notwendig. Das hat nichts damit zu tun, wann man C++ "sich beigebracht hat", bzw. gelernt hat (eigentlich komisch, daß man andere Dinge lernt und Programmieren bringt man sich bei
),Bevor Templates in C++ einzug gehalten haben, habe ich mir 2 Makros geschrieben: DEFINE_ARRAY und DECLARE_ARRAY, welches typsichere dynamische Vektoren definiert haben. Das war so ca. 1992. Auch eine String-Klasse habe ich geschrieben. Von daher sehe ich es noch nicht mal so, daß sich die Programmierung in C++ so massiv verändert hat. Natürlich verwende ich heute std::vector und std::string. Aber das Grundprinzip ist gleich geblieben. Und auch das schätze ich an C++.
Diese Konstanz der Sprachdefinition ist doch einfach Klasse. Programme, die vor 15 Jahren geschrieben wurden, kann man mit modernen C++-Compilern noch compilieren und ausführen. Und ich denke, daß wir die Programme, die wir heute schreiben auch in 15 Jahren noch verwenden können. Diese Konstanz müssen andere Programme erst mal beweisen. Da habe ich so meine Bedenken.
Tntnet
-
Gregor schrieb:
In welcher Reihenfolge sich der Autor mit den beiden Sprachen beschäftigt hat, ist mir nicht auf Anhieb klar. Ich vermute eher, dass er C++ früher gemacht hat als Java.
ich kann mir auch gut vorstellen, das für oop-fans, die sich einst mit c++ herumgequält haben, java oder C# wie eine offenbarung sein muss

-
Also ich denke schon, dass es prinzipiell immer noch wichtig ist zumindest zu wissen wie Ressourcenverwaltung (also new/delete usw...) funktioniert. Vielleicht ändert sich das mal, aber im Moment finde ich nicht. Man kann übrigens auch in Java mit GC Memory Leaks erzeugen. Wenn man aber etwas darüber bescheid weiß kann man sowas evtl. vermeiden.
Deshalb find ich es prinzipiell auch nie verkehrt wenn jemand z.B. mit C++ anfängt zu programmieren. Selbst wenn man dann später mal eine andere Sprache benutzen wird, wird das Wissen dass man sich mit C++ angeeignet hat, sicherlich nicht unnütz sein
-
ten schrieb:
Gregor schrieb:
In welcher Reihenfolge sich der Autor mit den beiden Sprachen beschäftigt hat, ist mir nicht auf Anhieb klar. Ich vermute eher, dass er C++ früher gemacht hat als Java.
ich kann mir auch gut vorstellen, das für oop-fans, die sich einst mit c++ herumgequält haben, java oder C# wie eine offenbarung sein muss

Also ich quäle mich mit C++ nicht herum. Ich quäle mich eher mit Java rum, da mir in Java so vieles fehlt, was ich in C++ zu schätzen gelernt habe. Java ist für mich persönlich keine Offenbarung sondern ein Rückschritt.
Was immer wieder vergessen wird ist, daß es noch andere Resourcen ausser Speicher, die frei gegeben werden müssen, wie z. B. Locks, Transaktionen, Filehandles, temporäre Dateien usw. . All das kann ich automatisch im Destruktor der Klasse implementieren, welche dafür zuständig ist. Fehlt mir der Destruktor, wie in modernen Sprache, die GC verwenden, muß ich die Resourcen explizit frei geben.
Tntnet
-
nep schrieb:
...
Deshalb find ich es prinzipiell auch nie verkehrt wenn jemand z.B. mit C++ anfängt zu programmieren....Ich auch nicht.
Aber es ist IMO auch kein Drama, mit Java anzufangen - bzw. inzwischen unterscheide ich zwischen Leuten, die schnell was auf die Beine stellen wollen/müssen und solchen, die sich lieber gründlich mit einem Thema beschäftigen wollen. Ersteren rate ich eher zu Java, letzteren zu C++. (allerdings sage ich Ersteren auch, dass sie das, was sie an Anfang sparen hinterher doppelt "nachzahlen" müssen).nep schrieb:
...
...wird das Wissen dass man sich mit C++ angeeignet hat, sicherlich nicht unnütz sein"Unnütz" sowieso nicht. Es ist auch nicht unnütz, was mein Kollege in Host-ASM und PL1 weiß ... aber es wird zunehmend zu Spartenwissen, das immer weniger Leute beherrschen müssen. Das wird bei uns nur noch in der Systemprogrammierung gebraucht - und das machen in unserer Firma vielleicht 10-20 von 600 Leuten. Von den Anderen programmieren der Großteil nur Java, ein kleinerer Mal Java, mal Cobol und vielleicht 80 Leute C oder C++.
D.h. nur ein 6tel unserer Programmierer haben jemals Erfahrung mit manueller Ressourcenverwaltung gemacht (die "alten" Programmiersprachen wie Cobol haben das ja alles auch nicht) - und da sind beileibe nicht nur Programmiergurken dabei.EDIT: Hier war tntnet mit dem Argument schon schneller:
Ach ja: GC wird IMO in beiden Richtungen überschätzt -tntnet schrieb:
...
Was immer wieder vergessen wird ist, daß es noch andere Resourcen ausser Speicher, die frei gegeben werden müssen, wie z. B. Locks, Transaktionen, Filehandles, temporäre Dateien usw. ...D.h.
- das müssen sie genauso machen (also nix mit "Mit GC kann nichts mehr passieren") aber auch:
- Dadurch haben auch Java-und Cobol-Programmierer Erfahrung mit Ressourcenverwaltung (wenn auch nicht mit so schönen Sprachmitteln wie bei C++
).Ich denke einfach, dass dieses Thema an Gewicht verlieren wird, weil einem immer mehr von OS, Runtime, ... abgenommen und es deswegen irgendwann nur noch von Leuten gebraucht wird, die sowas programmieren.
Gruß,
Simon2.
P.S.: Mein "Host-ASM-Kollege" ist übrigens sehr gefragt mit seinem Spezialwissen und hat sehr lukrative Jobs - auch ein Argument, was man bei der Frage, ob man sich mit "alten Techniken" beschäftigt, mal durch den Kopf gehen lassen sollte.
-
tntnet schrieb:
Was immer wieder vergessen wird ist, daß es noch andere Resourcen ausser Speicher, die frei gegeben werden müssen, wie z. B. Locks, Transaktionen, Filehandles, temporäre Dateien usw. . All das kann ich automatisch im Destruktor der Klasse implementieren, welche dafür zuständig ist. Fehlt mir der Destruktor, wie in modernen Sprache, die GC verwenden, muß ich die Resourcen explizit frei geben.
das stimmt natürlich.
ich hatte mal eine java-klasse gebastelt, die automatisch eine netzwerkverbindung aufmacht und sich anmeldet. kurz vor ende der objektlebenszeit musste noch was über's netz geschickt werden. eigentlich eine aufgabe für einen destruktor. ich hab' dann einfach 'finalize()' überschrieben (in einen try/catch block mit super.finalize(), wie sich das gehört) und das klappte problemlos. der einzige nachteil ist, dass man es nicht ganz exakt zeitlich steuern kann (genau jetzt musst du dich abmelden).

-
Ihr mit eueren Destructoren...
Was immer wieder vergessen wird ist, daß es noch andere Resourcen ausser Speicher, die frei gegeben werden müssen, wie z. B. Locks, Transaktionen, Filehandles, temporäre Dateien usw. . All das kann ich automatisch im Destruktor der Klasse implementieren, welche dafür zuständig ist. Fehlt mir der Destruktor, wie in modernen Sprache, die GC verwenden, muß ich die Resourcen explizit frei geben.
In C++ musst du externe Ressourcen auch explizit freigeben, seit wann macht das der Destructor automatisch? Du musst auch in C++ einen Destruktor definieren, in dem steht: Gibt mir die Ressource frei. Das ist in Java nur an einer anderen Stelle.
Du hast die Möglichkeiten: a) finallize() und b) eine Methode dispose() oder so zu definieren. Ein Destruktor ist auch nichts weiter als eine Methode, die aber halt implizit aufgerufen wird, wenn du das Objekt zerstörst.
Ein GC soll einem nur dir Speicherverwaltung von spracheigenen Ressourcen abnehmen, nicht mehr und nicht weniger.
das stimmt natürlich.
ich hatte mal eine java-klasse gebastelt, die automatisch eine netzwerkverbindung aufmacht und sich anmeldet. kurz vor ende der objektlebenszeit musste noch was über's netz geschickt werden. eigentlich eine aufgabe für einen destruktor. ich hab' dann einfach 'finalize()' überschrieben (in einen try/catch block mit super.finalize(), wie sich das gehört) und das klappte problemlos. der einzige nachteil ist, dass man es nicht ganz exakt zeitlich steuern kann (genau jetzt musst du dich abmelden).Auf die Idee eine Methode disconnect() zu definieren bist du nicht gekommen?
Daß Java-Programmierer ihre liebe Not damit haben, sich das new abzugewöhnen, ist meine persönliche Erfahrung. Das wollte ich hier einfach mal einwerfen. Ich glaube nicht, daß das unbedingt einen Flame-war auslösen muß.
Das ist ja auch nachvollziehbar, alle Objekte in Java werden mit new erstellt, und ist auch für die Sprache Java o.k.
inzwischen unterscheide ich zwischen Leuten, die schnell was auf die Beine stellen wollen/müssen und solchen, die sich lieber gründlich mit einem Thema beschäftigen wollen. Ersteren rate ich eher zu Java, letzteren zu C++. (allerdings sage ich Ersteren auch, dass sie das, was sie an Anfang sparen hinterher doppelt "nachzahlen" müssen).
Also das ist ja Blödsinn hoch 3. Auch in C++ kann man "mal schnell was auf die Beine stellen" und dann hinterher Designfehler ausbügeln. Hast du vor 10 Jahren auch Leuten geraten in Assembler zu programmieren, weil man in Asm ja so viel effezientere Programme schreiben kann?
-
DEvent schrieb:
das stimmt natürlich.
ich hatte mal eine java-klasse gebastelt, die automatisch eine netzwerkverbindung aufmacht und sich anmeldet. kurz vor ende der objektlebenszeit musste noch was über's netz geschickt werden. eigentlich eine aufgabe für einen destruktor. ich hab' dann einfach 'finalize()' überschrieben (in einen try/catch block mit super.finalize(), wie sich das gehört) und das klappte problemlos. der einzige nachteil ist, dass man es nicht ganz exakt zeitlich steuern kann (genau jetzt musst du dich abmelden).Auf die Idee eine Methode disconnect() zu definieren bist du nicht gekommen?
nö, das wollte ich nicht.
das objekt sollte alles selbständig machen (es hat dafür auch einen eigenen thread), verbindung aufbauen, daten in eine queue schieben...und wenn es fertig ist, sich abmelden und tschüss.
-
DEvent! tntnet meinte sowas:
void foo() { fstream f("test.txt"); } // f wird autom. close() aufrufenvoid foo() { try{ FileInputStream f = new FileInputStream("test.txt"); f.close(); // muß ich selber dran denken... }catch(FileNotFoundException e) {} }Wenn ich in Java nicht close() aufrufe, wird f dann geschlossen, wenn der GC Lust und Laune hat. Das im fstream-Dtor einmal auch close() stehen muß, ist klar. Aber es steht nur einmal vom fstream-Entwickler, aber nicht vom Anwender. Das ist der springende Punkt.
-
DEvent schrieb:
Ihr mit eueren Destructoren...
Naja, sie geben einem eben eine synchronisierbare automatische Möglichkeit des Aufräumens. In Java gibt's das halt nicht (automatisch schon, synchronisierbar nicht). Wie wichtig dieses Mittel für eine Sprache ist, muß jeder selbst entscheiden (für mich ist es kein KO-Kriterium) ....
DEvent schrieb:
Daß Java-Programmierer ihre liebe Not damit haben, sich das new abzugewöhnen, ist meine persönliche Erfahrung. Das wollte ich hier einfach mal einwerfen. Ich glaube nicht, daß das unbedingt einen Flame-war auslösen muß.
Das ist ja auch nachvollziehbar, alle Objekte in Java werden mit new erstellt, und ist auch für die Sprache Java o.k.
Hat auch niemand etwas Anderes behauptet. Es geht mehr um die "Kommunikationskultur" hier im Forum ... wenn man weiß, dass jemand von Java herkommt, kann man gezielter Tipps geben ... und bisweilen legt eine in C++ unübliche Verwendung von new es nahe, dass das auf den Fragesteller zutrifft.
(alles noch vollkommen OK)
Wenn man (ich) dann das aber anspricht (z.B. um zielgerechter antworten zu können), gibt es Leute hier, die das gleich zum Anlass für einen Flame-war nehmen.
(Nicht OK)Nach meiner letzten (vollkommen neutralen) Bemerkung in so einer Situation hatte ich auch über eine Woche lang hier einen Stalker an den Hacken wie ein LKW einen kläffenden Hund.....

Das darf man IMO gerne mal beklagen.
DEvent schrieb:
inzwischen unterscheide ich zwischen Leuten, die schnell was auf die Beine stellen wollen/müssen und solchen, die sich lieber gründlich mit einem Thema beschäftigen wollen. Ersteren rate ich eher zu Java, letzteren zu C++. (allerdings sage ich Ersteren auch, dass sie das, was sie an Anfang sparen hinterher doppelt "nachzahlen" müssen).
Also das ist ja Blödsinn hoch 3. Auch in C++ kann man "mal schnell was auf die Beine stellen" und dann hinterher Designfehler ausbügeln. Hast du vor 10 Jahren auch Leuten geraten in Assembler zu programmieren, weil man in Asm ja so viel effezientere Programme schreiben kann?
Was hat denn ASM jetzt damit zu tun ? ASM und C++ unterscheiden sich durch grundsätzlich andere Abstraktionsstufen ... C++ und Java nicht.
Und von "effizienten Programmen" habe ich IIRC auch nichts geschrieben... ich verstehe den Vergleich und deswegen Deine Aussage hier nicht.Nach meiner Erfahrung kommt man als Anfänger mit Java "schneller zum Schuß" als in C++ - nicht mehr und nicht weniger. Kann sein, dass Andere abweichende Erfahrungen gemacht haben, das ändert aber genausowenig an meinen wie der Umstand, dass der Grund dafür nur zum geringeren Teil an der Sprache selbst liegt.
(Es wäre übrigens guter Stil, auf Pauschalaussagen wie "Blödsinn hoch 3" zu verzichten. Die bringen nichts ein und sollen nur ein Thema mit einem "Dicke-Eier-Faktor" versehen, der der Diskussion nie weiterhilft).Gruß,
Simon2.
-
@Artchi: Genau das meinte ich. Und das Java-Beispiel ist ein gutes Beispiel dafür, was man da falsch machen kann. Korrekterweise gehört der Aufruf von close grundsätzlich in einen finally-Block, da man mit der Datei in der Regel was machen möchte, was wiederum eine Exception werfen könnte (wobei das aufgrund der Methodensignatur in der Java-Variante nicht erlaubt wäre, d.h. bei der Verarbeitung darf kein Fehler auftreten - könnte man ja auch mal diskutieren
). Etwa so:void foo() { try{ FileInputStream f = new FileInputStream("test.txt"); try { // mach was mit der Datei, sonst macht das öffnen keinen Sinn } finally { f.close(); // muß ich selber dran denken... } }catch(FileNotFoundException e) {} }Da wird noch deutlicher, daß die Verantwortung, die Resource aufzuräumen beim Anwender der Klasse statt bei der Klasse selbst liegt, wie das bei C++ der Fall ist. Ich finde, die C++-Lösung eleganter:
void foo() { fstream f("test.txt"); // mach was mit der Datei, sonst macht das öffnen keinen Sinn } // f wird autom. close() aufrufenUnd danke Simon2 für den Hinweis auf die Kommunikationskultur. Da kann ich Dir nur zustimmen.
Tntnet