von Java zu C/C++

  • hallo,
    ich überleg grad ob ich von java auf c || c++ umzusteigen sollte.
    davor hätt ich noch ein paar fragen:
    was sind denn die vorteile von c || c++ gegenüber java?
    würd es sich lohnen umzusteigen?
    wie lang bräucht ich zum einarbeiten?

    ALL GLORY TO THE HYPNO TOAD...

  • korrigiert mich wenn was falsch ist.

    also der vorteil schlechthin von C, im vergleich zu Java auch von C++, ist auf jeden fall die Geschwindigkeit. Wäre derzeit wohl ziemlich undenkbar, eine schnelle 3D-Engine in Java zu schreiben.

    Programmiertechnische Unterschiede gibts natürlich auch, und zwar:
    C unterstützt keine Klassen. ist wahrscheinlich einer der größten Unterschiede zu Java.
    C++ unterstützt Klassen. Sogar mit Mehrfachvererbung.
    Was mir in Java am meisten abgeht sind die in C/C++ üblichen Zeiger auf Variablen/Strukturen (achja, Strukturen: Sammlungen von Variablen, wie eine Klasse ohne Methoden), mit solchen Zeigern kannst du allerhand Feines machen, z.B. einen einer Funktion als Parameter übergeben, welche dann die Variable direkt verändern kann. Zeiger auf Zeiger sind auch möglich.

    Was ein bisschen Einarbeitung erfordert, ist das Hantieren mit Strings, was ja in Java sehr komfortabel ist, da ist C/C++ doch ein bisschen umständlich.
    Ja, und der wohl größte Unterschied überhaupt sind die Bibliotheken. In Java gibts ja bekanntlich einen Haufen Klassen für alle Möglichen Verwendungszwecke, im originalen C/C++ gibts nur die ANSI-C-Bibliothek für elemantare Sachen wie z.B. File-Operationen, String-Operationen, Ein-Ausgabe, Datum/Zeit-Funktionen, ...das sollte das wichtigste gewesen sein, glaub ich. Daneben muss man sich auf die Betriebssystem-Funktionen verlassen, was aber auch fein ist, immerhin lernt man da gleich, wie das Ganze aufgebaut ist.

    Wenn du eine breitere Unterstützung mit zusätzlichen Klassen oder so brauchst, dann musst du dir die selber besorgen (ich weiß nicht, wie ist das Angebot an Freeware-Bibliotheken?) oder du nimmst dir sowas wie Visual Studio, wo dann nebenher auch eine ganze Reihe bisher noch Windows-spezifischer Klassen (Windows Forms) mitkommen.

    Ähm, und was auch nicht zu verachten ist: du kannnst mit C/C++ echte ausführbare Dateien erstellen. Mit Java geht das wegen der System-Unabhängigkeit nicht, deshalb die .class-Dateien, die von der Virtual Machine interpretiert werden müssen, die dann auch die langsame Ausführung zu verantworten hat, aber dafür eben systemunabhängig.

    Ja, ich glaub das wär das Wichtigste. wenn ich was vergessen hab, bitte hinzufügen.

    "Egbert B. Gebstadter is the Egbert B. Gebstadter of indirect self-reference." - Egbert B. Gebstadter

  • obs sich lohnt umzusteigen, das liegt wohl in deinem eigenen ermessen. immerhin kann ich nicht beurteilen, welche programmiererischen ambitionen du hast, und wofür du die Sprachen brauchst.
    jedenfalls ist gerade C, aber natürlich auch C++ weit verbreitet und nüchtern gesehen der Programmiersprachen-Standard schlechthin, also glaub ich nicht, dass es schadet, wenn man das ein bisschen kann.
    mitm Umsteigen bin ich in die umgekehrte Richtung gegangen, und das war nicht allzu schwer, weil prinzipiell die gleiche Syntax benutzt wird. nur bei den Konstrukten und Einsatzbereichen unterscheidet sich insbesondere C doch eher stärker von Java.

    "Egbert B. Gebstadter is the Egbert B. Gebstadter of indirect self-reference." - Egbert B. Gebstadter

  • Kommt darauf an, was du programmieren willst.

    Java-> Applets fürs Internet
    C/C++-> Alles andere

    (Tja, man merkt's, meine Meinung von Java ist nicht sehr hoch)

    '100 little bugs in the code, 100 bugs in the code. Fix one bug, compile it again: 101 little bugs in the code.
    101 little bugs in the code . . .'
    Continue until 0 Bugs reached...

  • Zitat

    Original geschrieben von Soulmerge
    Java-> Applets fürs Internet
    C/C++-> Alles andere

    stimmt leider... der einsatzbereich von java is etwas beschränkt... liegt zt. sicher auch daran das man dem normalen windows - mausschubser nicht zumuten kann ein aktuelles java runtime env. installiert zu haben.
    exe datei ausführen kriegt hingegen (fast) jeder hin

    ausserdem gibts bei java immer die troubles mit verschiedenen jre - versionen, das kann bei einem statisch gelinkten programm nicht passieren

    einziger vorteil von java: mit ein bisschen arbeit kriegt man ein programm unter jedem erdenklichen betriebssystem zum laufen... das geht mit c++ eher nicht so gut

  • Java wird mittlerweile fast ausschließlich für Servlets verwendet, nix Applets (für sowas gibts flash und DHTML).

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

  • aja, und was noch vergessen wurde:
    In Java kann man normalerweise keine GUI entwickeln, die das look & feel des jeweiligen Betriebssystems übernimmt. (geht nur mit SWT, das jedoch nicht offizieller teil von Java ist, sondern eine proprietäre erweiterung)

    Ich bevorzuge C (C++ auch, aber C ist mir eigentlich lieber) hauptsächlich wegen der geschwindigkeit und deshalb, weil C mir nicht vorschreibt was ich darf und was nicht. Wenn ich irgendwo in den speicher hinschreiben will, kann ich das in C und bekomm halt einen seg fault. Und wenn ich 5 Klassen in eine datei schreiben will darf ich das auch.

    Aja, und noch ein Vorteil von C/C++:
    #defines
    Damit kann man super bedingte Kompilierung durchführen. (z.B Statusausgaben nur in einer Debugversion, oder für die Programmierung von mehreren Plattformen)

  • Mittlerweile tendier ich auch schon zu C/C++, Objective C würd mich
    ebenfalls interessieren, aber ein paar Sachen muss ich einfach korrigieren

    J.Petso wrote:
    > korrigiert mich wenn was falsch ist.
    >
    > also der vorteil schlechthin von C, im vergleich zu Java auch von C++, ist auf
    > jeden fall die Geschwindigkeit. Wäre derzeit wohl ziemlich undenkbar, eine
    > schnelle 3D-Engine in Java zu schreiben.

    Gibt es, nennt sich Java3D. performancemäßig aber kein Vergleich zu
    Quake, bzw. featuremäßig zu Doom 3. Eher so wie die Unreal Engine :)

    > Was mir in Java am meisten abgeht sind die in C/C++ üblichen Zeiger auf
    > Variablen/Strukturen (achja, Strukturen: Sammlungen von Variablen, wie eine
    > Klasse ohne Methoden), mit solchen Zeigern kannst du allerhand Feines machen,
    > z.B. einen einer Funktion als Parameter übergeben, welche dann die Variable
    > direkt verändern kann. Zeiger auf Zeiger sind auch möglich.

    Ähh, seit wann gibts in Java bitte *keine* Zeiger (Referenzen)? Wenn du
    ein Beispielprogramm hast, das das demonstriert, schick es mir bitte
    oder poste es hier, wäre interessant. Primitive Datentypen zählen aber
    nicht...

    MaxAuthority wrote:
    > aja, und was noch vergessen wurde:
    > In Java kann man normalerweise keine GUI entwickeln, die das look &
    feel des
    > jeweiligen Betriebssystems übernimmt. (geht nur mit SWT, das jedoch
    nicht
    > offizieller teil von Java ist, sondern eine proprietäre erweiterung)

    SWT ist einfach nur genial, und soweit ich das beurteilen kann "freely
    redistributable". Außerdem gibts ja JFace, das macht das Programmieren
    damit etwas komfortabler

    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

  • martin: zu pointern:

    probier einmal das: int testFunction (int x, my_struct *addr_of_big_struct)
    {
    if (addr_of_big_struct->do_something());
    return 1;
    else
    return 0;
    }

    Ich weiss, als Java-Programmierer würd man sowas anders (objektorientierter) Programmieren, mir geht dieses Feature von Durchgangsparametern schon stark ab.

    Hmm, und warum zählen primitive Datentypen nicht? Warum muss man für *alles* Objekte haben, was einfach von der geschwindigkeit fraglich ist?

    Aja und vermutlich ist es möglich, aber mich würd interssieren, wie ich das in Java löse:
    MyObject *a, *b;
    a) a = b; //die addresse von b an a zuweisen
    b) memcpy (a, b, sizeof (a)); //wirklich das objekt kopieren


    @java3d: hmm, interessante idee, aber auszug aus dem FAQ:

    Q: I want to use OpenGL/Direct3D directly, is there a way to do that?
    A: There is currently no way to access OpenGL or Direct3D directl through the Java 3D API.

    Ich glaube nicht, dass auch nur irgendjemand halbwegs professioneller (Spiele)-Programmierer, noch einen Layer mehr zw. Spiel und Hardware haben will, der ihm performance kostet und in den möglichkeiten einschränkt.

  • MaxAuthority wrote:
    > martin: zu pointern:
    >
    > probier einmal das: int testFunction (int x, my_struct *addr_of_big_struct)
    > {
    > if (addr_of_big_struct->do_something());
    > return 1;
    > else
    > return 0;
    > }
    >
    > Ich weiss, als Java-Programmierer würd man sowas anders (objektorientierter)
    > Programmieren, mir geht dieses Feature von Durchgangsparametern schon stark
    > ab.

    Wenn ich das richtig verstanden habe, meinst du es gäbe in Java keine
    Pointer. Das wollte ich vorher schon klarstellen...

    Hier ein Beispielcode:

    StringBuffer answer = new StringBuffer("Fortytoo");
    StringBuffer correctAnswer = answer;
    correctAnswer.setCharAt(6, 'w');
    System.out.println(answer);

    STDOUT: Fortytwo. Echt :)
    In C/C++ Terminologie: in Java kommt alles (zumindest alle Objekte) auf
    den Heap.

    > Hmm, und warum zählen primitive Datentypen nicht?

    Im Sinne von vorhin zählen die deshalb nicht, weil die beim
    Methodenaufruf sehr wohl kopiert werden..

    > Aja und vermutlich ist es möglich, aber mich würd interssieren, wie ich das in
    > Java löse:
    > MyObject *a, *b;
    > a) a = b; //die addresse von b an a zuweisen
    > b) memcpy (a, b, sizeof (a)); //wirklich das objekt kopieren

    Die Frage ist wohl eher: wie geht das *nicht*? Man müsste wohl mit
    Object.clone() arbeiten bzw. Clonable implementieren und eine eigene
    clone() Methode schreiben, die eine neue Instanz zurückgibt.

    I invented ctrl-alt-del but Bill [Gates] made it famous
    Dave Bradly, IBM PC designer

  • hmm, ok ich habs anscheinend noch nicht ganz verstanden...

    Wie kann ich in Java sagen, dass ein parameter in Java nur ein Pointer (od Referenz) ist oder eine Kopie?

    //C code:
    int main ()
    {
    my_struct s1 = XXX;
    other_struct s2 = YYY;
    Test (s1, &s2);
    }

    int Test (my_struct s1, *other_struct s2)
    {
    s1 = ZZZ;
    *s2 = AAA;
    }

    Jetzt hab ich als ergebnis s1= XXX und s2 = AAA;

    Anders formuliert, wie kann ich in Java einer Funktion einen paramter als wert übergeben, der nur lokal in der Funktion verändert wird, und wie einen paramater als referenz der "global" verändert wird.

  • also den &-referenz-operator nicht in java vorzufinden war für mich ein schwerer schock wie ich mit dem 1. eprog-bsp angefangen hab... hab mich mittlerweile allerdings schon ein bisschen dran gewöhnt. die indexOutOfBoundsExceptions zb finde ich relativ angenehm.. in c/c++ findet man so einen fehler immer erst nach mindestens einer halben stunde... generell brauche ich fürs fehlersuchen in java nur einen bruchteil der zeit die ich fürs fehlersuchen in einem c++-programm brauche..
    lg

  • also C sollte in Punkto Programmiereffizienz, Debugging, Modularität und so weiter wohl für keinen eine ernsthafte Konkurrenz zu Java sein. Nachdem ich den umgekehrten Weg gegangen bin, finde ich C ziehmlich grauslich, vorallem was Speicherschutz (bei mir Segfaultet vom xmms bis hin zu rm! wirklich alles ab und zu), dynamische Datenstrukturen (generische Collections in ANSI C gehören ganz klar in die Kategorie "verbrechen an der Menschheit") und Namespaces (Alles in einem riesigen Symboltable) angeht. Außerdem liefert der Compiler viel schlechtere Fehlermeldungen. Absoluter Hassfaktor: unions.
    Als Gegenbeispiel: kann sich das ein Javaprogrammierer antun?:


    Selbst in der kleinen Funktion können schon vier Segfaults auftreten. Ganz abgesehen davon, dass man (imho) nich feststellen kann, ob eine beliebige Struktur vom Client schon initialisiert wurde (eine Abfrage gegen (void*) 0 hilft auch nichts, wenn der Pointer munter z.B. auf 0xFFFFFF (void*-1) zeigt. Außerdem gibts keine Möglichkeit festzustellen, welchen Typ ein Pointer hat.
    JA, es ist schnell, verdammt schnell, aber mir kommt vor manche von euch freuen sich, weils so eine tolle Programmiersprache ist.
    Ich weiß ja nicht, wer von euch OOP gemacht hat, aber die Beispiele von dort möchte ich in reinem C (ohne ++) nicht realisieren.
    Und C++ ist für meinen Geschmack ein bisserl zu kompliziert und auf rückwärtskompatibel getrimmt (wie so vieles).
    Java ist auf jeden Fall eine wunderschöne objektorientierte Sprache - dass es langsam ist, es keine gscheiden Graphiklibraries usw. gibt und es damit vermutlich nicht allzu praxistauglich ist, sei eine andere Geschichte.

    P.S.: Pointer braucht man nicht.Klar, sogar mit brainfuck kannst du alles programmieren. Viel wichtiger: Pointer sind ein direkter Zugriff auf den Speicher, der außerhalb des Systemnahen Programmierens nicht gerade für ein stabiles System sorgt.
    Aber: Pointer funktionieren schon ein bisserl anders als Referenzen, eben eine direkte Referenz auf den Speicher.

  • Zitat

    Original geschrieben von MaxAuthority
    Aja und vermutlich ist es möglich, aber mich würd interssieren, wie ich das in Java löse:
    MyObject *a, *b;
    a) a = b; //die addresse von b an a zuweisen
    b) memcpy (a, b, sizeof (a)); //wirklich das objekt kopieren
    [/B]


    Öhm ... Frage: Warum so kompliziert?

    *a = *b;

    macht genau das selbe wie memcpy(a, b, sizeof(a)), wobei letzteres unschöner pre-ANSI Code und nicht mehr nötig ist. Oder übersehe ich da was?

    BTW, in Java würdest Du das folgendermaßen lösen:

    // a und b sind Referenzen vom Typ MyObject

    a = b.clone();

    Ist ja auch nicht so schwierig, oder? Du musst lediglich sicherstellen, dass MyObject Cloneable implementiert. Indem Du clone() überschreibst, kannst Du sogar bestimmen, _wie_ das Objekt kopiert wird. Eine bitweise Kopie ist nämlich nur bei wenigen Klassen/structs zielführend. Dieses Problem lässt sich in C nicht so sauber lösen.

    Um noch auf einige Meldungen hier Bezug zu nehmen, dass Java quasi kein Anwendungsgebiet hätte:

    Auf dem Markt wird nach mehr Java Programmierern als nach C++ oder C Programmierern gesucht - und das hat auch einen Grund.

    Java ist im Enterprise und Server Bereich extrem stark, vor allem wenn es um maßgeschneiderte Custom Software geht. Bei Standardsoftware haben natürlich C und C++ die Nase vorne.

    Aber gerade für In-House Development bietet sich Java geradezu an (wenn nicht bereits eine alte C Code Basis besteht), da die Entwicklungszeiten einfach kürzer und die resultierenden Programme weniger fehleranfällig sind.

    Fazit: Java ist alles andere als "tot", nur wird man kaum einen Shareware FTP Client auf download.com finden, der in Java geschrieben ist ... weil das ganz einfach nicht das Ziel-Markt-Segment von Java ist.

    Ich habe mich als C++ Fanatiker auch entsprechend lange gegen Java gewehrt, aber mittlerweile muss ich feststellen, dass diese Sprache echt was drauf hat.

    Besonders genial ist das Nachladen/Reloaden von Klassen zur Laufzeit, was zB für Hot Deployment eingesetzt werden kann.

    Dann natürlich die ganzen Sachen wie Runtime Reflection, etc ... Man kann ein Java Programm schreiben, das Java Code generiert, diesen kompiliert und die entstandenen Klassen dann verwendet. Macht das mal mit C++ :)

    Außerdem sind die Java Threads natürlich ein Traum, verglichen mit Libraries wie pthreads. Überhaupt: die Java Library ist zwar nicht perfekt, aber sie ist so schön konsistent und deckt soviele Bereiche ab, verglichen mit der C++ Standard Bibliothek, die wesentlich weniger umfangreich ist, und noch dazu in sich inkonsistent.

    Abschließend: Java, C und C++ haben alle ihre Vorzüge und sind notwendig.

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

  • Zitat

    Original geschrieben von Shade
    na das kann ja heiter werden mit dem C++ einstieg.Irgendwelche Buchempfehlungen?

    C++ Primer von Stan Lippman und Josee Lajoie ist IMHO das beste Buch für Einsteiger.

    http://www.amazon.de/exec/obidos/AS…8517946-3489347

    "The C++ Programming Language" von Bjarne Stroustrup finde ich zwar "historisch interessant", weil es viel über den Werdegang von C++ spricht, allerdings finde ich den Aufbau unlogisch und unstrukturiert. Trotzdem ist das Buch ein Muss für jeden ernsthaften C++ Programmierer.

    Dann sind zu empfehlen:
    Effective C++, Scott Meyers
    More Effective C++, Scott Meyers
    Effective STL, Scott Meyers
    Exceptional C++, Herb Sutter

    So weit meine Liste.

    Eins Zwei Gras Bär Hund Vier Muh Macht Die Kuh

  • @stessi: ja, in einf i.d. techn. inf, das du angerechnet gekriegt hast :)

    [font=verdana,sans-serif]"An über-programmer is likely to be someone who stares quietly into space and then says 'Hmm. I think I've seen something like this before.'" -- John D. Cock[/font]

    opentu.net - freier, unzensierter Informationsaustausch via IRC-Channel!
    Hilfe und Support in Studienangelegenheiten, gemütliches Beisammensein, von und mit Leuten aus dem Informatik-Forum!

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!