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

问题描述 投票:10回答:3

我一直在阅读有关

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

相对

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

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

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

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

types casting programming-languages
3个回答
5
投票
强类型和弱类型的定义没有很好地定义,特别是在仅对一种语言进行评级的情况下。它是比较语言的常用轴,在这种情况下,强类型和弱类型会获得更多含义,但重要的是要了解没有像静态和动态这样的严格定义。使类型系统弱或强的原因归结为程序员能够创建类型错误的方式。

未选中的显式转换

很多人会认为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 ++是静态的并且是弱类型的,因此符合说明。


0
投票
C和C ++ ­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­­

-1
投票
C#允许用户定义隐式转换,因此它符合您对“静态”和“弱”的定义(尽管“弱”是有界的。]
© www.soinside.com 2019 - 2024. All rights reserved.