13

我一直在阅读

  • 静态(在编译时检查类型)和
  • 动态(在运行时检查类型)类型

相对

  • (无隐式转换)和
  • (隐式转换)类型

我知道它们是不同的东西(也讨论过这里)所以我一直在以这种方式考虑示例语言:

  • 静态-(C、C++、Java、..)
  • 静态-(???)
  • 动态-(python、ruby、..)
  • 动态-(perl、javascript、..)

所以我的问题是,那里有没有静态弱类型语言?(我想如果不是没有的话,这样做也没什么意义)。而且我上面的理解/例子是否正确?

4

2 回答 2

6

强类型和弱类型的定义没有很好的定义,尤其是在只评价一种语言的情况下。它是比较语言的常用轴,在这种情况下,强类型和弱类型获得更多意义,但重要的是要了解没有像静态和动态这样的严格定义。使类型系统变弱或变强的原因归结为程序员能够创建类型错误的方式。

未经检查的显式转换

很多人会认为 C 是弱类型的,因为允许程序员转换类型。如果我只是告诉 C 它们都是整数,我可以添加一个指向字符的指针。

int main () {
    char c = 'a';
    void *p;
    (int)c + (int)p;
}

然而,在 Haskell 中,我可以显式地将一种类型转换为另一种类型,但只有某些类型可以工作。

ord('c') + 10
fromIntegral (2::Int) + 4.13

Java 也有静态类型转换,它允许程序员例如向下转换对象。这使得静态类型系统不健全。但是 Java 正是出于这个原因而具有动态类型检查。是的,Java 有动态和静态类型检查。然而,出于这个原因,我认为很多人会认为 Java 是强类型的。

自动铸造

Perl 和 Javascript 将接受字符串并将它们视为数字,如果它们看起来足够像数字并自动使其工作。

'2 is my favorite number' + 413 == 415 # in Perl

如果你想将一个字符串转换为一个数字,比如说,Scheme,你必须使用一个函数进行显式转换,如果它们的字符串不是数字,它会进行检查并引发异常。

(= (+ (string->number '2') 413) 415) ; In Scheme

出于这个原因,很多人会认为 Scheme 是强类型的。

根本没有类型

在某些语言中没有任何类型。无类型的 Lambda 演算就是这样一个例子。这显然不是强类型的。一切都是函数。我可以使用教堂数字或对或字符串或任何使用各种编码的数字,但值仅表示我同意它们的含义,并且肯定存在重叠。

比较

就像我说的,这些术语没有很好的定义,但是当以相对的方式使用时它们会更有用一些。例如,我可以很好地声称 OCaml 比 Java 类型更强大,因为 Java 允许显式静态向下转换,而 OCaml 不允许。

结论

这些术语并不严格,但它们很有用。为了回答您最初的问题,在我看来,C/C++ 是静态且弱类型的,因此它们符合描述。

于 2014-04-01T17:58:22.773 回答
0

C# 允许用户定义的隐式转换,因此它符合您对“静态”和“弱”的定义(尽管“弱点”是有界的)。

于 2013-10-31T04:23:04.380 回答