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

Avatar
Alain Naigeon
"Christophe Lephay" a écrit dans le message
news: bg48p5$hbd$
Je crois que ce n'est pas demain la veille que C++ intègrera une GUI.
C'est

lié, de mon point de vue, au positionnement de C++ en ce qui concerne
l'efficacité : standardiser quelque chose qui dépend autant de
l'environnement ne peut se faire que par un nivellement par le bas (tant
sur

le plan des performances que du nombre de fonctionnalités).


Je ne suis pas d'accord, c'est ce que j'appelle (de leur part) une
position de Ponce-Pilate : puisque les experts, avec les contraintes
réelles que tu cites, ne peuvent faire quelque chose d'idéal, laissons
donc les autres faire ce qu'ils veulent chacun dans leur coin, ce qui
laisse les mains libres par la suite pour critiquer leur façon de faire,
et leur balancer, en plus, avec la plus parfaite mauvaise foi, l'argument
de non portabilité. Belle mentalité ! ;-)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France

Avatar
Alain Naigeon
"Christophe Lephay" a écrit dans le message
news: bg54b7$q5$
"Endymion" a écrit dans le message de
news:
Est-ce qu'on peut dire que définir une classe abstraite avec quelques
méthodes abstraites et quelques champs et demader aux programmeurs
d'écrire des sous-classes de cette classe abstraite, c'est de la
programmation par contrat ?



Le principe est plus simple que ça, c'est juste d'énoncer clairement
quelles valeurs, ou quelles relations entre valeurs, une classe doit
vérifier à tout moment, ou en entrée et sortie d'une opération.
Et de se donner les moyens, dans le langage, d'exprimer ces
contraintes, et d'avertir (de façon récupérable) quand elles sont
violées).
Enfin, il me semble que ça donne une première idée.

Ensuite, un truc sur le quel Meyer insiste : le contrat n'existe pas
seulement pour la classe, mais aussi pour l'appelant d'une
méthode :
Tel genre de résultat est garanti (et/ou tel ou tel invariant
est conservé...)
**si**
l'entrée vérifie telle et telle condition.

(il ne s'agit pas, évidemment, de demander l'impossible)

--

Français *==> "Musique renaissance" <==* English
midi - facsimiles - ligatures - mensuration
http://anaigeon.free.fr | http://www.medieval.org/emfaq/anaigeon/
Alain Naigeon - - Strasbourg, France


Avatar
Loïc Joly
Martinez Jerome wrote:
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)

Il me semble que sur ce point particulier, TrollTech a signé un contrat

stipulant qu'en cas de faillite, QT basculerait automatiquement dans
l'OpenSource.

--
Loïc


Avatar
Olivier LUONG
Ce n'est pas dit. Si tu fais attention à ne travailler qu'avec les
double[], le résultat pourrait être même plus vite qu'avec C++. Sur
certaines plateformes, en tout cas -- la portabilité à ce niveau, ce
n'est pas le fort de Java.


J'ai du mal a imaginer qu'un code précompilé soit plus rapide qu'un code
compilé, plus proche de la machine donc.
A optimisation egale (a la limite sans utiliser vector<>), le C++ serait
vraiment moins rapide que Java???
as-tu des exemples?
(j'avoue, c'est le principe meme de code non completement compilé plus
rapide que du code compilé qui me "choque". Mais bon, avec
l'informatique plus rien doit choquer... :) )



Jeffrey Richter dans son livre sur .NET Framework, explique pourquoi dans
certain cas une application peut tourner plus vite avec tu codes précompilé
plutot qu'un code compilé.

En général tu distribues non pas ton code (hors open source) mais ton
binaire
hors le binaire que tu vas compilé tu vas faire en sorte qu'il soit
compatible avec
autant de plateforme possible. Donc tu vas évité toute optimisation lié au
matériel, ou
bien comme c'etait le cas avec FlaskMPEG tu auras une version pour athlon
et une version générique...

Alors qu'avec une compilation précompilé, tu vas permettre au compilateur
de compilé le code en fonction des spécificité du matériel de la machine
exécutant le code => gain de possible de performance durant l'exécution...

donc précompilé = coût fixe + gain variable fonction notamment de la durée
d'exécution
code compilé pas de coût fixe, mais pas ou peu d'optimisation si tu veux
pouvoir
optimisé on peut s'attendre a une certaine lourdeur de ton code =>
difficulté de maintenance....

tout ceci reste pour moi théorique, si vous avez des exemples concret je
suis preneur :)

Olivier


Avatar
Loïc Joly
Vincent wrote:
Euh? En C++ on peut écrire une fonction redéfinissable mais pas
appelable par la classe fille?


Oui.

class A
{
private:
virtual void f();
};

f est redéfinissable, mais non appelable, ni par le client, ni par la
classe fille.



du reste, je n'ai jamais trouvé cet argument particulièrement pertinent.
C'est à l'environnement de développement d'être capable, à partir d'un
fichier source, de fournir l'interface. De ce côté-là, javadoc est
plutôt performant.


Je ne sais pas si la remarque initiale conceranait l'aspect
documentaire, il est vrai que dans ce cas javadoc est la réponse.


