OVH Cloud OVH Cloud

Java et C++

141 réponses
Avatar
pr.nm
Vu d'un néophyte (pas débutant, mais pas très bon), quelles
différences y a-t-il entre Java et C++, mis à part quelques petites
particularités syntaxiques (syntaxe de création d'un tableau,
l'utilisation de destructeur d'objet, l'initialisation par défaut des
champs) ? Est-ce que l'héritage multiple change vraiment quelque chose
?
Où puis-je trouver un document clair (français ou anglais) qui me
permette de faire la transition (j'ai lu un article disant que C/C++
était plus rapide que Java et nécessitait moins de lignes) ?
Merci d'avance.

10 réponses

1 2 3 4 5
Avatar
James Kanze
"Dany" writes:

|> Houla effectivement j'ai fait quelques erreurs.

|> > Ça n'a pas été mon expérience. Au contraire, du fait
|> > que ce que tu livres dépend d'une machine virtuelle et des
|> > bibliothèques sur la machine client fait que ton programme
|> > peut s'arrêter de marcher d'un jour à l'autre, sans que
|> > rien n'y ait changé.

|> Ben, je n'ai jamais eu ce genre de probleme, je livre toujours une
|> platforme de déploiment.

Une machine entière pour chaque application ? Chouette alors, mais
il va falloir un bureau plus grand.

|> > > L'inconvénient c'est que du coup tu n'a pas d'executable
|> > > (enfin il y a bien des moyen de faire des exe mais selon le
|> > > cas la place que prend l'executable est dérisoire).

|> > Je n'ai pas trop compris. Est-ce que tu fais référence aux
|> > problèmes dus au dynamisme forcé et l'édition de liens
|> > à l'execution, ou à quelque chose d'autre.

|> Non en fait je fait référence à la création
|> d'exécutable "natif" (pas trés natif d'ailleur)

Mais en quel sens, et pourquoi ? Je n'arrive pas à saisir. La seule
chose que je vois, éventuellement, c'est qu'on ne veut pas
forcement que tout soit chargé dynamiquement -- je dirais même
qu'en général, on cherche à charger le moins possible
dynamiquement : si tout est linké statiquement, je sais la version
des bibliothèques qu'a le programme chez l'utilisateur. Surtout, je
sais que ce sont les mêmes versions avec lesquelles j'ai testé
le programme. Avec le chargement dynamique, c'est assez aléatoire.

|> > > Un autre inconvénient de Java, c'est tout ce qui est
|> > > graphique.

|> > Il n'y aurait pas une faute de frappe, ou quelque chose. Tout ce
|> > qui est graphique, c'est un des avantages de Java, parce que
|> > lui, au moins, a une bibliothèque standard qui s'adresse au
|> > problème.

|> La je ne suis trompé je voulais dire "java c'est tout sauf
|> graphique". Les bibliotheque graphiques de java ont encore du
|> retard par rapport à ceux de c++ (trop pour moi)

Je me doutais un peu. C'est effectivement une grande faiblesse
côté C++. À quel point que je ne crois pas que j'utiliserais
C++ pour un logiciel « client » ; le client serait soit écrit
en Java, soit carrément IE/Netscape/Mozilla.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Martinez Jerome writes:

|> wrote:

|> > Mais combien d'applications C++ utilise wxWindows ou Qt ? Vue
|> > qu'ils ne sont pas standard.

|> Malheuresement, C++ n'a jamais voulu s'attacher a une autre
|> interface que std::cin et std::cout

C'est drôle, j'arrive à ouvrir des fichiers chez moi.

Mais je comprends ce que tu veux dire. Dans la réalité, en fait,
très peu d'entrées/sorties se laissent modèler par un flux,
même étendu avec des fonctions de positionnement. (Et
curieusement, les entrées/sorties qui se modèlent le plus
naturellement par un flux, les pipes, ne sont pas accessibles non plus
depuis le C++ standard.)

|> C'est très très dommage.

