121 votes

Pourquoi limiter artificiellement votre code au C ?

Cette question fait suite à une réponse que j'ai donnée à une personne de l'Union européenne. question actuelle qui pose la question d'une bibliothèque générique pour le C - l'auteur de la question précise qu'il ne veut pas utiliser le C++. La question que je lui pose, ainsi qu'aux autres personnes qui insistent pour utiliser le C, est la suivante : pourquoi le font-ils alors qu'ils le font ?

  • C++ fournit les caractéristiques spécifiques qu'ils demandent
  • Leur compilateur C est presque certainement en réalité un compilateur C++, ce qui n'a aucune incidence sur le coût du logiciel.
  • Le C++ est tout aussi portable que le C
  • Le code C++ peut être aussi efficace que le C (ou plus, ou moins).

Veuillez noter : Je n'ai pas l'intention d'argumenter - je suis sincèrement intéressé par les motivations du choix de la langue.

Edit : Il a été suggéré qu'il s'agissait d'un doublon, mais je ne le pense pas. Pour clarifier, je m'intéresse aux raisons pour lesquelles les gens se limitent au sous-ensemble C. Par exemple, l'auteur du message auquel j'ai fait référence aurait pu conserver tout son ancien code C et se contenter d'utiliser les conteneurs génériques C++ comme "meilleurs tableaux" - je m'intéresse à la raison pour laquelle les gens sont si réfractaires à cette idée. Je ne suis pas intéressé par les raisons pour lesquelles vous devriez ou ne devriez pas apprendre le C ou le C++.

Le message de Peter Kirkham était pour moi le plus instructif, en particulier en ce qui concerne les questions relatives à la C99 que je n'avais pas prises en compte, et je l'ai donc accepté. Merci à tous les autres participants.

34voto

Anders Hansson Points 2362

Il y a des tas d'arguments sur la programmation embarquée, les performances et autres, je ne les crois pas. Le C++ est facilement comparable au C dans ces domaines. Cependant :

Récemment, après avoir programmé en C++ pendant plus de 15 ans, j'ai redécouvert mes racines en C. Je dois dire que, même si le C++ présente de bonnes caractéristiques qui facilitent la vie, il y a aussi beaucoup de pièges et une sorte de "il y a toujours une meilleure façon de faire les choses". Vous n'êtes jamais vraiment satisfait de la solution que vous avez trouvée. (Ne vous méprenez pas, cela peut être une bonne chose, mais la plupart du temps non).

C++ vous permet de tirer à l'infini. Ce qui pourrait être une bonne chose, mais d'une manière ou d'une autre, vous finissez toujours par en utiliser trop. Cela signifie que vous déguisez vos solutions avec de "belles" et "agréables" couches d'abstractions, de généralité, etc.

Ce que j'ai découvert en revenant au C, c'est que c'était vraiment amusant de programmer à nouveau. Après avoir passé tant de temps à modéliser et à réfléchir à la meilleure façon d'utiliser l'héritage, je trouve que la programmation en C rend mon code source plus petit et plus lisible. Cela dépend bien sûr de votre niveau d'autodiscipline. Mais il est très facile de mettre trop d'abstractions sur du code direct, ce qui n'est jamais vraiment nécessaire.

27voto

x4u Points 7436

Le C a l'avantage principal de vous permettre de voir ce qui se passe réellement lorsque vous regardez un morceau de code (oui, le préprocesseur : compilez avec -E et vous le verrez). Quelque chose qui est bien trop souvent faux lorsque vous regardez du code C++. Il y a des constructeurs et des destructeurs qui sont appelés implicitement en fonction de la portée ou à cause des affectations, il y a la surcharge des opérateurs qui peut avoir un comportement surprenant même si elle n'est pas mal utilisée. J'admets que je suis un maniaque du contrôle, mais je suis arrivé à la conclusion que ce n'est pas une si mauvaise habitude pour un développeur de logiciels qui veut écrire des logiciels fiables. Je veux juste avoir une chance équitable de dire que mon logiciel fait exactement ce qu'il est censé faire et ne pas avoir une mauvaise sensation dans l'estomac en même temps parce que je sais qu'il pourrait encore y avoir tellement de bogues dans ce logiciel que je ne remarquerais même pas en regardant le code qui les cause.

