Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Pédagogie : C++ ou Java ?

133 réponses
Avatar
Gilles
Bonjour à tous.

J'ai beaucoup apprécié le fil "Avis sur les include files" où ont été
abordées entre autres des questions sur l'enseignement du C++ et les "bonnes
habitudes" à enseigner en TP, ce qui m'incite à poster ce message.

Voici la situation : je suis enseignant en IUT - DUT informatique (Bac+2 à
vocation professionnelle). Jusqu'à maintenant la programmation était
enseignée au travers du C++. Il est fortement question de changer ce choix
dans notre IUT pour remplacer C++ par Java (actuellement un enseignement de
Java existe, mais en seconde année seulement, donc avec déjà une pratique du
C++ et les bases de la POO).

J'aimerais vos avis sur ces deux questions :
- quels sont les arguments en faveur (ou en défaveur) du C++ (par rapport à
Java) pour enseigner la POO à des débutants complets en programmation ? (et
pour qui, pour reprendre une remarque apparue dans le fil auquel je faisais
référence, il n'y a plus en majorité "de passion ou de réelle envie de faire
de l'informatique"...)
- est-il raisonnable de lâcher sur le marché du travail des informaticiens
"Bac+2" qui n'aient jamais programmé en C++ ?

Note personnelle : je ne suis pas le chargé de cours concerné, j'ai une
tendance à préférer le C++ (par mon parcours et par mon activité quotidienne
en recherche), mais je n'aurai aucune réticence à faire pratiquer Java si je
suis convaincu que c'est un meilleur choix pour mes étudiants.

Merci d'avance pour vos contributions qui nourriront sûrement le débat que
nous devrions avoir au sein de l'équipe pédagogique.

Gilles

10 réponses

Avatar
pjb
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.



Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.



Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple, et Ada un modèle objet statique avec
héritage simple.

Le meilleur moyen de vérifier que ce ne sont pas le même modà ¨le,
serait d'essayer d'implémenter dans un langage X une sous classe d'une
classe écrite dans un langage Y avec X≠Y.

--
__Pascal Bourguignon__
Avatar
Marc Boyer
On 2009-02-09, Pascal J. Bourguignon wrote:
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.



Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.



Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.



Complètement, non, je ne pense pas.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple



Non, je ne partage pas cette analyse.
Dans les deux, tu as un modèle de type à base de classes, des
instances (objet), le sous-typage se fait de manière déclarative
sur les classes (je laisse de côté les templates/la généricité).
Après, oui, C++ a par défaut une sémantique de valeur, Java
une sémantique de poignée, et on a quelques autres différences
(héritage multiple par exemple). Mais ça reste pour moi dans
la même famille.

et Ada un modèle objet statique avec héritage simple.



Je ne connais pas bien.

Le meilleur moyen de vérifier que ce ne sont pas le même modèle,
serait d'essayer d'implémenter dans un langage X une sous classe d'une
classe écrite dans un langage Y avec X?Y.



Non, pour moi, pour montrer que ce ne sont pas les mêmes modèles,
il faudrait trouver une conception architecturale qui passe dans
l'un et pas du tout dans l'autre.
Les modèles ou classes et objets sont manipulables de la même
manière sont AMHA eux dans une classe différente (ils se disent
souvent plus objet d'ailleurs).

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
Avatar
espie
In article ,
Pascal J. Bourguignon wrote:
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.



Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.



Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple, et Ada un modèle objet statique avec
héritage simple.



Ca va pas non ? vu du point de vue de smalltalk ou de self, C++, Java, et Ada,
c'est essentiellement la meme chose...
Avatar
Wykaaa
Marc Boyer a écrit :
On 2009-02-09, Pascal J. Bourguignon wrote:
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.


Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.


Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.



Complètement, non, je ne pense pas.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple



Non, je ne partage pas cette analyse.
Dans les deux, tu as un modèle de type à base de classes, des
instances (objet), le sous-typage se fait de manière déclarative
sur les classes (je laisse de côté les templates/la généricité).
Après, oui, C++ a par défaut une sémantique de valeur, Java
une sémantique de poignée, et on a quelques autres différences
(héritage multiple par exemple). Mais ça reste pour moi dans
la même famille.



Je suis tout à fait d'accord avec toi. La distinction entre les
différents modèles objet se fait sur d'autres critères comme, par
exemple, si on considère le typage et la classification : le typage du
premier ordre "à la Liskov" avec le principe de substitution ou le
typage du second ordre "à la Cook". Dans ce cas, on voit que Smalltalk
permet ce genre de typage mais pas Java ou C++.

et Ada un modèle objet statique avec héritage simple.



Je ne connais pas bien.



L'objet, dans Ada, a été ajouté après coup (Ada 95 vs Ada 83). Ca se voit !

Le meilleur moyen de vérifier que ce ne sont pas le même modèle,
serait d'essayer d'implémenter dans un langage X une sous classe d'une
classe écrite dans un langage Y avec X?Y.



Non, pour moi, pour montrer que ce ne sont pas les mêmes modèles,
il faudrait trouver une conception architecturale qui passe dans
l'un et pas du tout dans l'autre.
Les modèles ou classes et objets sont manipulables de la même
manière sont AMHA eux dans une classe différente (ils se disent
souvent plus objet d'ailleurs).



Justement dans Smalltalk (ce n'est qu'un exemple) ou tout est objet, y
compris les classes ce qui impose qu'on parle de métaclasse (typage du
second ordre).
Avatar
espie
In article <49902083$0$4090$,
Wykaaa wrote:
Justement dans Smalltalk (ce n'est qu'un exemple) ou tout est objet, y
compris les classes ce qui impose qu'on parle de métaclasse (typage du
second ordre).



Je me sens oblige de mentionner le modele objet de perl, ou tout est un
peu "en kit" En tout cas, suffisamment pour que, meme si le modele dominant
est sous forme de classes, on puisse faire tres facilement des choses
extremement exotiques, comme la foultitude de modules existants sur CPAN
le prouvent.

Mais bon, a la base:
- on peut synthetiser nom de methode et appels de methode au vol
- le genial AUTOLOAD permet de faire ce qu'on veut cote delegation et
fabrication de methodes.
- le cote dynamique fait que les classes sont ouvertes. Tres possible
de rajouter des methodes apres coup.
- les types sont associes aux objets, on peut facilement changer un
objet de classe (meme si c'est rarement utile).
- pas d'infrastructure "particuliere" pour le constructeur. On peut
faire ce qu'on veut.
- possibilites de reflexivite extremement etendues, y compris controle
de ce qui se passe a la compilation/au runtime.

... entre autres.

Personnellement, j'y ai retrouve la joie de faire du smalltalk, avec en
plus un langage communiquant avec le monde exterieur.
Avatar
Wykaaa
Pascal J. Bourguignon a écrit :
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.


Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.



Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple, et Ada un modèle objet statique avec
héritage simple.



Il est abusif de dire que Java a un modèle objet dynamique.

Le meilleur moyen de vérifier que ce ne sont pas le même modèle,
serait d'essayer d'implémenter dans un langage X une sous classe d'une
classe écrite dans un langage Y avec X≠Y.



Ca vérifiera surtout la difficulté qu'il y a à faire communiquer
plusieurs langages dans une même application !
Avatar
pjb
(Marc Espie) writes:

In article <49902083$0$4090$,
Wykaaa wrote:
Justement dans Smalltalk (ce n'est qu'un exemple) ou tout est objet, y
compris les classes ce qui impose qu'on parle de métaclasse (typage du
second ordre).



Je me sens oblige de mentionner le modele objet de perl, ou tout est un
peu "en kit" En tout cas, suffisamment pour que, meme si le modele dominant
est sous forme de classes, on puisse faire tres facilement des choses
extremement exotiques, comme la foultitude de modules existants sur CPAN
le prouvent.
[...]
Personnellement, j'y ai retrouve la joie de faire du smalltalk, avec en
plus un langage communiquant avec le monde exterieur.



C'est vrai qu'un langage dynamique permet plus facilement de s'adapter
et de s'interfacer avec des systèmes objets différents. En Common
Lisp, CLOS peut être considéré comme un module indépendant, et on peut
définir des systèmes objets différents (il en existe, par exemple, KR
qui est basé sur les prototypes comme Javascript), et grâce au FFI, on
peut aussi s'interfacer avec des systèmes d'objets comme celui du C++.

Mais ceci demande beaucoup plus de travail, et un travail qui est de
plus trés dépendant du compilateur utilisé pour compiler les objets
C++. On ne peut pas vraiment dire alors qu'il y ait une quelconque
compatibilité entre CLOS (idem Smalltalk, Objective-C, Java, Ruby,
Perl) d'une part et C++ d'autre part. On peut implémenter dans un
langage le système objet de l'autre. Greenspun!

Le plus proche, ce sont des choses comme CORBA, qui imposent en fait
leur propre modèle objet aux langages qui veulent s'interfacer.

--
__Pascal Bourguignon__
Avatar
pjb
(Marc Espie) writes:

In article ,
Pascal J. Bourguignon wrote:
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.



Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.



Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple, et Ada un modèle objet statique avec
héritage simple.



Ca va pas non ? vu du point de vue de smalltalk ou de self, C++, Java, et Ada,
c'est essentiellement la meme chose...



En Java, il y a l'introspection et la réflexion qui permettent
d'ajouter ou modifier des classes et méthodes dynamiquement. Java, ou
plus exactement, le système objet derrière Java est dans la catégorie
de Smalltalk et CLOS.

--
__Pascal Bourguignon__
Avatar
Marc Boyer
On 2009-02-09, Wykaaa wrote:
Marc Boyer a écrit :
On 2009-02-09, Pascal J. Bourguignon wrote:
Marc Boyer writes:
Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.


Je pense que tu exagères un peu: il y AMHA un modèle dominant,
à base de classe et d'objets qui instancies ces classes (Java, C++,
Ada ?), tellement dominant que beaucoup croient que c'est le seul.


