Zrozumienie hierarchii typu C11

Chciałbym w pełni zrozumieć hierarchię typów języka C11 i przedstawić ją graficznie(idealny byłby diagram drzewa). Norma nie podaje żadnej liczby dla tego zagadnienia – jest 30 punktów opisujących poszczególne typy i relacje między nimi. Chciałbym go narysować.

Moja próba rozpoczęła się od uzyskania projektu Komitetu ISO/IEC 9899:201x N1570 i wyciągnięcia wszystkich istotnych oświadczeń z sekcji 6.2.5 dokumentu. Potem zacząłem przearanżować wiedzę w formie drzewa. Pozwólcie, że przedstawię moją pracę w dwóch krokach.

Krok 1: punkty 1-15

Wydobyta wiedza (punkt w sekcji 6.2.5 + określona produkcja):

  • 1 rodzaje = typy obiektów + typy funkcji ;
  • 4 standardowe podpisane typy całkowite = signed char, short int, int, long int, long long int;
  • 4 signed integer types = standard signed integer types + extended signed typy całkowite ;
  • 6 standardowe typy liczb całkowitych niepodpisanych = _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int;
  • 6 unsigned integer types = standardowe typy unsigned integer + rozszerzone typy unsigned integer;
  • 7 standard integer types = standard signed integer types + standard unsigned integer types;
  • 7 extended integer types = extended signed integer types + extended unsigned integer typy;
  • 10 prawdziwe typy pływające = float, double, long double;
  • 11 typy złożone = float _Complex, double _Complex, long double _Complex;
  • 12 typy zmiennoprzecinkowe = prawdziwe typy zmiennoprzecinkowe + typy złożone;
  • 14 podstawowe typy = char + signed integer types + unsigned integer types+floating types;
  • 15 typy znaków = char, signed char, unsigned char.

I otrzymana struktura:

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

Krok 2: punkty 16–24

Pozostałe wypowiedzi:

  • 16 typy wyliczeniowe ;
  • 17 typy całkowite = char + signed integer types + unsigned integer types+enumerated types;
  • 17 typy rzeczywiste = typy całkowite + typy rzeczywiste zmiennoprzecinkowe;
  • 18 typy arytmetyczne = typy całkowite + typy zmiennoprzecinkowe;
  • 20 typy pochodne = typy tablic, typy konstrukcji, typy Unii , typy funkcji, typy wskaźników, typy atomowe ;
  • 21 typy skalarne = typy arytmetyczne + typy wskaźnikowe;
  • 21 typy zbiorcze = typy tablic + typy struktur;
  • 24 pochodne typy deklaratorowe = typy tablicowe + typy funkcji + typy wskaźników.

I ostateczna struktura systemu typu 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

Teraz muszę zredukować strukturę (najlepiej do pojedynczego drzewa) lub znaleźć bardziej skomplikowane sposób na reprezentowanie relacji. Chciałbym mieć ładny arkusz geparda do systemu typowania C11. Jakieś pomysły?

Author: Krzysztof Abramowicz, 2013-12-08

1 answers

Zaśmiecona struktura typów C11 wynikająca z drugiego etapu pytania może być uproszczona poprzez usunięcie/redukcję mniej ważnych węzłów i przekazanie niektórych zbędnych / dodatkowych informacji, które mają być przedstawione w inny sposób.

Proponuję następujący pięciostopniowy algorytm:

  1. usunięcie wszystkich rozszerzonych typów całkowitych (zakłada się ściśle zgodną implementację);
  2. redukcja standardowych typów całkowitych (tak jak już nie typy partycji);
  3. grupowanie struktury:
    1. a typy skalarne vs typy zbiorcze para podrzędnych drzew (reprezentowanych jako drzewo),
    2. a typy podstawowe vs typy pochodne para podrzędnych drzew (reprezentowanych przez kolorowe regiony),
    3. typy rzeczywiste i pochodne typy deklaratoryjne (reprezentowane jako podregiony tych),
    4. typy znaków (reprezentowane różnymi kolor tekstu);
  4. zastosowanie produkcji poza standardem: typy obiektów = typy skalarne + typy agregatów;
  5. uzupełnianie typów obiektów z brakujących typów Unii i typów atomowych.

Podsumowanie systemu typu C11 wygląda następująco:

Hierarchia typu C11

Szary pociągnięcie / obszary są wprowadzane w celu zwiększenia czytelności drzewa.

Typ summary nie zawierają pojęcia "kompletności deklaracji typu", ponieważ jest stanem obserwowanym w określonym punkcie w jednostki translacyjnej . W czasie wykonywania wszystkie obiekty i funkcje są instancjami typu kompletnego. Typ void jest wyjątkiem, ale jako typ no (lub dowolny w przypadku wskaźnika) jest celowo wykluczony z diagramu.

The const, volatile, restrict oraz _Atomickwalifikatorami typu, które w przeciwieństwie do typu specyfiki dla typów pochodnych , nie mogą być stosowane rekurencyjnie. Każda ich kombinacja może poprzedzać dowolną definicję typu (O ile ma to sens). Dlatego włączenie ich do diagramu skomplikowałoby to, nie wprowadzając żadnych odpowiednich informacji. Wyjątek stanowi konstrukcja _Atomic (type), która jest brana pod uwagę jako typ dla typu atomowego – jeden z typów pochodnych wymienionych w standardzie 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/doraprojects.net/template/agent.layouts/content.php on line 54
2016-03-06 16:02:33