gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 23:07:03 26 4
gpt4 key购买 nike

在stackoverflow上反复询问了静态类型还是动态类型,例如here

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

A language is statically typed if the type of a variable is known at compile time.



以及一种动态语言:

A language is dynamically typed if the type is associated with run-time values, and not named variables/fields/etc.



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中,由于隐式转换是可以的(类似于C/C++中 bool x = 1;的用法,但在Java中则不是这样:两者都是静态类型的,但是Java更适合在这种情况下为强类型)。这种转换在Perl中根本没有发生的唯一原因是因为 x的类型,这再次表明Perl是静态类型的。

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

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

我的问题是,这条推理出了什么问题?

最佳答案

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

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

根据您发布的静态类型语言的定义,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也不能完全符合静态类型的定义。

    关于perl - 人们为什么说Perl是动态类型的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56894069/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com