Seulement tu donnes en exemple trois langages avec trois modèles
objets complètement différents.



Complètement, non, je ne pense pas.

Pour simplifier, Java a un modèle objet dynamique, C++ un modèle objet
statique avec héritage multiple



Non, je ne partage pas cette analyse.
Dans les deux, tu as un modèle de type à base de classes, des
instances (objet), le sous-typage se fait de manière déclarative
sur les classes (je laisse de côté les templates/la généricité).
Après, oui, C++ a par défaut une sémantique de valeur, Java
une sémantique de poignée, et on a quelques autres différences
(héritage multiple par exemple). Mais ça reste pour moi dans
la même famille.



Je suis tout à fait d'accord avec toi. La distinction entre les
différents modèles objet se fait sur d'autres critères comme, par
exemple, si on considère le typage et la classification : le typage du
premier ordre "à la Liskov" avec le principe de substitution ou le
typage du second ordre "à la Cook". Dans ce cas, on voit que Smalltalk
permet ce genre de typage mais pas Java ou C++.



Je ne suis pas expert, mais c'est bien ce qu'il me semblait.

et Ada un modèle objet statique avec héritage simple.



Je ne connais pas bien.



L'objet, dans Ada, a été ajouté après coup (Ada 95 vs Ada 83). Ca se voit !



