Pourquoi les tableaux de longueur variable ont-ils été rendus facultatifs en C 2011?

12

Lorsque les VLA ont été introduits en C 1999, je pensais que c'était une grande innovation pour le langage. Cependant, après avoir appris qu'elle a été rendue facultative en C 2011, je me demande ce qui a conduit à son changement de statut, et si cela signifie que la fonctionnalité est en fait dirigée vers l'obsolescence. Dans l'affirmative, existe-t-il une notion équivalente de gestion automatique des données de taille dynamique qui est envisagée pour les remplacer?

J'ai essayé de trouver le document de justification C 2011, mais il ne semble pas encore être publié.

jxh
la source
Manque d'adoption?
Ryan Reich
@RyanReich: Probablement, mais pourquoi la résistance des vendeurs?
jxh

Réponses:

8

J'ai entendu des légendes variant de "cela devrait être facultatif car certains petits compilateurs devraient pouvoir être conformes C11 sans VLA" à "c'était une erreur en premier lieu". Je n'ai cependant jamais eu de réponse vraie et définitive à cela. En fin de compte, je ne crois pas que quiconque en ait vraiment un car la raison (en supposant - et en espérant - qu'il y en ait un) n'a jamais été divulguée (pour autant que mes anciennes recherches soient allées).


Extrait du chapitre 4 (page 13) de la justification de la Norme internationale - Langages de programmation - C 5.10 (2003)

En définissant des implémentations conformes en termes de programmes qu'ils acceptent, la norme laisse la porte ouverte à une large classe d'extensions dans le cadre d'une implémentation conforme. En définissant des implémentations hébergées conformes et autonomes conformes, la norme reconnaît l'utilisation de C pour écrire des programmes tels que des systèmes d'exploitation et des applications basées sur la ROM, ainsi que des applications hébergées plus conventionnelles. Au-delà de ce schéma à deux niveaux, aucun sous-ensemble supplémentaire n'est défini pour C, car le Comité C89 est convaincu que trop de niveaux diluent l'efficacité d'une norme .

Je souligne. Notez que cette décision va à l'encontre de leur propre justification. Pourtant, une autre chose est devenue facultative. Maintenant, vous obtenez __STDC_NO_VLA__soit le support VLA. C'est une décision très étrange.

Bernardo Sulzbach
la source
@jxh Je n'ai même pas vu ça. Merci de l'avoir signalé, il a été remplacé par un libellé plus clair et moins ambigu. J'ai vu le motif comme synonyme de motif et de but dans certains contextes, mais je crois qu'il n'est courant que dans les scénarios artistiques.
Bernardo Sulzbach
Le problème de n'avoir qu'un schéma à deux niveaux est qu'il existe de nombreuses fonctionnalités et garanties utiles qui sont largement mais pas universellement prises en charge, et qui peuvent permettre à certains types de programmes d'être écrits beaucoup plus efficacement qu'il ne serait possible autrement. L'absence de tout moyen standard de tester la disponibilité de ces fonctionnalités oblige une fraction importante sinon une majorité de programmes pratiques dans de nombreux domaines à utiliser des garanties allant au-delà de celles incluses dans la norme, et rend difficile de déterminer avec certitude si un particulier ...
supercat
... le programme fonctionnera avec n'importe quelle mise en œuvre particulière. La définition d'une plus grande variété de fonctionnalités optionnelles et de garanties que les implémentations peuvent prendre en charge ou refuser (en rejetant la compilation) permettrait d'avoir un moyen simple et facile de tester si un programme qui spécifie correctement ses exigences fonctionnera correctement sur une plate-forme: essayez pour le construire. S'il construit, cela fonctionnera. Sinon, ce ne sera évidemment pas le cas. Augmenter la fraction des programmes pour lesquels il serait possible de garantir qu'une construction réussie garantirait un fonctionnement réussi ...
supercat
... semblerait bien plus utile que de simplement maximiser le nombre de compilateurs capables de gérer la petite fraction des programmes qui ne bénéficieraient pas de fonctionnalités et de garanties au-delà de ce que la norme exige.
supercat
4

D'après ce que je peux déterminer à partir des documents du comité public (en particulier N1395 ), l'une des principales raisons pour lesquelles les VLA (avec l'arithmétique et le threading complexes) étaient facultatifs était de permettre de créer des compilateurs C conformes pour les petits processeurs intégrés.

La tendance était que les éditeurs de compilateurs qui ciblent les systèmes embarqués restaient sur la norme C90, en raison de l'introduction de ces grandes fonctionnalités que leurs clients ne demandaient pas.

Bart van Ingen Schenau
la source
Dans de nombreux cas, "demandaient à être exclus". Une fois que vous avez examiné le changement d'encombrement de la RAM lorsque vous activez ces fonctionnalités, il devient évident que certaines personnes n'en veulent pas. Il peut doubler le coût du processeur, qui peut être la partie la plus chère du système.
ღ uі
1
@JerryCoffin: Oui, mais le code n'est généré que lorsque sizeof () est réellement utilisé sur le tableau. Le compilateur doit suivre les informations afin de générer le code correct, mais ces informations n'ont pas besoin d'être intégrées dans la représentation en mémoire du VLA.
jxh
2
@jxh: Comme prévu à l'origine, les implémentations autonomes et hébergées utilisaient le même langage principal. Les différences se limitaient à la bibliothèque. Dans le cas des VLA, il y a une différence dans le langage lui-même qui (au moins pour certains fournisseurs) ne convenait pas vraiment aux petits systèmes embarqués. En ce qui concerne l'intégration de la taille: non, ce n'est probablement jamais absolument nécessaire, mais peut être le moyen le plus simple (par exemple, quelques octets de stockage pour la taille peuvent éviter de nombreux octets de code pour le calculer).
Jerry Coffin
1
@supercat: Je peux voir la logique de la fonctionnalité de sélection de la bibliothèque C, mais rendre les fonctionnalités du langage "facultatives" semble décidément inutile pour quelqu'un qui essaie d'écrire du code C multiplateforme. Il sert à être que C était le choix évident pour près de systèmes métalliques de programmation qui pourraient facilement être réorientées à un autre compilateur et différent plate - forme matérielle. Maintenant, ce n'est pas si évident.
jxh
1
@supercat: bombarder la pile n'est pas unique à VLA. Les objets automatiques anormalement grands ou une pile d'appels de fonction non restreinte auront des problèmes similaires. Si la norme définit un moyen de détecter l'échec pour ces cas, cela fonctionnera probablement aussi pour VLA. En termes de facultatif, il est juste plus difficile d'argumenter pour l'utilisation de nouvelles fonctionnalités C dans le nouveau code C dans de nouveaux projets qui doivent fonctionner sur plusieurs plates-formes à l'aide de compilateurs de plusieurs fournisseurs.
jxh