Java in C++ programmieren - Programmier- und Designunterschiede



  • Ist das eine Scherzfrage?



  • Ad try/finally/exceptions/raii/blah...:
    Es geht um "deterministische Finalisierung", die Java nicht bieten kann.





  • fricky schrieb:

    http://blog.pwkf.org/post/2008/07/27/RAII-in-Java-to-clean-your-code
    🙂

    selten sowas doofes gelesen... try/finally ist kein ersatz für raii und meistens muss man auf null checken wenn man mehrere voneiannder abhängige resourcen verwendet.

    Java ist viel ähnlicher zu C als zu C++.



  • [quote="Shade Of
    try/finally ist kein ersatz für raii.
    [/quote]
    ne, aber die alternative, wenn man raii-ähnliches in java machen will.

    [quote="Shade Of
    Java ist viel ähnlicher zu C als zu C++.
    [/quote]
    hmmm, deshalb ist mir java wohl so sympathisch.
    🙂



  • Richtigerweise hätte ich wohl sagen sollen deterministische Finalisierung "die Java nicht unterstützt".



  • hustbaer schrieb:

    Richtigerweise hätte ich wohl sagen sollen deterministische Finalisierung "die Java nicht unterstützt".

    dazu müsste man den java-GC austauschen, so dass er nach der letzen referenz sofort den speicher freigibt. dann wäre finalize() deterministisch. aber so isses das leider nicht.
    🙂



  • GC austauschen nützt da nichts. Der kennt ja nicht den Zeitpunkt, wann ein Objekt nicht-erreichbar wird. Das müsste man schon tiefer in der VM verankern.

    In Zukunft könnten ARM-Blöcke Abhilfe schaffen, falls die denn mal realisiert werden sollten.



  • Wenn ich das richtig verstehe sind diese ARM Blöcke auch nix anderes als was "using" in C# ist? Dann wäre das zwar ... nunja, besser als nichts, aber IMO nicht wirklich ausreichend.



  • 5%Sauerstoff schrieb:

    Weitere?

    In C++ programmierst du oft funktionaler, besonders wenn du die STL & deren Algorithmen benutzt. Mit C++0x wird sich das wohl noch verschaerfen, wenn wir Lambda's etc. kriegen.



  • hustbaer schrieb:

    Wenn ich das richtig verstehe sind diese ARM Blöcke auch nix anderes als was "using" in C# ist? Dann wäre das zwar ... nunja, besser als nichts, aber IMO nicht wirklich ausreichend.

    Richtig, nur dass im Gegensatz zu C# mehr als eine Ressource pro Block möglich sein sollen.



  • fricky schrieb:

    hustbaer schrieb:

    Richtigerweise hätte ich wohl sagen sollen deterministische Finalisierung "die Java nicht unterstützt".

    dazu müsste man den java-GC austauschen, so dass er nach der letzen referenz sofort den speicher freigibt. dann wäre finalize() deterministisch. aber so isses das leider nicht.
    🙂

    nein. siehe c++/cli oder D
    das objekt modell ist das "problem"



  • Shade Of Mine schrieb:

    fricky schrieb:

    hustbaer schrieb:

    Richtigerweise hätte ich wohl sagen sollen deterministische Finalisierung "die Java nicht unterstützt".

    dazu müsste man den java-GC austauschen, so dass er nach der letzen referenz sofort den speicher freigibt. dann wäre finalize() deterministisch. aber so isses das leider nicht.
    🙂

    nein. siehe c++/cli oder D
    das objekt modell ist das "problem"

    nö, man könnte sogar den GC seine arbeit machen lassen wie bisher, nur dass 'finalize()' *sofort* aufgerufen wird, wenn die letzte referenz weg ist. dann wärs auch deterministisch.
    🙂



  • Nochmal: der GC weiß nicht, wann die letzte Referenz weg ist.



  • Von welchem GC redest du?



  • fricky schrieb:

    nö, man könnte sogar den GC seine arbeit machen lassen wie bisher, nur dass 'finalize()' *sofort* aufgerufen wird, wenn die letzte referenz weg ist. dann wärs auch deterministisch.
    🙂

    die performance kosten waeren enorm.



  • Shade Of Mine schrieb:

    die performance kosten waeren enorm.

    warum?
    🙂



  • fricky schrieb:

    Shade Of Mine schrieb:

    die performance kosten waeren enorm.

    warum?
    🙂

    befass dich mal mit GCs. Was du willst ist ein Refcounting GC und die sind ewig veraltet. GC mit deterministic finalization ist einfach nicht schnell implementierbar. Aber der GC ist auch der komplett falsche Ansatzpunkt. Du willst für die meisten Resourcen keine deterministische finalization haben. Die meisten Resourcen sind in Pools wie sie der GC anbietet perfekt aufgehoben.



  • 5%Sauerstoff schrieb:

    Man kann ja hier öfter sowas wie "man kann auch Java in C++ programmieren" lesen. Was sind denn die großen Unterschiede?

    1. C++ erlaubt Metaprogrammierung mit Templates. In Java kann man das manchmal mit Vererbung und Polymorphie nachbauen, manchmal muss man es ganz anders machen.
    2. C++ Objekte können auf den Stack und haben hat Destruktoren -> RAII möglich. In Java muss man überall try{} finally{} darum schreiben.
    3. In C++ kann man freie Funktionen in Namespaces stecken. In Java macht man das mit static Methoden in Klassen.

    Weitere?

    Ganz ehrlich: Es ist oft keine gute Idee eine Programmiersprache X, wie eine Programmiersprache Y zu benutzen. Jede Programmiersprache bringt eigene Strategien, Ideen und Konzepte mit.
    Natürlich kann man C++ schon sehr wie Java programmieren (gibt ja sogar GCs), wenn man eben alles in Klassen packt und große Hierarchien baut. Aber so programmiert man - zumindest heutzutage - eben kein C++ mehr, weil es nicht sonderlich effektiv ist, C++ so zu programmieren.

    Wie Blue-Tiger schon geschrieben hat, sind moderne C++-Programme oft eher funktional.



  • Ich dachte das ursprüngliche Konzept von C++ war, moderne Dinge wie OOP nach C zu bringen. Das C++ mehr als C mit Klassen ist, heißt nicht, dass C++ nicht OOP sein sollte.
    C++ ist doch eben Multiparadigmisch, sodass jeder so programmieren kann, wie er es als am sinnvollsten betrachtet und das ist für mich der Kerngedanke vom modernen C++ und nicht, dass auf einmal alles so aufgebaut ist wie die funktionalgenerische Standardbibliothek.

    Das man in C++ nicht so streng OOP programmiert wie in Java, ist klar, aber der funktionale Ansatz ist meines Erachtens veraltet und ein Schritt in die falsche Richtung(C++ funktional programmieren und C OOP scheint ja ein Trend zu sein).
    Ebenso ist die Templatemetaprogrammierung Schwachsinnig, solche Optimierung braucht kein Mensch, wenn dadurch das Programm derart unleserlich wird.
    Um auf deine Aussage zurückzukommen, effektiv ist anders.


Anmelden zum Antworten