Вопрос по types, language-lawyer, standards, c, c11 – Понимание иерархии типов C11

34

Я хотел бы полностью понять иерархию типов языка 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. Есть идеи?

@KrzysztofAbramowicz, хорошая диаграмма. Как от вашего замечания о_Atomicэто не совсем правильно. Это может выглядеть как два разных значения, которые в дополнение очень близки друг к другу: как спецификатор, и поэтому вы должны перечислить его с другими классификаторами, и как типспецификатор, Чем позже тот с() и только с этим соответствующий тип атома рассматривается как производный тип, как бы странно это ни звучало. Jens Gustedt
Являетсяwchar_t применимо здесь? С11 3.7.3 chux
Основными типами и т. Д. Являются все типы объектов. Похоже, вы не рассматриваете их как подтип типов объектов. У вас также есть несколько типов, появляющихся в нескольких точках на диаграмме. Jonathan Leffler
Уважаемые суперпользователи и модераторы! Вопрос вырос до ужасного размера - слишком долго для этого формата, но он не слишком широк. Я почти готов дать ему ответ - он будет состоять из одной диаграммы и одного абзаца текста и заменит раздел «шаг 3» вопроса. Как результат: 1. вопрос будет намного короче, 2. будет дан ответ. Поэтому, пожалуйста, снова откройте мой вопрос и дайте мне возможность завершить эту тему - по крайней мере 10 человек ждут его. Krzysztof Abramowicz
@KrzysztofAbramowicz, вы упускаете мою точку зрения. Термин «целочисленный тип» встречается впоследствии как таковой, и исключение «стандартного» из «стандартных целочисленных типов», таким образом, противоречит именам двух терминов. Сам по себе термин «целочисленный тип» является очень важным в стандарте, и его концепция здесь еще даже не представлена. Jens Gustedt

Ваш Ответ

1   ответ
16

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

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

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

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

Серый штрих / области введены для повышения читабельности дерева.

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

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

Похожие вопросы