|> Mais le paliatif tel que WxWindows n'est pas déplaisant, certe
|> ce n'est pas standart si on est difficile sur les mots, mais on
|> peut dire que c'est un standart de fait au vu du nombre de
|> plate-formes supportées et de son age :)

En général, il y a des chances qui le non-standard soit
supérieur, ou au moins plus à jour, étant donné le temps
qu'il faut à la normalisation. En revanche, côté
portabilité...

Sans parler de l'aspect risque. Quand j'étais à la Dresdner
Bank, ils ont décidé de réécrire toute une application en
Java, parce que la bibliothèque de fenêtrage sur laquelle elle
était basée était retirée du marché.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Fabien LE LEZ writes:

|> On Fri, 25 Jul 2003 17:46:15 +0200, Martinez Jerome
|> wrote:

|> >Malheuresement, C++ n'a jamais voulu s'attacher a une autre
|> >interface que std::cin et std::cout

|> C++ est un langage fait pour être portable -- i.e. tout
|> élément du standard doit avoir un sens sur toutes les
|> machines où un compilateur C++ existe ou peut exister.

Alors, pourquoi un std::cin et un std::cout ? Dans mes applications,
ils n'existent pas. (En fait, ils sont connecté à /dev/null, ce
qui revient à la même chose.)

Il y a aussi des machines sans fichiers -- on les supporte quand
même.

À l'avenir, il me semble fort probable qu'il y aurait du support,
au moins partiel, pour des threads et des objets dynamiques (pour la
simple raison que dans ces deux cas, une solution pûrement
bibliothèque ne suffit pas). Tu ne vas pas me dire que toutes les
plateformes vont les supporter.

Dans la passer, déjà en C, il y a une fonction « time() »,
or que les premiers systèmes où je me suis servi de C n'avait
pas d'horloge temps-réel.

|> En particulier, puisque parler de souris sur une chaîne hi-fi
|> ou d'écran VGA sur un four à micro-ondes n'a pas de sens, le
|> standard ISO-C++ ne parle pas de ces notions.

Et que fait std::filebuf dans un four à micro-ondes ?

|> Il est bien sûr possible de définir un standard pour une
|> interface graphique à la Windows/X/MacOS, mais ce n'est plus du
|> ressort du C++...

C'est une autre question, et ça se discute. Mais les raisons pour
ne pas le définir ne tiennent pas à le fait qu'il existe des
plateformes où ce n'est pas implémentables. (En fait, les
implémentations pour des plateformes particulières s'adaptent,
et je me suis déjà servi des C qui ne supportait pas float ni
double.)

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
James Kanze
Fabien LE LEZ writes:

|> On 25 Jul 2003 06:24:12 -0700, wrote:
|>
|> >> ben tu à les MFC (trés pratique dans le développement
|> >> graphique ^_^).

|> >Du peu que j'ai pu voir, c'est loin de valoir Swing.

|> Faut dire que les MFC sont assez vieilles, pas forcément
|> conçues par des gens qui connaissaient bien le C++, et de
|> toutes façons obsolètes (plein de gens continuent à les
|> utiliser, mais ça m'étonnerait que Microsoft investisse
|> encore dans le développement des MFC...)

Certes, et je crois qu'un des arguments valables contre la
normalisation d'une interface graphique est (ou au moins aurait
été lors de la dernière normalisation) que la technologie
n'est pas encore stable -- que nous ne savons pas trop ce qu'il faut
normaliser. Une norme se doit d'être stable, et il ne faut pas
oublier que si Swing n'est pas trop mal, il est aussi la troisième
version de l'interface graphique de Java.

--
James Kanze mailto:
Conseils en informatique orientée objet/
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France +33 1 41 89 80 93
Avatar
Christophe Le Gal
À l'avenir, il me semble fort probable qu'il y aurait du support,
au moins partiel, pour des threads et des objets dynamiques (pour la
simple raison que dans ces deux cas, une solution pûrement
bibliothèque ne suffit pas).


