language c types standards language-lawyer c11

c - language - iso 9899



Comprender la jerarquía de tipos C11 (1)

La estructura desordenada de los tipos C11 resultante del segundo paso de la pregunta puede simplificarse mediante la eliminación / reducción de nodos menos importantes y la delegación de alguna información redundante / secundaria que se presentará por otros medios.

Propongo el siguiente algoritmo de cinco pasos para eso:

  1. Eliminación de todos los tipos de entero extendido (se supone que la implementación es estrictamente conforme);
  2. Reducción de los tipos enteros estándar (ya que no hacen más tipos de particiones);
  3. Agrupando la estructura:
    1. Tipos escalares vs tipos agregados de par de subárboles (representados como un árbol),
    2. Tipos básicos vs pares de tipos derivados de subárboles (representados por regiones de color),
    3. tipos reales y tipos de declaradores derivados (representados como sub-regiones con trazos de estos),
    4. tipos de caracteres (representados con diferentes colores de texto);
  4. Aplicación de una producción fuera de norma: tipos de objetos = tipos escalares + tipos agregados ;
  5. Complementando los tipos de objeto de tipos de unión faltantes y tipos atómicos .

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

Los trazos / áreas grises se introducen para aumentar la legibilidad del árbol.

El resumen de tipo no incluye el concepto de "integridad de 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 de void es una excepción pero, como no-type (o any-type en caso de un puntero), se excluye intencionalmente del diagrama.

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

Me gustaría comprender 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 problema: hay 30 puntos que describen los tipos individuales y las relaciones entre ellos. Me gustaría dibujarlo.

Mi intento comenzó con la obtención del Borrador N1570 del Comité ISO / IEC 9899: 201x y la extracción de todas las declaraciones esenciales de la sección 6.2.5 del documento. Entonces, comencé 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 funciones ;
  • 4 tipos de entero con signo estándar = signed char , short int , int , long int long long int , long int long long int ;
  • 4 tipos de entero con signo = tipos de entero con signo estándar + tipos de entero con signo extendido ;
  • 6 tipos de 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 ampliados ;
  • 7 tipos enteros estándar = tipos enteros con signo estándar + tipos enteros sin signo estándar;
  • 7 tipos enteros extendidos = tipos enteros con signo extendido + tipos enteros sin signo ampliados;
  • 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 tipos derivados = tipos de matriz , tipos de estructura , tipos de unión , tipos de función , tipos de puntero , tipos atómicos ;
  • 21 tipos escalares = tipos aritméticos + tipos de punteros;
  • 21 tipos agregados = tipos de matriz + tipos de estructura;
  • 24 tipos de declaradores derivados = tipos de matriz + tipos de funciones + tipos de punteros.

Y la estructura final del sistema 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 necesito reducir la estructura (idealmente a un solo árbol) o encontrar una forma más complicada de representar las relaciones. Me gustaría sacar una buena hoja de cheet para el sistema de escritura C11. ¿Algunas ideas?