Как понять разницу между статической и динамической типизацией

  • 18 октября, 14:25
  • 3068
  • 0

Прежде всего, что это за термины - статические/динамические языки?

Язык обладает статической типизацией, если тип переменной известен во время компиляции, а не выполнения. Типичными примерами таких языков являются Ada, C, C++, C#, JADE, Java, Fortran, Haskell, ML, Pascal, и Scala. 

Динамическая проверка типов — это процесс подтверждения типобезопасности программы во время её выполнения. Типичными примерами динамически типизированных языков являются Groovy, JavaScript, Lisp, Lua, Objective-C, PHP, Prolog, Python, Ruby, Smalltalk и Tcl.

Проверка типа - это процесс проверки и применения ограничений типов. Обычно выполняется компилятором или интерпретатором во время компиляции или выполнения. 

Как понять разницу между статической и динамической типизацией

Проще говоря, проверка типов просто смотрит на переменные и их типы, а затем говорит, имеет ли это выражение смысл. 

Объявление типа

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

Например в Java: float f = 0.5;

Динамическая проверка: явное объявление не требуется, так как тип присваивается переменной во время выполнения.

Например в Python: f = 0.5

Производительность

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

Динамическая проверка: более эффективные компиляторы/интерпретаторы, но проверка типов во время выполнения влияет на производительность.

Гибкость   

Статическая проверка: менее подвержена ошибкам во время выполнения, но обеспечивает меньшую гибкость для программиста.

Динамическая проверка: обеспечивает большую гибкость, но более подвержена ошибкам во время выполнения.

статическая / динамическая типизация ==  сильная / слабая типизация

Обычным заблуждение является мнение, что все статически типизированные языки являются сильно типизированными, а динамически типизированные — слабо типизированными. Это неверно, и вот почему.

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

x = 1 + "2"

Мы часто ассоциируем статически типизированные языки, такие как Java и C#, с сильно типизированным (они такими и являются), поскольку тип данных задаётся явно при инициализации переменной — как в этом примере на Java:

String foo = new String("hello world")

Тем не менее, Ruby, Python и JavaScript (все они обладaют динамической типизацией) также являются сильно типизированными, хотя разработчику и не нужно указывать тип переменной при объявлении. Рассмотрим такой же пример, но написанный на Ruby:

foo = "hello world"

Оба языка являются сильно типизированными, но используют разные методы проверки типов. Такие языки, как Ruby, Python и JavaScript не требуют явного определения типов из-за вывода типов — способности программно выводить нужный тип переменной в зависимости от её значения. Вывод типов — это отдельное свойство языка, и не относится к системам типов.

Слабо типизированный язык — это язык, в котором переменные не привязаны к конкретному типу данных; у них всё ещё есть тип, но ограничения типобезопасности гораздо слабее. Рассмотрим следующий пример кода на PHP:

$foo = "x";
$foo = $foo + 2; // not an error
echo $foo;       // 2

Поскольку PHP обладает слабой типизацией, ошибки в этом коде нет. Аналогично предыдущему предположению, не все слабо типизированные языки являются динамически типизированными: PHP — это динамически типизированный язык, но вот C — тоже язык со слабой типизацией — воистину статически типизирован.

Хотя статическая / динамическая  и сильная / слабая системы типов и являются разными, они обе связаны с типобезопасностью. Проще всего это выразить так: первая система говорит о том, когда проверяется типобезопасность, а вторая — как.


0 комментариев
Сортировка:
Добавить комментарий