34 votes

Comprendre la hiérarchie des types C11

J'aimerais comprendre parfaitement la hiérarchie des types du langage C11 et la présenter graphiquement (un diagramme en arbre serait parfait). La norme ne fournit aucune figure à ce sujet - il y a 30 points décrivant les types individuels et les relations entre eux. J'aimerais la dessiner.

Ma tentative a commencé par l'obtention du ISO/IEC 9899:201x Projet de comité N1570 et en extrayant 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 de la section 6.2.5 + production spécifiée) :

  • 1 types \= types d'objets + types de fonctions ;
  • 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 d'entiers non signés standard \= _Bool , unsigned char , unsigned short int , unsigned int , unsigned long int , unsigned long long int ;
  • 6 Types d'entiers non signés \= types d'entiers non signés standard + Types d'entiers non signés étendus ;
  • 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 signés étendus + types d'entiers non signés étendus ;
  • 10 types réels flottants \= float , double , long double ;
  • 11 types complexes \= float _Complex , double _Complex , long double _Complex ;
  • 12 types flottants \= types réels flottants + types complexes ;
  • 14 types de base \= char + types d'entiers signés + types d'entiers non signés + types flottants ;
  • 15 types de caractères \= char , signed char , unsigned char .

Et la structure qui en résulte :

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 autres déclarations :

  • 16 types énumérés ;
  • 17 types de nombres entiers \= char + types entiers signés + types entiers non signés + types énumérés ;
  • 17 véritables types \= types entiers + types réels flottants ;
  • 18 types arithmétiques \= types entiers + types flottants ;
  • 20 types dérivés \= types de réseaux , types de structures , types de syndicats , types de fonctions , Types de pointeurs , types atomiques ;
  • 21 types scalaires \= types arithmétiques + types pointeurs ;
  • 21 types d'agrégats \= types de tableaux + types de structures ;
  • 24 types de déclarateurs dérivés \= types de tableaux + types de fonctions + types de pointeurs.

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 une façon plus délicate de représenter les relations. J'aimerais arriver à une belle feuille de chèques pour le système de typage C11. Des idées ?

16voto

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 qui seront présentées par d'autres moyens.

Je propose pour cela l'algorithme suivant en cinq étapes :

  1. Suppression de tous les étendu types d'entiers (implémentation strictement conforme supposée) ;
  2. Réduction de la standard les types entiers (car ils ne partitionnent plus les types) ;
  3. Regroupement de la structure :
    1. A types scalaires vs types d'agrégats paire de sous-arbres (représentée sous forme d'arbre),
    2. A types de base vs types dérivés paire de sous-arbres (représentés par des régions colorées),
    3. véritables types y types de déclarateurs dérivés (représentées comme des sous-régions de celles-ci),
    4. types de caractères (représenté avec une couleur de texte différente) ;
  4. Application d'une production hors normes : types d'objets \= types scalaires + types d'agrégats ;
  5. Compléter le types d'objets de manque types de syndicats y types atomiques .

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

  C11 type hierarchy

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 la déclaration de type", car il s'agit d'un état, observé à un moment particulier dans le cadre d'une unité de traduction . Au moment de l'exécution, tous les objets et toutes les fonctions sont des instances d'un système de gestion de l'information. type complet . El void est une exception mais, en tant que no-type (ou any-type dans le cas d'un pointeur), il est intentionnellement exclu du diagramme.

El const , volatile , restrict y _Atomic sont qualificatifs de type qui, contrairement à spécificateurs de type pour le types dérivés ne peut être appliqué de manière récursive. Toute combinaison de ces éléments peut précéder n'importe quelle définition de type (pour autant qu'elle ait un sens). Ainsi, les inclure dans le diagramme le compliquerait, tout en n'introduisant aucune information appropriée. L'exception apparente est le _Atomic (type) construction, qui est prise en compte comme étant une spécificateur de type pour le type atomique - l'un des types dérivés énumérés dans la norme C11.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X