Oui, je connaissais relativement bien Ada 83, mais pas trop Ada 95, donc
je ne peut pas trop argumenter techniquement.

Le meilleur moyen de vérifier que ce ne sont pas le même modèle,
serait d'essayer d'implémenter dans un langage X une sous classe d'une
classe écrite dans un langage Y avec X?Y.



Non, pour moi, pour montrer que ce ne sont pas les mêmes modèles,
il faudrait trouver une conception architecturale qui passe dans
l'un et pas du tout dans l'autre.
Les modèles ou classes et objets sont manipulables de la même
manière sont AMHA eux dans une classe différente (ils se disent
souvent plus objet d'ailleurs).



Justement dans Smalltalk (ce n'est qu'un exemple) ou tout est objet, y
compris les classes ce qui impose qu'on parle de métaclasse (typage du
second ordre).



Et cela donne un modèle objet très différent, et vue de Smalltalk,
C++ et Java sont dans la même famille (même si, dans une même famille,
on focalise toujours sur les petites différences).

Marc Boyer
--
Au XXIème siècle, notre projet de société s'est réduit
à un projet économique...
Avatar
Fabien LE LEZ
On Mon, 9 Feb 2009 08:49:39 +0000 (UTC), Marc Boyer
:

Yep. En plus, ça peut permettre de rappeler qu'il y a (au moins)
autant de modèles OO que de langages dits OO.



Je pense que tu exagères un peu



Peut-être le mot "modèle" est-il erroné.

Il me semble que l'idée qu'un objet a normalement une sémantique de
valeur, et a un opérateur de copie sauf si on bricole pour l'enlever,
est une différence fondamentale par rapport auxx langages dont les
objets ont une sémantique d'identité.