Статический тип или динамический тип неоднократно запрашивался в стеке, например, здесь .
Похоже, что консенсус (цитата из верхнего ответа по приведенной выше ссылке):
Язык статически типизирован, если тип переменной известен во время компиляции.
И динамический язык:
Язык динамически типизируется, если тип связан со значениями времени выполнения, а не с именованными переменными / полями / и т. Д.
Кажется, что Perl статически типизируется этим (или другими общими определениями статической / динамической типизации). Он имеет 3 типа: скаляр, массив, хеш (игнорируя такие вещи, как ссылки для простоты). Типы объявляются вместе с переменными:
my $x = 10; # declares a scalar variable named x
my @y = (1, 2, 3); # declares an array variable named y
my %z = (one => 1, two => 2); # declares a hash variable named z
$
, @
и %
выше говорят Perl, какой тип вы хотите; Я бы посчитал это формой явной печати.
Как только x
объявлено как скаляр, как указано выше, невозможно сохранить нескалярное значение в x
:
$x = @y; # x is now 3
Преобразует y
в скаляр (в Perl преобразование массива в скаляр приводит к длине массива). Я виню в этом слабую типизацию (Perl очень свободно разрешает преобразования между 3 типами), а не динамическую типизацию.
В то время как в большинстве статически типизированных языков такое назначение было бы ошибкой, в Perl это нормально из-за неявных преобразований (аналогично тому, как bool x = 1;
хорошо в C / C ++, но не в Java: оба статически типизированы , но Java в этом случае более типично). Единственная причина, по которой это преобразование вообще произошло в Perl, заключается в типе x
, что опять же предполагает статическую типизацию Perl.
Другой аргумент против статической типизации Perl заключается в том, что значения типа float, int и string хранятся в переменной одного типа (скаляры). Но это действительно не имеет ничего общего со статической или динамической типизацией. В системе типов Perl (которая имеет только 3 типа) нет различий между числами с плавающей запятой, целыми числами и строками. Все они имеют тип скаляр. Это похоже на то, что C89 не является статически типизированным, потому что он использовал тип int
для представления как целых, так и значений типа bools.
Очевидно, что эта аргументация нелепа. Perl имеет очень мало общего с тем, что большинство людей считает статически типизированными языками, такими как C / C ++, Java, OCaml и т. Д.
У меня вопрос, что не так с этой линией рассуждений?