Descripción de la jerarquía de tipos C11


Me gustaría entender completamente la jerarquía de tipos del lenguaje C11 y presentarla gráficamente (un diagrama de árbol sería perfecto). La norma no proporciona ninguna cifra para este tema – hay 30 puntos que describen los tipos individuales y las relaciones entre ellos. Me gustaría dibujarlo.

Mi intento comenzó obteniendo el Borrador del Comité ISO/IEC 9899:201x N1570 y extrayendo todas las declaraciones esenciales de la sección 6.2.5 del documento. Entonces, empecé a reorganizar el conocimiento en forma de árbol. Permítanme presentar mi trabajo en dos pasos.

Paso 1: puntos 1-15

El conocimiento extraído (punto dentro de la sección 6.2.5 + producción especificada):

  • 1 tipos = tipos de objetos + tipos de función ;
  • 4 estándar firmado tipos enteros = signed char, short int, int, long int, long long int;
  • 4 tipos enteros firmados = tipos enteros estándar firmados + extendido firmado tipos enteros ;
  • 6 tipos enteros sin signo estándar = _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int;
  • 6 tipos enteros sin signo = tipos enteros sin signo estándar + tipos enteros sin signo extendidos ;
  • 7 tipos enteros estándar = tipos enteros con signo estándar + tipos enteros sin signo estándar;
  • 7 extended integer types = extended signed integer types + extended unsigned integer tipos;
  • 10 tipos flotantes reales = float, double, long double;
  • 11 tipos complejos = float _Complex, double _Complex, long double _Complex;
  • 12 tipos flotantes = tipos flotantes reales + tipos complejos;
  • 14 tipos básicos = char + tipos enteros con signo + tipos enteros sin signo+tipos flotantes;
  • 15 tipos de caracteres = char, signed char, unsigned char.

Y la estructura resultante:

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

Paso 2: puntos 16–24

Las declaraciones restantes:

  • 16 tipos enumerados;
  • 17 tipos enteros = char + tipos enteros con signo + tipos enteros sin signo+tipos enumerados;
  • 17 tipos reales = tipos enteros + tipos flotantes reales;
  • 18 tipos aritméticos = tipos enteros + tipos flotantes;
  • 20 derivados de tipos de = tipos de matriz, tipos de estructura, tipos de unión, tipos de función, los tipos de puntero, tipos atómicos;
  • 21 tipos escalares = tipos aritméticos + tipos de puntero;
  • 21 tipos agregados = tipos de matriz + tipos de estructura;
  • 24 tipos de declarador derivados = tipos de matriz + tipos de función + tipos de puntero.

Y la estructura final del sistema de tipo 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

Ahora tengo que reducir la estructura (idealmente a un solo árbol) o encontrar una más difícil el modo de representar las relaciones. Me gustaría salir con un buen cheet-sheet para el sistema de escritura C11. Alguna idea?

Author: Krzysztof Abramowicz, 2013-12-08

1 answers

La estructura desordenada de los tipos C11 resultante del segundo paso de la pregunta se puede simplificar mediante la eliminación/reducción de nodos menos importantes y la delegación de alguna información redundante/subsidiaria para ser presentada por otros medios.

Propongo el siguiente algoritmo de cinco pasos para eso:

  1. Removal of all extended integer types (strictly conforming implementation assumed);
  2. Reducción de los tipos enteros estándar (como lo hacen ya no hay tipos de partición);
  3. Agrupando la estructura:
    1. A tipos escalares vs tipos agregados par de subárboles (representados como un árbol),
    2. A tipos básicos vs tipos derivados par de subárboles (representados por regiones coloreadas),
    3. tipos reales y tipos declaradores derivados (representados como subregiones trilladas de estos),
    4. tipos de caracteres (representados con diferentes color del texto);
  4. Aplicación de un estándar de producción: tipos de objeto = tipos escalares + tipos de agregado;
  5. Que complementa los tipos de objeto de los tipos de unión que faltany de los tipos atómicos.

El resumen del sistema de tipo C11 resultante se ve de la siguiente manera:

Jerarquía de tipos C11

Se introducen los trazos/áreas grises para aumentar la legibilidad del árbol.

El tipo el resumen no incluye el concepto de" integridad de la declaración de tipo " porque es un estado, observado en un punto particular dentro de una unidad de traducción . En tiempo de ejecución, todos los objetos y funciones son instancias de un tipo completo . El tipo void es una excepción pero, como no-type (o cualquier-type en el caso de un puntero), se excluye intencionalmente del diagrama.

El const, volatile, restrict y _Atomic son calificadores de tipo que, al contrario de tipo los especificadores para los tipos derivados , no se pueden aplicar recursivamente. Cualquier combinación de estos puede anteponer cualquier definición de tipo (siempre y cuando tenga sentido). Por lo tanto, incluirlos en el diagrama lo complicaría, sin introducir ninguna información adecuada. La excepción aparente hace la construcción _Atomic (type), que se toma en cuenta como un especificador de tipo para el tipo atómico – uno de los tipos derivados enumerados en el estándar C11.

 16
Author: Krzysztof Abramowicz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-06 16:02:33