Подтвердить что ты не робот

Понимание иерархии типов C11

Я хотел бы полностью понять иерархию типов языка C11 и представить ее графически (идеальная древовидная диаграмма). Стандарт не дает какой-либо цифры для этой проблемы - есть 30 пунктов, описывающих отдельные типы и отношения между ними. Я бы хотел его нарисовать.

Моя попытка началась с получения проекта ИСО/МЭК 9899: 201x проекта N1570 и извлечения всех основных заявлений из раздела 6.2.5 документ. Затем я начал переставлять знания в форме дерева. Позвольте мне представить свою работу в два этапа.

Шаг 1: точки 1-15

Извлеченные знания (точка в разделе 6.2.5 + заданное производство):

  • 1 тип = типы объектов + типы функций;
  • 4 стандартных знаковых целочисленных типа = signed char, short int, int, long int, long long int;
  • 4 знаковых целочисленных типа = стандартные знаковые целые типы + расширенные типы целочисленных подписей;
  • 6 стандартных беззнаковых целочисленных типов = _Bool, unsigned char, unsigned short int, unsigned int, unsigned long int, unsigned long long int;
  • 6 беззнаковых целочисленных типов = стандартные беззнаковые целые типы + расширенные целые типы без знака;
  • 7 стандартных целочисленных типов = стандартные знаковые целые типы + стандартные беззнаковые целочисленные типы;
  • 7 расширенных целочисленных типов = расширенные целые типы со знаком + расширенные целые типы без знака;
  • 10 реальных плавающих типов = float, double, long double;
  • 11 сложных типов = float _Complex, double _Complex, long double _Complex;
  • 12 плавающих типов = реальные плавающие типы + сложные типы;
  • 14 основных типов = char + целые числа со знаком + целые типы без знака + плавающие типы;
  • 15 типов символов = char, signed char, unsigned char.

И получившаяся структура:

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

Шаг 2: точки 16-24

Остальные утверждения:

  • 16 перечисленных типов;
  • 17 целых типов = char + целые числа со знаком + беззнаковые целые типы + перечисляемые типы;
  • 17 реальных типов = целые типы + реальные плавающие типы;
  • 18 арифметических типов = целые типы + плавающие типы;
  • 20 производных типов = типы массивов, типы структуры, типы объединения, типы функций, типы указателей, атомные типы;
  • 21 скалярные типы = арифметические типы + типы указателей;
  • 21 агрегированные типы = типы массивов + типы структуры;
  • 24 производных типов декларатора = типы массивов + типы функций + типы указателей.

И окончательная структура системы типа 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

Теперь мне нужно уменьшить структуру (в идеале до одного дерева) или найти более сложный способ представления отношений. Я хотел бы выйти с хорошим черным списком для системы набора текста C11. Любые идеи?

4b9b3361

Ответ 1

Захламленная структура типов C11, возникающая в результате второго этапа вопроса, может быть упрощена путем удаления/уменьшения менее важных узлов и делегирования некоторой избыточной/вспомогательной информации, которая будет представлена ​​другими средствами.

Я предлагаю следующий пятиступенчатый алгоритм для этого:

  • Удаление всех расширенных целых типов (подразумевается строго соответствующая реализация);
  • Уменьшение стандартных целых типов (поскольку они больше не разделяют типы);
  • Группировка структуры:
    • Скалярные типы против совокупных типов пары поддеревьев (представлены как дерево),
    • Базовые типы и производные типы пара поддеревьев (представлены цветными областями),
    • реальные типы и производные типы деклараторов (представленные в виде поглаженных субрегионов),
    • типы символов (представлены с различным цветом текста);
  • Применение нестандартного производства: типы объектов = скалярные типы + совокупные типы;
  • Дополнение типов объектов отсутствующих типов соединений и типов атомов.

Итоговая сводка системы типа C11 выглядит следующим образом:

Иерархия типов C11

Для повышения удобочитаемости дерева вводятся серые штрихи/области.

Сводка типа не включает понятие "полнота декларации типа", потому что это состояние, наблюдаемое в определенной точке внутри единицы перевода. Во время выполнения все объекты и функции являются экземплярами полного типа. Тип void является исключением, но как не-тип (или любой тип в случае указателя), он намеренно исключается из диаграммы.

const, volatile, restrict и _Atomic являются классификаторами типов, которые, в отличие от спецификаторов типов для производных типов, не могут быть рекурсивно применены. Любая комбинация из них может предусматривать любое определение типа (если это имеет смысл). Таким образом, включение их в диаграмму затруднит его, не внося никакой подходящей информации. Явное исключение создает конструкцию _Atomic (type), которая учитывается как спецификатор типа для атомного типа - один из производных типов, перечисленных в стандарте C11.