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.
Réponses:
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.
la source
long long
sont également agréables à avoir.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.
la source
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
bool
ou_Bool
comme un exemple simple lors de l' importation des fonctions d'un dylib et seulement comprendre, par exemple,int
.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.
la source