Existe-t-il une distinction significative entre les implémentations autonomes et hébergées?

La question que j’ai est principalement liée à la section quatre, paragraphe six .

Les deux formes de mise en œuvre conforme sont hébergées et autonomes. Une implémentation hébergée conforme doit accepter tout programme ssortingctement conforme.

Si je comprends bien, cela constitue l’environnement d’application type, avec les systèmes de fichiers, la mémoire allouée et les threads …

Une implémentation autonome conforme doit accepter tout programme ssortingctement conforme dans lequel l’utilisation des fonctionnalités spécifiées dans la clause de bibliothèque (clause 7) est limitée au contenu des en-têtes standard , , , , , , , et .

… et il s’agit de l’environnement minimum et / ou intégré, kernel typique, dépourvu de systèmes de fichiers standard, de mémoire allouée ou de threads (entre autres).

Une implémentation conforme peut avoir des extensions (y compris des fonctions de bibliothèque supplémentaires), à condition qu’elles ne modifient pas le comportement d’un programme ssortingctement conforme.

Il semble que cela donne à une implémentation hébergée la liberté de s’appeler elle-même une implémentation hébergée ou autonome, et quand il s’agit de systèmes de fichiers, de mémoire allouée ou de threads (entre autres), ceux-ci peuvent entrer dans la catégorie d’ extension afin qu’elle puisse simplement implémenter une interface qui renvoie une valeur indiquant des erreurs à chaque fois. Juste pour en nommer quelques-uns:

  • fopen , fgets et malloc peuvent renvoyer NULL
  • fscanf , fscanf , fputc et fgetc peuvent renvoyer EOF
  • thrd_create peut retourner thrd_error (indiquant que “la requête n’a pas pu être honorée”)

Cela implique que la distinction que donne la section quatre, paragraphe six, n’a pratiquement aucun sens. Existe-t-il des exigences garantissant un niveau réel de fonctionnalité pour ces fonctions dans les implémentations hébergées et autonomes? Par exemple, faut-il que les fonctions ci-dessus puissent réellement renvoyer autre chose que leurs valeurs de défaillance correspondantes?

Le paragraphe cité le dit déjà très bien.

Un environnement d’exécution hébergé est également autonome, mais pas l’inverse. Un compilateur doit seulement fournir une implémentation autonome. gcc, par exemple, est à proprement parler autonome, car la bibliothèque standard n’est pas incluse. Cependant, il suppose qu’il est disponible lors de la compilation pour un environnement hébergé (par défaut), en supposant que la bibliothèque est disponible sur le système (comme glibc). Voir ici

Autrement dit, l’ autonomie n’est que la langue. Il n’est pas nécessaire de prendre en charge les bibliothèques et quelques en-têtes (principalement pour les types courants et les éléments spécifiques à une implémentation tels que les limites numériques, etc.). Cela implique que la bibliothèque standard n’a pas besoin d’exister – ni les en-têtes correspondants. Reason est un environnement autonome qui n’aura probablement pas d’installations telles que les fichiers, l’affichage, etc. Il est utilisé pour les kernelx, les systèmes incorporés en métal nu, etc.

Notez que par exemple, si vous comstackz pour un environnement hébergé ( -fhosted ), -fhosted supposera que les fonctions utilisées dans la bibliothèque standard ont la signification correspondante et peuvent appliquer des optimisations très agressives (de nombreuses fonctions sont intégrées). En réalité, ce n’est pas le cas, vous pouvez donc utiliser une fonction strcmp par exemple, une sémantique complètement différente. Cependant, il suppose que les fonctions mem …- existent, car elles sont utilisées pour le code normal, par exemple une affectation de structure.

Donc, si vous construisez pour du métal nu, vous devriez toujours passer – sans -ffreestanding .

Si une implémentation hébergée s’appelle autonome , ce n’est évidemment plus une implémentation hébergée . Cependant, une fois qu’il s’appelle hébergé , il doit fournir toutes les installations requirejses par la norme et n’est pas autorisé à implémenter des nuls mais à fournir la sémantique définie dans la norme.

