Тип даних - це

Ще в 1960-х р.р. Р. Хиндли (Roger Hindley) досліджував типізацію в комбінаторної логікою. Його проблемною областю була типізація в мовах, основаних на теорії лямбда-числення. Пізніше, в кінці 1960-х років. той же вчений досліджував поліморфні системи типів. Пізніше, в 1970-х роках. Робін Мілнер запропонував практичну реалізацію розширеної системи полиморфной типізації для мови функціонального програмування ML.

визначення

Тип (сорт) - відносно стійка і незалежна сукупність елементів, яку можна виділити в усьому розглянутому безлічі (предметної області). [1]

Поліморфний тип - представлення набору типів як єдиного типу.

Математично тип може бути визначений двома способами:

  1. Безліччю всіх значень, що належить типу.
  2. Предикатной функцією, визначальною приналежність об'єкта до даного типу

Необхідність використання типів даних

Типи даних розрізняються починаючи з нижніх рівнів системи. Так, наприклад, навіть в Асемблері х86 розрізняються типи «ціле число» і «дійсне число». Це пояснюється тим, що для чисел розглянутих типів відводяться різні обсяги пам'яті, використовуються різні регістри мікропроцесора, а для операцій з ними застосовуються різні команди Ассемблера і різні ядра мікропроцесора.

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

Практичне застосування

Як правило, типи мов програмування не завжди строго відповідають подібним математичним типам. Наприклад, тип «ціле число» більшості мов програмування не відповідає прийнятому в математиці типу «ціле число», так як в математиці вказаний тип не має обмежень ні зверху, ні знизу, а в мовах програмування ці обмеження є. Як правило, в мовах і системах є безліч цілих типів, що відрізняються допустимим діапазоном значень (визначеним обсягом займаної пам'яті). Варто відзначити, що в більшості реалізацій мов і систем вихід за кордон цілого типу (переповнення) не призводить до виняткової ситуації.

Сучасні мови програмування (включаючи Асемблер) підтримують обидва способи завдання типу (див. Визначення). Так, в С ++ тип enum є прикладом завдання типу через набір значень. Визначення класу (якщо розглядати клас як тип даних) фактично є визначенням предиката типу, причому можлива перевірка предиката як на етапі компіляції (перевірка відповідності типів), так і на етапі виконання (поліморфізм дуже тісно пов'язане з поліморфними типами). Для базових типів подібні предикати задані творцями мови спочатку.

Мови без типів

Теоретично не може існувати мов, в яких відсутні типи (включаючи поліморфні). Це випливає з того, що всі мови засновані на машині Тьюринга або на лямбда-численні. І в тому, і в іншому випадку необхідно оперувати як мінімум одним типом даних - зберігаються на стрічці (машина Тьюринга) або переданим і повертається з функції (лямбда-числення). Нижче перераховані мови програмування за способом визначення типів даних:

1) Мови з поліморфним типом даних. Одні мови не пов'язують змінні. константи. формальні параметри і повертаються значення функцій з певними типами, підтримуючи єдиний поліморфний тип даних. У чистому вигляді таких мов не зустрічається, але близькі приклади - MS Visual Basic - тип variant, Пролог. Лісп - списки. У цих мовах змінна може приймати значення будь-якого типу, в параметри функції можна передавати значення будь-яких типів, і повернути функція також може значення будь-якого типу. Зіставлення типів значень змінних і параметрів з застосовуваними до них операціями здійснюється безпосередньо при виконанні цих операцій. Наприклад, вираз a + b. може трактуватися як складання чисел, якщо a і b мають числові значення, як конкатенація рядків, якщо a і b мають строкові значення, і як неприпустима (помилкова) операція, якщо типи значень a і b несумісні. Такий порядок називають «динамічною типізацією» (відповідає поняттю поліморфізм в ООП. Поліморфний тип в теорії типів). Мови, що підтримують тільки динамічну типізацію, називають іноді «безтипових». Ця назва не слід розуміти як ознака відсутності поняття типів в мові - типи даних все одно є.

2) Мови з неявним визначенням типів. Здавалося б, BASIC є прикладом мови без типів. Однак це строго тіпізірованія мову: в ньому розрізняються рядкові типи (додається символ $), масиви (додається []) і числові типи (нічого не додається).

