Перейти к содержанию

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Итоги

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