Pour être clair, la section citée permet à un environnement indépendant d’omettre toutes les fonctions de la bibliothèque, à l’exception des quelques en-têtes répertoriés. Vous êtes donc libre de fournir n’importe quelle autre bibliothèque et d’utiliser les mêmes noms, mais faites ce que vous voulez. Comme ce ne serait pas la bibliothèque standard, la conformité n’est pas nécessaire.

5.1.2.1 indique en outre que “toutes les installations de bibliothèque disponibles pour un programme indépendant, autres que l’ensemble minimal requirejs par l’article 4, sont définies par la mise en œuvre.”. Cela corrobore ma déclaration. Note: Il n’exige pas non plus main() comme point d’entrée du programme.

Il existe de nombreux types d’implémentations C, ciblant de nombreux types de plates-formes d’exécution différentes, dont beaucoup peuvent fournir une variété de fonctionnalités utiles et garantir que d’autres ne le peuvent pas. Les auteurs de la norme ont décidé que, dans la plupart des cas, les types de fonctionnalités et de garanties devant être fournis par des implémentations ciblant diverses plates-formes et domaines d’application, ainsi que la manière dont elles devraient être fournies, ne devraient pas obligatoirement être assortis d’une norme. se préoccuper de ces détails. D’autre part, le nombre d’applications nécessitant des éléments tels que les entrées / sorties de fichiers et le nombre de plates-formes pouvant les fournir étaient suffisants pour justifier la reconnaissance “spéciale” des implémentations qui incluaient de telles fonctionnalités.

En règle générale, les implémentations destinées à une utilisation autonome seront utilisables sur des plates-formes incapables de gérer utilement une implémentation hébergée. Alors que la norme impose des exigences allant au-delà de ce qui serait pratique sur certaines des plus petites plates-formes C, certaines implémentations presque conformes de C peuvent être utilisées de manière très utile sur des processeurs ne disposant que de suffisamment de mémoire pour stocker 256 instructions et 16 octets de variables. Si quelque chose comme un gadget numérique de thermomètre / timer de cuisine ne possède pas de système de fichiers ou de console, pourquoi devrait-il gaspiller de la mémoire sur des éléments tels que des descripteurs pour la sortie standard?

En outre, comme la norme ne définit aucun moyen standard permettant aux applications autonomes de réaliser des E / S et que différentes plates-formes gèrent les E / S différemment, les applications quasi autonomes seront ciblées sur une plateforme cible ou sur un nombre de plateformes donné. Une implémentation hébergée qui n’expose ni les fonctionnalités naturelles ni les garanties fournies par la plate-forme sous-jacente pourrait s’avérer utile pour exécuter des programmes ne nécessitant pas de telles fonctionnalités ou garanties. Cependant, il est impossible pour un programme intégré de faire beaucoup de choses sans utiliser des fonctionnalités et des garanties propres à la plate-forme. Par conséquent, une implémentation autonome qui ne permettait pas à un programmeur d’accéder à de telles choses ne pourrait pas faire grand chose. Des implémentations de qualité devraient permettre aux programmeurs d’utiliser toutes les fonctionnalités ou garanties susceptibles de les aider à accomplir ce qu’ils doivent faire, bien que certaines puissent nécessiter l’utilisation d’options de compilation afin de s’assurer qu’ils ne fassent rien de lingue. Pour une raison quelconque, il est devenu à la mode de considérer une décision du Comité des normes selon laquelle il pourrait y avoir des implémentations et des champs d’application dans lesquels la valeur d’une fonctionnalité ou d’une garantie ne justifierait pas le coût, ce qui est une indication que les programmeurs ne devraient pas s’attendre à ce que les implémentations fournir une fonctionnalité ou une garantie qui serait utile dans la programmation de bas niveau et que la plate-forme fournirait comme coût essentiellement nul.