Почему люди говорят, что Perl динамически набирается? - PullRequest
3 голосов
/ 04 июля 2019

Статический тип или динамический тип неоднократно запрашивался в стеке, например, здесь .

Похоже, что консенсус (цитата из верхнего ответа по приведенной выше ссылке):

Язык статически типизирован, если тип переменной известен во время компиляции.

И динамический язык:

Язык динамически типизируется, если тип связан со значениями времени выполнения, а не с именованными переменными / полями / и т. Д.

Кажется, что 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 и т. Д.

У меня вопрос, что не так с этой линией рассуждений?

1 Ответ

4 голосов
/ 05 июля 2019

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

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


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

  • Тип $a, как известно, является скаляром во время компиляции.
  • Тип @a, как известно, является массивом во время компиляции.

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

  • $a может содержать целое число со знаком (IV).
  • $a может содержать строку (PV).
  • $a может содержать ссылку (RV) на объект класса Foo.

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

  • $a может содержать целое число со знаком (IV).
  • $a может содержать строку (PV).
  • $a может содержать ссылку (RV) на объект класса Foo.

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

  • Тип $a, как известно, является скаляром во время компиляции.
  • Тип @a, как известно, является массивом во время компиляции.

Точно так же, языки C ++, C #, Java, BASIC и ассемблер не имеют статической или динамической типизации. Даже C не вписывается в опубликованное определение статически напечатанного текста.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...