人们为什么说Perl是动态类型的?

Cof*_*sso 4 perl

静态类型VS动态类型已被要求反复的计算器,例如这里

共识似乎是(引用以上链接的最高答案):

如果在编译时就知道变量的类型,则语言是静态类型的。

和动态语言:

如果一种语言与运行时值关联,而不是命名为变量/字段/等,则该语言是动态类型的。

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
Run Code Online (Sandbox Code Playgroud)

$@%上面就告诉Perl你想要的类型; 我认为这是显式键入的一种形式。

x如上所述,一旦被声明为标量,就无法在中存储非标量值x

$x = @y;                      # x is now 3
Run Code Online (Sandbox Code Playgroud)

将转换y为标量(在Perl中,数组到标量的转换导致数组的长度)。我将此归咎于弱类型(Perl非常自由地允许其3种类型之间进行转换),而不是动态类型。

在大多数静态类型的语言中,这样的分配将是一个错误,但是在Perl中,由于隐式转换是可以的(类似于bool x = 1;C / C ++,但在Java中则没有问题:两者都是静态类型,但是Java更强大在这种情况下键入)。这种转换在Perl中完全发生的唯一原因是因为的类型x,这再次表明Perl是静态类型的。

人们反对将Perl静态类型化的另一个论点是,浮点数,整数和字符串都存储在相同类型的变量(标量)中。但这确实与静态或动态类型无关。在Perl的类型系统(只有3种类型)中,浮点数,整数和字符串之间没有区别。这些都具有类型标量。这类似于说C89不是静态类型的,因为它使用该int类型表示int和bool。

显然,这种推理是荒谬的。Perl与大多数人认为的静态类型语言(如C / C ++,Java,OCaml等)几乎没有共通之处。

我的问题是,什么是用这种推论?

ike*_*ami 5

我不同意在您发布的定义上达成共识。但是就像您的主张一样,这是基于观点的,因此是不合时宜的。

张贴的“静态类型语言”和“动态类型语言”的定义是无用的。这些是虚构的存储桶,几乎没有任何语言适合其中。


根据您发布的静态类型语言的定义,Perl是一种静态类型语言。

  • $a已知类型为编译时的标量。
  • @a已知类型为编译时的数组。

根据您发布的静态类型语言的定义,Perl不是静态类型的语言。

  • $a 可以包含一个有符号整数(IV)。
  • $a 可以包含一个字符串(PV)。
  • $a 可以包含对类Foo的对象的引用(RV)。

根据您发布的动态类型语言的定义,Perl是一种动态类型语言。

  • $a 可以包含一个有符号整数(IV)。
  • $a 可以包含一个字符串(PV)。
  • $a 可以包含对类Foo的对象的引用(RV)。

According to the definition of dynamically-typed language you posted, Perl isn't a dynamically-typed language.

  • The type of $a is known to be a scalar at compile-time.
  • The type of @a is known to be an array at compile-time.

Similarly, C++, C#, Java, BASIC and assembler languages are both/neither statically-typed and dynamically-typed. Even C doesn't fit the posted definition of statically-typed perfectly.