Je pense que l'argument principal est de pouvoir modifier
l'implémentation en étant certain de ne pas toucher l'interface (et une
gestion par fichier permet au système de compilation de tenir compte
facilement de ce fait pour optimiser énormément le temps de compilation).

--
Loïc


Avatar
Loïc Joly
Vincent wrote:
Arf! Si tu considères que les templates sont une "commodité syntaxique",


Expression un peu mal choisie je te l'accorde, ça ne rend pas bien
compte de l'utilité de la chose... Mais je continue de penser que ça
n'est pas indispensable.


je
te recommande chaudement la lecture de "Modern C++ Design", ou bien de te
pencher sur le design de certaines librairies (Boost, ATL, Blitz,....). Les
templates ne servent pas qu'à faire des conteneurs de T, loin de là.


Oui, mais quoi qu'il arrive ça ne fait que remplacer le <template> par
le vrai type, non? D'où l'idée de "commodité syntaxique"...


Par vraiment, non...
Déjà, on peut faire des templates avec autre-chose qu'un type...
Ensuite, plutôt que modern C++ design, qui est assez ardu, je te
conseille de lire C++ template, the complete guide, et en particulier
les chapitres meta-programming et expression template.

--
Loïc


Avatar
Fabien LE LEZ
On 28 Jul 2003 08:19:12 -0700, (Vincent) wrote:

mais honnêtement peu d'entreprises
peuvent se permettre de maintenir une bibliothèque que leurs auteurs
aurait abandonné...


Certes, mais une bibliothèque abandonnée mais en open source a plus de
chances d'être reprise par quelqu'un d'autre...


--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html

Avatar
Gabriel Dos Reis
Fabien LE LEZ writes:

| On 28 Jul 2003 08:19:12 -0700, (Vincent) wrote:
|
| > mais honnêtement peu d'entreprises
| >peuvent se permettre de maintenir une bibliothèque que leurs auteurs
| >aurait abandonné...
|
| Certes, mais une bibliothèque abandonnée mais en open source a plus de
| chances d'être reprise par quelqu'un d'autre...

comme libg++ ? :-)

-- Gaby
Avatar
Gabriel Dos Reis
Loïc Joly writes:

| Un argument est que si tu as codé vite, il te reste du temps pour
| optimiser là où tu en a besoin.

J'ai souvent entendu « si tu codes vite, il te restera du temps pour
debugguer » ;-)

-- Gaby
Avatar
kanze
(Vincent) wrote in message
news:...
Arf! Si tu considères que les templates sont une "commodité syntaxique",


Expression un peu mal choisie je te l'accorde, ça ne rend pas bien
compte de l'utilité de la chose... Mais je continue de penser que ça
n'est pas indispensable.

je te recommande chaudement la lecture de "Modern C++ Design", ou
bien de te pencher sur le design de certaines librairies (Boost,
ATL, Blitz,....). Les templates ne servent pas qu'à faire des
conteneurs de T, loin de là.


Oui, mais quoi qu'il arrive ça ne fait que remplacer le <template> par
le vrai type, non? D'où l'idée de "commodité syntaxique"...


D'abord, évidemment, les paramètres d'un template ne sont pas forcément
des types -- il peut être des entiers ou des pointeurs ou des références
aussi. Deuxièmement, en C++, on peut avoir des fonctions templatées
aussi, et non seulement des classes, et enfin (et surtout), le
compilateur peut déduire lui-même les paramètres d'une fonction
templatée.

Et évidemment, on peut aussi faire des spécialisations explicites.

Le résultat, c'est que le langage des templates C++ est Turing
complete. On peut en principe l'utilisable pour tout problème que peut
résoudre un ordinateur. Et du moment qu'on peut calculer, ou même faire
des décisions simple, c'est plus qu'un simple commodité syntaxique.

Considère un exemple simple : tu veux déclarer un buffer assez grand
pour contenir des chiffres générés par la conversion d'un int en
décimal. D'une façon portable -- c'est clair que sous Windows, la
réponse est 11 (10 chiffres plus la signe), mais toutes les machines
n'ont pas des int de 32 bits. En C++ moderne, tu utilises la template
suivante :

template< size_t N >
struct MaxDigits
{
static size_t const value = 1 + MaxDigits< N / 10 >::value ;
} ;

template<>
struct MaxDigits< 0 >
{
static size_t const value = 1 ;
} ;

instantié sur INT_MAX (ou SHRT_MAX, ou ta valeur maximum, n'importe ce
qu'elle est), ainsi :
char buffer[ MaxDigits< INT_MAX >::value ] ;
Évidemment, tu peux faire la calcule à la main, et puis y écrire la
valeur voulue. Mais il ne faut pas oublier de le faire de nouveau chaque
fois tu passes à une autre machine.

--
James Kanze GABI Software mailto:
Conseils en informatique orientée objet/ http://www.gabi-soft.fr
Beratung in objektorientierter Datenverarbeitung
11 rue de Rambouillet, 78460 Chevreuse, France, +33 (0)1 30 23 45 16