Über solchen Threads hängt immer das Damoklesschwert des Sprachenbashings, und um dem vorzubeugen erstmal die Klarstellung:
Java ist die besteste Sprache von der Welt, cuz, y’know, 1337 n stuff
Mal im Ernst: Ich persönlich sehe zwischen Java, C# und C++ so wenige konzeptuelle Unterschiede, dass bis zu einem gewissen Grad „egal“ ist, was man „lernt“. Natürlich gibt’s (meistens im Rahmen des o.g. bashings aufgelistete) Vor- und Nachteile, aber … das sind alles Objektorientierte curly-braces-Sprachen. Wenn man lernt, was Klassen und Objekte sind, was Polymorphie und Vererbung bedeuten, und ein paar Design Patterns kennt, sind das langfristig gesehen viel wichtigere Dinge, als die Frage nach dem Unterschied zwischen Structs und Classes in C#. Klar: Wenn man produktiv damit arbeiten will, MUSS man das wissen, aber es sind so gesehen „Details“, die sprachspezifisch sind und von denen es bei jeder Sprache so viele gibt, dass man sie ohnehin nicht für alle Sprachen, die man vielleicht irgendwann mal einsetzt, präventiv lernen kann.
Speziell bei den genannten Sprachen, Java, C# und C++, aber auch C, sind zudem die Kernelemente der Syntax gleich…
// Which language is this?
int foo()
{
int i=0;
for(i=0; i<5; i++)
{
if (i != 3) return 45;
}
return 23;
}
Auch da gibt es spezifische Elemente, wie *pointer in C oder die pointer->notation bei C++, die Typ bei Java und C#, … aber auch da gilt, dass man die kaum für alle Sprachen alle auswendig wissen kann (und muss).
In all diesen Sprachen gilt auch, dass eine der wichtigsten Voraussetzungen, um produktiv mit der Sprache arbeiten zu können, NICHT nur irgendwelcher syntaktischer Klein-klein-kram ist. Stattdessen muss man die wichtigsten Bibliotheken kennen, die zum „quasi-Kern“ der der Sprache gehören, wie etwa die STL bei C++ oder die Collections API bei Java, und natürlich noch die Bibliotheken, die für die spezielle Aufgabe, die man zu erledigen hat, verwendet werden sollen - für GUIs in C++ vielleicht Qt, in Java eben Swing & Co. Plakativ: Es ist zwar schön, wenn man einen Mergesort in Java implementieren kann, aber wenn jemand einen Array sortieren will, und dann erstmal seinen eigenen Mergesort zusammenstümpert, statt Arrays.sort aufzurufen, ist er von vornherein unten durch
(Aber… in bezug auf Algorithmen an sich: Dass Algorithmen sprachunabhängig sind, und man (nach einer kurzen Einarbeitungszeit) sowas wie den Dijkstra in jeder dieser Sprachen runterimplementieren (oder zumindest aus Pseudocode in die jeweilige Spache umsetzen) können sollte, ist auch klar…)
Dem gegenüber stehen eben komplett andere Konzepte. Speziell funktionale Programmierung, bzw. (weil ich das als eine der Ursachen für deren Renaissance ansehe) nebenläufige Programmierung (Parallelverarbeitung, Multithreading…). Teilweise verwendet man dort Problemlösungsstrategien, die komplett anders sind, als man das von OO-Sprachen gewohnt ist. Aber… leider, leider… kenne ich mich da zu wenig aus, als dass ich das weiter ausbreiten könnte
Trotzdem: Auch wenn ich C in diesem Sinne nicht als „komplett andere“ Sprache bezeichnen würde, kann es nicht schaden, da mal reingeschnuppert zu haben. Damit ist man schon etwas näher an der Hardware; zu wissen, was Pointer und Addressen sind (und was es für ein ätzender Krampf ist, sich um Speicherverwaltung komplett selbst kümmern zu müssen ;)) hilft an manchen Stellen sicher, die Hintergründe der High-Level-Sprachen besser zu verstehen (und vor allem lernt man einen <3 Garbage Collector <3 endlich zu schätzen). Eine „ganz andere“ interessante Sprache wäre Scala, weil das Typsystem, die schon mehrfach erwähnten funktionalen Elemente, und auch bestimmte syntaktische Eigenschaften sie schon deutlich von den anderen Sprachen abhebt (und sie, ganz vordergründig betrachtet, an Bedeutung zu gewinnen scheint). Ich persönlich würde mir auch gerne mal die neueren Features von C++11 ansehen (und da sind sie wieder, die funktionalen Elemente ;)), und den beeindruckenden Werkzeugkasten, der einem mit den Boost.org libraries zur Verfügung steht (und mit dem man in C++ schon fast so bequem programmieren kann, wie in Java von Haus aus ), aber … wenn ich mir das wirklich alles ansehen will, muss ich endlich aufhören, solche langen Beiträge wie diesen hier zu schreiben… -_-