Система типізації

Матеріал з Вікіпедії — вільної енциклопедії.
Перейти до навігації Перейти до пошуку

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

Базові відомості

Присвоєння типу даних (типізація) надає значення набору бітів. Як правило, типи надаються або значенням в пам'яті, або об'єктам, таким, як змінні. Оскільки будь-яке значення в комп'ютері складається із множини бітів, апаратне забезпечення не розрізняє навіть адресу, коди операцій, символьні дані, цілі числа. Типи вказують програмам та програмістам на те, як слід обробляти дані.

Системи типізації виконують наступні функції:

  • Безпечність — застосування типів даних дозволяє компілятору знаходити беззмістовний або неправильний код. Наприклад, можна визначити вираз "Привіт!" + 3 як неправильний, оскільки додавання (в загальному розумінні) рядка до цілого числа не має сенсу. Як зазначено нижче, сильна типізація безпечніша, однак вона не обов'язково гарантує повну безпеку (докладніше, дивіться безпечна типізація).
  • Оптимізація — статична перевірка типів може повідомити додаткову інформацію компілятору. Наприклад, якщо тип даних вказує на те, що значення повинні вирівнюватись на границі кратні 4, компілятор зможе використати ефективніші машинні інструкції.
  • Документування — у виразніших системах типізації, типи даних можуть служити як вид документації, оскільки вони можуть описувати наміри розробника. Наприклад, довжина може бути підтипом цілих чисел, але, якщо розробник декларує тип результату функції як довжину, а не просто ціле число, це може частково описувати значення функції.
  • Абстрагування (або модульність) — типи даних дозволяють розробнику розмірковувати про програми на вищому рівні, не звертаючи увагу на деталі реалізації на нижчому рівні. Наприклад, розробник може вважати рядок значенням, замість простого масиву байт. Або, типи можуть дозволити розробникам виражати інтерфейс між двома підсистемами. Це локалізує необхідні для взаємодії двох підсистем визначення та запобігає появі несумісностей під час взаємодії цих підсистем.

Перевірка типів

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

Статична типізація

Статична типізація — механізм, що дозволяє на етапі написання програми визначити через тип об'єкта програми множину припустимих значень та множину операцій над об'єктом так, що порушення вимог типізації буде призводити до попередження або помилки на етапі трансляції програми, а не на етапі її виконання. Тип об'єкта, встановлений при написанні програми, не може бути змінений на етапі виконання програми, але значення, яке містить об'єкт, може бути перетворене (приведене) до іншого типу.

Механізм широко використовується в окремих мовах програмування (званих як мови зі статичною типізацією) і дозволяє зменшити число помилок при написанні програми, але також вимагає явного перетворення типу при необхідності. Приклади статично типізованих мов — Ada, С++, Pascal.

Динамічна типізація

Мову програмування називають динамічно типізованою, коли основна частина перевірок типів виконується під час виконання програми, а не під час компіляції. У динамічній типізації, значення мають типи, а змінні — ні, тому змінна може містити значення будь-якого типу. Динамічно типізовані мови включають APL, Erlang, Groovy, JavaScript, LISP, Lua, MATLAB/GNU Octave, Perl (для користувацьких типів, але не для вбудованих типів), PHP, Пролог, Python, Ruby, Smalltalk, Clojure та Tcl.

Приклади

В окремих мовах з статичною типізацією може мати місце наступне:

3 + 4 = 7 (цілі числа)
"3" + "4" = "34" (рядки)
3 + "4" -> невідповідність типів операндів операції, помилка

В окремих мовах з динамічною типізацією може мати місце наступне:

3 + 4 -> 7 або 34 в залежності від контексту

Див. також

Посилання