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

时间:2019-07-04 20:47:31

标签: perl

静态类型对动态类型相对于动态类型已在堆栈溢出中反复询问,例如here

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

  

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

和一种动态语言:

  

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

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静态键入的另一个论点是浮点数,整数和字符串都存储在相同类型的变量(标量)中。但这确实与静态或动态类型无关。在Perl的类型系统(只有3种类型)中,浮点数,整数和字符串之间没有区别。这些都具有类型标量。这类似于说C89不是静态类型的,因为它使用int类型来表示整数和布尔值。

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

我的问题是,这种推理方式是什么错误

1 个答案:

答案 0 :(得分:4)

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

发布的“静态语言”和“动态语言”的定义没用。这些是虚构的存储桶,几乎没有任何语言适用于此。


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

  • $a的类型在编译时是标量。
  • @a的类型在编译时是数组。

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

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

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

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

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

  • $a的类型在编译时是标量。
  • @a的类型在编译时是数组。

类似地,C ++,C#,Java,BASIC和汇编语言都不是静态类型的,也不是动态类型的。甚至C也不能完全符合静态类型的发布定义。

相关问题