Типизация. Что это и какие её виды бывают в программировании

Типизация -- способ (порядок, набор правил) разделения данных на типе в конкретном языке программирования.

Виды типизации

Обычно типизацию описывают несколькими словами, например, говорят, что

PHP обладает слабой, динамической типизацией

причем у каждого слова возможно противоположное, ниже рассмотрим варианты возможные варианты.

Сильная / слабая типизация (тоже самое, что строгая / нестрогая)

Пожалуй это одно из важных свойств, по тому обладает ли язык сильной или слабой типизацией (напр., читая его описание) можно понять как часто придётся писать выражения для явного преобразования типов (что часто неудобно).

Сильная типизация выделяется тем, что язык не позволяет смешивать в выражениях различные типы и не выполняет автоматические неявные преобразования, например нельзя вычесть из строки множество.

Языки со слабой типизацией выполняют множество неявных преобразований автоматически, даже если может произойти потеря точности или преобразование неоднозначно.

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

Например, Pascal относится к языкам с сильной типизацией (например поэтому в Паскале нельзя конкатенировать строки и числа), но тем не менее возможно, например преобразование целого числа к вещественному в неявном виде, подобное явление называют «ограниченное неявное преобразование» (подробнее см. источник 1).

Примеры

  • Сильная типизация: Java, Python, Haskell, Pascal, Lisp;
  • Слабая типизация: C, JavaScript, Visual Basic, PHP.

Статическая / динамическая типизация

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

В динамической типизации все типы выясняются уже во время выполнения программы.

Примеры:

  • Статическая: Pascal, C, Java, C#;
  • Динамическая: Python, JavaScript, Ruby, PHP

Явная / неявная типизация

Явно-типизированные языки отличаются тем, что тип новых переменных / функций / их аргументов нужно задавать явно. Соответственно языки с неявной типизацией перекладывают эту задачу на компилятор / интерпретатор.

Примеры:

  • Явная: C++, D, C#
  • Неявная: PHP, Lua, JavaScript

Выводы о типизации конкретного ЯП

Как уже говорилось выше, для типизации языка используют несколько слов ("набор видов типизации"), так в соответствии с приведенными выше типами, можно подробнее охарактеризовать PHP:

PHP обладает слабой, динамической, неявной типизацией.

Также не забудем и про Pascal:

Паскаль обладает сильной (в основном, про искл. см. выше), статической, явной типизацией.

При этом существуют языки программирования исключения вообще нормально по данной системе (относительно подходящей для большинства ЯП), напр. такие что обладают одновременно и статической и динамической типизацией (хотя, наверное, для них надо просто придумать третий типа в виде "статическая/динамическая", что-то вроде: "стато-динамическая типизация" ;)

Источники (что почитать подробнее)

  1. Ликбез по типизации в языках программирования: https://habr.com/post/161205/