Endlich mal wieder ein Sprachenbashing-Thread
Die Antwort ist einfach und immer die gleiche: „Weil Java die besteste Sprache von der Welt sein tut!!!111einszwöf“
Eigentlich sind die Vor- und Nachteile speziell beim Vergleich zu C++ schon SO ausgelutscht, dass es schon fast langweilig wird. Aber da ich in letzter Zeit wieder etwas C++ machen durfte, sind mir die Vorteile von Java wieder (schmerzhaft) vor Augen geführt worden. (Immer, wenn ich C++ programmiere, bekomme ich Lust darauf, Raider zu essen und Cola aus 1-Liter-Glasflaschen zu trinken). In C++ werden dann erstmal 10 Klassen mit compilerspezifischen #ifdefs und inline-Assembler erstellt, um die (für alles, was über akademische Toy-Projekte hinausgeht) vollkommen unbrauchbaren Pointer hinter einer dicken Sicherhheitsschicht mit Reference Counting & Co zu verstecken, und wenn man das Wort „Java“ nur erwähnt, wird trotzdem noch über den Garbage collector geschimpft. Kein nicht-triviales Programm kommt ohne Boost C++ Libraries aus. C++ hatte bis version 11 nicht mal Threads (die es in Java seit 20 Jahren gibt), geschweige denn ein Memory Model. Buildprozesse und IDE-Unterstützung sind ein Witz, schon die Fragen „Wer ruft diese Methode auf?“, „Wird dieses #include hier benötigt oder nicht?“, oder „Welche Klassen erben von dieser hier?“ sind praktisch unbeantwortbar, außer mit einer Volltextsuche über den gesamten Code.
Das alles wäre schlimm genug. Richtig niederschmetternd finde ich, dass viele „eingefleischte C++ler“ zu glauben scheinen, dass das alles gut und richtig ist, so wie es ist.
Tipp:
[spoiler]
Das ist es nicht.
(Nur um das mal überdeutlich gesagt zu haben. Und wer das nicht glaubt, dem würde ich gerne mal eine Demo-Session geben, wie man in Eclipse ein kleines Projektchen erstellt. IN YOUR FACE ).
[/spoiler]
Also mal im Ernst:
Java ist eine Sprache, die den (für mich) richtigen Trade-Off zwischen High-Level Konzepten und Low-Level Möglichkeiten* bietet, den (für mich) richtigen Trade-Off zwischen erzwungenen Konventionen** und schönen Abstraktionsmöglichkeiten bietet***, und mit der man sehr schnell und sehr leicht in vieler Hinsicht gute Programme schreiben kann.
(Wer meint, er könne gut C++ programmieren, möge sich bei mir melden. (Bisher hatte noch niemand die Eier, das zu tun)).
- Mehr Low-Level Möglichkeiten wären gut. Es wäre schön, wenn man JCuda oder JOCL nicht bräuchte. Es wäre auch gut, wenn man bessere Repräsentationen von „rohem Speicher“ und „value objects“ hätte. Aber NUR dafür auf C/C++ zu schwenken wäre ein mieserabler Tausch. Wenn man in C++ eine Zeile sieht wie
int y = x * 3;
dann weiß niemand, was diese Zeile macht - und, was fast noch schlimmer ist: Es gibt keine praktikable Möglichkeit, herauszufinden, was diese Zeile macht!. Vielleicht ist der Zuweisungsoperator von „int“ so überladen, dass er MineSweeper startet. Man weiß es einfach nicht.
** Mit „Konventionen“ meinte ich hier z.B. die 1:1-Korrespondenz zwischen Packages und Verzeichnissen, und dass jede public class „X“ in einer Datei Namens „X“ liegen muss. Wenn man in einem C+±Projekt eine Klasse „Namespace::Foo“ hat, und sie dann in einem Verzeichnis „Your\Princess\Is\In\Another\Castle.cpp“ findet, läuft es einem kalt den Rücken runter.
*** Mehr Abstraktionsmöglichkeiten wären gut. Das Typsystem ist wirklich nicht so mächtig, und der Vergleich von Generics mit C++Templates wirkt wie der Vergleich eines Bobby-Cars mit einem Formel1-Rennwagen. Aber auch dort gilt: Wenn das (eigentlich tolle!) System der „Concepts“ bei C++ erst durch Concept Check Library - 1.57.0 einen Hauch von Sinn bekommt, scheint beim grundlegenden Design und der Evolution der Sprache etwas SO grundlegend falsch gelaufen zu sein, dass ich mir anmaße, in Frage zu stellen, ob diejenigen, die dafür verantwortlich sind, sich überhaupt „Informatiker“ (oder „Computer Scientists“) nennen dürfen.