静态类型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等)几乎没有共通之处。
我的问题是,什么是错用这种推论?
我不同意在您发布的定义上达成共识。但是就像您的主张一样,这是基于观点的,因此是不合时宜的。
张贴的“静态类型语言”和“动态类型语言”的定义是无用的。这些是虚构的存储桶,几乎没有任何语言适合其中。
根据您发布的静态类型语言的定义,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.
$a is known to be a scalar at compile-time.@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.