Exact. Et c'est plutot la que se situe aussi la diffrence pour
les interfaces graphiques.
En C++ ca n'apporterait pas grand chose, en dehors certes d'une
certaines standardisation (mais 1. ca n'interdirait pas de faire
autre chose, 2. On peut standardiser sans lier au langage) de lier au langage
l'interface graphique. Tout peut se faire au niveau librairie
(et du coup les standards definis par ces librairies couvrent
d'autres langages).

On integre au langage quand a apporte qqchose. cin et cout c'est different.
Il faut bien prevoir des entrees sorties. S'il n'y en avait pas
ca ne serait pas si facile de les ecrire simplement dans une
librairie (et sans utiliser autre chose que C++ pour l'ecriture
de cette lib).

Il en va de meme des float. Sans gestion des float par le langage
(et donc par le compilo) on ne peut pas utiliser les capacites
specifiques du processeur pour la virgule floattante.

Et il en va de meme du toolkit graphique en java.
En java le toolkit graphique etait necessaire, puisque sans
lui il n'etait pas possible de faire une interface graphique
juste en ecrivant (en java) une librairie.

--
Christophe Le Gal

Avatar
pr.nm
wrote in message news:...

Ça dépend de ce qu'on veut faire. Si on a un style de programmation
résoluement OO, ils se ressemblent pour certaines choses. Sinon : C++
permet d'autres idiomes aussi, ce qui n'est pas le cas de Java.
Je ne sais pas ce qu'est le style OO. Du coup, je ne suis pas sûr de

connaître différents styles de programmation.



- En C++, on définit beaucoup de types avec une sémantique de valeur :
quand on déclare une variable de type T, c'est réelement de la place
d'un T qui est alloué par le compilateur ; il n'y a pas d'histoire
de faire des new.
"Il n'y a pas d'histoire de new" : tu veux dire qu'on ne peut pas

caster un champ pour qu'il change de type ? ou que la création d'un
objet ne s'écrie pas par Objet o = new Objet(); ?



- En C++, on utilise des destructeurs pour faire le menage. En Java,
les bloc de finally. La différence est, encore une fois,
fondamental. En C++, c'est la classe qui gère la ressource ou la
cohérence qui impose l'execution du nettoyage ; en Java, c'est
l'utilisateur de cette classe qui doit le faire explicitement -- et
je n'ai jamais vu un programme Java où il n'en manquait pas de bloc
de finally.
Ma question est hors sujet (je devrais la poser sur .lang.java) mais

comme tu en parles : qu'est-ce qu'un bloc finally ? (question qui
prouve que je programme sans faire le ménage comme tu le fais
remarquer ci-dessus)

- En C++, on distingue en général entre les erreurs à traiter
localement (indiquer par des valeurs de retour d'une fonction), les
erreurs à traiter globalement (les exceptions), et les erreurs qui
ne doivent en aucun cas se produire, et où il faut avorter (les
échecs d'assertion). Java traite tout par des exceptions, ce qui le
rend extrèmement difficile, sinon impossible, à écrire un programme
qui est réelement correct -- pour pouvoir se comporter d'une façon
correcte lors d'une exception, il faut qu'il y a certaines
opérations qui ne peuvent pas lever une exception. Or, en Java, même
des chose comme une erreur dans la machine virtuelle donne lieu à
une exception.
Je ne compremd pas l'importance de la différenciation : si tu mets

dans ton exception un catch{System.exit(0);}, le programme quitte s'il
rencontre cette erreur.


- Java pose des problèmes pour la programmation par contrat. En C++,
c'est plutôt l'exception d'avoir une fonction virtuelle publique --
la plupart en sont privée. En Java, on ne peut pas déclarer une
fonction privée virtuelle. Du coup, c'est extrèmement difficile à
forcer que tous les appels de la fonction passent par une fonction
non-virtuelle (final, en Java) dans la classe de base ; fonction qui
vérifie que le contrat est maintenu.
Je suppose que la programmation par contrat consiste à créer une

classe abstraite avec des méthodes abstraites, ce qui force tous ceux
qui doivent créer des sous-classes de cette classe à définir un
certain nombre de méthodes.

- Java, au moins dans les implémentations que je connais, impose un
certain dynamisme, qui n'est pas toujours souhaitable. En C++, si tu
veux, tu peux découper ton programme en objets dynamiques (DLL's
sous Windows, objets partagés sous Unix, mais dans les deux cas, ce
qui fait la différence, c'est que l'édition de liens se fait lors de
l'execution.) Or, globalement, un objet dynamique n'est qu'une chose
de plus que tu ne contrôles pas complètement lors de l'execution. On
les évite autant que possible, à cause des erreurs qui en
proviennent.
Il n'y a donc pas d'équivalents Java des dlls ?


En faveur de Java, évidemment, ce sont des bibliothèques standard pour à
peu près tout, et dans certains cas, comme les JSP, l'environement
applicatif.



Avatar
Julien Blanc
Endymion wrote:
wrote in message news:...

- En C++, on définit beaucoup de types avec une sémantique de valeur :
quand on déclare une variable de type T, c'est réelement de la place
d'un T qui est alloué par le compilateur ; il n'y a pas d'histoire
de faire des new.


"Il n'y a pas d'histoire de new" : tu veux dire qu'on ne peut pas
caster un champ pour qu'il change de type ? ou que la création d'un
objet ne s'écrie pas par Objet o = new Objet(); ?


non, ça s'écrit simplement Objet o; (comme tu déclares un int ou un
float). Et tu peux bien sûr écrire Objet *o=new Objet(); pour avoir un
objet avec identité.

- En C++, on distingue en général entre les erreurs à traiter
localement (indiquer par des valeurs de retour d'une fonction), les
erreurs à traiter globalement (les exceptions), et les erreurs qui
ne doivent en aucun cas se produire, et où il faut avorter (les
échecs d'assertion). Java traite tout par des exceptions, ce qui le
rend extrèmement difficile, sinon impossible, à écrire un programme
qui est réelement correct -- pour pouvoir se comporter d'une façon
correcte lors d'une exception, il faut qu'il y a certaines
opérations qui ne peuvent pas lever une exception. Or, en Java, même
des chose comme une erreur dans la machine virtuelle donne lieu à
une exception.


Je ne compremd pas l'importance de la différenciation : si tu mets
dans ton exception un catch{System.exit(0);}, le programme quitte s'il
rencontre cette erreur.


Si j'ai bien retenu ce qui a été dit lors de ma dernière discussion avec
James sur ce sujet, il ressort qu'il est parfois pire de lever une
exception (qui exécutera un certain nombre de destructeurs et
d'opérations sur la pile, pouvant créer des dégats importants) que
d'arrêter tout brutalement. Et en l'occurrence, comme tu ne sais pas
vraiment quand est-ce que ta machine virtuelle peut avoir une erreur (ça
peut dépendre de beaucoup de choses, y compris un problème matériel), il
est très imprudent de lever une exception qui peut provoquer des dégats
importants plutôt que de faire un arrêt brutal, beaucoup moins dangereux.

- Java pose des problèmes pour la programmation par contrat. En C++,
c'est plutôt l'exception d'avoir une fonction virtuelle publique --
la plupart en sont privée. En Java, on ne peut pas déclarer une
fonction privée virtuelle. Du coup, c'est extrèmement difficile à
forcer que tous les appels de la fonction passent par une fonction
non-virtuelle (final, en Java) dans la classe de base ; fonction qui
vérifie que le contrat est maintenu.


Je suppose que la programmation par contrat consiste à créer une
classe abstraite avec des méthodes abstraites, ce qui force tous ceux
qui doivent créer des sous-classes de cette classe à définir un
certain nombre de méthodes.


Non. Ca consiste à définir dans ta classe de base toutes les
préconditions, postconditions, invariants que doit respecter ta classe
et chacune de ses méthodes (et par conséquent chacune de ses classes
dérivées). En c++, il n'y a aucun mécanisme natif pour gérer cela, mais
des styles d'écriture qui le permettent (de manière peu élégante à mon
goût, le résultat est moyen (AMHA, il y'a certaines choses que je n'ai
jamais réussi à faire, mais peut-être que ça vient plus de mon
incompétence :) )). En java, on n'a vraiment aucun moyen de garantir le
contrat autrement qu'en le précisant à la main, ce qui est assez mauvais
(surtout pour un langage "jeune"). Le seul langage à ma connaissance qui
offre un support complet pour la programmation par contrats est Eiffel,
et si tu veux en savoir plus à ce sujet je t'invite à lire Bertrand
Meyer - "Object-Oriented Software Construction" (évidemment, les
exemples sont en Eiffel).

--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.


Avatar
Julien Blanc
Fabien LE LEZ wrote:
On Fri, 25 Jul 2003 17:46:15 +0200, Martinez Jerome
wrote:


Malheuresement, C++ n'a jamais voulu s'attacher a une autre interface
que std::cin et std::cout



C++ est un langage fait pour être portable -- i.e. tout élément du
standard doit avoir un sens sur toutes les machines où un compilateur
C++ existe ou peut exister. En particulier, puisque parler de souris
sur une chaîne hi-fi ou d'écran VGA sur un four à micro-ondes n'a pas
de sens, le standard ISO-C++ ne parle pas de ces notions.


qui parle de souris ? On peut définir une interface pour une "interface
graphique" sans spécifier la manière dont elle doit être affichée. Un
bouton, qu'il soit un bouton cliquable à la souris ou un bouton de four
micro-onde a quand même bien toujours un certain nombre de propriétés
communes, même si certaines n'ont pas nécessairement de sens (changer le
texte d'un bouton en plastique noir me parait difficile, mais après
tout...). Il y'a quand même un certain nombre de propriétés communes à
toutes les interfaces, et cela pourrait avoir tout à fait sa place dans
la norme (et comme le faisait remarquer James, quel est le sens de
std::cin sur un four micro-ondes ? (j'exclus le four ultra-moderne avec
clavier incorporé qui communique avec ton frigo par bluetooth :) )).

Il est bien sûr possible de définir un standard pour une interface
graphique à la Windows/X/MacOS, mais ce n'est plus du ressort du
C++...


parce que c++ doit se limiter à définir une interface standard pour une
console texte, chose qui n'a pas toujours de sens ?

--
Julien Blanc. Equipe cadp. VERIMAG. Grenoble. France.


Avatar
Gabriel Dos Reis
Julien Blanc writes:

[...]

| > Il est bien sûr possible de définir un standard pour une interface
| > graphique à la Windows/X/MacOS, mais ce n'est plus du ressort du
| > C++...
|
| parce que c++ doit se limiter à définir une interface standard pour
| une console texte, chose qui n'a pas toujours de sens ?

Il y a souvent des confusions en ce qui concerne la question «
pourquoi C++ n'a pas de GUI ». La réalité est que ce n'est pas que C++
n'a pas de facilités GUI, mais qu'il y en a trop et qu'il y a trop de
gens qui s'intéressent à C++ et qui ont leurs propres idées sur ce que
doit être GUI. Récemment, on discutait du sujet avec BS et il a promis
d'ajouter une note dans sa FAQ

http://www.research.att.com/~bs/bs_faq.html

-- Gaby
Avatar
Martinez Jerome
James Kanze wrote:

Sans parler de l'aspect risque. Quand j'étais à la Dresdner
Bank, ils ont décidé de réécrire toute une application en
Java, parce que la bibliothèque de fenêtrage sur laquelle elle
était basée était retirée du marché.


D'ou l'interet de l'open-source...
(Et c'est pourquoi je préfère WxWindows a Qt, trop restrictif a mon gout)

1 2 3 4 5