3) Мови з типом, визначеним користувачем. Також добре відомі мови, в яких типи даних визначаються автоматично, а не задаються користувачем. Кожноїзмінної, параметру, функції приписується певний тип даних. В цьому випадку для будь-якого виразу можливість його виконання та тип отриманого значення можуть бути визначені без виконання програми. Такий підхід називають «статичної типізацією». При цьому правила поводження зі змінними, виразами і параметрами різних типів можуть бути як дуже суворими (С ++), так і досить ліберальними (Сі). Наприклад, в класичному мовою Сі практично всі типи даних сумісні - їх можна застосовувати спільно в будь-яких виразах, привласнювати значення змінної одного типу змінної іншого майже без обмежень. При таких операціях компілятор генерує код, що забезпечує перетворення типів, а логічна коректність такого перетворення залишається на совісті програміста. Подібні мови називають «мовами зі слабкою типізацією». Протилежні їм - «мови з сильною типізацією», такі як Ада. У них кожна операція вимагає операндів строго заданих типів. Ніякі автоматичні перетворення типів не підтримуються - їх можна виконати тільки явно, за допомогою відповідних функцій і операцій. Сильна типізація робить процес програмування більш складним, але дає в результаті програми, що містять помітно менше труднообнаружіваемих помилок.

На практиці мови програмування підтримують кілька моделей визначення типів одночасно.

базові типи

Кожна мова програмування підтримує один або кілька вбудованих типів даних (базових типів) (див. Класифікацію типів даних), крім того, розвинені мови програмування надають програмісту можливість описувати власні типи даних, комбінуючи або розширюючи існуючі.

Переваги від використання типів даних

  • Надійність. Типи даних захищають від трьох видів помилок:
  1. Некоректне присвоювання. Нехай змінна оголошена як має числовий тип. Тоді спроба привласнити їй символьне або будь-яке інше значення в разі статичної типізації призведе до помилки компіляції і не дасть такій програмі запуститися. У разі динамічної типізації код програми перед виконанням потенційно небезпечного діяння порівняє типи даних змінної і значення і також видасть помилку. Все це дозволяє уникнути неправильної роботи і «падіння» програми.
  2. Некоректна операція. Дозволяє уникнути спроб застосування виразів виду «Hello world» + 1. Оскільки як уже говорилося всі змінні в пам'яті зберігаються як набори бітів, то при відсутності типів подібна операція була здійсненна (і могла дати результат на кшталт «ello worldǼ»). З використанням типів (див. Далі «Контроль типів») такі помилки відсікаються знову ж на етапі компіляції.
  3. Некоректна передача параметрів. Якщо функція «синус» очікує, що їй буде переданий числовий аргумент, то передача їй як параметр рядка «Hello world» може мати непередбачувані наслідки. За допомогою контролю типів такі помилки також відсікаються на етапі компіляції.
  • Стандартизація. Завдяки угодам про типах, підтримуваних більшістю систем програмування, склалася ситуація, коли програмісти можуть швидко змінювати свої робочі інструменти, а програми не вимагають великих переробок при перенесенні вихідних текстів в інше середовище. На жаль, стандартизації по універсальним типам даних ще є куди розвиватися.

Класифікація типів даних [2] [3]

Типи даних бувають такі:

Контроль типів і системи типізації

Процес перевірки і накладання обмежень типів - контролю типів. може виконуватися під час компілювання (статична перевірка) або під час виконання (динамічна перевірка).

  • Статична типізація - контроль типів здійснюється при компіляції.
  • Динамічна типізація - контроль типів здійснюється під час виконання.

Контроль типів також може бути строгим і слабким.

  • Сувора типізація - сумісність типів автоматично контролюється транслятором:
    • Номінатівная типізація (англ. Nominative type system) - сумісність повинна бути явно вказана (успадкованою) при визначенні типу.
    • Структурна типізація (англ. Structural type system) - сумісність визначається структурою самого типу (типами елементів, з яких побудований складовою тип).
  • Слабка типізація - сумісність типів ніяк транслятором не контролюється. У мовах зі слабкою типізацією зазвичай використовується підхід під назвою «качина типізація» - коли соместімость визначається і реалізується загальним інтерфейсом доступу до даних типу.

Примітки