Прежде всего, что это за термины - статические/динамические языки?
Язык обладает статической типизацией, если тип переменной известен во время компиляции, а не выполнения. Типичными примерами таких языков являются 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 комментариев
Добавить комментарий