Schwierige Entscheidung

Es gibt 17 Antworten in diesem Thema. Der letzte Beitrag () ist von Jonas Jelonek.

    Schwierige Entscheidung

    Guten Tag

    Den Titel gibt es zwar schon, mir fiel aber kein besserer ein.

    Da es ja nicht mehr so lange bis zum Schulabschluss und somit dann zum Studium ist, wollte ich eine neue Programmiersprache dazulernen, die spaeter bei meinen Projekten, die ich starten will, am besten geeignet ist. Ich kann mich jedoch nicht zwischen C, C++ und Java entscheiden, da man mit allen dreien spaeter in meinem Wunschbereich arbeiten kann. Deshalb frage ich euch, welche ich lernen sollte. Ich hoffe ihr koennt mir auch Vorteile und Nachteile der Sprachen nennen.

    Vielen Dank im Voraus

    MfG
    Jonas Jelonek


    Edit by Manschula: Hat das Thema etwas mit dem Forum an sich zu tun? --> Thema verschoben

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Manschula“ ()

    Ganz klar C++. C brauchst du nur, wenn du sowas wie ein Betriebssystem oder was ähnliches lowleveliges programmieren willst, andernfalls ist das kaum noch im Einsatz, weils einfach besseres gibt (C++). Und Java ist sowieso der größte Ranz auf Programmierer-Erden.
    Dinge, die gegen Java sprechen:
    - die Runtime ist ein schlechter Witz, sowohl von Seiten Sicherheit alsauch von Seiten Performance gesehen
    - es gibt keine Delegaten und damit keine Events im eigentlichen Sinne
    - es gibt keine Properties
    - unter gut zu verwenden stell ich mir was anderes vor, Eclipse kommt dir im Vergleich zu Visual Studio wie Notepad vor
    Auf die Liste kann man noch weiteres setzen, mir fällt nur gerade nicht alles ein.
    Also wenn mein keine Delegaten und keine Properties in Java hat, ist das natuerlich richtig Mist, da kann man nicht wirklich arbeiten.
    Java hat bei mir sowieso eine niedrigere Prioritaet, da ich Java immer so mit Android verbinde und Java dadurch auch ziemlich gepraegt ist, und was ich von Android halte, sage ich jetzt mal lieber nicht hier. Aber stimmt es, dass Java heutzutage viel gefragt wird und auch oft verwendet wird?

    Brauch man fuer die OS-Programmierung unbedingt auch C, oder geht das alles auch mit C++? Ich habe naemlich viele Vorstellungen, wie ich mein OS spaeter gestalten will und dabei sollte auch die Performance stimmen, welche durch die richtige Sprache geliefert wird.
    Nein, mit C++ kann man eigentlich alles machen, was mit C geht. Ich kenn mich nur bei sowas nicht wirklich aus, vielleicht hatte Microsoft nen Grund, C zu nehmen statt C++ (wobei viele teile von Windows auch in C++ geschrieben sind, z.B. DirectX).
    C++ ist aber gar nicht so schrecklich, wie man es sich vielleicht vorstellt. Wenn ich Gonger da Glauben schenke, dann ist es seit der Version 11 gar nicht weit von C# entfernt. Es werden sogar neuste Sachen wie Lambda (anonyme Methoden) unterstützt, und in einigen Gebieten ist es .Net sogar voraus (z.B. bei den Templates).
    Ich habe mir C++ auch garnicht schrecklich vorgestellt, und wenn man dann fuer OS-Programmierung C++ anstatt C nehmen kann, ist das natuerlich auch etwas besser, denn ich befasse mich gerade mit C#, bin auch schon relativ gut, und dann sollte der Umstieg auf C++ nicht zu schwierig sein.
    @Jonas Jelonek: Da ich in der Schule Java lernen muss, kann ich Dir aus Erfahrung versichern, dass Artentus mit fast allem recht hat. Die Sicherheit kann ich nicht testen und Eclipse habe ich einfach nicht getestet.

    Es gibt so viele Dinge, die einfach total umständlich implementiert sind. Als .Net-ler ist man da hoffnungslos verloren (naja, nicht ganz, aber die Frustration steigt exponenziell zur Zeit).

    Beispiele
    Methoden, die in Java Exceptions auslösen können, müssen als solche deklariert sein:

    Java-Quellcode

    1. static void Foo()
    2. {
    3. throw new Exception();
    4. }

    Das gibt einen Compilerfehler:
    unreported exception Exception; must be caught or declared to be thrown

    Also:

    Java-Quellcode

    1. static void Foo() throws Exception
    2. {
    3. throw new Exception();
    4. }

    Das heißt, wenn man ganz unten irgendwo eine Exception auslösen will, die man weiter oben behandelt (oder garnicht), dann müssen alle Methoden, die die auslösende Methode aufrufen (und die Methoden, die diese Methoden aufrufen, und die diese aufrufen, und so weiter...) ebenfalls das "throws Exception" bekommen.

    Aber!
    Manche Methoden dürfen trotzdem Exceptions auslösen:

    Java-Quellcode

    1. static void Foo()
    2. {
    3. String a = "Hallo Welt";
    4. String b = a.substring(0, 100);
    5. }

    Kompiliert problemlos. Löst zur Laufzeit natürlich eine Exception aus (genau genommen eine StringIndexOutOfBoundsException). Und die fliegt hoch bis durch die main-Methode raus und wird dann auf der Konsole angezeigt.
    Was definiert, ob eine Methode mit "throws Exception" deklariert werden muss, oder nicht, habe ich bis heute nicht herausgefunden.

    Anderes Beispiel:
    Was ist der Unterschied zwischen double und Double? Oder zwischen int und Integer? Oder zwischen string und String?
    Die großgeschriebenen sind Objekte (bei .Net würde man "Referenztyp" sagen). Und die kleingeschriebenen sind... keine Ahnung, jedenfalls gibt's die nur bei den primitiven Datentypen.

    Java-Quellcode

    1. //a1 ist ein int.
    2. int a1 = 10;
    3. //a2 ist ein Integer.
    4. Integer a2 = new Integer(10);
    5. //a2 hat Methoden, a1 nicht.
    6. a2.toString(); // Funktioniert
    7. a1.toString(); // Compiler-Fehler: int cannot be dereferenced

    Und string? Gibt's nicht mal. Es gibt nur String:

    Java-Quellcode

    1. String a = "Hallo Welt";
    2. //Länge mit der length-Methode:
    3. int LengthOfA = a.length(); //Sehr unintuitiv

    Vergleichen von Strings:
    Der ==-Operator vergleicht, ob es sich um das selbe Objekt handelt (Wie der Is-Operator bei VB).
    Um zu prüfen, ob in beiden Strings das selbe drin steht, verwendet man die Equals-Methode.

    Java-Quellcode

    1. static void Foo()
    2. {
    3. String a = "Hallo Welt";
    4. String b = "Hallo Welt";
    5. String c = new String("Hallo Welt");
    6. String d = "Nope";
    7. WriteLine("a == b ", a == b);
    8. WriteLine("a.equals(b)", a.equals(b));
    9. WriteLine("a == c ", a == c);
    10. WriteLine("a.equals(c)", a.equals(c));
    11. WriteLine("a == d ", a == d);
    12. WriteLine("a.equals(d)", a.equals(d));
    13. WriteLine("c == d ", c == d);
    14. WriteLine("c.equals(d)", c.equals(d));
    15. }
    16. static void WriteLine(String Name, boolean Equals) { System.out.println(Name + " : " + (Equals ? "true" : "false")); }

    Quellcode

    1. a == b : true
    2. a.equals(b) : true
    3. a == c : false
    4. a.equals(c) : true
    5. a == d : false
    6. a.equals(d) : false
    7. c == d : false
    8. c.equals(d) : false

    Das bedeutet jetzt: zwei Strings, die nur in "" stehen, die aber den gleichen Inhalt haben, sind die selben Objekte. Java möchte da wohl RAM sparen.
    new String("Der selbe String nochmal"); erstellt tatsächlich eine neue String-Instanz, mit dem Inhalt aus dem vorherigen String.
    a und d sind wie erwartet unterschiedliche Objekte mit dem selben Inhalt.

    Und die Liste geht weiter und weiter und weiter...


    Es gibt genau einen Grund, Java zu verwenden: Plattformunabhängigkeit.
    Für alles andere gibt's bessere Lösungen. Und wenn Microsoft den Stock aus dem Rektum entfernen würde, würde es .Net auch für andere Betriebssysteme geben und dann .Net unbesiegbar (wenn's nicht gerade um Treiber o.ä. geht).

    Mein Vorschlag: Java nur nebenbei angucken, damit man nicht komplett verloren ist, wenn man's mal braucht.
    "Luckily luh... luckily it wasn't poi-"
    -- Brady in Wonderland, 23. Februar 2015, 1:56
    Desktop Pinner | ApplicationSettings | OnUtils

    Jonas Jelonek schrieb:

    Da es ja nicht mehr so lange bis zum Schulabschluss und somit dann zum Studium ist

    "nicht lange" ist ein 3/4 Jahr, 4 Jahre, ?
    Die Aufnahme des Studiums steht in ursächlichem Zusammenhang mit dem Erlernen einer neuen Programmiersprache
    Das Studium ist Medizin, E-Technik, Informatik, Germanistik, ... ?

    zwischen C, C++ und Java entscheiden,

    Da müsste man erstmal Frage 2 von oben klären.
    ^ Da hat picoflop recht.

    Ich bevorzuge C und gelegentlich Assembler (naja, ich programmiere damit Hauptsächlich 8Bit-Microcontroller ;) ). Aber genau bei Microcontroller merkt man richtig die Performance-Unterschiede der Sprachen.
    Wenn du in Richtung microcontroller und betriebssysteme gehen willst (32Bit-ARM Prozessor und co) dann wäre C eindeutig empfehlenswerter als C++ (und dafuq, java? ^^)

    mfg

    gfc
    Naja, 4 Jahre vergehen schneller als man denkt und nach meinem ABI moechte ich ein Informatik-Studium beginnen. Und, wie gesagt, moechte ich in Richtung OS-Programmierung gehen. Das mit den Sprachen hat jetzt zwar nicht so viel mit dem eigentlichen Studium zu tun, aber man sollte schon vorbereitet sein, und das war auch nicht nur fuers Studium gedacht, sondern auch, da ich schon lange andere Sprachen erlernen wollte, mich nur noch nicht entscheiden konnte.
    Kenntnis in C (gerade hardwarenah) kann überhaupt nicht schaden, von daher kann ich es empfehlen. Es ist die Basis für viele andere Sprachen... Wobei es natürlich die gleichen Konstrukte wie If-Abfragen, Schleifen, Funktionen usw usw gibt.
    Warum nicht einfach beides, C und C++? Ich habe gehört, dass sie sich sehr ähnlich sind. Anfangen könntest du ja mit C++, weil du da noch Visual Studio hast und dann zwischendrin zum Beispiel Microcontroller programmieren, was jetzt wirklich nicht schwer ist (zu Plattformen wie Arduino gibt es auch richtig schön viele Tutorials). Ich hab auch schon das ein oder andere Mal mit C++ programmiert und ich muss sagen, dass es, wenn man C# versteht, gar nicht so schwer ist. Dasselbe gilt für C.
    @nafets3646
    Wer sagt das man mit C auf Visual Studio verzichten muss? :D
    AtmelStudio baut auf VisualStudio auf, hat den ganzen IntelliSense-gedöns und unterstützt C, C++ und Assembler.

    Ebenso ist die Oberfläche massiv brauchbarer als dieser (billiger) Editor von Arduino.

    Besser mit C anfangen und dann "treppenmässig" aufsteigen ;)

    sonne75 schrieb:

    Ansonsten, fang mit C an, C++ ist ja fast das Selbe (gerade, weil du ja OOP kennst) und Java soll auch sehr ähnlich sein.

    Auf keinen Fall. Wenn du in einem C++ Programm C-Methoden nutzt oder Lösungen auf C Basis, dann wirst du von jedem C++ Programmierer erschlagen. C++ ist 120% OO.

    Fang mit C++ an, so lernst du eine korrekte Architektur zu implementieren, erfreust dich an der Standardbibliothek und OS's kannste damit auch großteils machen. Ist zwar mords Arbeit, aber eigentlich muss nur der Kernel in C & bisschen Assembler sein. Visual Studio ist auch noch ne schöne IDE um mit Assembler, C und C++ (auch alles gleichzeitig) zu entwickeln. Das einzige Problem ist der Compiler, der nicht grad Up to Date ist. Ich nutz mit VS 2012 den 2013'er Compiler und der unterstützt immer noch nicht alle C++ 11 Standards. Microsoft ist da ziemlich langsam.

    C++ ist eine der modernsten Programmiersprachen dies gibt. Dort hast du auch ganz andere Möglichkeiten als in .Net (bezogen auf OO-Implementierungen). Du hast Mehrfachvererbung, Traits und Policy Klassen, Variadic Templates usw. Sowas hat man in keiner .Net Sprache. Zudem kannst du natürlich um einiges Hardware näher arbeiten, du kannst auch Treiber und Co basteln. Bei sowas kommt aber auch immer etwas C dazu dass ist nicht zu vermeiden.
    Vielen Dank fuer all eure Antworten und den Argumenten fuer die Sprachen.

    Ich werde jetzt C++ lernen, aus den Gruenden, die Gonger96 schon genannt habe, da ich diese sehr gut finde. Danach werde ich mich mit C beschaeftigen, und dann schliesslich mit Assembler, damit ich fuer die OS-Programmierung gut vorbereitet bin.