Тип данных
В информатике и компьютерном программировании тип данных (или просто тип ) — это набор или группа значений данных, обычно определяемых набором возможных значений, набором разрешенных операций над этими значениями и/или представлением этих значений. как типы машин. [ 1 ] Спецификация типа данных в программе ограничивает возможные значения, которые может принимать выражение , например переменная или вызов функции. В случае буквальных данных он сообщает компилятору или интерпретатору, как программист намерен использовать данные. Большинство языков программирования поддерживают базовые типы данных: целые числа (разных размеров), числа с плавающей запятой (которые приближаются к действительным числам ), символы и логические значения . [ 2 ] [ 3 ]
Концепция
[ редактировать ]Тип данных может быть указан по многим причинам: для сходства, удобства или для привлечения внимания. Зачастую это вопрос хорошей организации. это помогает понять сложные определения. Почти все языки программирования явно включают понятие типа данных, хотя возможные типы данных часто ограничиваются соображениями простоты, вычислимости или регулярности. Явное объявление типа данных обычно позволяет компилятору выбрать эффективное машинное представление, но не следует сбрасывать со счетов концептуальную организацию, предлагаемую типами данных. [ 4 ]
В разных языках могут использоваться разные типы данных или схожие типы с разной семантикой. Например, в языке программирования Python int
представляет целое число произвольной точности , в котором выполняются традиционные числовые операции, такие как сложение, вычитание и умножение. Однако в языке программирования Java тип int
представляет набор 32-битных целых чисел в диапазоне значений от -2 147 483 648 до 2 147 483 647 с арифметическими операциями, которые переносятся при переполнении . В Rust этот 32-битный целочисленный тип обозначается i32
и паникует при переполнении в режиме отладки. [ 5 ]
Большинство языков программирования также позволяют программисту определять дополнительные типы данных, обычно путем объединения нескольких элементов других типов и определения допустимых операций нового типа данных. Например, программист может создать новый тип данных с именем « комплексное число », который будет включать действительную и мнимую части, или тип данных цвета, представленный тремя байтами, обозначающими количества каждого из красного, зеленого и синего, и строкой, представляющей название цвета.
Типы данных используются в системах типов , которые предлагают различные способы их определения, реализации и использования. В системе типов тип данных представляет собой ограничение, налагаемое на интерпретацию данных, описывающее представление, интерпретацию и структуру значений или объектов, хранящихся в памяти компьютера. Система типов использует информацию о типах данных для проверки правильности компьютерных программ , которые получают доступ к данным или манипулируют ими. Компилятор . может использовать статический тип значения для оптимизации необходимого ему объема памяти и выбора алгоритмов операций над значением Во многих C компиляторах float
тип данных, например, представлен 32 битами в соответствии со спецификацией IEEE для чисел с плавающей запятой одинарной точности . с плавающей запятой Таким образом, они будут использовать микропроцессорные операции над этими значениями (сложение с плавающей запятой, умножение и т. д.).
Большинство типов данных в статистике имеют сопоставимые типы в компьютерном программировании, и наоборот, как показано в следующей таблице:
Статистика | Программирование |
---|---|
действительное значение ( интервальная шкала ) | с плавающей запятой |
действительный ( шкала отношений ) | |
данные подсчета (обычно неотрицательные) | целое число |
двоичные данные | логическое значение |
категориальные данные | перечислимый тип |
случайный вектор | список или массив |
случайная матрица | двумерный массив |
случайное дерево | дерево |
Определение
[ редактировать ]Парнас, Шор и Вайс (1976) выделили пять определений «типа», которые использовались — иногда неявно — в литературе:
- Синтаксический
- Тип — это чисто синтаксическая метка, связанная с переменной при ее объявлении. Хотя такие определения полезны для продвинутых систем типов, таких как системы субструктурных типов , они не дают интуитивного значения типов.
- Представительство
- Тип определяется как композиция более примитивных типов — часто машинных типов.
- Представление и поведение
- Тип определяется как его представление и набор операторов, управляющих этими представлениями.
- Пространство ценности
- Тип — это набор возможных значений, которыми может обладать переменная. Такие определения позволяют говорить о ( непересекающихся ) объединениях или декартовых произведениях типов.
- Пространство ценностей и поведение
- Тип — это набор значений, которыми может обладать переменная, и набор функций , которые можно применять к этим значениям.
Определение в терминах представления часто выполнялось в императивных языках, таких как ALGOL и Pascal , тогда как определение в терминах пространства значений и поведения использовалось в языках более высокого уровня, таких как Simula и CLU . Типы, включая поведение, более тесно связаны с объектно-ориентированными моделями, тогда как модель структурированного программирования, как правило, не включает код и называется старыми добрыми структурами данных .
Классификация
[ редактировать ]Типы данных можно классифицировать по нескольким факторам:
- Примитивные типы данных или встроенные типы данных — это типы, встроенные в реализацию языка. Пользовательские типы данных не являются примитивными типами. Например, числовые типы Java являются примитивными, а классы определяются пользователем.
- Значение атомарного типа — это отдельный элемент данных, который нельзя разбить на составные части. Значение составного типа или агрегатного типа — это коллекция элементов данных, к которым можно обращаться по отдельности. [ 6 ] Например, целое число обычно считается атомарным, хотя оно состоит из последовательности битов, тогда как массив целых чисел, безусловно, является составным.
- Базовые типы данных или фундаментальные типы данных определяются аксиоматически на основе фундаментальных понятий или путем перечисления их элементов. Сгенерированные типы данных или производные типы данных определяются и частично определяются в терминах других типов данных. Все базовые типы являются атомарными. [ 7 ] Например, целые числа — это базовый тип, определенный в математике, а массив целых чисел — это результат применения генератора типа массива к целочисленному типу.
Терминология различается: в литературе примитивный, встроенный, базовый, атомарный и фундаментальный могут использоваться как синонимы. [ 8 ]
Примеры
[ редактировать ]Типы машинных данных
[ редактировать ]Все данные в компьютерах на базе цифровой электроники представлены в виде битов (альтернативы 0 и 1) на самом низком уровне. Наименьшая адресуемая единица данных обычно представляет собой группу битов, называемую байтом (обычно октет , состоящий из 8 бит). Единица, обрабатываемая инструкциями машинного кода , называется словом (по состоянию на 2011 г. [update], [ нужно обновить ] обычно 32 или 64 бита).
Типы машинных данных предоставляют или делают доступными детальный контроль над оборудованием, но это также может раскрыть детали реализации, которые делают код менее переносимым. Следовательно, типы машин в основном используются в системном программировании или языках программирования низкого уровня . В языках более высокого уровня большинство типов данных абстрактны , поскольку не имеют машинного представления, определяемого языком. реализацией . Например, язык программирования C предоставляет такие типы, как логические значения, целые числа, числа с плавающей запятой и т. д., но точные битовые представления этих типов определяются Единственный тип C с точным машинным представлением — это char
тип, представляющий байт. [ 9 ]
Логический тип
[ редактировать ]Тип Boolean представляет значения true и false . Хотя возможны только два значения, они чаще представляются как слово, а не как один бит, поскольку для хранения и извлечения отдельного бита требуется больше машинных инструкций. Многие языки программирования не имеют явного логического типа, вместо этого используют целочисленный тип и интерпретируют (например) 0 как ложь, а другие значения как истину. Логические данные относятся к логической структуре того, как язык интерпретируется машинным языком. В этом случае логическое значение 0 относится к логике False. True всегда ненулевое значение, особенно такое, которое известно как логическая 1.
Числовые типы
[ редактировать ]Почти все языки программирования предоставляют один или несколько целочисленных типов данных. Они могут либо предоставлять небольшое количество предопределенных подтипов, ограниченных определенными диапазонами (например, short
и long
и соответствующие им unsigned
варианты на C/C++); или разрешить пользователям свободно определять поддиапазоны, например 1..12 (например, Pascal / Ada ). Если соответствующий собственный тип не существует на целевой платформе, компилятор разобьет их на код, используя существующие типы. Например, если на 16-битной платформе запрашивается 32-битное целое число, компилятор будет молчаливо рассматривать его как массив из двух 16-битных целых чисел.
Типы данных с плавающей запятой представляют собой определенные дробные значения ( рациональные числа , математически). Хотя они имеют заранее определенные ограничения как на максимальные значения, так и на точность, их иногда ошибочно называют действительными числами (напоминает математические действительные числа ). Обычно они хранятся внутри в виде a × 2 б (где a и b — целые числа), но отображаются в знакомой десятичной форме.
Типы данных с фиксированной точкой удобны для представления денежных значений. Они часто реализуются внутри как целые числа, что приводит к предопределенным ограничениям.
Для независимости от деталей архитектуры используется Bignum или произвольная точность. numeric
тип может быть предоставлен. Это представляет собой целое число или рациональное число с точностью, ограниченной только доступной памятью и вычислительными ресурсами в системе. Реализации Bignum арифметических операций над значениями машинного размера значительно медленнее, чем соответствующие машинные операции. [ 10 ]
Перечисления
[ редактировать ]Перечисляемый тип имеет отдельные значения, которые можно сравнивать и присваивать, но которые не обязательно имеют какое-либо конкретное представление в памяти компьютера; компиляторы и интерпретаторы могут представлять их произвольно. Например, четыре масти в колоде игральных карт могут быть четырьмя перечислителями с именами CLUB , DIAMOND , HEART , SPADE , принадлежащими перечисляемому типу с именем масти . Если переменная V объявлена с типом данныхsuit , ей можно присвоить любое из этих четырех значений. Некоторые реализации позволяют программистам присваивать целочисленные значения значениям перечисления или даже рассматривать их как эквиваленты целых чисел по типу.
Строковые и текстовые типы
[ редактировать ]Строки — это последовательность символов , используемая для хранения слов или простого текста . Чаще всего это языки текстовой разметки, представляющие форматированный текст . Символами могут быть буквы какого-либо алфавита , цифры, пробелы, знаки препинания и т. д. Символы извлекаются из набора символов, например ASCII . Типы символов и строк могут иметь разные подтипы в зависимости от кодировки символов. Было обнаружено, что исходный 7-битный код ASCII ограничен и заменен 8-, 16- и 32-битными наборами, которые могут кодировать широкий спектр нелатинских алфавитов (таких как иврит и китайский ) и другие символы. Строки могут иметь как переменную, так и фиксированную длину, а некоторые языки программирования имеют оба типа. Их также можно разделить на подтипы по максимальному размеру.
Поскольку большинство наборов символов включают цифры , можно использовать числовую строку, например "1234"
. Эти числовые строки обычно считаются отличными от числовых значений, таких как 1234
, хотя некоторые языки автоматически конвертируют между ними.
Типы союзов
[ редактировать ]Определение типа объединения будет указывать, какой из нескольких разрешенных подтипов может храниться в его экземплярах, например «число с плавающей запятой или длинное целое число». В отличие от записи , которая может содержать число с плавающей запятой и целое число, объединение может одновременно содержать только один подтип.
( Теговое объединение также называемое вариантом , вариантной записью, дискриминируемым объединением или непересекающимся объединением) содержит дополнительное поле, указывающее его текущий тип для повышения безопасности типов.
Алгебраические типы данных
[ редактировать ]Алгебраический тип данных (ADT) — это, возможно, рекурсивный тип суммы типов продукта . Значение ADT состоит из тега конструктора вместе с нулем или более значениями полей, при этом количество и тип значений полей фиксируются конструктором. Множество всех возможных значений АТД представляет собой теоретико-множественное непересекающееся объединение (сумму) множеств всех возможных значений его вариантов (произведение полей). Значения алгебраических типов анализируются с помощью сопоставления с образцом, которое идентифицирует конструктор значения и извлекает содержащиеся в нем поля.
Если конструктор только один, то ADT соответствует типу продукта, подобному кортежу или записи. Конструктор без полей соответствует пустому товару (типу единицы измерения). Если все конструкторы не имеют полей, то ADT соответствует перечисляемому типу .
Одним из распространенных ADT является тип опции , определенный в Haskell как data Maybe a = Nothing | Just a
. [ 11 ]
Структуры данных
[ редактировать ]Некоторые типы очень полезны для хранения и извлечения данных и называются структурами данных . Общие структуры данных включают в себя:
- Массив списком также называемый вектором, ( или последовательностью) хранит несколько элементов и обеспечивает произвольный доступ к отдельным элементам. Элементы массива обычно (но не во всех контекстах) должны быть одного типа. Массивы могут быть фиксированной длины или расширяемыми. Индексы в массиве обычно должны быть целыми числами (в противном случае можно подчеркнуть это расслабление, говоря об ассоциативном массиве ) из определенного диапазона (если не все индексы в этом диапазоне соответствуют элементам, это может быть разреженный массив ).
- Запись (также называемая кортежем или структурой) Записи относятся к числу простейших структур данных . Запись — это значение, которое содержит другие значения, обычно в фиксированном количестве и последовательности и обычно индексируемое по именам. Элементы записей обычно называются полями или членами .
- Объект содержит ряд полей данных, как и запись, а также предлагает ряд подпрограмм для доступа к ним или их изменения, называемых методами .
- односвязный список , который можно использовать для реализации очереди и который определен в Haskell как ADT
data List a = Nil | Cons a (List a)
, и - двоичное дерево , которое обеспечивает быстрый поиск и может быть определено в Haskell как ADT
data BTree a = Nil | Node (BTree a) a (BTree a)
[ 12 ]
Абстрактные типы данных
[ редактировать ]Абстрактный тип данных — это тип данных, который не определяет конкретное представление данных. формальная спецификация Вместо этого для его описания используется , основанная на операциях с типом данных. Любая реализация спецификации должна соответствовать данным правилам. Например, в стеке есть операции push/pop, которые следуют правилу «Последним пришел — первым вышел» и могут быть конкретно реализованы с использованием либо списка, либо массива. Абстрактные типы данных используются в формальной семантике и проверке программ , а также, в менее строгом смысле, в проектировании .
Указатели и ссылки
[ редактировать ]Основным несоставным производным типом является указатель , тип данных, значение которого ссылается непосредственно (или «указывает на») на другое значение, хранящееся в другом месте в памяти компьютера, используя его адрес . Это примитивный вид ссылки . (В повседневной жизни номер страницы в книге можно рассматривать как часть данных, которая ссылается на другую страницу). Указатели часто хранятся в формате, аналогичном целочисленному; однако попытка разыменовать или «найти» указатель, значение которого никогда не было допустимым адресом памяти, приведет к сбою программы. Чтобы решить эту потенциальную проблему, указатели считаются отдельным типом данных, на которые они указывают, даже если базовое представление одно и то же.
Типы функций
[ редактировать ]Языки функционального программирования рассматривают функции как отдельный тип данных и позволяют хранить значения этого типа в переменных и передавать их функциям. Некоторые мультипарадигмальные языки, такие как JavaScript, также имеют механизмы обработки функций как данных. [ 13 ] Большинство современных систем типов выходят за рамки простого типа «объект функции» JavaScript и имеют семейство типов функций, различающихся по типам аргументов и возвращаемых значений, например тип Int -> Bool
обозначающие функции, принимающие целое число и возвращающие логическое значение. В C функция не является первоклассным типом данных, но указателями функций программа может манипулировать . Java и C++ изначально не имели значений функций, но они были добавлены в C++11 и Java 8.
Конструкторы типов
[ редактировать ]Конструктор типа создает новые типы из старых, и его можно рассматривать как оператор, принимающий ноль или более типов в качестве аргументов и создающий тип. Типы продуктов, типы функций, мощные типы и типы списков могут быть преобразованы в конструкторы типов.
Количественные типы
[ редактировать ]Универсально-квантифицированные и экзистенциально-квантифицированные типы основаны на логике предикатов . Универсальная количественная оценка записывается как или forall x. f x
и является пересечением всех типов x
тела f x
, т. е. значение имеет тип f x
для каждого x
. Экзистенциальная количественная оценка, записанная как или exists x. f x
и является объединением всех типов x
тела f x
, т. е. значение имеет тип f x
для некоторых x
.
В Haskell обычно используется универсальная квантификация, но экзистенциальные типы должны быть закодированы путем преобразования exists a. f a
к forall r. (forall a. f a -> r) -> r
или аналогичный тип.
Типы уточнений
[ редактировать ]Уточняющий тип — это тип, наделенный предикатом, который предполагается справедливым для любого элемента уточненного типа. Например, тип натуральных чисел больше 5 можно записать как
Зависимые типы
[ редактировать ]Зависимый тип — это тип, определение которого зависит от значения. Двумя распространенными примерами зависимых типов являются зависимые функции и зависимые пары. Тип возвращаемого значения зависимой функции может зависеть от значения (а не только типа) одного из ее аргументов. Зависимая пара может иметь второе значение, тип которого зависит от первого значения.
Типы пересечений
[ редактировать ]Тип пересечения — это тип, содержащий значения, которые являются членами двух указанных типов. Например, в Java класс Boolean
реализует как Serializable
и Comparable
интерфейсы. Поэтому объект типа Boolean
является членом типа Serializable & Comparable
. Рассматривая типы как наборы значений, тип пересечения является теоретико- пересечением множественным и . Также возможно определить зависимый тип пересечения, обозначаемый , где тип может зависеть от термина переменная . [ 14 ]
Мета-типы
[ редактировать ]Некоторые языки программирования представляют информацию о типе в виде данных, что позволяет осуществлять типов самоанализ и отражение . Напротив, более высокого порядка системы типов , хотя и позволяют создавать типы из других типов и передавать их функциям в качестве значений, обычно избегают принятия основе вычислительных решений. на их [ нужна ссылка ]
Типы удобства
[ редактировать ]Для удобства языки высокого уровня и базы данных могут предоставлять готовые типы данных «реального мира», например время, даты и денежные значения (валюта). [ 15 ] [ 16 ] Они могут быть встроены в язык или реализованы как составные типы в библиотеке. [ 17 ]
См. также
[ редактировать ]- Типы данных C
- Словарь данных
- Добрый
- Тип (теория модели)
- Теория типов для математических моделей типов
- Преобразование типов
- ISO/IEC 11404 , Типы данных общего назначения
Ссылки
[ редактировать ]- ^ Парнас, Шор и Вайс 1976 .
- ^ наберите в бесплатном онлайн-словаре по информатике
- ^ Шаффер, Калифорния (2011). Структуры данных и алгоритмический анализ на C++ (3-е изд.). Минеола, Нью-Йорк: Дувр. 1.2. ISBN 978-0-486-48582-9 .
- ^ Скотт, Дана (сентябрь 1976 г.). «Типы данных как решетки». SIAM Journal по вычислительной технике . 5 (3): 540–541. дои : 10.1137/0205037 .
- ^ «Rust RFC — целочисленное переполнение» . Язык программирования Rust. 12 августа 2022 г.
- ^ Дейл, Нелл Б.; Уимс, Чип; Хедингтон, Марк Р. (1998). Программирование на С++ . Джонс и Бартлетт Обучение. п. 349. ИСБН 978-0-7637-0537-4 .
- ^ ИСО/МЭК 11404 , 6.4.
- ^ БХАТНАГАР, СИМА (19 августа 2008 г.). УЧЕБНИК ИНФОРМАТИКИ ДЛЯ XI КЛАССА . PHI Learning Pvt. ООО с. 182. ИСБН 978-81-203-2993-5 .
- ^ «SC22/WG14 N2176» (PDF) . Машина обратного пути. Раздел 6.2.6.2. Архивировано из оригинала (PDF) 30 декабря 2018 года
. Какой из [знака и величины, дополнения до двух, дополнения до одного] применяется, определяется реализацией.
- ^ «Целочисленные тесты — документация mp++ 0.27» . bluescarni.github.io .
- ^ «6 предопределенных типов и классов» . www.haskell.org . Проверено 15 июня 2022 г.
- ^ Суреш, С.П. «Программирование на Haskell: лекция 22» (PDF) . Ченнайский математический институт . Проверено 10 августа 2022 г.
- ^ Фланаган, Дэвид (1997). «6.2 Функции как типы данных». JavaScript: полное руководство (2-е изд.). Кембридж: О'Рейли и партнеры. ISBN 9781565922341 .
- ^ Копылов, Алексей (2003). «Зависимое пересечение: новый способ определения записей в теории типов». 18-й симпозиум IEEE по логике в информатике . LICS 2003. Компьютерное общество IEEE. стр. 86–95. CiteSeerX 10.1.1.89.4223 . дои : 10.1109/LICS.2003.1210048 .
- ^ Уэст, Рэндольф (27 мая 2020 г.). «Как SQL Server хранит типы данных: деньги» . Рожденный SQL . Проверено 28 января 2022 г.
Некоторое время назад я описал MONEY как «удобный» тип данных, который фактически аналогичен DECIMAL(19,4), [...]
- ^ «Введение в типы данных и свойства полей» . support.microsoft.com . Проверено 28 января 2022 г.
- ^ Уикхэм, Хэдли (2017). «16 дат и времени» . R для науки о данных: импортируйте, приводите в порядок, преобразуйте, визуализируйте и моделируйте данные . Севастополь, Калифорния. ISBN 978-1491910399 . Проверено 28 января 2022 г.
{{cite book}}
: CS1 maint: отсутствует местоположение издателя ( ссылка )
Дальнейшее чтение
[ редактировать ]- Парнас, Дэвид Л .; Шор, Джон Э.; Вайс, Дэвид (1976). «Абстрактные типы, определенные как классы переменных». Материалы конференции 1976 года «Данные: абстракция, определение и структура» . стр. 149–154. дои : 10.1145/800237.807133 . S2CID 14448258 .
- Карделли, Лука ; Вегнер, Питер (декабрь 1985 г.). «О понимании типов, абстракции данных и полиморфизме» (PDF) . Обзоры вычислительной техники ACM . 17 (4): 471–523. CiteSeerX 10.1.1.117.695 . дои : 10.1145/6041.6042 . ISSN 0360-0300 . S2CID 2921816 . Архивировано (PDF) из оригинала 3 декабря 2008 г.
- Кливленд, Дж. Крейг (1986). Введение в типы данных . Аддисон-Уэсли. ISBN 978-0201119404 .
Внешние ссылки
[ редактировать ]- СМИ, связанные с типами данных, на Викискладе?