Le C++ dispose également de modèles. Je les déteste et les aime, mais si quelqu'un dit qu'il ou elle les comprend parfaitement, je le traite de menteur ! Cela inclut les auteurs de compilateurs ainsi que les personnes impliquées dans la définition de la norme (ce qui devient évident lorsque vous essayez de la lire). Il y a tellement de cas particuliers absurdement trompeurs qu'il n'est tout simplement pas possible de les prendre tous en compte lorsque vous écrivez du code. J'aime les templates C++ pour leur puissance pure. C'est vraiment incroyable ce que l'on peut faire avec eux, mais ils peuvent également conduire aux erreurs les plus étranges et les plus difficiles à trouver que l'on peut (ne pas) imaginer. Et ces erreurs se produisent réellement, et même rarement. La lecture des règles impliquées dans la résolution des templates dans l'ARM C++ me fait presque exploser la tête. Et cela me donne le sentiment désagréable d'avoir perdu du temps à lire des messages d'erreur du compilateur qui font plusieurs milliers de caractères et pour lesquels il me faut déjà 10 minutes ou plus pour comprendre ce que le compilateur attend réellement de moi. Dans le code C++ typique (bibliothèque), on trouve aussi souvent beaucoup de code dans les fichiers d'en-tête pour rendre certains templates possibles, ce qui rend les cycles de compilation/exécution douloureusement lents, même sur des machines rapides, et nécessite la recompilation de grandes parties du code lorsque l'on y change quelque chose.

Le C++ dispose également de la trappe const. Soit vous évitez les constantes pour tous les cas d'utilisation, sauf les plus triviaux, soit vous devrez tôt ou tard les rejeter ou remanier de grandes parties du code de base lorsqu'il évolue, en particulier lorsque vous êtes sur le point de développer une conception OO agréable et flexible.

Le C++ possède un typage plus fort que le C, ce qui est formidable, mais j'ai parfois l'impression de nourrir un Tamagotchi lorsque j'essaie de compiler du code C++. Une grande partie des avertissements et des erreurs que je reçois habituellement ne sont pas vraiment dus au fait que je fais quelque chose qui ne fonctionnerait pas, mais simplement à des choses que le compilateur n'aime pas que je fasse de telle ou telle façon sans faire de casting ou sans mettre quelques mots-clés supplémentaires ici et là.

Ce ne sont là que quelques-unes des raisons pour lesquelles je n'aime pas le C++ pour les logiciels que j'écris seul en utilisant uniquement des bibliothèques externes prétendument robustes. La véritable horreur commence lorsque vous écrivez du code en équipe avec d'autres personnes. Qu'il s'agisse de hackers C++ très intelligents ou de débutants naïfs n'a pratiquement aucune importance. Tout le monde fait des erreurs, mais le C++ rend délibérément difficile de les trouver et encore plus difficile de les repérer avant qu'elles ne se produisent.

