Bien que le comité de normes C ++ travaille dur pour définir ses fonctionnalités complexes mais puissantes et maintenir sa compatibilité arriérée avec C, dans mon expérience personnelle, j'ai trouvé de nombreux aspects de la programmation avec le C ++ encombrant à cause de l'absence d'outils. p>
Par exemple, j'ai récemment essayé de refacturer un code C ++, remplaçant de nombreux Shared_Ptr par T & Pour supprimer les usages du pointeur où il n'est pas nécessaire dans une grande bibliothèque. Je devais effectuer presque tout le refactoring manuellement, car aucun des outils de refactorisation ne m'aiderait à le faire en toute sécurité. p>
Faire face aux structures de données STL à l'aide du débogueur, c'est comme élever le numéro de téléphone d'un étranger quand elle n'est pas d'accord. p>
Dans votre expérience, quels outils de développeurs essentiels manquent de C ++? P>
12 Réponses :
Dans votre expérience, quels outils de développeurs essentiels manquent de C ++? P> blockQuote>
Achèvement du code. Sérieusement. Le refactoring est une fonctionnalité agréable à avoir, mais je pense que l'achèvement du code est beaucoup plus fondamental et plus important pour la découvertabilisation de l'API et USABILLYTY. P>
Fondamentalement, des outils nécessitant tout em> le désadience du code C ++ sucer. p>
J'ai trouvé l'achèvement du code pour être assez inutile à moins que je sache exactement ce que je recherche; Une commande APROPOS est beaucoup plus utilisable pour la "découvertabilité"
Personnellement, je trouve que l'achèvement du code a tendance à se mettre en route. Il est préférable de simplement lire la documentation et de connaître la bibliothèque / API bien avant de l'utiliser, au lieu de dépendre de l'EDI pour vous dire ce que vous voulez.
Je conviens que l'achèvement pourrait être mieux fait. I SE Code SE: Blocs et beaucoup de temps, cela fonctionne bien, mais il a tendance à faire du barbecue sur des modèles. La raison est facile à voir - un moteur d'achèvement doit analyser le code C ++ à la volée et le faire pour que des modèles n'est pas ce que vous appelez trivial.
Si vous souhaitez terminer le code de code près de C ++, vous avez ensuite consulté VC ++ 2010. Je l'ai testé sur un exemple qui a étouffé tous les autres moteurs d'achèvement du code C ++ que je connais (un boost polymorphe.lambda), et il a réussi à le gérer parfaitement. J'ai posté le code exemple et les résultats sur mon blog: blogs.msdn.com/pminaev/archive/2009/06/09/...
Je joue récemment avec Kdevelop et son achèvement du code est plutôt bon. J'ai en fait été assez satisfait de cela. L'omnique de Vim est également très très bon.
Visual Assist X ( wholetomato.com ) fait un très bon travail de code C ++ dans vs, je ne peux pas vivre sans ce.
Cela fait également un refactoring comme le renommage, l'extrait de méthode, ... assez bien.
@greyfade: Omnicomplete est complètement brisé sur ma machine. Soin de prendre un coup de poignard sur ma question connexe? Stackoverflow.com/questions/1115876 , je n'ai pas encore trouvé d'outil d'achèvement de code compétent pouvant gérer des modèles (je les utilise beaucoup i>).
Mon outil de rêve serait un débogueur de modèle de compilation. Quelque chose qui me laisserait interactivement passer à travers des instantanations du modèle et examiner les types comme ils sont instanciés, tout comme le débogueur habituel à l'exécution. P>
Une idée très intéressante.
Vous pourriez être intéressé par cela (très vieux et évidemment mort, mais imo Néanmoins intéressant) Article: ACCU. Org / index.php / Journaux / 390 . `: ^>
C'est une pensée très intéressante. Je n'avais jamais envisagé d'avoir besoin d'informations de type lui-même, mais maintenant que vous en parlez une idée fantastique +1
Il semble évident - Modèles de métaprogramming est une langue Turing-Complete après tout, alors pourquoi ne pas être capable de le déboguer comme vous le faites avec d'autres langues? Les affirmations statiques sont fondamentalement l'équivalent TMP du débogage avec Printf, qui n'est guère satisfaisant. Et @pavel, cela signifie-t-il que vous allez l'obtenir dans VC11? ;)
Un indexeur rapide et fiable. La plupart des fonctionnalités de fantaisie viennent après cela. P>
Je suis assez heureux de l'état des outils C ++. La seule chose à laquelle je puisse penser est une installation par défaut de boost dans VS / GCC. p>
7 Go + d'ajout, ceux qui n'utilisent pas Boost vous aimeront. ;RÉ
Ceux qui n'utilisent pas boost sont fous.
Certaines bibliothèques de boost doivent être construites, ce n'est pas tous les modèles ... et lorsque vous le faites et construisez les bibliothèques avec des informations de débogage, vous obtenez environ 1 Go de sortie (dernier j'ai vérifié quand même, qui était il y a plusieurs années).
Si vous construisez tout, avec toutes les variantes (bibliothèque SIMP / MULTI, bibliothèque partagée / statique, etc.) Comme un compilateur devra installer car il ne peut pas prédire la version que vous souhaiterez utiliser, il s'agit d'environ 4 Go pour chaque plate-forme cible . Prenez VC, il devra installer des versions X86 et X64, qui le prennent jusqu'à 7 Go +.
Hunh. 7 Go est grand, mais je l'accepterais toujours. (Bien que je pense que le jeu complet de combinaisons ne devrait être généré que lorsque nécessaire ...).
Une bibliothèque de boost expédition avec votre compilateur pourrait être "pré-compilée" pour supprimer tout support pour d'autres compilateurs.
D'autre part, je suis curieux que vous vivez des outils C ++.
@Amit: J'utilise g ++ ou le CLI vers Visual Studio; J'utilise également un emacs quelque peu personnalisé. Pour le débogage, j'utilise Visual Studio.
Un outil tout seul est propre: Nommer des conventions. P>
Ce n'est pas que nous n'avons pas de conventions de nommage pour C ++, c'est que nous en avons plus d'un. Je ne comprends vraiment pas pourquoi les gens ne sont pas disposés à coller à ceux utilisés par la bibliothèque standard, comme nous le faisons dans toutes les autres langues. Envie d'augmenter au moins cela, mais pourquoi personne d'autre?
Avoir différentes conventions de dénomination vous permet de voir en un coup d'œil quel code est boost / stl-code et quel code est autre chose ... c'est une fonctionnalité: ^)
@Pavel: Ils le font parce qu'il y avait d'autres conventions de nommage en place lorsque le C ++ STD LIB est né. :) code>
génération de code de méthodes de classe. Lorsque je tape dans la déclaration, vous devriez pouvoir comprendre la définition. Et pendant que je suis sur le sujet, pouvons-nous réparer "Déclaration goto / définition goto" allant toujours à la déclaration? P>
refactoring. Oui, je sais que c'est officiellement impossible à cause du pré-processeur - mais le compilateur pourrait toujours faire un meilleur travail de recherche et remplacer sur un nom de variable que possible. Vous pouvez également syntaxe Mettez en surbrillance local, membres et paramateurs pendant que vous vous trouvez. P>
peluche. Donc, la variable que je viens de définir des ombres une plus haut? C aurait dit que en 1979, mais C ++ en 2009 préfère que je puisse savoir moi-même seul. P>
Quelques messages d'erreur décents. Si je promets de ne jamais définir une classe avec le même nom à l'intérieur de la méthode d'une classe - promettez-vous de me parler d'un "}" manquant. En fait, le compilateur peut avoir une certaine connaissance de l'histoire - donc si j'ai ajouté un "{" déséquilibré "ou" ("à un fichier de travail précédemment pourrions-nous envisager de mentionner cela dans le message? P>
Les messages d'erreur STL peuvent-ils s'il vous plaît (désolé de citer un autre commentaire) à ne pas ressembler à vous lire "/ dev / aléatoire", bloqué "! / bin / perl" devant puis dirigé le code de taxe par le biais du résultat? p>
Qu'en est-il des avertissements pour des choses utiles? «Integer utilisé comme avertissement de performance Bool» n'est pas utile, cela ne fait aucune différence de performance, je n'ai pas de choix - c'est ce que la bibliothèque fait, et vous m'avez déjà dit 50 fois.
Mais si je manque un ";" à partir de la fin d'une déclaration de classe ou d'une "}" à partir de la fin d'une définition de la méthode, vous ne me prénomez pas - vous sortez de votre façon de trouver le moyen le moins probable (mais théorique) correct pour analyser le résultat.
C'est comme la vérificatrice orthographique intégrée dans ce navigateur qui m'accepte jadis d'orthographier quelpelling whather (parce que l'orthographe est un terme archaïque pour une chèvre masculine castrée! Combien de fois puis-je écrire sur les herbivores de soprano?) P>
Que diriez-vous de la vérification orthographique? Il y a 40 ans, les compilateurs de Fortran Mainframe avaient une vérification orthographique afin de «écrire» mal orthographiés, vous n'avez pas revenu le lendemain à une pile de cartes et d'un message d'erreur de snotty. Vous avez eu un avertissement que "Wriet" avait été changé pour écrire à la ligne X. Le compilateur continue maintenant et passe à 10 minutes de construction de nombreux fichiers de navigation et de débogueur avant de vous dire que vous avez orthographié il y a 10 000 lignes. P>
ps. Oui, beaucoup de ceux-ci s'appliquent uniquement à Visual C ++. P>
pps. Oui, ils viennent avec mes médicaments maintenant. P>
Essayez COMEAU COMPILER et vous verrez quels messages d'erreur amicaux sont ...
Vous dites au compilateur: traiter le cas habituel spécialement. Le même encore et encore.
refactoring, refactoring, refactoring. Et compilation en tapant. Pour les refacteurs, il me manque au moins la moitié de ce que la plupart des idées de Java modernes peuvent faire. Bien que Visual Assist X va un long chemin, il manque beaucoup de refactoring. La tâche de l'écriture de code C ++ est toujours à peu près que. Écrire C ++ code. Plus l'IDE prend en charge le refactoring de haut niveau, plus il devient de la construction, plus la structure est classique, plus la structure est la plus facile de se déplacer sur la structure et de l'améliorer. Ramassez une version de démonstration d'Intellij et Voir ce qu'il vous manque . Ce ne sont que quelques-uns que je me souvienne d'il y a quelques années. P>
Interface d'extraction: Prise des classes d'affichage avec une interface commune, déplacez les fonctions communes dans une classe d'interface (pour C ++, ce serait une classe de base abstraite) et dérivez les fonctions désignées comme abstraites p> li>
Methy Extract Méthode: Marquez une section du code et faites-vous écrire une fonction qui exécute ce code, construisant les paramètres corrects et les valeurs de retour p> l> l>
connais le type de chacun des symboles que vous utilisez de manière à ce que l'achèvement de la commande non seulement peut être correct pour les valeurs dérivées par ex. Symbole -> ... mais aussi uniquement des fonctions qui renvoient le type qui peut être utilisé dans l'expression actuelle. pour p>
Bouton UIBUTTON = fenêtre -> ... p> li> ul>
au ... Seulement insérez des fonctions qui renvoient réellement un UIBUTTON. P>
Un outil commun pour appliquer les normes de codage.
Prenez toutes les normes communes et vous permettez de les activer / désactiver le cas échéant pour votre projet. P>
Actuellement juste un tas de Scrips Perl Usullay doit aussi supstituer. P>
Le problème principal avec C ++ est qu'il est difficile d'analyser. C'est pourquoi il y a si peu d'outils qui fonctionnent sur le code source. (Et c'est aussi pourquoi nous sommes bloqués avec certains des messages d'erreur les plus horribles de l'histoire des compilateurs.) Le résultat est que, à très peu d'exceptions près (je ne connais que Doxygen et assistance visuelle), c'est au compilateur actuel Pour soutenir tout nécessaire pour nous aider à écrire et à masser le code. Avec des compilateurs étant traditionnellement des outils de ligne de commande plutôt rationalisés, c'est une base très faible pour construire un support d'éditeur riche sur. p>
pendant environ dix ans maintenant, je travaille avec vs. Pendant ce temps, son achèvement de code est presque utilisable. (Oui, je travaille sur Dual Core Machines. Je n'aurais pas dit cela autrement, n'est-ce pas?) Si vous utilisez un assistant visuel, l'achèvement du code est en fait assez bon. Les deux vs elles-mêmes et VA viennent avec un refactoring de base de nos jours. Cela aussi est presque utilisable pour les rares choses qu'elle vise (même s'il est toujours notamment moins que la fin du code). Bien sûr,> 15 ans de refactoring avec la recherche et remplacer étant le seul outil de la boîte, mes demandes sont probablement trop détériorées par rapport à d'autres langues, cela pourrait donc ne pas dire grand chose. p>
Cependant, ce que je manque vraiment, c'est toujours: compilateurs conformes à la conformité complèrent entièrement standard et implémentations de la bibliothèque standard sur toutes les plates-formes mon code est porté à. em> et je dis ceci> 10 ans après la sortie de la libération de la dernière norme et environ un an avant la sortie du prochain! (Ce qui ajoute simplement ceci: c ++ 1x être largement adopté d'ici 2011. em>) p>
Une fois que ceux-ci sont résolus, il y a quelques points qui se traduisent de temps en temps, mais quels fournisseurs se battent toujours avec la conformité à une norme de> 10 ans (ou, comme c'est en réalité le cas avec certaines caractéristiques ayant même donné dessus), ne s'est jamais levé pour s'attaquer à: p>
Si tous ceux-ci et beaucoup d'autres que j'ai oubliés de mentionner (n'hésitez pas à ajouter) sont résolus, il serait agréable de se refactore un soutien qui joue presque dans la même ligue que, par exemple, Java ou C #. Mais seulement alors. p>
Opérateur << () code> nous donne en recourant à appeler l'analyse d'exécution
printf ( ) code> sous la hotte (Dietmar Kühl a déjà décidé de le faire, malheureusement, sa mise en œuvre est morte sans que les techniques deviennent généralisées) li>
Lint Code> inutile (pas besoin de craindre,
LintS CODE> Vendeurs, c'est juste une idée de la réflexion) li>
ul>
Euh, j'ai examiné la mise en œuvre de Stlport et de GNU's LibstDC ++. Aucun de leurs iostreams n'appelle Printf sous le capot.
Vous pouvez faire un: Egrep -r "sn" printf "/ usr / include / stlport code> Si vous le souhaitez, il n'y a que quelques références dans toute la bibliothèque, dont aucune n'est utilisée pour iostreams .
Si vous parlez de Mme Visual Studio C ++, Visual Assist est un outil très pratique pour la complétion de code, certaines Refacteurs - par exemple Renommez toutes les références Toutes les références, la Déclaration de recherche / goto, mais je manque toujours la richesse des Ides Java comme Jbuilder ou Intellij. P>
Ce que je manquais toujours, c'est un outil de diffamantique diffère - vous savez, qui ne compare pas les deux fichiers ligne-ligne, mais des déclarations / expressions. Ce que j'ai trouvé sur Internet ne sont que quelques essais abandonnés - si vous en connaissez un, veuillez écrire en commentaire P>
Achèvement intelligent IntelliSense / Code Même pour le code Heavy-Heavy. P>
Lorsque vous êtes à l'intérieur d'un modèle de fonction, le compilateur ne peut rien dire à coup sûr em> sur le paramètre de modèle (au moins pas sans concepts), mais cela devrait être capable de faire une beaucoup d'hypothèses et d'estimations. Selon la manière dont le type est utilisé dans la fonction, il devrait être en mesure de réduire les types possibles vers le bas, d'une sorte de concepts ad hoc conservateurs. Si une ligne dans la fonction appelle .foo () sur un type de modèle, il est évident que une méthode de membre FOO doit exister et IntelliSense devrait également le suggérer dans le reste de la fonction. P>
Il pourrait même regarder où la fonction est invoquée et l'utiliser pour déterminer au moins un type de paramètre de modèle valide et proposer simplement IntelliSense à l'intérieur de la fonction basée sur cela. P>
Si la fonction est appelée avec un paramètre JavaScript vient de recevoir un soutien Intellisense dans VS, qui devait surmonter beaucoup de problèmes similaires, cela peut donc être fait. Bien sûr, avec le niveau de complexité de C ++, ce serait une quantité de travail ridicule. Mais ce serait une belle fonctionnalité. P> int code> en tant que paramètre de modèle, il est évident que l'utilisation de
int code> doit être valide et que l'IDE pourrait donc l'utiliser comme " Type d'échantillon "à l'intérieur de la fonction et offre des suggestions Intellisense en fonction de cela. P>
Je pense que j'ai lu quelque part qui, en commençant dans l'une des versions suivantes, VS utilisera le compilateur réel pour IntelliSense.
Un compilateur qui essaie d'optimiser le modèle de compilation. P>
plutôt que naïfs comprennent des en-têtes selon les besoins, les analysant à nouveau dans chaque unité de compilation, pourquoi ne pas analyser les en-têtes une fois en premier, construisez des arbres de syntaxe complètes pour eux (ce qui devrait inclure des directives de préprocesseur, car nous ne savions pas encore que Les macros sont définies), puis passez simplement à travers cet arborescence de syntaxe chaque fois que l'en-tête est inclus, appliquer les énigmes connues pour le pruneaux. P>
Il pourrait même être utilisé comme remplacement des en-têtes précompilés, chaque en-tête pouvait donc être précompilé individuellement, juste en déversant cet arborescence de syntaxe sur le disque. Nous n'aurions pas besoin d'un seul en-tête précompilé monolithique et orné d'erreurs et obtiendrait une granularité plus fine sur les reconstitutions, la reconstruction aussi peu que possible, même si un en-tête est modifié. P>
Comme mes autres suggestions, ce serait beaucoup de travail à mettre en œuvre, mais je ne peux voir aucun problème fondamental pour le rendre impossible em>. P>
Il semble que cela puisse accélérer considérablement la compilée, le rendu à peu près il linéaire dans le nombre de fichiers d'en-tête, plutôt que dans le nombre de #includes. P>
D'une certaine manière - mais avec PCH, il est appliqué uniquement à un i> en-tête i>, et vous devez le déclarer explicitement comme tel et sauter à travers beaucoup de cerceaux pour vous assurer que cela fonctionnera correctement. Pourquoi pas analyser chaque i> en-tête inclus individuellement comme ça?
Le livre de programmeurs pragmatiques suggère d'écrire vous-même de tels outils (pour le remplacement de problème) vous-même (si vous ne pouvez pas les trouver) dans une langue de manipulation de texte comme Perl, Python ou avec des outils Shell de commandes.
Je ne sais pas que je voterais pour fermer, mais la question est un peu mal guidée. Les outils de développement n'ont rien à voir avec la langue. Ils sont également totalement différents selon la plate-forme sur laquelle vous travaillez.
@ T.e.d.: Les outils ont beaucoup à voir avec la langue. Ils sont mis en œuvre sur une base par langue, ainsi que la langue le permet. C'est pourquoi C # a un excellent soutien IntelliSense en VS, et C ++ est chanceux si elle peut comprendre une application Hello World 3 lignes. Ou l'exemple de l'OP, C ++ est une douleur à analyser, ce qui signifie que les outils de refactorisation sont ridiculement difficiles à écrire également.