静态类型对动态类型相对于动态类型已在堆栈溢出中反复询问,例如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等)几乎没有共通之处。
我的问题是,这种推理方式是什么错误?
答案 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也不能完全符合静态类型的发布定义。