Avec le C++, vous êtes tout simplement perdu sans l'utilisation permanente d'un débogueur, mais j'aime pouvoir vérifier l'exactitude de mon code dans ma tête et ne pas avoir à compter sur un débogueur pour découvrir que mon code s'exécute sur des chemins que je n'aurais jamais prévus. En fait, j'essaie d'exécuter tout mon code dans ma tête et de prendre toutes les branches qu'il a, même dans les sous-routines, etc. et de n'utiliser un débogueur qu'occasionnellement, juste pour voir à quel point il fonctionne bien dans tous les endroits confortables que j'ai préparés pour lui. Il est tout simplement impossible d'écrire et d'exécuter un si grand nombre de cas de test où tous les chemins de code ont été utilisés dans toutes les combinaisons avec toutes sortes de données d'entrée étranges. Vous ne connaissez peut-être pas les bogues des programmes C++, mais cela ne veut pas dire qu'ils n'existent pas. Plus un projet C++ est important, moins je suis sûr qu'il ne comportera pas de nombreux bogues non détectés, même s'il fonctionne parfaitement avec toutes les données de test dont nous disposons. Finalement, je le mets à la poubelle et je recommence avec un autre langage ou une combinaison d'autres langages.

Je pourrais continuer, mais je pense que j'ai été clair maintenant. Tout cela m'a donné l'impression d'être improductif lorsque je programme en C++ et m'a fait perdre confiance dans l'exactitude de mon propre code, ce qui signifie que je ne l'utiliserai plus, alors que j'utilise toujours du code C que j'ai écrit il y a plus de 20 ans. Peut-être est-ce simplement parce que je ne suis pas un bon programmeur C++, ou peut-être que le fait d'être assez bon en C et dans d'autres langages me permet de reconnaître à quel point je suis nul en ce qui concerne le C++, et que je ne serai jamais capable de le comprendre complètement.

La vie est courte...

24voto

bstpierre Points 12616

Dans un environnement embarqué de bas niveau, certains des "ingénieurs logiciels" ont une formation en EE et maîtrisent à peine le C. Le C++ est plus complexe et certains d'entre eux ont tout simplement peur d'apprendre un nouveau langage. Le C est donc utilisé comme le plus petit dénominateur commun. (Avant que vous ne suggériez de vous débarrasser de ces types, sachez qu'ils sont au moins aussi importants que les majors CS qui ne comprennent pas les trucs analogiques hardcore).

Parlant d'expérience pour avoir hérité et maintenu les deux : une conception horrible en C est difficile à comprendre, à dérouler et à remanier en quelque chose d'utilisable.

Une conception horrible en C++ est infiniment pire car des couches d'abstraction aléatoires font que votre cerveau se promène dans la base de code en essayant de déterminer quel code sera exécuté dans quelle circonstance.

Si je dois travailler avec des ingénieurs dont je sais qu'ils ne produiront pas d'excellentes conceptions, je préfère de loin les premiers aux seconds.

22voto

Suma Points 11966

Je ne vois aucune raison autre qu'une aversion personnelle, même pour la programmation de systèmes embarqués et autres choses similaires. En C++, vous ne payez des frais généraux que pour les fonctionnalités que vous utilisez. Vous pouvez utiliser le sous-ensemble C du C++ dans certaines situations spécifiques où les frais généraux du C++ sont trop élevés pour vous. Ceci dit, je pense que certains programmeurs C surestiment la surcharge de certaines constructions C++. Laissez-moi vous donner quelques exemples :

  • Les classes et les fonctions membres n'ont pas de surcharge par rapport aux fonctions normales (sauf si vous utilisez des fonctions virtuelles, auquel cas il n'y a pas de surcharge par rapport à l'utilisation de pointeurs de fonctions).
  • Les modèles ont très peu de frais généraux (le plus souvent aucun frais général).

Une raison valable serait que vous programmez pour une plate-forme qui ne dispose pas d'un compilateur C++ décent (pas de compilateur C++ du tout, ou un compilateur existe, mais il est mal implémenté et impose une surcharge inutile pour certaines fonctionnalités C++).

15voto

SPWorley Points 5439

Pourquoi limiter la prise de parole en anglais ? Vous seriez peut-être un auteur plus créatif en serbe.

C'est le même argument, avec des failles évidentes. Si vous avez une tâche à accomplir et que vos outils confortables permettent de la résoudre efficacement, vous utiliserez probablement vos outils confortables pour une bonne raison.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X