Java lernen sinnlos?
-
Was kann Java überhaupt? Die Sprache ist wie C++ mit weniger Sprachmittel.
Keine Makros, weil sind ja gefährlich, dass es gute Anwendungen gibt zeigt Boost.
Zeiger, nö, sind ja gefährlich. Das im gewünschten Fall auch nur Libs mit Zeigern arbeiten müssen ist ja unwichtig, dass es manchmal aber sinnvoll ist mit ihnen zu arbeiten ist auch egal.
Funktionszeiger und Operatorenüberladung wie Funktoren führen dann zu Dingen wie boost.function und boost.signals, darüber hinaus gehend boost.lambda wo in eine ach so veraltete Sprache auf einmal Dinge realisiert werden, wie sie andere Sprachen wie C# erst wieder neu entdecken müssen, in Java gibts das noch gar nicht(kein Wort dazu, dass wirklich moderne Sprachen hier First-Class-Functions anbieten)
Templates? Will nicht sagen, dass Java das explizit ausgebaut hat, aber es ist etwas was ich an C++ sehr schätze und in Java sehr vermisse, Generics sind kein Ersatz dafür.Sache ist die, dass Java einfach ist. Dadurch dass es einfach ist, wird es häufig gelehrt, dadurch entstehen haufenweise guter Bibliotheken, zwar keine die auf allgemeiner Ebene an Boost heran kommen, aber gute spezialisiertere Bibliotheken. Ebenso ist die Javaumgebung an sich schon mit einem größeren Satz an Bibliotheken ausgestattet.
Blöd nur, dass dieses Standardargument kein Grund ist, denn es gibt für die JVM eine Menge anderer Sprachen, einige von denen sind richtig gut, beim Cousin .NET ist das noch extremer.
-
JustAnotherNoob schrieb:
darüber hinaus gehend boost.lambda wo in eine ach so veraltete Sprache auf einmal Dinge realisiert werden, wie sie andere Sprachen wie C# erst wieder neu entdecken müssen, in Java gibts das noch gar nicht(kein Wort dazu, dass wirklich moderne Sprachen hier First-Class-Functions anbieten)
Mein Wissen über Lambda und First-Class Funktionen ist etwas begrenzt, aber hatte das nicht etwas mit Closures zu tun? Closures waren nämlich eins der großen Features, die für Java 7 geplant waren. Allerdings werden sie es wohl nicht mehr ins Release schaffen (Stand Februar 2009).
Da gibt es auch nen ausführlichen Google Talk zu: http://www.youtube.com/watch?v=0zVizaCOhME
-
JustAnotherNoob schrieb:
Was kann Java überhaupt? Die Sprache ist wie C++ mit weniger Sprachmittel.
nö, nur die syntax beider stammt von C. sonst gibts viele unterschiede.
JustAnotherNoob schrieb:
Zeiger, nö, sind ja gefährlich. Das im gewünschten Fall auch nur Libs mit Zeigern arbeiten müssen ist ja unwichtig, dass es manchmal aber sinnvoll ist mit ihnen zu arbeiten ist auch egal.
wann ist es sinnvoll mit zeigern zu arbeiten? beispiel?
JustAnotherNoob schrieb:
Funktionszeiger und Operatorenüberladung wie Funktoren führen dann zu Dingen wie boost.function und boost.signals...
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.
...wo in eine ach so veraltete Sprache auf einmal Dinge realisiert werden...
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.
-
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.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.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.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.
-
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.