强类型语言的关键方面是什么?
是什么使语言成为强类型?我正在寻找一种强类型语言的最重要方面。
昨天我问PowerShell是否为强类型,但没人同意"强类型"的定义,因此我想澄清一下定义。
随意链接到Wikipedia或者其他来源,但不要只是剪切并粘贴答案。
解决方案
强类型意味着我们声明某种类型的变量,并且如果我们尝试将该变量转换为另一种类型而不进行转换,则编译器将抛出嘶嘶作风。
示例(在Java中,请注意):
int i = 4; char s = i; // Type mismatch: cannot convert from int to char
关键是要记住,静态类型和强类型之间是有区别的。强类型语言只是意味着一旦被分配,给定变量将始终表现为某种类型,直到被重新分配为止。根据定义,静态类型的语言(例如Java和Care)是强类型的,但是许多流行的动态语言(例如Ruby和Python)也是如此。
所以用强类型的语言
x = "5"
x将始终是字符串,并且永远不会是整数。
在某些弱类型语言中,我们可以执行以下操作
x = "5" y = x + 3 // y is now 8
我在采访中听到有人说过(我认为这是Cand turbo pascal的声名远扬的Anders Hejlsberg),强类型并不是一成不变的,某些语言比其他语言具有更强大的类型系统。
在强类型,弱类型,静态类型和动态类型之间还存在很多混淆,其中静态类型的语言将类型分配给变量,而动态语言将类型赋予存储在变量中的对象。
尝试使用Wikipedia以获得更多信息,但是不要期望得出结论性的答案:
http://en.wikipedia.org/wiki/Strongly_typed_language
人们将静态类型与强类型混淆。静态类型的意思是"字符串是字符串就是字符串"。强类型表示"一旦将其设为字符串,它将被视为字符串,直到将其重新分配为其他名称为止"。
编辑:我看到别人确实指出了这一点:)
据卑诗省皮尔斯(Pierce),他写了《类型和编程语言以及高级类型和编程语言》:
I spent a few weeks trying to sort out the terminology of "strongly typed," "statically typed," "safe," etc., and found it amazingly difficult... The usage of these terms is so various as to render them almost useless.
因此,难怪同事为什么会不同意。
我会给出最简单的答案:如果可以将字符串和int连接起来而不进行强制转换,则它的类型不是强类型。
编辑:正如评论中所述,Java只是这样做:-(
术语"强类型"没有公认的定义。
它在烈火战中提出了"伟大"的论据,因为只要有人被证明是错的,他们就可以将其重新定义为想要表达的意思。除此之外,该术语没有任何实际目的。
最好不要使用该术语,或者,如果我们使用它,请首先严格定义它。如果看到其他人使用它,请让他定义该术语。
每个人都有自己的定义。我看到的一些是:
- 强类型=静态类型
- 强类型=显类型
- 强类型=标称类型
- 强类型=类型
- 强类型=没有隐式类型转换,只有显式类型转换
- 强类型=完全没有类型转换
- 强类型=我了解/弱类型=我不了解
- 强类型= C ++ /弱类型=其他
- 强类型= Java /弱类型=其他
- 强类型= .NET /弱类型=其他
- 强类型=我的编程语言/弱类型=编程语言
在类型理论中,存在一种类型系统强于另一种类型的概念。特别是,如果存在一个表达式" e1",使得它被类型系统" T1"接受,但被类型系统" T2"拒绝,则称" T2"比" T1"更强。这里有两件重要的事情要注意:
- 这是一个比较,不是绝对的:没有强者或者弱者,只有强者和弱者
- 该术语没有暗示任何价值;更强并不意味着更好
"强类型"一词完全是完全荒谬的。它没有任何意义,也从未如此。即使某些要求保护的定义是准确的,我也看不出区别的原因。为什么知道,讨论或者辩论某种语言是否为强类型(无论意味着什么)很重要?
这与" Web 2.0"或者" OEM"术语非常相似,后者也没有实际含义。
这些短语是如何开始的,并在日常交流中扎根,这是值得考虑的。