是什么让语言成为强类型的?我正在寻找强类型语言最重要的方面。
昨天我问PowerShell是否是强类型的,但没有人同意“强类型”的定义,所以我想澄清一下这个定义。
随意链接到维基百科或其他来源,但不要只是剪切和粘贴您的答案。
是什么让语言成为强类型的?我正在寻找强类型语言最重要的方面。
昨天我问PowerShell是否是强类型的,但没有人同意“强类型”的定义,所以我想澄清一下这个定义。
随意链接到维基百科或其他来源,但不要只是剪切和粘贴您的答案。
术语“强类型”没有公认的定义。
它在一场激烈的战争中提出了一个“伟大”的论点,因为每当有人被证明是错误的,他们可以重新定义它以表示他们想要的任何含义。除此之外,该术语没有任何实际用途。
最好不要使用该术语,或者,如果您使用它,请先严格定义它。如果您看到其他人使用它,请让他定义该术语。
每个人都有自己的定义。我见过的一些是:
在类型论中,存在一种类型系统比另一种更强大的概念。特别是,如果存在一个表达式e1
,它被类型系统接受T1
,但被类型系统拒绝T2
,则T2
说它比强T1
。这里有两件重要的事情需要注意:
According to B.C. Pierce, the guy who wrote "Types and Programming Languages and Advanced Types and Programming Languages" :
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.
So no wonder why your collegues disagree.
I'd go with the simplest answer : if you can concatenate a string and an int without casting, then it's not strongly typed.
EDIT: as stated in comments, Java just does that :-(
关键是要记住静态类型和强类型之间是有区别的。强类型语言只是意味着一旦分配,给定变量将始终表现为某种类型,直到它被重新分配。根据定义,Java 和 C# 等静态类型语言是强类型的,但许多流行的动态语言(如 Ruby 和 Python)也是如此。
所以在强类型语言中
x = "5"
x 将永远是一个字符串,永远不会是一个整数。
在某些弱类型语言中,您可以执行类似的操作
x = "5"
y = x + 3
// y is now 8
人们将静态类型与强类型混淆。静态类型意味着“字符串是字符串是字符串”。强类型意味着“一旦你把它变成一个字符串,它将被视为一个字符串,直到它被重新分配为不同的东西。”
编辑:毕竟我看到其他人确实指出了这一点:)
我在一次采访中听到有人说(我认为是 C# 的 Anders Hejlsberg 和 turbo pascal 的名声)强类型不是开启或关闭的东西,某些语言比其他语言具有更强大的类型系统。
在强类型、弱类型、静态类型和动态类型之间也存在很多混淆,其中静态类型语言将类型分配给变量,而动态语言将类型分配给存储在变量中的对象。
尝试 wikipedia 获取更多信息,但不要指望一个决定性的答案: http ://en.wikipedia.org/wiki/Strongly_typed_language
强类型意味着您声明了某种类型的变量,如果您尝试将该变量转换为另一种类型而不进行强制转换,您的编译器将抛出一个嘶嘶声。
示例(在 Java 中记住你):
int i = 4;
char s = i; // Type mismatch: cannot convert from int to char
“强类型”这个词完全没有意义。它没有任何意义,而且从来没有。即使一些声称的定义是准确的,我认为区分的原因没有任何意义;为什么了解、讨论或辩论一种语言是否是强类型(无论这可能意味着什么)很重要?
这与术语“Web 2.0”或“OEM”非常相似,它们也没有实际意义。
有趣的是,这些短语是如何开始的,并在日常交流中扎根。
静态类型语言是一种需要先声明变量才能使用的语言。虽然动态类型语言是一种可以随时使用变量的语言,即使它们没有被声明。唯一的条件是它们必须在使用之前进行初始化。
现在,让我们来看看强类型语言。在这样的语言中,变量具有类型,并且它们将始终是该类型。它们不能分配给其他类型的值。而弱类型语言是一种变量没有类型的语言。可以为它们分配任何类型的值。
示例:
Java是一种静态类型和强类型语言。它是静态类型的,因为必须先声明变量才能使用它们。它是强类型的,因为特定类型的变量int
将始终保存整数值。你不能分配boolean
给他们。
Powershell是一种动态类型和弱类型的语言。它是动态类型的,因为变量在使用之前不需要声明。它是弱类型的,因为变量可能在某个时间点保持一种类型的值,而在不同的时间点保持另一种类型的值。