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

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

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

Этап на котором происходит контроль типов, определяет вид типизации. Контроль типов который происходит на этапе компиляции, называется статическим контролем типов или статической типизацией. Контроль типов, который происходит на этапе выполнения программы, называется динамическим контролем типов или динамической типизацией.

Статическая типизация (Static Typing)

Статическая типизация обуславливается тем, что нуждающаяся в аннотации типа конструкция связывается с типом данных в момент объявления на этапе компиляции. При этом связь с типом данных остается неизменна.

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

За счет того, что большая часть проверок происходит на этапе компиляции, программа обладает большей производительностью из-за отсутствия проверок во время выполнения.

Языки со статической проверкой типов значительно повышают семантическую привлекательность кода делая его более читабельным.

Благодаря статическому контролю типов, редактор кода способен на основе синтаксического анализа выводить вспомогательную информацию, ускоряющую разработку.

К статически типизированным относятся такие языки, как C#, Java.

Динамическая Типизация (Dynamic Typing)

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

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

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

По причине выявления несовместимости типов только во время выполнения программы ошибки выявляются менее эффективно. Программа не узнает о скрывающейся в ней ошибке, пока не дойдет очередь выполнения проблемного участка кода.

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

К динамически типизированным языкам относятся такие языки как PHP, Python, JavaScript.

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