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

时间:2008-09-23 14:34:09

标签: strong-typing

什么使语言强类型化?我正在寻找强类型语言最重要的方面。

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

随时链接到维基百科或其他来源,但不要只剪切和粘贴您的答案。

8 个答案:

答案 0 :(得分:26)

“强类型”一词没有达成一致的定义。

它在火焰战中成为一个“伟大的”论据,因为每当有人被证明是错误的,他们就可以重新定义它,以表达他们想要的意思。除此之外,该术语没有任何实际意义。

最好不要使用该术语,或者,如果您使用该术语,请先严格定义。如果您看到其他人使用它,请让他定义术语。

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

  • 强类型=静态类型
  • 强类型=明确键入
  • 强类型=名义上键入
  • strong typed = typed
  • strong typed =没有隐式类型转换,只有显式
  • 强类型=完全没有类型转换
  • 强类型=我理解/弱类型=我不明白
  • 强类型= C ++ /弱类型=其他一切
  • 强类型= Java /弱类型=其他一切
  • 强类型= .NET /弱类型=其他一切
  • 强类型= 我的编程语言/弱类型= 您的编程语言

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

  1. 这是一个比较而非绝对的:没有,只有更强
  2. 该术语没有隐含的价值; 更强并不意味着更好

答案 1 :(得分:11)

据B.C.皮尔斯,编写“类型和编程语言以及高级类型和编程语言”的人:

  

我花了几周时间试图理清   “强类型”的术语   “静态打字”,“安全”等等   发现它非常困难......   这些术语的用法如此多样   使它们几乎无用。

所以难怪为什么你的同事不同意。

我会选择最简单的答案:如果你可以连接一个字符串和一个int而不进行强制转换,那么它就不是强类型的。

编辑:正如评论中所述,Java就是这样做的: - (

答案 2 :(得分:7)

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

所以用强类型语言

x = "5"

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

在某些弱类型语言中,您可以执行类似

的操作
x = "5"
y = x + 3
// y is now 8

答案 3 :(得分:6)

人们使用强类型进行静态输入。静态类型表示“字符串是字符串是字符串”。强类型意味着“一旦你将它作为一个字符串,它将被视为一个字符串,直到它被重新分配为不同的东西。”

编辑:我看到其他人确实指出了这一点:)

答案 4 :(得分:4)

我听到有人在接受采访时说(我认为这是C#的Anders Hejlsberg和turbo pascal成名)强打字不是开关的,有些语言的类型系统比其他语言强。

强,弱,静态和动态类型之间也存在很多混淆,其中静态类型语言为变量分配类型,动态语言为存储在变量中的对象赋予类型。

尝试使用维基百科获取更多信息,但不要指望得出确凿的答案: http://en.wikipedia.org/wiki/Strongly_typed_language

答案 5 :(得分:1)

强类型意味着您声明某个类型的变量,如果您尝试将该变量转换为另一种类型而不强制转换,则编译器会抛出一个异形。

示例(在java中介意你):

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

答案 6 :(得分:1)

“强类型”一词完全是荒谬的。它没有任何意义,也从来没有。即使一些声称的定义是准确的,我也没有看到区分原因的目的;为什么知道,讨论或辩论一种语言是否是强类型(无论可能意味着什么)是否重要?

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

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

答案 7 :(得分:1)

静态类型语言是在使用变量之前需要声明变量的语言。虽然动态类型语言是可以随时使用变量的语言,即使它们未被声明也是如此。唯一的条件是必须先将它们初始化才能使用它们。

现在,让我们来看看强类型语言。在这种语言中,变量具有类型,并且它们将始终是该类型。它们不能分配给另一种类型的值。虽然弱类型语言是变量不具备类型的语言。可以为它们分配任何类型的值。

示例: Java 静态类型以及强类型语言。它是静态类型的,因为必须先声明变量才能使用它们。它是强类型的,因为特定类型int的变量将始终保存整数值。您无法为其分配boolean

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