Je pense que par « bonne pratique », nous entendons deux choses différentes.
Puisque l'on parle des pointeurs :
- Par « bonne pratique », il me semble que tu entends « précautions d'usage », comme dans « en C, il est préconisé, lors d'une allocation avec malloc(), de tester si le pointeur est bien assigné, d'écrire l'utilisation dans un bloc if, et d'assigner le pointeur à NULL après l'appel de free() ». C'est effectivement le genre de choses qu'on peut oublier à cause de la fatigue, de l'inattention, d'une flemmingite, …
- Par « bonne pratique », j'entends « style de codage et outils modernes ». Utiliser shared_ptr à la place des pointeurs bruts, c'est juste un truc à savoir, qui ne nécessite pas une attention de tous les instants.
J'entends par "bonne pratique" des préconisations, que ce soit du style d'écriture, de l'implémentation de pattern ou de l'utilisation de structures/classes (d'ailleurs toutes ces choses me semblent indissociables).
C'est différent d'une "obligation", qui ne laisse pas d'autre possibilité pour le développeur que de suivre la règle.
Mais bon, on s'éloigne un peu de la question initiale. Pour moi, je ne suis pas prêt à reprogrammer en 100% C/C++ une application que j'ai fait en Java/JNI ou C#/Pinvoke.
Moi non plus.
En C++/CLI, par contre, ça reste à voir.
A toi de faire le choix d'apprendre le C++ d'aujourd'hui dès que tu te sens
Et personnellement, je cherche généralement l'exactitude dans mes propos, pas toi ?
Pour une grande partie du C oui. C'est un des choix qui fait que des gens font du "C/C++". Mais ils ont pu migrer des projets C vers du C++ grâce à ça, enfin y'a pleins de raisons, la majorité étant historiques.
Non. Personnellement, j'ai bossé dans le nucléaire cet été, on avait une bibliothèque C qui récupérait des infos sur un serveur concernant un tokamak. Le truc bien dégueulasse, avec 2 niveaux d'indirection pour les paramètres etc. Elle a été faite il y a des années. On a écrit une plateforme autour de ça (cf ma signature). Le seul endroit sensible de mon code, c'était les appels à ces fonctions C. Tout le reste était fait autour de Boost et Qt. Je n'ai pas 15 ans d'expérience derrière moi hein, j'ai 20 ans. Pourtant les seuls segfaults que j'ai eus étaient dûs à cette fameuse bibliothèque C. Je ne suis pas un génie non plus, donc ça doit être que c'est accessible à tout le monde. Bon la plateforme ne faisait p-ê pas 200 000 lignes, on va plutôt parler d'environ 100 000 LoC.
Avec le C++ "moderne", toutes les bêtises que j'entends sur le "C/C++" n'ont aucun sens. On est dans le multi-paradigme, on fait que du haut niveau, sauf qu'on a par exemple à causer un peu à une lib C... Ah tiens, comme avec Java et .NET ?
Dommage pour toi. Et par pitié, pas toi, n'écris pas "C/C++"
Comme dit précédemment, ce n'est pas le C++ (langage) qui t'assure la sécurité dans ton application. C'est l'utilisation des frameworks Boost et Qt, qui ne sont absolument pas OBLIGATOIRES en C++.
On en revient a créer un "sur-langage" au dessus du C++ standard officiel. Un sur-langage plus sécurisé, plus propre, ... car il impose l'utilisation des frameworks Boost et Qt qui, eux, sont spécialisés (et donc restrictifs).
Posons la question autrement : "Souhaiteriez-vous reprogrammer en C++/STL/Xlib après des années d'utilisation de C++/Boost/Qt ?"Avec le C++ "moderne", toutes les bêtises que j'entends sur le "C/C++" n'ont aucun sens. On est dans le multi-paradigme, on fait que du haut niveau, sauf qu'on a par exemple à causer un peu à une lib C... Ah tiens, comme avec Java et .NET ?
1. C'est pas moi qui ai écrit le Topic de ce thread.Dommage pour toi. Et par pitié, pas toi, n'écris pas "C/C++"
2. C'est pas moi qui ai ajouté la méthode "c_str()" dans std::string
Je déplore tout autant que toi l'amalgame de ces deux langages, mais c'est une réalité. D'ailleurs j'espère toujours une version de C++ qui rompe la compatibilité avec le C... Mais je pense que c'est un voeu pieux, et que seul la création d'un nouveau langage (Vala ?) pourra le réaliser.
C/C++ n'existe pas, mais C∩C++ existe, par contre: Mais dans tous les cas, quand on programme en C∩C++, on suit des paradigmes C, donc question sécurité du code ce n'est pas top.
Ah non. Le langage C++ en lui-même tel que décrit dans la norme, est très bien. C'est l'utilisation que plus de 50% des gens en font qui est déplorable, à cause du côté historique qui le rapproche du C. Mais je ne me vois pas une seconde réaliser un projet en C si j'ai le choix de le faire en C++. Ce sont deux langages TOTALEMENT différents pour moi. C++ est plus proche de Java que de C, définitivement. Et il ne s'agit pas seulement de Boost et de Qt, mais de tout un écosystème qui a compris que C et C++ étaient totalement différents, à part pour le côté historique. Après, il est vrai que le comité de normalisation a voulu garder la compatibilité C dans une certaine mesure, mais bon. Comme je dis, après, c'est à un programmeur C++ de voir s'il veut faire de la m.... ou s'il veut apprendre le vrai C++. Et ça à part écrire des articles, FAQs, etc, je ne vois pas comment faire d'autre pour les aider.
Ah non la STL est bieng hein Boost "l'étend" simplement. Beaucoup, certes
Et Xlib c'est du C
Mais sinon, je vois ce que tu voulais dire. Et ma réponse est non. Mais ce qui m'énerve, c'est que C++ == le premier que tu mentionnes, i.e le "C/C++" ou "C inter C++" ((c) Medinoc), pour beaucoup de gens. Alors qu'en fait C++ aujourd'hui c'est vraiment le second.
Quel coup bas, bah bravo, c'est joli ça tiens
A qui le dis-tu... Mais bon déjà avec C++0x on aura de quoi se faire plaisir, et ça ne ressemblera vraiment plus à du C
Certes, utiliser une VM/librairie ne met pas à l'abri des bugs... surtout ceux de la VM/librairie.
NB: la méthode String.getBytes() de java renvoie une référence sur un tableau (byte[]) et pas un pointeur sur un zone mémoire. En ce sens, cela reste cohérent avec le reste du langage Java.
« En tant que développeur, envisageriez-vous de faire un petit voyage dans le passé, disons dans les années 1980, pour retrouver les langages de programmation d'avant ? »
La question peu ouvrir un grand débat, personnellement j'ai commencer par du c et de l'assembleur, puis du c++ (déjà haut niveau par rapport a l'assembleur a l'époque) pour finir sur du java plus par nécessité professionnelle que par gout. Récemment j'ai eu l'idée étrange de recoder un projet de solveur de sudoku (écrit en c et en java) en assembleur 16 bit.
Ca fait un choque de remettre les mains dedans !
Cela m’a pris un temps considérable pour un gain de perf processeur ridicule voir négatif (par contre ca tien en quelques octets - moins de 100 !)
Je me suis rendu compte du chemin, mais je dois dire que sur le projet j’ai pris mon pied. Après pour du multithreading ou du socket, je passerai sur du C sans problèmes mais serait certainement un peu plus long qu’en java, pour moi du moins.
Enfin pour avoir un peu de rentabilité et structurer le développement en équipes, l’objet a des bon cotés. Le Java aussi avec le JNI pour garder la forme en C. Chacun ses gouts!
J'ai passé 2 ans en studio de développement en C++ avant de partir bosser en .NET et C# depuis 5 mois. Je n'ai aucune envie de repartir dans mes problématiques C++ et j'apprécie le temps laissé par .Net pour mieux penser le fonctionement du software et prévoir à l'avance les cas à problème. Ne pas avoir à gérer un tas de choses permet de bien libérer l'esprit, le debugging est moins une torture.
bon moi j'étais un cas extrême, environnement C++ sous Emacs avec 6 plateformes différentes dont Windows et AIX 5.3. Pas de complétion auto, pas de recherche avancée, parfois obligé de débugger en remote avec gdb, à la très ancienne.
De quel(s) compilateur(s) disposais-tu ?
Ça, c'est faux. C++ n'a pas de vue d'ensemble, c'est un C patché et repatché tant et si bien que dans la pratique ça n'a plus rien à voir avec C.
Il y a de très nombreuses fonction dans le C++ qui interagissent très mal entre elles. Par exemple, si l'on veux faire du calcul vectoriel grâce à la surcharge des opérateurs.
Qu'est ce que tu vas utiliser comme retour ?
Ou bien tu le fais par valeur, mais dans ce cas tu pourris tes perfs en faisant des copies dans tous les sens. Ou bien tu retournes un smart pointer mais c'est le même combat (et en plus, c'est pas vraiment le langage mais une surcouche). Ou bien tu retournes une référence et ta gagné la fuite de mémoire (tu n'as acun moyen de l'esquiver).
La seule façon de t'en sortir, c'est les expressions templates. Mais la encore, les templates ne C++ sont super mal foutues et la plupart du temps interagissent mieux avec d'autres éléments du langage.
Et alors que dire des gros gags du type Move Contructor ou autres classes de traits improbable servant retrouver les types en metaprogrammation (alors que le compilo sait parfaitement quel est le type, puisqu'il crie au scandale quand ce n'est aps le bon).
En tant que programmeur C++ moderne, tu devrait regarder un peu ce qu'Alexandrescu dis à ce popros si les miens ne te semblent pas convaincants.
Tout le problème du C++, c'est qu'on est par défaut bas niveau et on s'élève grâce aux outils fournis par le langage (mais surtout car on en a besoin). Cette approche est en place, non pas parce qu'elle est pertinente, mais parce qu'elle permet la compatibilité avec C.
Une approche inverse est nettement plus pertinent : on est haut niveau, et on peut descendre bas niveau si besoin est.
Autant je reconnais des qualité au C++ que n'ont pas ses confrère C# et Java, autant en déduire que C++ est bien foutu, c'est réellement excessif.
Alexandrescu ( que alp connait j'en suis sur), est à l'origine justement des traits dont tu parles et d'un framework sur la move semantic hein.En tant que programmeur C++ moderne, tu devrait regarder un peu ce qu'Alexandrescu dis à ce popros si les miens ne te semblent pas convaincants.
Les derniers écrits d'alexandrescu critiquant quelque chose était sur les iterator je te laisse me montrer ce qu'il dit sur le Gag de la move semantic comme tu dis .
Ah oui, moi aussi je sais lancer des phrases qui n'ont aucun fondement, sans argument ! Genre : "toutes les poules sur la planète terre sont vertes !". Pas mal celle-là non ? Argumente et ensuite on verra
Et ? Quel est le soucis ? Perso, j'ai déjà écrit de plusieurs façon des libs persos pour le calcul vectoriel, et plus généralement pour l'algèbre linéaire et l'analyse, j'ai pas eu de soucis. Ca m'intéresse, donc détaille !
Ou alors, t'utilises des trucs bien pensés, genre NT2 (nt2.sf.net), uBlas, MTL, Blitz++, et j'en passe. Je doute que tu puisse faire mieux.
Les expression templates c'est LA façon ultime et efficace, c'est tout. Et les templates sont au pire un peu tricky desfois, mais c'est à toi de voir si tu veux utiliser leur puissance ou alors avoir une philosophie du genre "je me contente du strict minimum", le genre de philosophie qui mène loin dans la vie. Comme toute chose, l'apprentissage des templates, c'est un investissement, et celui-là il rapporte gros, donc à toi de voir.
Et même sans ça, tu peux t'en sortir très bien, avec de la move semantic, ou par valeur avec des RVO/NRVO, etc... Y'a pas mal de billets sur cpp-next.com sur tout ça
Ca ne sert pas à retrouver des types, ça sert à faire des calculs sur les types. C'est le principe de la métaprogrammation. Je te conseille de regarder par exemple Haskell/OCaml/Coq/autres qui vont assez loin dans ce sens aussi. Je te rappelle que les templates sont turing-complete, via le moteur de templates des compilos. Les templates SONT EQUIVALENTS à une machine de turing ! Ou au lambda-calcul, ... C'est pas juste un truc pour écrire une fonction min générique. Ca c'est juste une quantification universelle sur le type d'une fonction.
Le C++ a des défauts, je le sais, je les connais, et je joue avec justement. Après, de là à balancer des choses fausses avec potentiellement des dizaines de milliers de lecteurs qui vont lire tes messages, je refuse.
D'ailleurs, comme le dit Goten, Alexandrescu est à l'origine de quelques tricks, ou au moins a contribué à les populariser, et je doute qu'il ait dit que les classes de traits, de politiques, la métaprogrammation etc, et encore moins la move semantic, soient de la masturbation intellectuelle, etc. Il travaille justement sur des choses de ce genre dans D.
C'est l'approche qu'on expose depuis le début de ce débat avec Florian Goo, Goten & autres. Je ne vois pas pourquoi tu dis ça du coup
Je donne peu de valeurs aux messages absolument pas argumentés (à l'inverse de ceux de pseudocode par exemple). Argumente ! Et chaque langage est ce qu'il est, c'est difficile de dire lequel est bien foutu. Je trouve Haskell bien foutu, d'autres non par exemple.
Si tu te mets à argumenter, on aura enfin un débat constructif et intéressant pour les visiteurs.
C'est justement ce pourquoi son propos est intéressant. Alexandrescu est l'un des plus grands spécialistes du C++, et son avis est le même que le miens (ou alors serait-ce l'inverse ?).
Le fait qu'on ai justement besoin de passer par ces artifices montrent que la langage est mal foutu à la base et ne fournis pas outils nécessaires à la programmation.
Alp > Prend du recul par rapport à ce que tu racontes.
Oui, C++, c'est du C auquel on à ajouté plein de trucs au fur et à mesure. On a ajouté tellement de truc que ça n'a plus grand chose à voir avec le C finalement, mais on a tout construit sur le C. Ce n'est pas un fait que j'avance comme ça au hazard, c'est juste des faits, facilement vérifiables qui plus est.
Pour le reste, je pourrais répondre point par point. mais ce ne serait pas intéressant car tu n'a rien comprit au propos. Tu connais tout plein de lib en C++ pour faire les choses que tu souhaites, comme uBlast pour l'exemple que j'ai donné. C'est bien. Mais ça prouve une chose : LA façon ultime et efficace pratiquement personne n'est capable de la mettre en place, et c'est d'un complexité incroyable de le faire (je sais, je l'ai fait) car la façon dont les templates sont implémentées en C++ n'a aucune vue d'ensemble.
Le problème majeur dans l'implémentation d'un telle solution et de retrouver les types de retour des opérateurs. C++ ne fournis aucune solution à ce problème, ce que font pourtant tous les autres langages que tu as cité (OCaml, Haskell, etc . . .). Effectivement, eux vont loin dans ce sens mais C++, quedal ! Pire, ce n'est pas simplement compliqué, c'est non standard. Alors oui, C++0x fournis des solution, mais il est ou ce C++0x ?
Parce 0x, ça voulait bien dire 0x avec x l'année de sortie du machin. Va falloir s'activer la, parce qu'il ne reste plus qu'un mois pour sortir un compilo.
Pour le reste, je n'ai parlé de masturbation intellectuelle nulle part (pas plus que Alexandrescu ne l'a fait) juste de complexité inutile, et de choses mal terminées dans le C++ actuel. D'ailleurs regarde un peu ce qu'il a pu proposer dans D et compare les solutions en C++.
Tiens par exemple (mais il n'y a que ça des exemple on peut en trouver à la pelle) aucun des types standard n'est utilisable pour faire une appli portable en C++. Un int, c'est jamais la même chose. Du coup, faut encore une fois passer par des libs pour faire le typage d'une appli portable.
Le C++ est un langage construit sur des bases moisies, mais des gens nous ont pondeus des libs pour le rendre utilisable. les bases moisies du C++, c'est le C.
Allez deux trois exemples, l'équivalent en C++ va être amusant :
http://www.digitalmars.com/d/2.0/lazy-evaluation.html
http://www.digitalmars.com/d/2.0/mixin.html
http://www.digitalmars.com/d/2.0/var...templates.html
EDIT: Et aussi faudrait voir le temps de compilation xD . Ça prend des lustres en C++, et cela est du principalement à sa grammaire souvent ambiguë.
Et c'est là que je te comprends pas... Tu te contredis toi même, d'un côté tu dis que c'est moisi parce qu'on a pas telle ou telle feature et d'un autre tu sors une bibliothèque antichambre du standard (boost) qui vient palié à ce manques, voir le standard lui même avec le prochain draft? Au final que manque-t-il au C++ puisque c'est possible hein?
Attention je dis pas que tout est blanc hein, juste que puisque ça existe alors pourquoi chercher midi à quatorze heures?
Quand à la médiocrité des templates : je serais intéressé que tu me montres un langages qui exprime mieux la généricité.
C'est comme les design patterns, ils sont là pour combler les manques des langages. Si encore boost et consor n'existait pas, ça pourrait être valable de dire que oui il y'a de gros manques, mais c'est pas le cas.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager