Quand les nouveaux projets C devraient-ils viser des normes C très anciennes (> 20 ans, c'est-à-dire C89)?


12

Parfois, je vois des projets C open source majeurs, relativement nouveaux, ciblant des normes C très anciennes, généralement C89. Un exemple est systemd. Ces projets ont des gens intelligents à la barre, donc ils ont probablement une bonne raison derrière cette décision que je ne connais pas. Cet avantage du doute mis à part, il semble presque que la justification soit "plus ancienne et standardisée est toujours plus portable et meilleure", ce qui est ridicule car la conclusion logique serait que FORTRAN est meilleur que C et COBOL est encore meilleur que FORTRAN.

Quand et pourquoi est-il justifié que les nouveaux projets C visent des normes C très anciennes?

Je ne peux pas imaginer un scénario où le système d'un utilisateur ne doit absolument pas mettre à jour son compilateur C mais est par ailleurs libre d'installer de nouveaux logiciels. La version LTS de Debian, par exemple, a un paquet gcc 4.6 qui prend en charge C99 et une partie de C11. Je suppose que ce scénario étrange doit exister et que des programmes comme systemd ciblent ces utilisateurs.

Le cas d'utilisation le plus raisonnable que je puisse imaginer est celui où les utilisateurs devraient avoir des architectures exotiques sur lesquelles il n'y a qu'un compilateur C89 disponible, mais ils sont tout à fait disposés à installer de nouveaux logiciels. Étant donné le déclin de la diversité des architectures de jeux d'instructions, cela semble être un scénario excessivement hypothétique, mais je ne suis pas sûr.


10
"Je ne peux pas imaginer un scénario où le système d'un utilisateur ne doit absolument pas mettre à jour son compilateur C mais est par ailleurs libre d'installer de nouveaux logiciels." Vous n'avez pas fait assez de travail intégré ;-)
Philip Kendall

2
@PhilipKendall Je n'ai effectué aucun travail intégré. Je vous encourage à m'éclairer avec une réponse!
Praxeolitic

2
Une fois qu'une norme est établie, elle durera pratiquement toujours. Parfois plus de 2000 ans .
Doc Brown

1
@DocBrown Mais notez que cette page explique que l'affirmation selon laquelle il s'agit d'une norme vieille de 2000 ans est fausse.
Jesper

1
Lorsque vous voyez quelque chose comme ça, la première question que vous devez vous poser est: «Quelle (s) plateforme (s) est-il destiné à cibler? )? " Vient ensuite: "Quelle (s) version (s) de C offrent le plus de compatibilité avec les exigences du projet?" Et la suivante serait probablement: "Quelle (s) version (s) de C la majorité des chefs de projet connaissent-ils le mieux?"
Justin Time - Rétablir Monica le

Réponses:


14

... "plus vieux et standardisé est toujours plus portable et meilleur" ce qui est ridicule ...

Cette déclaration est devenue ridicule lorsqu'elle est devenue meilleure , ce qui est complètement subjectif. Vous ne sélectionnez pas de langue et de norme pour un projet car la moitié des personnes lors du dernier meetup que vous avez utilisé l'utilisaient; vous le choisissez parce que vous avez étudié et compris le problème que vous résolvez et déterminé que c'est le bon outil pour le travail.

Pour les normes en général, il y a un argument à faire valoir sur certains projets pour la portabilité, et c'est là que le choix d'un ancien a un certain avantage. Cela est particulièrement vrai lorsque vous développez des bibliothèques en tant que produits, qui sont un moyen pour la fin de quelqu'un d'autre. La dernière chose que vous voulez faire est d'écrire quelque chose que vous ne pouvez pas vendre car cela nécessite un compilateur que les clients que vous n'avez pas encore rencontré peuvent ne pas avoir à disposition. Le commentaire de Philip Kendall sur le monde intégré est tout à fait exact; il y en a beaucoup qui circulent, soit parce que les gens doivent encore écrire du nouveau code pour les anciennes plates-formes stables ou celles qui ne bénéficient pas des fonctionnalités supplémentaires et ne disposent pas d'un compilateur à jour. Lorsque vous maîtrisez parfaitement tous les aspects de votre projet, il

Pour C en particulier, il y a la question de ce que vous obtenez en échange de l'adhésion à la dernière norme. La transition de K & R vers C89 a été un grand changement qui a nécessité beaucoup d'efforts pour nettoyer l'ancien code mais a finalement fait beaucoup de bien. Les changements en C99 et C11sont mineurs en comparaison, et la plupart des rencontres CI récemment développées passeraient toujours C89 car elles n'utilisent pas les nouvelles fonctionnalités. Il est difficile de prétendre que rendre C99 sur C89 serait la bonne chose à faire, car il prend en charge les commentaires sur une ligne, a un type de données booléen natif et peut faire des tableaux de longueur variable. Les commentaires et les booléens ont des solutions de contournement non laides et les VLA peuvent être traités par d'autres moyens, légèrement moins efficaces. C11 a rétrogradé les VLA en option, et cela pourrait être une justification pour choisir l'ancien C99 s'ils figurent en bonne place dans votre implémentation.


3
Eh bien, mélanger des déclarations de variables et des déclarations est assez bon pour la compréhensibilité. Fonctions en ligne, prise en charge unicode limitée et long longsont également agréables à avoir.
Deduplicator

De plus, le multithreading est parfois agréable à avoir ...
Deduplicator

@Deduplicator Je ne suis pas en désaccord avec le fait que ce qui est en C99 et C11 sont des améliorations. Vous pouvez écrire tout le C11 que vous voulez si vous pouvez faire une analyse de rentabilité pour la valeur des gentils-nantis dépassant la valeur de la portabilité vers les environnements plus anciens. Fichier que sous "étudier le problème et trouver le bon outil pour le travail."
Blrfl

2
Eh bien, le fait était que vous n'avez pas mentionné exactement les améliorations importantes .
Déduplicateur

@Deduplicator: J'écrivais du code multi-thread dans les années 1990. Le code qui s'appuie sur des fonctionnalités de thread basées sur le langage peut être inutilisable sur les implémentations autonomes qui ne peuvent pas prendre en charge tout ce dont la norme a besoin, tandis que celles qui utilisent des bibliothèques pour envelopper les fonctions de plate-forme qui prennent en charge les fonctionnalités dont elles ont besoin seront adaptables à toute plate-forme qui prend en charge ces fonctions. .
supercat

10

Lorsque la portabilité sur une large gamme de plates-formes est importante. Cela peut inclure des plates-formes obsolètes et de nombreux processeurs intégrés pour lesquels seul un compilateur minimaliste est disponible.

Il y a aussi un sens dans lequel C89 est le "plus petit dénominateur commun". C'était la première version correctement standardisée, et à peu près n'importe quel compilateur utilisé aujourd'hui peut être supposé implémenter un surensemble de C89.

Il y a aussi le problème que Microsoft Visual C ++, alors qu'il était relativement bon pour suivre les normes C ++, restait longtemps en C89 en mode C. Ainsi, toute personne n'utilisant pas la dernière version de Visual Studio peut être limitée à C89.


Oui, l'argument en faveur est la portabilité, mais la question est de savoir s'il existe réellement des systèmes non hypothétiques qui ne peuvent utiliser qu'un compilateur C89 mais compilent de nouvelles distributions de logiciels. Par exemple, si je commençais un nouveau projet C, comment pourrais-je décider si l'adhésion à C89 pourrait augmenter le nombre d'utilisateurs potentiels? Le point MSVC est bon.
Praxeolitic

1
@Praxeolitic C'est vraiment une question de savoir si vous créez du code qu'une grande variété de personnes différentes utilisera. Parce que beaucoup de gens utiliseront d'anciens compilateurs, soit parce qu'ils ne peuvent pas mettre à niveau, soit parce qu'ils considèrent qu'il y a trop de risques et d'efforts à mettre à niveau.
Simon B

3

Je dois admettre que j'écris toujours du code pseudo-C89 (pas entièrement compatible C99) principalement à cause de Microsoft. Je m'appuie fortement sur MSVC pour le côté Windows et ils ne sont toujours pas entièrement conformes à C99, plaçant plutôt l'essentiel de leur attention sur C ++ 17 et versions ultérieures.

En plus de cela, je travaille sur des SDK C contre lesquels de nombreux développeurs de plugins utilisent MSVC pour leur développement de plugins, et certains encore MSVC 2010. Il existe donc toujours des compilateurs populaires largement utilisés sur des plateformes pas si exotiques (sauf si vous considérez Windows exotiques) qui n'implémentent même pas encore complètement C99. Lorsque vous ciblez une large compatibilité avec la plus grande gamme de compilateurs (ce qui est l'une des principales raisons pour lesquelles le SDK est écrit en C et non en C ++), il y a encore un certain nombre d'entre eux largement utilisés (au moins MSVC) qui sont en retard sur le temps en ce qui concerne le support C. Cela fait presque deux décennies depuis C99 et nous n'avons toujours pas de VLA, par exemple, dans MSVC AFAIK (pas encore vérifié sur MSVC 2017 mais étant donné la position de Microsoft sur C, je doute qu'il soit beaucoup plus conforme à C99) .

Et donc il y a malheureusement encore de nouveaux compilateurs qui sont en fait assez bons avec de bons optimiseurs et débogueurs qui ne sont pas encore entièrement conformes à C99. Bien sûr, sans cela, je sauterais partout en C11.

Outre la compatibilité des sources avec les plugins et MSVC, il existe également une interaction avec d'autres langues. Certaines autres langues utilisent le SDK via un FFI, et certains de ces FFI ne comprennent que C89. Ils pourraient ne pas comprendre boolou _Boolcomme un exemple simple lors de l' importation des fonctions d'un dylib et seulement comprendre, par exemple, int.

Oui, l'argument en faveur est la portabilité, mais la question est de savoir s'il existe réellement des systèmes non hypothétiques qui ne peuvent utiliser qu'un compilateur C89 mais compilent de nouvelles distributions de logiciels. Par exemple, si je commençais un nouveau projet C, comment pourrais-je décider si l'adhésion à C89 pourrait augmenter le nombre d'utilisateurs potentiels?

Je viens de remarquer celui-ci mais en quelque sorte un écho Blrfl, le gain de productivité en utilisant C99 et C11 n'est pas si énorme dans mon cas, tout en perdant la possibilité de permettre aux gens d'écrire leurs plugins dans MSVC pourrait être un coût énorme (surtout depuis le produit sur lequel je travaille) on détient de loin la plus grande part de marché du côté Windows et l'utilisateur moyen achète et télécharge souvent de nombreux plugins tiers). Le type de produit sur lequel je travaille est presque à mi-chemin entre un environnement de développement pour les programmeurs / scripteurs et un produit utilisateur pour les artistes, car beaucoup de gens veulent développer de nouvelles choses en plus pour permettre de nouvelles capacités et obtenir les effets spéciaux d'un les gens gentils n'ont pas encore vu. Donc, dans mon cas, c'était en fait une décision assez simple de favoriser C89 au moins pour le SDK.

Je suppose que vous devez en quelque sorte regarder les compilateurs autour de vous et essayer de comprendre votre groupe démographique cible. Si vous ne développez pas une architecture de plug-in pour Windows, ne faites pas de programmation intégrée ou n'essayez pas de créer un kit de développement logiciel pouvant être utilisé par la plus large gamme de compilateurs et de langages, cela facilite certainement les choses pour C99 +. une façon. Pensez peut-être aussi à la quantité de gains de productivité que vous obtenez à partir du formulaire C99. Je ne profite pas beaucoup de choses comme les VLA, car je compte sur des moyens assez simples pour utiliser la pile lorsque les données sont ajustées et autrement.

Mais il y a beaucoup de choses à la traîne des compilateurs populaires comme MSVC aux FFI dans d'autres langages qui sont cool dans le sens où ils peuvent importer et appeler des fonctions C directement à partir d'un dylib, mais qui pourraient également être un peu en retard sur le fois. Il y a donc beaucoup plus de choses pratiques à considérer, selon votre domaine, que de simplement privilégier les anciennes et les standardisées pour une sorte d'esthétique.

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.