stringtranslate.com

Тип данных

Стандартная иерархия типов Python 3

В информатике и компьютерном программировании тип данных (или просто тип ) — это набор или группа значений данных, обычно определяемых набором возможных значений, набором разрешенных операций над этими значениями и/или представлением этих значений. как типы машин. [1] Спецификация типа данных в программе ограничивает возможные значения, которые может принимать выражение , например переменная или вызов функции. В случае буквальных данных он сообщает компилятору или интерпретатору , как программист намерен использовать данные. Большинство языков программирования поддерживают базовые типы данных: целые числа (разных размеров), числа с плавающей запятой (которые приближаются к действительным числам ), символы и логические значения . [2] [3]

Концепция

Тип данных может быть указан по многим причинам: для сходства, удобства или для привлечения внимания. Часто вопрос хорошей организации помогает пониманию сложных определений. Почти все языки программирования явно включают понятие типа данных, хотя возможные типы данных часто ограничиваются соображениями простоты, вычислимости или регулярности. Явное объявление типа данных обычно позволяет компилятору выбрать эффективное машинное представление, но не следует сбрасывать со счетов концептуальную организацию, предлагаемую типами данных. [4]

В разных языках могут использоваться разные типы данных или схожие типы с разной семантикой. Например, в языке программирования Pythonint представляет целое число произвольной точности , которое выполняет традиционные числовые операции, такие как сложение, вычитание и умножение. Однако в языке программирования Java тип intпредставляет собой набор 32-битных целых чисел в диапазоне значений от -2 147 483 648 до 2 147 483 647 с арифметическими операциями, которые переносятся при переполнении . В Rust этот 32-битный целочисленный тип обозначается i32и вызывает панику при переполнении в режиме отладки. [5]

Большинство языков программирования также позволяют программисту определять дополнительные типы данных, обычно путем объединения нескольких элементов других типов и определения допустимых операций нового типа данных. Например, программист может создать новый тип данных с именем « комплексное число », который будет включать действительную и мнимую части, или тип данных цвета, представленный тремя байтами , обозначающими количества каждого из красного, зеленого и синего, и строкой, представляющей название цвета.

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

Большинство типов данных в статистике имеют сопоставимые типы в компьютерном программировании, и наоборот, как показано в следующей таблице:

Определение

Парнас, Шор и Вайс (1976) выделили пять определений «типа», которые использовались — иногда неявно — в литературе:

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

Определение в терминах представления часто выполнялось в императивных языках, таких как ALGOL и Pascal , тогда как определение в терминах пространства значений и поведения использовалось в языках более высокого уровня, таких как Simula и CLU . Типы, включая поведение, более тесно связаны с объектно-ориентированными моделями, тогда как модель структурированного программирования , как правило, не включает код и называется старыми добрыми структурами данных .

Классификация

Типы данных можно классифицировать по нескольким факторам:

Терминология различается: в литературе примитивный, встроенный, базовый, атомарный и фундаментальный могут использоваться как синонимы. [8]

Примеры

Типы машинных данных

