Java lernen sinnlos?
-
JustAnotherNoob schrieb:
nö, nur die syntax beider stammt von C. sonst gibts viele unterschiede.
Ja, java hat keine Pointerarithmetik, Java hat keine Makros, Java hat keine Operatorenüberladung, Java hat keine globalen Funktionen, Java hat keine Templates u.s.w.?
Will sagen die Hauptdinge die fehlen, sind essentieller Natur.
Die Dinge die neu vorhanden sind, sind eher irrelevant. Als mächtiges Beispiel fällt mir auch nur die Reflection ein.Willst du jetzt ersthaft Macros, Pointerarithmetik, Templates, globale Fkt. und Op.ueberladung als essentiell bezeichnen? Macros ist eine Pest um die Schwaeche der Sprache auszumerzen. Generics sind weitaus nuetzlicher als Templates. Auf Pointerarithmetik koennen 99% der Anwendungen verzichten, genau so wie auf Op.ueberladung und globale Fkt. kannst du auch in Java haben, siehe Math http://java.sun.com/javase/6/docs/api/java/lang/Math.html
JustAnotherNoob schrieb:
wann ist es sinnvoll mit zeigern zu arbeiten? beispiel?
willst du ein ganz kleines Beispiel, das gar nicht so ein typische abstrakter C++-Fall ist? Um einfacher auf einzelne Bytes zugreifen zu können, z.B. bei Bildbearbeitung. Das ist jedenfalls eine Anwendung, in der im .NET Framework für C# Pointer verwendet werden!
Braucht man selten, ist scheißegal, dann verwendest du Pointer eben nur selten, aber du hast das Mittel, in Java hast du es halt nicht, das ist kein Vorteil von Java.Der eingebauter und sehr effektiver GC in Java ist aber ein sehr grosser Vorteil. In Java kannst du auch gerne auf Bytes direkt zugreifen, es gibt die NIO Bibliothek in Java http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html
JustAnotherNoob schrieb:
das sind doch nur verpackungen für schnöde function-pointer, bzw. mehrere davon werden in listen verwaltet. sowas in der art kriegste sogar mit ansi-C locker hin. Java hat übrigens das 'Runnable'-Interface, was z.b. so ähnlich wie function pointer eingesetzt werden kann.
Das in Java ist aber mehr Code. Es ist semantisch das selbe, du kannst in Java natürlich alles machen wie in C++. Es ist nur hässlich, wie man es macht.
Und dein erster Satz trifft das Wesen von C++ genau: Low-Level Features, die leicht mit Libs abstrahiert werden können. Klar sinds intern nur Functionpointer, aber sie verhalten sich nicht so. Abstraktion eben.Das gleiche kannst du auch in Java erreichen, nicht umsonst hat Java eine Anbindung an C/C++.
JustAnotherNoob schrieb:
im grunde sind doch alles alte kamellen, die's in anderer form schon lange irgendwo gibt. dass man mit C++ vieles mit templates u.ä. irgendwie nachbasteln kann, ist ja nichts berauschendes. mich wundert nur immer wieder, dass es bei manchen solche begeisterung hervorruft.
Weil es die Sprache eben flexibel macht, das kann Java nicht.
Versteh mich nicht falsch, es gibt eine Menge Sprachen, die derart flexibel sind, aber Java ist eben nicht so flexibel. Und das Thema war ob die Sprache untergehen wird und aufgrund der mangelnden Flexibilität wird sie immer weiter veralten. Sie spiegelt doch heute immer noch den selben Stil wieder, an den mich C++-Bibliotheken erinnern, die aus der Entstehungszeit Javas stammen. Java war da spezialisierter, schöner für diesen Programmierstil, aber C++ hat sich weiter entwickelt, Java nicht.Der Letzte Standard von C++ ist von 2003, der neue wird vielleicht irgendwan in den naechsten 2 Jahren veroeffentlicht. Java wurde immer weiter kontinuierlich verbessert.
--
Eigentlich ist die ganze Diskussion hier laecherlich. Java hat nunmal eine Luecke gefuellt, die C++ nicht fuellen konnte (oder schlecht gefuellt hat). Es hat sich zum sehr efolgreichen Industriestandard etabliert, man kann mit der Sprache, den Tools und den Bibliotheken sehr gute und robuste Programme entwickeln.
Java hat eine ausgezeichnete Bibliothek, die auf vielen Plattformen zugaenglich und Open Source ist. Meiner Meinung nach kann man in Java weitaus besser Applikationen entwickeln als mit vergleichbaren Sprachen. Die Sprache konzentriert sich auf die wesentlichen Features, bringt sehr gute Bibliotheken und Tools mit.
Natuerlich ist Java nicht fuer alle Anwendungsbeispiele geeignet, aber in GUI und Server Einsatz ist sie top.
-
pointercrash() schrieb:
Welche Sprache bietet also OOP, allgemeine Programmierdenke, übersichtliches Konzept und frühe Erfolgserlebnisse an? Also alles das, was pädagogisch erwünscht ist?
Wie waere es mit Python?
-
eignet sich natürlich auch sehr gut als Anfängersprache, allerdings scheint mir für OOP smalltalk geeigneter.
-
JustAnotherNoob schrieb:
Und das Thema war ob die Sprache untergehen wird und aufgrund der mangelnden Flexibilität wird sie immer weiter veralten. Sie spiegelt doch heute immer noch den selben Stil wieder, an den mich C++-Bibliotheken erinnern, die aus der Entstehungszeit Javas stammen. Java war da spezialisierter, schöner für diesen Programmierstil, aber C++ hat sich weiter entwickelt, Java nicht.
Auch Java hat sich weiter entwickelt. Mit jeder Version wurde die Java API aufgebohrt und mit Java 5 sind neue Sprachfeatures dazugekommen. Natürlich gibts mittlerweile modernere wesentlich schickere Sprachen. Java ist ja nun auch nicht mehr die jüngste Sprache.
Aber was in solchen Diskussion nie zur Sprache kommt, ist die Tatsache, dass es im Wesentlichen nicht die Sprache selbst ist, die Java so stark macht, sondern die gesamte Plattform Java mit allen Tools, Libraries und Frameworks.
Guckt Euch doch nur mal Frameworks wie Hibernate, Spring oder das gesamte Eclipse Umfeld (nicht die IDE sondern die OSGi Plattform mit all den Open Source Frameworks). Dazu gibts haufenweise exzellente Application-Server, IDEs, Build Tools (Maven und Co), ergänzende Programmieransätze (AspectJ) usw. Gerade durch die Java Reflection API oder Bytecode Instrumentation bieten einem viele Frameworks einen Comfort, den man in anderen Sprachen vergeblich sucht.Wer der Meinung sei, die Java Plattform entwickle sich nicht weiter, der hat die letzten 10 Jahre echt gepennt oder schlichtweg keine Ahnung, wovon er da spricht.
Aber ansonsten habt ihr nicht unrecht, die _Sprache_ Java ist mittlerweile altbacken (die Betonung liegt auf Sprache, nicht auf Plattform oder Ökosystem) und wird langsam durch andere Sprachen ersetzt (siehe Groovy, Scala).
-
JustAnotherNoob schrieb:
nö, nur die syntax beider stammt von C. sonst gibts viele unterschiede.
Ja, java hat keine Pointerarithmetik, Java hat keine Makros, Java hat keine Operatorenüberladung, Java hat keine globalen Funktionen, Java hat keine Templates u.s.w.?
Will sagen die Hauptdinge die fehlen, sind essentieller Natur.ja, essentiell für C++, zum beispiel für seine eigenschaft übermässig aufgebläht zu sein. naja, wir sind mal wieder beim vielzitierten apfel/birnenvergleich angekommen.
JustAnotherNoob schrieb:
wann ist es sinnvoll mit zeigern zu arbeiten? beispiel?
...
Um einfacher auf einzelne Bytes zugreifen zu können, z.B. bei Bildbearbeitung. Das ist jedenfalls eine Anwendung, in der im .NET Framework für C# Pointer verwendet werden!und du musst der meinung sein, sowas sowas geht nur vernünftig mit pointern, ne?
JustAnotherNoob schrieb:
...du kannst in Java natürlich alles machen wie in C++. Es ist nur hässlich, wie man es macht.
in java macht man's eben nicht wie in C++. denn dann wäre es hässlich.
...aber C++ hat sich weiter entwickelt...
ja, so wie der hund, aus dem ein krake werden soll. man nagelt einfach ein paar beine mehr dran. das klappt schon irgendwie.
-
Java lernen sinnlos?
Ja.
-
41011 Projekte auf Sourceforge
Das ist kein Argument. Ich beschaeftige mich zur Zeit mit Fujaba und Story-Diagramm-Modeling. Die Software generiert Java-Code und funktioniert soweit. Doch der generierte Code ist grausam, ekelhaft und scheisse. Jedesmal wenn ich den sehe, dann koennte ich mich aufregen. Die Implementation von Fujaba selbst ist auch unter aller Sau. Das ist auch kein Argument, nur ein Beispiel.
Mit smalltalk als Lehrsprache würde den Schülern lupenreine OOP vermittelt werden. Objektorientiertes Denken ohne Ablenkung durch komplizierte Syntax. Ist das nicht genug didaktischer Nährwert ?
Genau das ist das Problem, OOP ist hip und niemand macht mehr was anderes. Deswegen werden Java und Co. auf alle Probleme losgelassen und produzieren sowas grauenhaftes wie Fujaba. OOP geschaedigt wuerde ich sowas nennen.
wahrscheinlich beste IDE
ist Vim ... und indiskutabel
Lambda und First-Class Funktionen
Koennen in C++ bzw. Java nachgebildet werden. Meine Erfahrung mit Scheme zeigt mir aber, dass die funktionalen Elemente in C++ bzw. Java eher lachhaft erscheinen gegenueber den Moeglichkeiten in Scheme. Lisp sonst immer als altbacken ausgelacht, haelt jetzt Einzug in moderne Sprachen. Das wird dann als tolles neues Feature beworben, obwohl es 60 Jahre alt ist. Im Endeffekt werden OOP-Sprachen einfach durch funktionale Sprachen infiziert, unterwandert und assimiliert.
mit C++ vieles mit templates u.ä. irgendwie nachbasteln kann
Nein, Templates sind eine neue Qualitaet und hat nichts mit Nachbasteln zu tun.
sehr effektiver GC in Java ist aber ein sehr grosser Vorteil
Lisp, 1960 ... sorry alter Hut und gibt es auch fuer C, C++ und Co.
Java wurde immer weiter kontinuierlich verbessert
Ist aehnlich wie mit DirektX und OpenGL. Hinter Java steht eine einzelne Firma, hinter C++ steht ein Kommitee. Da ist das einfacher mit Weiterentwicklung. Auch wuerde ich es nicht als Entwicklung bezeichnen, eher als Kurswechsel. Der Slogan "compile once run everywhere" ist leider nicht mehr gueltig.
-
knivil schrieb:
Lambda und First-Class Funktionen
Koennen in C++ bzw. Java nachgebildet werden.
Wie denn?
(Und erzähl mir nichts davon, daß es sogar in C oder Assembler geht, wenn man es zu Fuß macht; das weiß ich selbst. Darum geht es aber nicht.)knivil schrieb:
Der Slogan "compile once run everywhere" ist leider nicht mehr gueltig.
Es heißt ja auch "Compile once, debug everywhere"
-
knivil schrieb:
Doch der generierte Code ist grausam, ekelhaft und scheisse. Jedesmal wenn ich den sehe, dann koennte ich mich aufregen...Das ist auch kein Argument, nur ein Beispiel.
ein besipiel dafür, dass generierter code nicht unbedingt ästhetisch sein muss, hauptsache er ist richtig und wird von compiler gefressen. sind c++ libraries, wie z.b. boost und stl eigentlich auch maschinell erzeugt worden? jedenfalls sehen sie so aus.
knivil schrieb:
mit C++ vieles mit templates u.ä. irgendwie nachbasteln kann
Nein, Templates sind eine neue Qualitaet und hat nichts mit Nachbasteln zu tun.
templates sind auch nichts anderes als ein codegenerator, nur ein fest eingebauter. im prinzip nichts weiter, als ein präprozessor, der type-checking und optimiermöglichkeiten beherrscht, also irgendwie nix, was einem freudentränen entlocken, oder anderen sprachen fehlen würde.
-
+fricky schrieb:
templates sind auch nichts anderes als ein codegenerator, nur ein fest eingebauter. im prinzip nichts weiter, als ein präprozessor, der type-checking und optimiermöglichkeiten beherrscht, also irgendwie nix, was einem freudentränen entlocken, oder anderen sprachen fehlen würde.
Spätestens wenn die Kompilierzeit durch die Templates ins unermessliche steigt, sinds wohl keine Freudentränen mehr.
knivil schrieb:
Lambda und First-Class Funktionen
Koennen in C++ bzw. Java nachgebildet werden. Meine Erfahrung mit Scheme zeigt mir aber, dass die funktionalen Elemente in C++ bzw. Java eher lachhaft erscheinen gegenueber den Moeglichkeiten in Scheme.
Dafür würde man in der Java-Welt zukünftig dann wohl auch lieber Scala benutzen. Wie siehts bei C++ aus?
-
Natuerlich hat C++ keine Sprachmittel fuer first class Funktionen und muessen per Hand (zu Fuss, ... ) nachgebildet werden, Funktoren zu deutsch. C++ hat auch keine Referenzzaehlung, aber der Implementationsaufwand fuer smart pointer ist vertretbar. Und genau darum geht es: Waehrend es in Java Klassen fuer jeden Scheiss gibt, so bietet C++ einfache Moeglichkeiten das Benoetigte selbst zu implementieren. Die Trennung zwischen Sprache und Klassenbibliothek ist in C++ klarer als in Java. Niemand wuerde ernsthaft mit Java arbeiten, wenn die Klassenbibliothek wegfallen wuerde.
Wie siehts bei C++ aus?
Man wuerde eine Sprache/Runtime wie Scheme nehmen und beide Welten mit einem Interface verbinden. Warum was nachahmen, was andere sowieso besser koennen.
Zu Templates und Compilezeit: Dort einsetzen, wo es sinnvoll ist, und die Compilezeit ist kein Problem.
-
byto schrieb:
Wie siehts bei C++ aus?
kannste dir doch denken: c++ führt einfach ein paar neue schlüsselwörter (selbstverständlich mit mehrfachbelegungen) und syntaxelemente ein. der krake, der einst ein hund war, lässt grüssen.
-
DEvent:
Eigentlich ist die ganze Diskussion hier laecherlich. Java hat nunmal eine Luecke gefuellt, die C++ nicht fuellen konnte (oder schlecht gefuellt hat).
Ich glaub das ist es, was Volkard meinte, mit statt Argumenten kommt nur Glaube.
Willst du jetzt ersthaft Macros, Pointerarithmetik, Templates, globale Fkt. und Op.ueberladung als essentiell bezeichnen? Macros ist eine Pest um die Schwaeche der Sprache auszumerzen. Generics sind weitaus nuetzlicher als Templates. Auf Pointerarithmetik koennen 99% der Anwendungen verzichten, genau so wie auf Op.ueberladung und globale Fkt. kannst du auch in Java haben, siehe Math http://java.sun.com/javase/6/docs/api/java/lang/Math.html
zu Teil 1.
Ja, ich möchte es als essenziell bezeichnen und ja ich möchte es auch nicht als essenzielles Element der Programmierung sondern nur als essenzielle Elemente in der C++ Programmierung bezeichnen.
Ich möchte darauf hinaus, dass es das ist, wie man in C++ am effektivsten Probleme löst. In Java nimmt man dieses Mittel nun einfach raus und man kommt auf die suboptimale Lösung, die zwar auch in C++ möglich ist, aber höchstens mal vor 10 Jahren verwendet wurde.
zu Teil 2:
Statische Funktionen in einer eigenen Klasse sind in der Tat global, haben nur eine unschönere Syntax. Mal ehrlich, ist es ein Vorteil Math.sin statt sin zu schreiben? Kein großer Nachteil, ich weiß, aber eine Frage der Ästhetik, da globale Funktionen in Java ja bewusst weggelassen wurden, frage ich mich halt welcher Depp auf die Idee kam. statischer Import wurde ja erst in Java 5 eingebaut.
Das Resultat sind Funktionen mit etlichen Memberfunktionen, die ja unbestreitbar der OOP abträglich sind(Stichwort Datenkapselung)
Zu Templates und Generics:
Hast du schonmal mit Templates programmiert?
Generics haben ihre Vorteile, aber Templates sind eindeutig mächtiger, insbesondere in Kombination mit Operatorenüberladung.
Mach mal eine mathematische Vektorklasse in Java bei der der Typ egal ist. Das geht einfach nicht, du musst die Klasse kopieren und den Typ ersetzen, wenn du wirklich beide brauchst.Der eingebauter und sehr effektiver GC in Java ist aber ein sehr grosser Vorteil. In Java kannst du auch gerne auf Bytes direkt zugreifen, es gibt die NIO Bibliothek in Java http://java.sun.com/javase/6/docs/api/java/nio/package-summary.html
Ja. Ein GC ist effektiver als Smartpointer in C++. Hauptsächlich weil er schneller ist, dass Java aber langsamer ist als C++ macht dein Argument irgendwie zu Nichte.
Das gleiche kannst du auch in Java erreichen, nicht umsonst hat Java eine Anbindung an C/C++.
Nein, es ging mir nicht darum, dass C++ low-level Aufgaben übernehmen kann, es ging mir um die Eigenschaft der Sprache wunderbar zu skalieren.
In Java hast du bei den Sprachmitteln ein höheres Abstraktionslevel als bei C++, aber du kannst wesentlich schlechter Abstrahieren, weil dir einfach die Mittel fehlen. Smartpointer in Java zu bauen wäre nicht möglich, man bräuchte einen Workaround, dass man es nicht braucht ist was ich mit der höheren Ausgangsabstraktion meinte, aber es ist ein Beispiel dafür wie uneffektiv diese Sprache ist.Der Letzte Standard von C++ ist von 2003, der neue wird vielleicht irgendwan in den naechsten 2 Jahren veroeffentlicht. Java wurde immer weiter kontinuierlich verbessert.
1. sind die schwerwiegenden Dinge die in Java neu eingebaut wurden, wie Generics in C++ schon enthalten(oder eben Alternativen: Templates)
2. you missed the point. Ich wollte darauf hinaus, dass C++ sich auch ohne Standard weiter entwickelt, weil man eben nicht an ein Programmierparadigma gebunden wird. In Java programmieren die Leute seit 15 Jahren gleich, leglich bei einer Veränderung der Sprache werden neue Dinge mit einbezogen. C++ hat man vor einiger Zeit noch ganz anders programmiert, schau dir nur mal die Bibliotheken an.Byto:
Auch Java hat sich weiter entwickelt. Mit jeder Version wurde die Java API aufgebohrt und mit Java 5 sind neue Sprachfeatures dazugekommen.
Wikipedia sagt:
-Generische Typen (Generics)
Sind mit Templates in C++ schon ewig enthalten, auch andere Sprachen haben Generics in der Form wie in Java schon ewig gehabt, aber letzteres kann man auf so ziemlich alles anwenden
-Vereinfachte Syntax für die Iteration über Collections, Maps und Arrays
BOOST_FOREACH, sicher nicht so schön wie ein Sprachelement, aber C++-Programmierer waren nicht auf ein Sprachupdate angewiesen(das ja jetzt doch kommt).
-Autoboxing/-unboxing (d. h. implizite Umwandlung von primitiven Datentypen in Objekte und zurück)
Ausgleich eines Designfehlers Java (primitive Typen in einer OO-fokussierten Sprache)
-Metadaten mit Hilfe von Annotationen
Zählt auf Reflection, die gibt es in C++ nicht, eine der Dinge die ich in C++ vermisse, wie bereits gesagt.
-Syntaktische Unterstützung für Aufzählungswerte („Enumerations“)
entferntes Feature wird wieder eingebaut
-Unterstützung für variable Argumentenlisten von Methoden
selbes
-Statischer Import von Klassen
Hab ich schon was dazu gesagtAber was in solchen Diskussion nie zur Sprache kommt, ist die Tatsache, dass es im Wesentlichen nicht die Sprache selbst ist, die Java so stark macht, sondern die gesamte Plattform Java mit allen Tools, Libraries und Frameworks.
Guckt Euch doch nur mal Frameworks wie Hibernate, Spring oder das gesamte Eclipse Umfeld (nicht die IDE sondern die OSGi Plattform mit all den Open Source Frameworks). Dazu gibts haufenweise exzellente Application-Server, IDEs, Build Tools (Maven und Co), ergänzende Programmieransätze (AspectJ) usw. Gerade durch die Java Reflection API oder Bytecode Instrumentation bieten einem viele Frameworks einen Comfort, den man in anderen Sprachen vergeblich sucht.Wer der Meinung sei, die Java Plattform entwickle sich nicht weiter, der hat die letzten 10 Jahre echt gepennt oder schlichtweg keine Ahnung, wovon er da spricht.
Aber ansonsten habt ihr nicht unrecht, die _Sprache_ Java ist mittlerweile altbacken (die Betonung liegt auf Sprache, nicht auf Plattform oder Ökosystem) und wird langsam durch andere Sprachen ersetzt (siehe Groovy, Scala).
Ich glaube so etwas bereits gesagt zu haben. Genau meine Meinung, ich programmiere selbst gerne in Scala, vermisse dort zwar auch Teile aus C++, aber andersrum gehts mir genauso, man kann nicht alles haben. Mir ging es immer nur darum, dass die Sprache mies ist. Ich würd auch gar nichts dagegen sagen, wenn nicht immer so getan würde, als wäre die Sprache so modern.
Fricky:
frickys gebrabbel
da steht nix drin auf das ich eingehen könnte. Nur "Java ist toll, C++ ist scheiße" mehr nicht. Hast du auch ausnahmsweise mal Argumente?
Nur eines noch:templates sind auch nichts anderes als ein codegenerator, nur ein fest eingebauter. im prinzip nichts weiter, als ein präprozessor, der type-checking und optimiermöglichkeiten beherrscht, also irgendwie nix, was einem freudentränen entlocken, oder anderen sprachen fehlen würde.
Wie schließt du denn nun vom ersten auf das zweite? Allgemeine und einfache Mittel sind meist die effektivsten. Es ist ein simpler Codegenerator, mit einem Präprozessor zu vergleichen.. ja.. und weiter? Er erleichtert einem die Arbeit enorm, deswegen fehlt er mir.
-
JustAnotherNoob schrieb:
Nein, es ging mir nicht darum, dass C++ low-level Aufgaben übernehmen kann, es ging mir um die Eigenschaft der Sprache wunderbar zu skalieren.
noch nicht mal für solche low-level aufgaben musste c++ benutzen.
JustAnotherNoob schrieb:
Smartpointer in Java zu bauen wäre nicht möglich, man bräuchte einen Workaround, dass man es nicht braucht ist was ich mit der höheren Ausgangsabstraktion meinte, aber es ist ein Beispiel dafür wie uneffektiv diese Sprache ist.
versuch doch nicht immer alles aus einer begrenzten C++-perspektive zu sehen, das ist ja grausam. smartpointer sind der inbegriff eines workarounds. was hat sowas in anderen programmiersprachen verloren?
JustAnotherNoob schrieb:
templates sind auch nichts anderes als ein codegenerator, nur ein fest eingebauter. im prinzip nichts weiter, als ein präprozessor, der type-checking und optimiermöglichkeiten beherrscht, also irgendwie nix, was einem freudentränen entlocken, oder anderen sprachen fehlen würde.
Wie schließt du denn nun vom ersten auf das zweite? Allgemeine und einfache Mittel sind meist die effektivsten. Es ist ein simpler Codegenerator, mit einem Präprozessor zu vergleichen.. ja.. und weiter? Er erleichtert einem die Arbeit enorm, deswegen fehlt er mir.
dir und wahrscheinlich vielen anderen c++ codern. aber frag doch mal 'nen ML-, lisp-, scheme-, sonstwas-programmierer, ob er sich sowas wie C++ templates in seiner programmiersprache haben will. ich glaub nicht, dass viele mit 'ja' antworten würden.
-
knivil schrieb:
Zu Templates und Compilezeit: Dort einsetzen, wo es sinnvoll ist, und die Compilezeit ist kein Problem.
Erzähl das mal den Boost-Autoren
JustAnotherNoob schrieb:
dass Java aber langsamer ist als C++
... trifft schlicht nicht zu. Wenn das mal nicht dein Argument zunichte macht.
JustAnotherNoob schrieb:
Wikipedia sagt:
-Generische Typen (Generics)
Sind mit Templates in C++ schon ewig enthalten, auch andere Sprachen haben Generics in der Form wie in Java schon ewig gehabt, aber letzteres kann man auf so ziemlich alles anwendenIst ja nicht so, daß Generics gegenüber Templates keine Vorteile hätten. (Allerdings halte ich von den Generics in Java auch nicht allzu viel infolge der einschränkenden Umsetzung; C# und Delphi zeigen, wie man es "richtig" macht.)
JustAnotherNoob schrieb:
-Vereinfachte Syntax für die Iteration über Collections, Maps und Arrays
BOOST_FOREACH, sicher nicht so schön wie ein Sprachelement, aber C++-Programmierer waren nicht auf ein Sprachupdate angewiesen(das ja jetzt doch kommt).Hast du dir schonmal angesehen, wie BOOST_FOREACH() oder gar BOOST_TYPEOF() implementiert ist?
Es amüsiert mich jedesmal erneut, daß manche meinen, so etwas in Produktivcode einsetzen zu müssen.Aber was in solchen Diskussion nie zur Sprache kommt, ist die Tatsache, dass es im Wesentlichen nicht die Sprache selbst ist, die Java so stark macht, sondern die gesamte Plattform Java mit allen Tools, Libraries und Frameworks.
Guckt Euch doch nur mal Frameworks wie Hibernate, Spring oder das gesamte Eclipse Umfeld (nicht die IDE sondern die OSGi Plattform mit all den Open Source Frameworks). Dazu gibts haufenweise exzellente Application-Server, IDEs, Build Tools (Maven und Co), ergänzende Programmieransätze (AspectJ) usw. Gerade durch die Java Reflection API oder Bytecode Instrumentation bieten einem viele Frameworks einen Comfort, den man in anderen Sprachen vergeblich sucht.Ganz recht. Das ist die große Stärke von Java, und die Defizite der Sprache spielen nur bedingt mit hinein.
+fricky schrieb:
JustAnotherNoob schrieb:
Smartpointer in Java zu bauen wäre nicht möglich, man bräuchte einen Workaround, dass man es nicht braucht ist was ich mit der höheren Ausgangsabstraktion meinte, aber es ist ein Beispiel dafür wie uneffektiv diese Sprache ist.
versuch doch nicht immer alles aus einer begrenzten C++-perspektive zu sehen, das ist ja grausam. smartpointer sind der inbegriff eines workarounds. was hat sowas in anderen programmiersprachen verloren?
Grundsätzlich hast du recht; jedenfalls kann man Smart-Pointer guten Gewissens als Workaround betrachten, wenn ihre Verwendung obligatorisch ist. Aber die Option, überhaupt so etwas wie einen Smart-Pointer schreiben zu können, kann dir doch manchmal das Leben und das Ressourcenmanagement spürbar vereinfachen. Ein kleines Beispiel wäre mein Problem im "Zyklische Referenzen"-Thread nebenan: in C++, C++/CLI oder Delphi kann ich entweder AddRef() und Release() entsprechend umbiegen oder angepaßte Smart-Pointer schreiben. Und in Java - sieh selbst.
-
noch nicht mal für solche low-level aufgaben musste c++ benutzen.
Ich meine, es war mir ja schon vorher klar, aber das ist der endgültige Beweis. Du liest nichtmal was ich schreibe. Du liest sogar nichtmal das, was du zitierst.
versuch doch nicht immer alles aus einer begrenzten C++-perspektive zu sehen, das ist ja grausam. smartpointer sind der inbegriff eines workarounds. was hat sowas in anderen programmiersprachen verloren?
Und wieder liest du nicht. Es ging um die Möglichkeit.
... trifft schlicht nicht zu. Wenn das mal nicht dein Argument zunichte macht.
Ich begründe meine Aussage mit den vielen Optimierungsmöglichkeiten, die dir C++ bietet. Und du? Mit Sunpropagandabenchmarks?
Ist ja nicht so, daß Generics gegenüber Templates keine Vorteile hätten. (Allerdings halte ich von den Generics in Java auch nicht allzu viel infolge der einschränkenden Umsetzung; C# und Delphi zeigen, wie man es "richtig" macht.)
Generics ermöglichen nicht annähernd das, was man mit Templates erreichen kann. Man kann mit ihnen wirklich nur Container schreiben. Zumindest in Java,
ich kenne Delphi nicht(Die Sprache fiel für mich immer schon weg, weil es in Händen Codegears ist und sich effektiv auf Windows beschränkt.), vielleicht kannst du mir erläutern, was die Unterschiede sind?Hast du dir schonmal angesehen, wie BOOST_FOREACH() oder gar BOOST_TYPEOF() implementiert ist?
Es amüsiert mich jedesmal erneut, daß manche meinen, so etwas in Produktivcode einsetzen zu müssen.Nein habe ich nicht. Ich schaue mir Libs eigtl. sehr selten an. Es funktioniert und das ist die Hauptsache.
-
templates, RTTI usw. sind letztlich doch Versuche, bestimmte Eigenschaften dynamisch typisierter Sprachen (zB Introspektion) in das statisch typisierte C++ einzupassen. Daß das zu immer höherer Komlexität an Syntax einhergehen muß, ist irgendwie zu ewarten. Warum nicht den Weg konsequent gehen, und C++ zusätzlich zur statischen um dynamische Typisierung erweitern, sodaß man diejenigen Bezeichner, deren Typprüfung zur Compilezeit nicht erforderlich ist, einfach mit "late binding" behandelt.
Viele wären wahrscheinlich überrascht, wie selten man die Sicherheit und Performance statischer Typisierung bei vielen nicht-kritischen Programmaufgaben wirklich braucht.
my EUR 0.02
-
templates, RTTI usw. sind letztlich doch Versuche, bestimmte Eigenschaften dynamisch typisierter Sprachen (zB Introspektion) in das statisch typisierte C++ einzupassen. Daß das zu immer höherer Komlexität an Syntax einhergehen muß, ist irgendwie zu ewarten. Warum nicht den Weg konsequent gehen, und C++ zusätzlich zur statischen um dynamische Typisierung erweitern, sodaß man diejenigen Bezeichner, deren Typprüfung zur Compilezeit nicht erforderlich ist, einfach mit "late binding" behandelt.
Dynamisch typisierte Sprachen haben eine hohe Flexibilität und C++ nimmt sich einige der Vorteile. Richtig. Aber ohne die Nachteile, C++ bleibt statisch typisiert, was besser ist ist nicht Bestand dieser Diskussion.
-
JustAnotherNoob schrieb:
... trifft schlicht nicht zu. Wenn das mal nicht dein Argument zunichte macht.
Ich begründe meine Aussage mit den vielen Optimierungsmöglichkeiten, die dir C++ bietet.
Gegen die habe ich ja nichts. Aber die Vorteile von C++ liegen eher selten in der Ausführungsgeschwindigkeit; moderne JVM- und CLR-Implementationen können da ganz gut mithalten. C++-Compiler können zwar bei weitem am besten optimieren - was eher weniger in der überhaupt nicht optimierungsfreundlichen Natur der Sprache C++, sondern eher in der großen Nachfrage nach solchen Werkzeugen begründet ist -, aber einiges davon kann ein JIT-Compiler auch prinzipbedingt kompensieren. In jedem Falle aber ist eine Aussage wie "dass Java aber langsamer ist als C++" unsinnig.
JustAnotherNoob schrieb:
Und du? Mit Sunpropagandabenchmarks?
Na komm. Du verlangst von mir Benchmarks, um dein unbelegtes Argument zu widerlegen?
JustAnotherNoob schrieb:
Generics ermöglichen nicht annähernd das, was man mit Templates erreichen kann. Man kann mit ihnen wirklich nur Container schreiben. Zumindest in Java
Ich sagte ja bereits, daß die Java-Generics aufgrund der Implementation über Type Erasure viel zu eingeschränkt sind. In Delphi kannst du mit Generics zwar vorrangig Container (das aber ganz ohne Boxing), aber auch z.B. Smart-Pointer oder Allokatoren schreiben. Und in der Kombination mit anonymen Methoden und RTTI kann man auch Generatoren (-> yield) oder sogar sogar anonyme Klassen simulieren - die sogar besser sind als anonyme Klassen in Java, da anonyme Methoden auf den Scope der umgebenden Methode zugreifen können.
Was natürlich wegfällt, ist die Metaprogrammierung. Die benutze ich in C++, soweit nötig und sinnvoll, auch sehr gerne - aber in Delphi habe ich sie, offen gestanden, fast noch nie vermißt. Es verhält sich ganz ähnlich wie mit Makros. (Und - darin sind wir uns ja vermutlich einig - der Template-Mechanismus ist auch nur ein etwas flexiblerer und typsicherer Präprozessor, der sich für eine Turingmaschine hält. Und um das Ding als Programmiersprache mißbrauchen zu wollen, wiegt mir der nicht vorhandene Komfort beim Debuggen zu schwer.)
JustAnotherNoob schrieb:
ich kenne Delphi nicht(Die Sprache fiel für mich immer schon weg, weil es in Händen Codegears ist und sich effektiv auf Windows beschränkt.), vielleicht kannst du mir erläutern, was die Unterschiede sind?
Bitte lies eines der zahllosen Tutorien zu Generics in Delphi oder C#. Einige interessantere Anwendungen von Generics findest du auch z.B. auf dem Blog von Barry Kelly.
JustAnotherNoob schrieb:
Hast du dir schonmal angesehen, wie BOOST_FOREACH() oder gar BOOST_TYPEOF() implementiert ist?
Es amüsiert mich jedesmal erneut, daß manche meinen, so etwas in Produktivcode einsetzen zu müssen.Nein habe ich nicht. Ich schaue mir Libs eigtl. sehr selten an. Es funktioniert und das ist die Hauptsache.
Es funktioniert bei einigen grundlegenden Typen, aber wenn ein Typ zufällig nicht entsprechend präpariert wurde, scheitert BOOST_TYPEOF() und vermutlich daher auch BOOST_FOREACH() mit einer üblicherweise alles andere als zielführenden Fehlermeldung. Und stell dir vor, das Ding hat eventuell mal einen Bug.
Mir ist es wichtig, die Bibliotheken, die ich benutze, debuggen und im Zweifelsfall auch ausbessern zu können. Dieses Unterfangen wäre bei BOOST_TYPEOF(), je nach Veranlagung, masochistisch bis suizidal. Und große Teile von Boost sind da nicht viel besser.
-
Gegen die habe ich ja nichts. Aber die Vorteile von C++ liegen eher selten in der Ausführungsgeschwindigkeit; moderne JVM- und CLR-Implementationen können da ganz gut mithalten. C++-Compiler können zwar bei weitem am besten optimieren - was eher weniger in der überhaupt nicht optimierungsfreundlichen Natur der Sprache C++, sondern eher in der großen Nachfrage nach solchen Werkzeugen begründet ist -, aber einiges davon kann ein JIT-Compiler auch prinzipbedingt kompensieren. In jedem Falle aber ist eine Aussage wie "dass Java aber langsamer ist als C++" unsinnig.
du sagst es doch selbst "ganz gut mithalten"
es ging mir in meinem Argument nur darum, dass Java definitiv nicht schneller ist als C++ und deswegen der GC hier seinen Hauptvorteil gegenüber Reference Counting ausgeglichen bekommt. Zirkuläre Referenzen hab ich persönlich zumindest sehr selten.Es funktioniert bei einigen grundlegenden Typen, aber wenn ein Typ zufällig nicht entsprechend präpariert wurde, scheitert BOOST_TYPEOF() und vermutlich daher auch BOOST_FOREACH() mit einer üblicherweise alles andere als zielführenden Fehlermeldung. Und stell dir vor, das Ding hat eventuell mal einen Bug.
Mir ist es wichtig, die Bibliotheken, die ich benutze, debuggen und im Zweifelsfall auch ausbessern zu können. Dieses Unterfangen wäre bei BOOST_TYPEOF(), je nach Veranlagung, masochistisch bis suizidal. Und große Teile von Boost sind da nicht viel besser.
Bei mir hats bisher noch immer hingehauen, aber vielleicht hatte ich ja nur Glück, mhm?x)
Bitte lies eines der zahllosen Tutorien zu Generics in Delphi oder C#. Einige interessantere Anwendungen von Generics findest du auch z.B. auf dem Blog von Barry Kelly.
Mache ich bei Gelegenheit, nur eine Frage, weil du sagst, ebenso hauptsächlich Container: Kann ich es als Typ für das Element eines mathematischen Vektors nehmen?
im Sinnetemplate <typename T> T add(T const& a, T const& b) { return a + b; }
Sprich kann ich Funktionen auf den Typparameter aufrufen?