IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C++ Discussion :

C++ ou java ?


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Par défaut C++ ou java ?
    Bonjour à tous !

    En fait je programme depuis un moment en C/C++ et je me suis mis au java pour les cours. J'en suis venu à me poser cette question : en quoi le C est plus intéressant (ou bas niveau) que le java ?
    Pour moi, la seule chose que permet le C que ne permet pas le java, c'est la création de pointeurs sur une adresse memoire quelconque, qui ne représente pas forcément un objet du programme. Mais en y réfléchissant, je ne vois pas trop à quoi cela pourrait servir... qq'un aurait un exemple ?

  2. #2
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Tu semble faire un amalgame très douteux entre le C et le C++...

    Et, pour compliquer le tout, tu met cet amalgame en balance avec le java

    Il faut déjà bien comprendre que, si le C fait partie d'un sous ensemble du C++, il n'en demeure pas moins qu'il s'agit de deux langages totalement différents, avec des optiques, des normes et des possibilités totalement différentes.

    C'est au point qu'une grande partie de ce qui fait le C++ est purement inconnu en C, et que, d'un autre coté, la grosse majorité des habitudes que tu peux avoir prises en C sont à oublier quand tu étudie le C++ (non pas que ce soit incompatible (du moins pas tout), mais, surtout, qu'il existe des alternatives bien plus faciles/sécurisantes à mettre en oeuvre )

    Il est donc déjà difficile de faire une comparaison entre le C et le C++, parce que, bien qu'il s'agisse de deux langages compilés, et que le C++ descende directement du C, du fait des différences existantes entre les deux (et qui pourraient se résumer en "le C++ est un langage orienté objet", même si c'est vraiment restrictif )

    Si en plus, tu fais entrer java, qui nécessite une machine virtuelle pour fonctionner, dans la danse, il devient littéralement impossible de faire une comparaison complète.

    Ceci dit, on peut dire que le C est le langage le plus bas niveau des trois, mais que c'est un langage à vocation essentiellement procédurale.

    Le C++ apporte un niveau d'abstraction supplémentaire avec une approche clairement orientée objet, et java présente encore un niveau d'abstraction supplémentaire grâce à sa machine virtuelle, et à ses capacités "run time".

    Quand on n'envisage que deux langages (C et C++, C et java, C++ et java), on trouve déjà une série d'"aficionados" pour chacun des langages, les un préférant clairement le C, d'autres le C++ et d'autres enfin le java, et les comparaisons sont généralement des débats qui font rage (y compris sur ce forum), chacun essayant de convaincre l'autre que le langage qu'il préfère est le meilleur

    Certains développeurs, les moins "sectaires" admettent que chaque langage a ses avantages et ses inconvénients, et admettent l'idée de choisir le langage ou la technologie en fonction des besoins de leurs applications, ce qui ne les empêche pas d'avouer une préférence pour l'un ou l'autre des langages.

    En effectuant une recherche sur le forum, principalement dans la partie Débats sur le développement - Le best of, tu trouvera une quantité phénoménale de débats sur les différents langages et technologie.

    Ces débats devraient sans doute te permettre de te faire une idée précise des différences existant entre les différents langages
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    57
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 57
    Par défaut
    merci pour cette longue réponse.
    Sinon est-ce que qq'un aurait une idée d'exemple où la possibilité d'accéder à n'imoprte quelle adresse mémoire est nécessaire ?

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    La question n'est vraiment pas là...

    Si, de fait, en programmation système, tu te trouve parfois obligé d'accéder à une adresse données (ex l'adresse physique d'un périphérique quelconque, voir, l'adresse physique d'une partie d'un périphérique), tu semble déjà n'avoir qu'une idée fausse de ce qu'est réellement un pointeur.

    Un pointeur (et ses dérivées: pointeur de pointeur (de pointeur de...)) n'est jamais qu'une variable un peu spéciale en cela qu'elle contient... l'adresse mémoire à laquelle se trouve l'élément recherché.

    En C, cela permet principalement trois choses:
    • de représenter l'adresse du premier élément d'un tableau contenant N éléments contigus:
      dans le code
      tab est un pointeur qui contient l'adresse de l'élément 0 du tableau
    • de permettre à une fonction d'apporter des modifications qui persisteront apres l'appel de la fonction:
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
       
      void fonction (int* i)
      {
         *i*=2;
         printf("Dans la fonction %d\n",*i);
      }
      int main()
      {
          int nombre=3;
          printf("avant la fonction %d\n",nombre);
          fonction(&nombre);
          printf("apres la fonction %d\n", nombre);
          return 0;
      }
    • disposer d'une variable permettant l'allocation dynamique de la mémoire
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
       
      int *tab;
      tab=malloc(10*sizeof(int));

    En C++, les principes sont identiques, mais:
    • on préférera utiliser les classes de la bibliothèque standard qui nous facilite la tâche (std::string au lieu des chaines C style, et les différents conteneurs en fonction des besoins)
    • On préférera passer un argument sous forme de référence
    • On limitera l'allocation dynamique d'objet aux moments où l'on n'a pas le choix
    • on réservera l'utilisation de pointeurs aux moments où l'on n'a pas le choix
      • les deux cas ci-dessus
      • les cas d'appartenance cyclique:une classe A qui contient un membre de type B, et le type B qui doit faire référence au type A qui le contient
        Code : Sélectionner tout - Visualiser dans une fenêtre à part
        1
        2
        3
        4
        5
        6
        7
        8
        9
        10
        11
        class B;
        class A
        {
            /*...*/
            B membre;
        };
        class B
        {
            /*...*/
            A* parent;
        };

    Quoi qu'il en soit, les pointeurs doivent toujours être valides avant toute tentative d'utilisation:

    Si tu tente d'accéder à l'élément pointé par un pointeur qui n'est pas valide, tu t'expose à des catastrophes sans nom, allant, dans le meilleur des cas, du plantage de ton application, dans le pire au fait de lancer une bombe atomique sur New York...
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    Citation Envoyé par TheShade Voir le message
    Pour moi, la seule chose que permet le C que ne permet pas le java, c'est la création de pointeurs sur une adresse memoire quelconque, qui ne représente pas forcément un objet du programme.
    Je crois que c'est la partie en rouge qui était importante....

    En fait, TOUS les langages utilisent des pointeurs (Java y compris), le java (qui devrait être comparé à C# et pas à C++) introduit la notion de garbage-collector. Dans 90% des cas, ca permet de ne pas se soucier de la gestion de la mémoire. Dans 9% des cas, ca demande un peu de finesse de programmation (surtout les try { } finally { } ), et dans 1% des cas, c'est carrément une horreur à gérer.

    D'une part, parcequ'il n'y a (en java) *absoluement* aucun moyen d'être sur qu'un objet sera bien détruit. Il existe certains modes de runtime en java ou le garbage collector n'est invoqué que lorsqu'une exception mémoire est levée ! Le C/C++ est très clair sur la durée de vie des objets, et permet même (new/delete) le soin au programmeur de la gérer...

    Par exemple:
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    void uneFonction()
    {
         MonObject a;
         ...
         // le destructeur de MonObject est automatiquement invoqué
    }
    Code java : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    void uneFonction()
    {
         MonObject a = new MonObject();
         ...
    } // a la sortie de la fonction, le destructeur de MonObject n'est *pas* invoqué, et je ne peux même pas être sur qu'il le soit un jour

    C'est pour cette raison, que nombre de classes en Java proposent des fonctions genre "release()" pour libérer toute ressource qu'elle pourrait avoir gardée... Oublier d'appeler ces fonctions est *aussi* dangereux qu'oublier d'appeler delete en C++, sauf que le runtime-C++ debug va crier au loup si on oublie, pas le runtime java.

    Il y a aussi de nombreuses applications (jeux, 3D, ...) ou l'optimisation de la mémoire est très importante... quand il faut traiter des millions de triangles 60 fois par secondes, on est vraiment à 2ms pret ! Organiser la mémoire de telle ou telle manière pour bénéficier des traitements SSE...

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 395
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pour contourner ces inconvénients du Garbage Collector, .Net met à disposition l'interface IDisposable pour forcer la libération des ressources, et dans certains langages (notamment C#) un mécanisme pour l'appeler automatiquement en fin de bloc.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

Discussions similaires

  1. le Java est la continuité du C++ ???
    Par Vincent PETIT dans le forum Débats sur le développement - Le Best Of
    Réponses: 33
    Dernier message: 25/08/2005, 20h17
  2. Envoi de Datagrames par IP en JAVA
    Par the java lover dans le forum Développement
    Réponses: 2
    Dernier message: 14/08/2002, 11h44
  3. directx et java?? possible??
    Par jiraiya dans le forum DirectX
    Réponses: 3
    Dernier message: 09/07/2002, 19h55
  4. webcam : lire sur un port usb en c/c++ ou java. sous win. ?
    Par flo007 dans le forum Choisir un environnement de développement
    Réponses: 2
    Dernier message: 24/05/2002, 23h24
  5. Service de nommage java C++
    Par Anonymous dans le forum CORBA
    Réponses: 3
    Dernier message: 15/04/2002, 12h48

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo