Динамическая и статическая типизации.

Динами́ческая типиза́ция приём, широко используемый в языках программирования и языках спецификации, при котором переменная связывается с типом в момент присваивания значения, а не в момент объявления переменной. Таким образом, в различных участках программы одна и та же переменная может принимать значения разных типов.

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

Преимущества:

ü Минимум дополнительных строк: переменные надо либо просто объявить без указания типа.

ü Соответственно, упрощается написание простых программ.

ü Повышается гибкость языка. Например, только динамический язык может иметь функцию eval(), вычисляющую значение произвольного выражения.

ü Ускоряет работу компилятора — а значит, производственный цикл «написать-проверить».

ü Автоматически дает языку элементы метапрограммирования и интросекции.

ü Другими словами: когда программист пишет функцию «отсортировать массив», функция сразу начинает работать для массива чисел, массива строк, массива объектов (метапрограммирование). Чтобы определить, возможна ли операция x.length, среде выполнения нужно знать, какого типа переменная x и есть ли у неё поле length; если подобные запросы может делать и сама программа, это и есть интроспекция.

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

Недостатки:

ü Статическая типизация позволяет уже при компиляции заметить простые ошибки «по недосмотру». Для динамической типизации требуется как минимум выполнить данный участок кода.

ü Особенно «коварны» в динамическом языке программирования опечатки: разработчик может несколько раз просмотреть неработающий код и ничего не увидеть, пока наконец не найдёт набранный с ошибкой идентификатор.

ü В объектно-ориентированных языках не действует либо действует с ограничениями автодополнение: трудно или невозможно понять, к какому типу относится переменная, и вывести набор её полей и методов.

ü Для написания сложного кода нужна особая культура программирования: венгерская нотация, юнит-тестирование и т. д. В статических языках, вообще-то, тоже, но намного в меньшей степени.

ü Интерфейсная часть модуля (описания типов, заголовки процедур и т. д. — то, что соответствует interface-секции в Паскале) в статическом языке сама по себе является существенной частью документации — а при удачной архитектуре модуля вообще позволяет обойтись без документирования.

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