Je voudrais livrer mes impressions à propos de ces trois langages et notamment de leur liens entre eux.
J'ai un parcours assez atypique dans l'apprentissage des langages. J'ai découvert l'informatique à la fac où j'était d'abord venu pour faire des maths. Le langage quy était enseigné aux premières années, c'était le Java. C'est discutable, mais ce n'est pas le sujet (envoyez un MP si vous voulez en débattre
). Je ne vous le cacherai pas, ca n'a pas était facile pour tout le monde: d'une part des étudiants qui découvrent l'informatique, de l'autre part des ensignants qui ne savent pas trop quel niveau technique inculquer à leurs eleves. J'ai eu la chance de tomber sur une prof motivée sympa et rigoureuse et j'ai appris le Java assez rapidement, et avec le recul, plutot bien je trouve.
Ce qui est utile avec le Java au début, c'est qu'on a pas à gérer la mémoire. Quand on débute en algorithmique c'est trés intrerressant, on se concentre sur les automatismes, on comprend bien comment les algos s'executent. On n'a aucun aperçu de la gestion de la mémoire, et c'est tant mieux car ce n'est pas encore l'enjeu.
Dés qu'on commence à aborder les structures de données, il faut pouvoir définir de nouveux types, donc des classes en Java, donc commencer à s'impregner de POO. Autant vous dire qu'en première année, ca fait mal, et que plus de la moitié des étudiants de seconde année ne savent toujours pas faire un programme de longueur moyenne (~500 lignes). Je me suis accroché, j'ai lu, j'ai demandé de l'aide, et j'ai petit à petit compris le mécanisme des classes, des champs et des méthodes d'instances et de classes, puis plus tard l'héritage, les interfaces le tout-objet ..... A partir de ce moment l j'ai commencé à faire de l'info en dehors des cours et j'ai réalisé quelques projets: la pratique et la lecture (encore et toujours) m'ont permis de mieux comprendre les subtilités, de mieux comprendre la philosophie Java et de rédiger du code plus adéquat.
Je me suis donc mis un peu plus tard au C++ que j'ai envisagé d'apprendre tout seul avec un gros bouquin: celui de Bjarne Stoustrup. Comme je n'étais plus un novice en programmation, c'est venu assez rapidement. La syntaxe changeait un peu (pour les déclarations de classes et la définition des méthodes), on pouvait faire plus de trucs (redifinitions des opérateurs) mais ca allait. Par contre grosse nouveauté: les références, les pointeurs et les valeurs ! J'ai du beaucoup bosser et demander beaucoup d'aide pour comprendre.. mais c'est venu. Mon véritable problème a été l'allocation dynamique, jimpossible de faire la différence entre variable automatique et variable dynamique: je connaissais pas ! Exemple: comme je connaissais le mot clé new en Java, je pensais que ca fonctionnait pareil en C++. Je ne voyais pas l'interet de renvoyer un pointeur, puisque je trouvais ca plus compliquer que les valeurs et les références. Et pendant longemps j'ai fait cette manip horrible:
mon_objet o = *(new mon_objet);
Et sans appel a delete ensuite ..ca se passe de commentaire.
Puis pour les besoins d'un concours, je me suis mis au C. A part quelques problèmes pour les déclarations (au début d'un bloc et jamais dans l'initialisateur d'un for), la syntaxe étant identique, ca n'a pas posé de problemes. Puis j'ai voulu utiliser des tableaux: "Ah oui merde, c'est comme en C++, pas de tableaux de tailles variables.. merde pas de STL , donc pas de Vector non plus !" Alors comment on fait ? Et bien on va sur developpez.com, on choppe un tutoriel ANSI C et la, bah c'est venu très vite. Aprés avoir compris malloc et free, j'ai donc compris new et delete.
Aujourd'hui j'estime avoir une bonne connaissance et une bonne pratique du C et du Java: je manque un peu de pratique en C++ (seulement un projet réalisé) mais les méthodes de travail que j'utilise en java me permette de garder une bonne conception.
Donc à partir de là, j'ai quelques avis sur les liens entre ces langages. À la lecture du livre de Stroustrup sur le C++, notamment les chapitres consacrées à la conception, on comprend bien le but de ce langage et plus généralement de la POO. Il ya derrière tout ca un souhait de gain de temps dans la programmation, de facilité et de réutilisabilité. En celà je dirais que oui, Java en est bien la continuité.
Java remplace-t'il pour autant le C++ ? Je ne pense pas. Sur toutes les directions prises par Stroustrup et les autres concepteurs du langage C++, Java en a privilégié certaines: notamment la facilité et l'utilisation d'outils standards. Le garbage collector ajoute plus de facilité, les composants awt et swing permettent de créer des GUI standards, les Threads et les Sockets sont aussi proposés en standard. Java a fait le pari d'introduire d'autres notions: la portabilité de l'application même, au dela du code-source, ce qui a amené à la création du byte-code, et une facilité d'utilisation des réseaux.
Les directions prises par Java le distingue donc bien du C++. Ce dernier a lui d'autres buts qu'il conserves et qui lui sont propres: compatibilité avec des modules C, gestion de la mémoire dynamique par l'utilisateur, langage compilé. Ces deux langages ont donc un socle commun: facilité et rapidité d'écriture du code, composants standards riches, POO, mais différent énormément sur d'autres domaines. Le problème pour un développeur et de savoir quel langage utilisé pour quel projet, leurs avantages étant souvent complémentaires.
Quant au C et au C++, c'est encore plus complexe. Le C++ étant construit à partir du C, il en conserve les principales propriétés. De plus il reste compatible, dans une certaine mesure, avec du code C. Donc il semble utile, au premier abord, de connaître le C, et notamment la gestion de la mémoire avant de faire du C++. C'est evidemment sans compter les principes de conception nécessaires au développement C++. Le C étant un langage sobre, dépourvue de toute fonctionnalité superflue et de la notion d'objet, il appartient au programmeur d'inventer des méthodes permettant de simuler ces fonctionnalités. Cette pratique, appelée un peu à tort du bidouillage, est justement ce qui a conduit à l'élaboration du C++, qui permet d'éviter celà. Donc pour passer du C au C++ il faut surtout s'impregner d'une nouvelle philosophie, les détails techniques viennent ensuite facilement une fois qu'on a compris le pourquoi du comment. Comme le dit Bjarne Stroustrup, il faut éviter de faire du C++ avec un style C. J'ai entendu une fois un porgrammeur dire à propos d'un autre:
Il dit qu'il fait du C++ ... mon oeil ! Il met #include<algorithm> au début de ses sources, et le reste c'est du C: pas une class et que des méthodes globales
Dans l'idéal, je dirais que pour apprendre le C++, il faudrait connaître le C ET le Java. Comme ca, on a les notions d'objet et d'allocation mémoire. Mon parcours original (Java-> C++->C) m'a créé quelques difficultés: j'aurais appris le C++ en dernier si j'avais su. En tout cas, aprés avoir bien maitrisé le Java, un peu de rigueur et de travail ont suffit pour comprendre rapidement le C, même le particularités les plus complexes. On ne voit plus les choses de la même facon aprés, et on félicite les concepteurs de Java pour leur travail: y'a pas à dire, les String de Sun et les std::string de C++, c'est beaucoup plus élégant que les char *
Aujourd'hui, j'utilise en majorité le C pour mes projets personnels (j'ai vite apprécié de gérer ma mémoire seul comme un grand), mais ce mois-ci, j'ai du développer une application dans le cadre d'un stage, et je n'ai pas hésité une seconde: Java ! Du coup j'ai une belle interface, l'application est portable, je n'ai pas eu à (re)programmer pleins de modules, et grâce aux exceptions, les séances de test et de débogages sont vraiment facilitées.
A bon entendeur, et en m'excusant pour la taille de ce post ...
Partager