【发布时间】:2010-09-12 09:24:31
【问题描述】:
是什么让语言成为强类型的?我正在寻找强类型语言最重要的方面。
昨天我问PowerShell是否是强类型的,但没有人同意“强类型”的定义,所以我想澄清一下这个定义。
请随意链接到维基百科或其他来源,但不要只是剪切和粘贴以获得您的答案。
【问题讨论】:
-
可能差异会回答你的问题stackoverflow.com/questions/2690544/…
标签: strong-typing
是什么让语言成为强类型的?我正在寻找强类型语言最重要的方面。
昨天我问PowerShell是否是强类型的,但没有人同意“强类型”的定义,所以我想澄清一下这个定义。
请随意链接到维基百科或其他来源,但不要只是剪切和粘贴以获得您的答案。
【问题讨论】:
标签: strong-typing
“强类型”一词没有公认的定义。
它在激烈的争吵中提出了一个“伟大”的论点,因为每当有人被证明是错误的,他们可以重新定义它以表示他们想要的任何意思。除此之外,该术语没有任何实际用途。
最好不要使用该术语,或者,如果您使用它,请先严格定义它。如果您看到其他人使用它,请让他定义该术语。
每个人都有自己的定义。我见过的一些是:
在类型理论中,存在一种类型系统比另一种类型系统更强的概念。特别是,如果存在表达式e1,它被类型系统T1 接受,但被类型系统T2 拒绝,那么T2 被称为更强比T1。这里有两点需要注意:
【讨论】:
根据 B.C. Pierce,写了《类型和编程语言》和《高级类型和编程语言》的人:
我花了几个星期试图解决 “强类型”的术语 “静态类型”、“安全”等,以及 发现它非常困难...... 这些术语的用法多种多样 使它们几乎无用。
所以难怪你的同事为什么不同意。
我会选择最简单的答案:如果你可以在不强制转换的情况下连接一个字符串和一个 int,那么它就不是强类型的。
编辑:如 cmets 中所述,Java 就是这样做的 :-(
【讨论】:
关键是要记住静态类型和强类型之间是有区别的。强类型语言只是意味着一旦分配,给定变量将始终表现为某种类型,直到重新分配。根据定义,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 是一种动态类型以及弱类型语言。它是动态类型的,因为变量在使用之前不需要声明。它是弱类型的,因为变量可能在某个时间点保持一种类型的值,而在不同的时间点保持另一种类型的值。
【讨论】: