Comprendre la hiérarchie de types C11

J’aimerais bien comprendre la hiérarchie des types du langage C11 et la présenter graphiquement (un diagramme en arbre serait parfait). La norme ne fournit aucun chiffre pour ce problème – il existe 30 points décrivant les types individuels et les relations entre eux. Je voudrais le dessiner.

Ma tentative a commencé par obtenir le projet de comité N1570 du comité ISO / IEC 9899: 201x et à extraire toutes les déclarations essentielles de la section 6.2.5 du document. Ensuite, j’ai commencé à réorganiser les connaissances sous la forme d’un arbre. Permettez-moi de présenter mon travail en deux étapes.

Étape 1: points 1 à 15

Les connaissances extraites (point dans la section 6.2.5 + production spécifiée):

  • 1 types = types d’ object + types de fonction ;
  • 4 types d’entiers signés standard = signed char , short int , int , long int , long long int ;
  • 4 types d’entiers signés = types d’entiers signés standard + types d’entiers signés étendus ;
  • 6 types entiers non signés standard = _Bool , caractère unsigned char , unsigned short int , unsigned int , unsigned long int , unsigned long long int ;
  • 6 types entiers non signés = types entiers standard non signés + types entiers étendus non signés ;
  • 7 types d’entiers standard = types d’entiers signés standard + types d’entiers non signés standard;
  • 7 types d’entiers étendus = types d’entiers étendus signés + types d’entiers étendus non signés;
  • 10 types réels flottants = float , double , long double ;
  • 11 types complexes = float _Complex , double _Complex , long double _Complex ;
  • 12 types flottants = vrais types flottants + types complexes;
  • 14 types de base = char + types entiers signés + types entiers non signés + types flottants;
  • 15 types de caractères = char , signed char unsigned char .

Et la structure résultante:

 types object types function types basic types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex standard integer types standard sίgned integer types standard unsίgned integer types extended integer types extended sίgned integer types extended unsίgned integer types character types char, signed char, unsigned char 

Étape 2: points 16 à 24

Les déclarations restantes:

  • 16 types énumérés ;
  • 17 types entiers = char + types entiers signés + types entiers non signés + types énumérés;
  • 17 types réels = types entiers + types réels flottants;
  • 18 types arithmétiques = types entiers + types flottants;
  • 20 types dérivés = types de tableau, types de structure, types d’ union, types de fonction, types de pointeur, types atomiques ;
  • 21 types scalaires = types arithmétiques + types de pointeur;
  • 21 types d’agrégats = types de tableaux + types de structures;
  • 24 types de déclarants dérivés = types de tableau + types de fonction + types de pointeur.

Et la structure finale du système de type C11:

 types object types function types basic types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex standard integer types standard sίgned integer types standard unsίgned integer types extended integer types extended sίgned integer types extended unsίgned integer types character types char, signed char, unsigned char real types integer types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types enumeration types real floating types float, double, long double scalar types arithmetic types integer types char sίgned integer types standard sίgned integer types signed char, short int, int, long int, long long int extended sίgned integer types unsίgned integer types standard unsίgned integer types _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int extended unsίgned integer types enumeration types floating types real floating types float, double, long double complex types float _Complex, double _Complex, long double _Complex pointer types derived types array types structure types unίon types function types pointer types atomic types aggregate types array type structure type derived declarator types array type structure type pointer type 

Maintenant, je dois réduire la structure (idéalement à un seul arbre) ou trouver un moyen plus délicat de représenter les relations. Je voudrais sortir avec une belle feuille de cheet pour le système de dactylographie C11. Des idées?

La structure encombrée des types C11 résultant de la deuxième étape de la question peut être simplifiée en supprimant / réduisant les nœuds moins importants et en déléguant certaines informations redondantes / subsidiaires à présenter par d’autres moyens.

Je propose l’algorithme en cinq étapes suivant:

  1. Suppression de tous les types entiers étendus (implémentation ssortingctement conforme supposée);
  2. Réduction des types entiers standard (car ils ne partitionnent plus les types);
  3. Grouper la structure:
    1. Une paire de sous-arbres de types scalaires et de types d’ agrégats (représentés sous forme d’arborescence),
    2. Une paire de sous-arbres types basiques vs types dérivés (représentés par des régions colorées),
    3. types réels et types de déclarants dérivés (représentés par des sous-régions en traits tronqués de ceux-ci),
    4. types de caractères (représentés avec une couleur de texte différente);
  4. Application d’une production hors normes: types d’object = types scalaires + types d’agrégats ;
  5. Compléter les types d’object des types d’ union et des types atomiques manquants.

Le résumé du système de type C11 résultant se présente comme suit:

Hiérarchie de type C11

Les traits / zones gris sont introduits pour améliorer la lisibilité de l’arbre.

Le résumé de type n’inclut pas le concept de “complétude de déclaration de type” car il s’agit d’un état observé à un moment donné dans une unité de traduction . Au moment de l’exécution, tous les objects et fonctions sont des instances d’un type complet . Le type void est une exception mais, en tant que no-type (ou n’importe quel type dans le cas d’un pointeur), il est intentionnellement exclu du diagramme.

Les _Atomic const , volatile , ressortingct et _Atomic sont des qualificateurs de type qui, contrairement aux spécificateurs de type pour les types dérivés , ne peuvent pas être appliqués de manière récursive. Toute combinaison de ces éléments peut précéder toute définition de type (dans la mesure où cela a du sens). Par conséquent, les inclure dans le diagramme compliquerait la tâche tout en n’introduisant aucune information appropriée. L’exception apparente rend la construction _Atomic (type) , qui est prise en compte en tant que spécificateur de type pour le type atomique – l’un des types dérivés listés dans la norme C11.