强类型语言的关键方面是什么?

18
什么使一种编程语言成为强类型语言?我正在寻找强类型语言的最重要方面。

昨天我问了PowerShell是否是强类型语言,但没有人能就“强类型”这个定义达成一致,所以我想要澄清这个定义。

可以自由地链接到维基百科或其他来源,但不要直接剪贴粘贴回答。


可能差异会回答你的问题。强类型语言和静态类型语言有什么区别?https://dev59.com/SHE85IYBdhLWcg3wnU4d - akashchandrakar
8个回答

29

"强类型"这个术语没有统一的定义。

在争吵中它很受欢迎,因为每当有人被证明是错的时候,他们可以重新定义它来表示任何他们想要的意思。除此之外,这个术语没有实际用途。

最好不要使用这个术语,或者如果你要使用它,先严格定义它。如果你看到别人使用它,请问他们定义这个术语的含义。

每个人都有自己的定义。我见过的一些定义如下:

  • 强类型 = 静态类型
  • 强类型 = 显式类型
  • 强类型 = 名义类型
  • 强类型 = 有类型
  • 强类型 = 没有隐式类型转换,只有显式类型转换
  • 强类型 = 没有任何类型转换
  • 强类型 = 我理解的 / 弱类型 = 我不理解的
  • 强类型 = C++ / 弱类型 = 其他所有语言
  • 强类型 = Java / 弱类型 = 其他所有语言
  • 强类型 = .NET / 弱类型 = 其他所有语言
  • 强类型 = 我的编程语言 / 弱类型 = 你的编程语言

在类型理论中,存在一个类型系统比另一个类型系统更加"强"的概念。特别地,如果存在表达式e1被类型系统T1接受,但被类型系统T2拒绝,则T2被称为比T1更加"强"。这里有两个重要的事情需要注意:

  1. 这是一种比较而不是绝对的:没有"强"或"弱",只有"更强"和"更弱"
  2. 这个术语本身并没有含义; 更强大并不意味着更好

我绝对不是在恶意挑衅,只是想澄清这个术语。 - Chris Sutton
抱歉,我并不是要暗示那个意思。我所说的“你”指的是“某个未定义的群体”。我将编辑我的回答中的那一部分。再次请原谅这个误解,英语不是我的母语。 - Jörg W Mittag
另一种方法可能是:强类型 = 女性 / 弱类型 = 男性或反之 :) - Zuuum

11
根据撰写了《类型和编程语言》和《高级类型和编程语言》的 B.C. Pierce 的说法:
我花了几周时间来梳理“强类型”,“静态类型”,“安全”等术语,发现这非常困难… 这些术语的用法是如此不同,以至于它们几乎没有用处。
所以难怪你的同事们持不同意见。
我会选择最简单的答案:如果可以连接字符串和整数而无需转换,则它不是强类型。
编辑:如评论中所述,Java 就是这样做的 :-(

你的例子是迄今为止最好的展示强类型和弱类型概念的范例。 - Hans Sjunnesson
你的意思是 "那么它不是强类型语言" 吗?因为自动变量强制转换不是我在任何强类型语言中看到的特性。 - John Millikin
你是在暗示Java不是强类型语言,因为你可以写"Hi" + 5吗?这听起来有问题。此外,这也意味着Scala也不是强类型语言,这很有趣,因为每个人都抱怨它太过严格了。 - Blaisorblade
1
哎呀,我的获取声望的邪恶计划正在破灭。 - Bite code
源自哪里?我找到的最好的是https://en.wikipedia.org/wiki/Talk%3AStrong_typing#Pierce_quotation。 - Blaisorblade
显示剩余2条评论

7
重要的是要记住静态类型和强类型之间的区别。强类型语言仅意味着一旦赋值,给定变量将始终表现为某种类型,直到重新分配。根据定义,像Java和C#这样的静态类型语言是强类型的,但许多流行的动态语言如Ruby和Python也是强类型的。
因此,在强类型语言中,
x = "5"

x将始终是一个字符串,永远不会是一个整数。

在某些弱类型语言中,您可以执行以下操作:

x = "5"
y = x + 3
// y is now 8

4
C 可以说是静态、弱类型语言。这很奇怪,但也是可能的。 - troelskn

6

人们常将静态类型与强类型混淆。静态类型意味着“字符串就是字符串就是字符串”。强类型意味着“一旦你将其定义为字符串,它就会被视为字符串,直到重新分配为其他类型”。

编辑:我看到有人在此之后指出了这一点 :)


4
我听到有人在采访中说过(我想这是C#和Turbo Pascal的Anders Hejlsberg),强类型并不是一种开关,某些语言比其他语言拥有更强的类型系统。
此外,在静态和动态类型之间也存在很多混淆,静态类型语言将类型分配给变量,而动态语言则将类型分配给存储在变量中的对象。
请参考维基百科获取更多信息,但不要期望得到确定的答案: http://en.wikipedia.org/wiki/Strongly_typed_language

1

“strongly typed”这个词完全毫无意义。它没有实际含义,从来也没有。即使某些所谓的定义是准确的,我也看不出为什么有必要去区分;为什么要知道、讨论或争论一门语言是否是“strongly typed”(不管那是什么意思)呢?

这与“Web 2.0”或“OEM”这些术语非常相似,它们也没有实际意义。

有趣的是考虑这些短语是如何开始并在日常交流中扎根的。


如果你说的是“静态类型”,我会同意你的观点,除了最弱的脚本语言外,所有代码都是强类型的。 - leppie
讨论静态类型与动态类型、类型安全与不安全、显式类型与隐式类型(类型推断)等是有意义的。仅仅“强类型”这个术语并没有一个清晰的定义。 - Blaisorblade

1

强类型意味着你声明变量时需要指定其类型,如果你试图在没有进行强制转换的情况下将该变量转换为另一种类型,编译器会抛出错误。

例如(以Java为例):

int i = 4;
char s = i; // Type mismatch: cannot convert from int to char

只有在静态类型的情况下,它才是“编译器”。在强动态类型的情况下,将由运行时抛出异常/错误/任何其他内容。请参见http://www.artima.com/weblogs/viewpost.jsp?thread=7590 - Suma
3
这是错误的。无论你是否声明类型,都与强类型无关,这是显式和隐式类型的问题。另外,编译器或运行时捕获类型错误的问题是静态 vs. 动态类型的问题,也与强类型无关。 - Jörg W Mittag

1

静态类型语言是指变量需要在使用之前进行声明的语言。而动态类型语言是指变量可以随时使用,即使它们没有被声明。唯一的条件是必须在使用之前对它们进行初始化。

现在,让我们来谈谈强类型语言。在这种语言中,变量具有一种类型,它们始终是该类型。不能将其分配给另一种类型的值。而弱类型语言是指变量没有类型。可以将任何类型的值赋给它们。

例子: Java是一种既是静态类型又是强类型语言。它是静态类型的,因为在使用之前必须声明变量。它是强类型的,因为特定类型int的变量始终保存整数值。不能将boolean分配给它们。

Powershell 是一种动态类型弱类型语言。它是动态类型的,因为变量在使用之前不需要声明。它是弱类型的,因为变量可能在某个时间点保存一个类型的值,而在另一个时间点保存另一种类型的值。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接