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?
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:
- usunięcie wszystkich rozszerzonych typów całkowitych (zakłada się ściśle zgodną implementację);
- redukcja standardowych typów całkowitych (tak jak już nie typy partycji);
- grupowanie struktury:
- a typy skalarne vs typy zbiorcze para podrzędnych drzew (reprezentowanych jako drzewo),
- a typy podstawowe vs typy pochodne para podrzędnych drzew (reprezentowanych przez kolorowe regiony),
- typy rzeczywiste i pochodne typy deklaratoryjne (reprezentowane jako podregiony tych),
- typy znaków (reprezentowane różnymi kolor tekstu);
- zastosowanie produkcji poza standardem: typy obiektów = typy skalarne + typy agregatów;
- 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:
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 _Atomic
są kwalifikatorami 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.
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