我一直在阅读
与
我知道它们是不同的东西(也讨论过here)所以我一直在考虑这种语言的示例语言:
所以我的问题是,那里有任何静态弱类型的语言吗? (我想如果不是这样的话就没有意义)。我的理解/例子也是正确的吗?
答案 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#允许用户定义的隐式转换,因此它适合您的“静态”和“弱”的定义(尽管“弱点”是有限的)。