Статический тип является свойством части программы (обычно это выражение), что средство проверки типов пытается доказать или опровергнуть без выполнения программы, возможно, одновременно вызывая свойство. (На самом деле, это немного, зависимые типы и поэтапная компиляция делают правду немного глуше, чем это). В общем случае динамически типизированный язык имеет один статический тип - тип синтаксически допустимых выражений.
Динамический тип является свойством «объекта» (необязательно объекта OO), который будет проверяться автоматически во время выполнения программы. Каждый основной статически типизированный язык имеет некоторые динамические типы ... например. функция деления статически определена, чтобы принимать два числа и возвращать число, но динамически определяемое таким образом, чтобы второе число не могло быть равно нулю. Существуют статически типизированные языки, для которых «ненулевое число» может быть статически проверенным типом. Во многих статически типизированных языках (например, Java) non-null является динамическим типом, тогда как в Haskell это статический тип. И т. Д.
Эти две части связаны друг с другом (оба способа предотвращения неопределенного поведения), но также совершенно разные, что является источником путаницы, что слово «тип» используется для обозначения того и другого.
Как системы статического, так и динамического типов предшествуют OO, и оба имеют отличные языки без OO для их представления (например, схемы и SML). Фактически, они предшествуют компьютерному программированию, как мы его знаем. См. Нетипизированные и просто типизированные лямбда-калькуляции, которые относятся к 1930-м и 40-м годам.
Для более углубленного обсуждения о различиях см: http://web.archive.org/web/20080822101209/http://www.pphsg.org/cdsmith/types.html
Для один подход к глядя на некоторые свойства статических и динамических типов см: http://james-iry.blogspot.com/2010/05/types-la-chart.html
ли динамически типизированных и нетипизированным означают то же самое ? Ну ... нетипированный происходит из нетипизированного лямбда-исчисления. Он называется нетипизированным, в отличие от других лямбда-калькулий, таких как просто типизированное лямбда-исчисление, которое имеет статические типы. Так что, конечно, динамически типизированные языки нетипизированы в этом смысле. Но ...
Неизученный лямбда-исчисление, в отличие от «реального» языка программирования, обладает тем свойством, что любое синтаксически допустимое выражение может «проделать прогресс» без необходимости проверять любые свойства, которые могут привести к неопределенному поведению. Нет эквивалента деления на ноль, разыменования нулевого значения или отправки сообщения объекту, который не может его обработать. Таким образом, можно было бы утверждать, что нетипизированный LC не имеет системы динамического типа, даже если он нетипизирован.
s/Java/C++/:-) – 2010-10-13 12:23:42
+1 для того, чтобы не использовать динамически типизированные и слабо типизированные как синонимы –
В Haskell вы не можете сопоставить шаблон по типу значения, а только по его структуре. Тип значения всегда статически известен и не может быть запрошен во время выполнения. Кстати, я не согласен с тем, что типы должны запрашиваться во время выполнения для языка, который нужно ввести. C, скорее всего, имеет типы, но не эквивалент оператора 'typeof'. – sepp2k