是否存在静态弱的类型语言?

时间:2012-12-26 21:04:30

标签: types casting programming-languages

我一直在阅读

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

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

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

  • static - strong (C,C ++,Java,..)
  • 静态 - (???)
  • 动态 - 强大(python,ruby,..)
  • 动态 - (perl,javascript,..)

所以我的问题是,那里有任何静态弱类型的语言吗? (我想如果不是这样的话就没有意义)。我的理解/例子也是正确的吗?

2 个答案:

答案 0 :(得分:4)

强类型和弱类型的定义没有明确定义,特别是在仅评定一种语言的情况下。它是比较语言的常用轴,在这种情况下,强弱打字获得更多意义,但重要的是要理解没有像静态和动态这样的严格定义。类型系统弱或强的原因归结为程序员能够创建类型错误的方式。

取消选中显式转换

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

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

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

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 ++是静态的和弱类型的,所以它们符合描述。

答案 1 :(得分:-1)

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