Все данные в компьютерах на базе цифровой электроники представлены в виде битов (альтернативы 0 и 1) на самом низком уровне. Наименьшая адресуемая единица данных обычно представляет собой группу битов, называемую байтом ( обычно октет , состоящий из 8 бит). Единица, обрабатываемая инструкциями машинного кода , называется словом (по состоянию на 2011 год обычно 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 b (где 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 как . [11]data Maybe a = Nothing | Just a

Структуры данных

Некоторые типы очень полезны для хранения и извлечения данных и называются структурами данных . Общие структуры данных включают в себя:

Абстрактные типы данных

Абстрактный тип данных — это тип данных, который не определяет конкретное представление данных. Вместо этого для его описания используется формальная спецификация , основанная на операциях с типом данных. Любая реализация спецификации должна соответствовать данным правилам. Например, в стеке есть операции push/pop, которые следуют правилу «Последним вошел — первым вышел» и могут быть конкретно реализованы с использованием либо списка, либо массива. Абстрактные типы данных используются в формальной семантике и проверке программ , а также, в менее строгом смысле, в проектировании .

Указатели и ссылки

Основным несоставным производным типом является указатель , тип данных, значение которого напрямую ссылается (или «указывает на») на другое значение, хранящееся в другом месте в памяти компьютера, используя его адрес . Это примитивный вид ссылки . (В повседневной жизни номер страницы в книге можно рассматривать как часть данных, которая ссылается на другую страницу). Указатели часто хранятся в формате, аналогичном целочисленному; однако попытка разыменовать или «найти» указатель, значение которого никогда не было допустимым адресом памяти, приведет к сбою программы. Чтобы решить эту потенциальную проблему, указатели считаются отдельным типом данных, на которые они указывают, даже если базовое представление одно и то же.

Типы функций

Языки функционального программирования рассматривают функции как отдельный тип данных и позволяют хранить значения этого типа в переменных и передавать их функциям. Некоторые мультипарадигмальные языки, такие как JavaScript, также имеют механизмы обработки функций как данных. [13] Большинство современных систем типов выходят за рамки простого типа «объект функции» в JavaScript и имеют семейство типов функций, различающихся по типам аргументов и возвращаемых значений, например, тип, Int -> Boolобозначающий функции, принимающие целое число и возвращающие логическое значение. В C функция не является первоклассным типом данных, но программа может манипулировать указателями функций . Java и C++ изначально не имели значений функций, но они были добавлены в C++11 и Java 8.

Конструкторы типов

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

Количественные типы

Универсально-квантифицированные и экзистенциально-квантифицированные типы основаны на логике предикатов . Универсальная количественная оценка записывается как или и является пересечением всех типов тела , т. е. значение имеет тип для каждого . Экзистенциальная квантификация, записанная как или и, представляет собой объединение всех типов тела , т. е. значение имеет тип для некоторых .forall x. f xxf xf xxexists x. f xxf xf xx

В 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]

Смотрите также

Рекомендации

  1. ^ Парнас, Шор и Вайс 1976.
  2. ^ введите в Бесплатном онлайн-словаре по информатике.
  3. ^ Шаффер, Калифорния (2011). Структуры данных и алгоритмический анализ на C++ (3-е изд.). Минеола, Нью-Йорк: Дувр. 1.2. ISBN 978-0-486-48582-9.
  4. ^ Скотт, Дана (сентябрь 1976 г.). «Типы данных как решетки». SIAM Journal по вычислительной технике . 5 (3): 540–541. дои : 10.1137/0205037.
  5. ^ «Rust RFC — целочисленное переполнение» . Язык программирования Rust. 12 августа 2022 г.
  6. ^ Дейл, Нелл Б.; Уимс, Чип; Хедингтон, Марк Р. (1998). Программирование на С++. Джонс и Бартлетт Обучение. п. 349. ИСБН 978-0-7637-0537-4.
  7. ^ ИСО/МЭК 11404 , 6.4.
  8. ^ БХАТНАГАР, СИМА (19 августа 2008 г.). УЧЕБНИК ИНФОРМАТИКИ ДЛЯ XI КЛАССА. PHI Learning Pvt. ООО с. 182. ИСБН 978-81-203-2993-5.
  9. ^ "SC22/WG14 N2176" (PDF) . Машина обратного пути. Раздел 6.2.6.2. Архивировано из оригинала (PDF) 30 декабря 2018 года . Какой из [знака и величины, дополнения до двух, дополнения до одного] применяется, определяется реализацией.
  10. ^ «Целочисленные тесты — документация mp++ 0.27» . bluescarni.github.io .
  11. ^ «6 предопределенных типов и классов» . www.haskell.org . Проверено 15 июня 2022 г.
  12. ^ Суреш, С. П. «Программирование на Haskell: лекция 22» (PDF) . Ченнайский математический институт . Проверено 10 августа 2022 г.
  13. ^ Фланаган, Дэвид (1997). «6.2 Функции как типы данных». JavaScript: полное руководство (2-е изд.). Кембридж: О'Рейли и партнеры. ISBN 9781565922341.
  14. ^ Копылов, Алексей (2003). «Зависимое пересечение: новый способ определения записей в теории типов». 18-й симпозиум IEEE по логике в информатике . LICS 2003. Компьютерное общество IEEE. стр. 86–95. CiteSeerX 10.1.1.89.4223 . дои : 10.1109/LICS.2003.1210048. 
  15. Уэст, Рэндольф (27 мая 2020 г.). «Как SQL Server хранит типы данных: деньги». Рожденный SQL . Проверено 28 января 2022 г. Некоторое время назад я описал MONEY как «удобный» тип данных, который фактически аналогичен DECIMAL(19,4), [...]
  16. ^ «Введение в типы данных и свойства полей». support.microsoft.com . Проверено 28 января 2022 г.
  17. ^ Уикхэм, Хэдли (2017). «16 дат и времени». R для науки о данных: импортируйте, приводите в порядок, преобразуйте, визуализируйте и моделируйте данные . Севастополь, Калифорния. ISBN 978-1491910399. Проверено 28 января 2022 г.{{cite book}}: CS1 maint: location missing publisher (link)

дальнейшее чтение

Внешние ссылки