Перейти до змісту

Типізація у програмуванні

Мови програмування по типізації прийнято ділити на два великих табори — типізовані і нетипізовані (бестипові). До першого наприклад належать C, Python, Scala, PHP і Lua, а до другого — мова асемблера, Forth і Brainfuck.

Так як «бестипова типізація» по своїй суті дуже проста, далі вона ні на які інші види не ділиться. А ось типізовані мови разділяються ще на декілька категорій:

Явна (explicit) і неявна (implicit) типізація

Явно-типізовані мови відрізняються тим, що тип нових змінних, функцій і їх аргументів треба задавати явно. Відповідно мови з неявною типізацією перекладають цю задачу на компілятор чи інтерпретатор.

Переваги явної типізації:

  • Наявність у кожної функції сигнатури (наприклад int add(int, int)) дозволяє без проблем вивзначити, що функція робить.
  • Програміст одразу ж записує, якого типа значення можутб зберігатись у конкретній змінній, що знижує необхідність запам'ятовувати це.

Переваги неявної типізації:

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

Статична (static) і динамічна (dynamic) типізація

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

Зауважте, що неявна типізація не рівносильна динамічній, а явна — статичній.

Переваги статичної типізації:

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

Переваги динамічної типізації:

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

Сильна (сувора, strong) і слабка (несувора, weak) типізація

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

Слабку типізацію часто плутають з динамічною, що зовсім неправильно. Динамічно типізована мова може бути і слабо і сильно типізована.

Переваги сильної типізації:

  • Надійність — ви отримаєте вийняткову ситуацію або помилку компіляції, на противагу неправиьлної поведінки.
  • Швидкість — замість прихованих перетворень, котрі можуть бути доволі затратними, з сильною типізацією необхідно писати їх явно, що заставлє програміста як мінімум знати, що ця ділянка кода може бути повільним.
  • Розуміння роботи програми — знову ж таки, замість неявного приведення типів, програміст пише усе сам, отже хоча б приблизно розуміє, що порівняння тядка і числа виконується не само по собі і не чарівним способом.
  • Визначеність — коли ви пишете перетворення вручну ви точно знаєте, що ви перетворюєте і в що саме. Також ви завжди будете розуміти, що такі перетворення можуть призвести до втрати точності і до невірних результатів.

Переваги слабкої типізації:

  • Зручність використання змішаних виразів.
  • Абстрагування від типізації і зосередженість на задачі.
  • Скорочення запису

Класифікація деяких мов програмування

мова типізація
Python динамічна сильна неявна
JavaScript динамічна слабка неявна
Ruby динамічна сильна неявна
Java статична сильна явна
PHP динамічна слабка неявна
C статична слабка явна
C++ статична слабка явна
Perl динамічна слабка неявна
Objective-C статична слабка явна
C# статична сильна явна
Haskell статична сильна неявна
Common Lisp динамічна сильна неявна
D статична сильна явна
Delphi статична сильна явна
- -

Додаткові матеріали

Back to top