有人能告诉我什么是强类型和弱类型,哪个更好吗?(涉及IT技术)

40

有人能告诉我什么是强类型和弱类型,哪种更好吗?


2
参见:https://dev59.com/03E95IYBdhLWcg3wWMdQ,https://dev59.com/MnI95IYBdhLWcg3w1BlN - outis
这里的大多数答案都是不正确的。请参见:https://dev59.com/03E95IYBdhLWcg3wWMdQ - darksky
8个回答

53

理论方面的答案已经解决了,但实践似乎被忽视了...

强类型意味着你不能在一个期望使用另一种类型变量的地方使用一个类型的变量(或有限制这样做)。弱类型意味着你可以混合使用不同类型。例如,在PHP中,你可以混合使用数字和字符串,PHP不会抱怨,因为它是一门弱类型语言。

$message = "You are visitor number ".$count;

如果它是强类型的,你就需要将$count从整数转换为字符串,通常使用转换操作符:

$message = "you are visitor number ".(string)$count;

...或者一个函数:

$message = "you are visitor number ".strval($count);

就哪种更好这个问题而言,那是主观的。支持强类型变量的人会告诉你,它有助于避免某些错误和/或错误,并帮助传达变量的用途等。他们还会告诉你,支持弱类型变量的人将称强类型变量为“不必要的语言废话,因为常识会让它变得毫无意义”,或类似的东西。作为一个支持弱类型变量的人,我得说他们了解我的想法...但我的也一样,可以将它放在字符串中 :)


16
“而且 能把它放到一个字符串中。”很好。对于原力的弱势方+1。 - annakata
2
强类型意味着你不能在期望另一种类型的变量时使用一种类型的变量。强/弱并不是关于变量,而是关于值。我认为你应该说:"强类型意味着你不能在期望另一种类型的时使用一种类型的值。" - Paul Biggar
2
你混淆了静态类型强类型。"传达变量的目的"是静态类型。"不必要的语言废话"也是静态类型。避免错误在很大程度上是静态类型,但强类型在这方面也有帮助,因此得分一半。 - Paul Biggar
@Paul:我认为“传达变量的目的”是良好的命名。一个名为interest_rate(或interestRate$interest_rate或者你想要如何大写/空格它)的变量,无论它是强类型还是弱类型、静态还是动态,都能清楚地传达其目的。 - Dave Sherohman
Java允许您将数字(或任何对象)连接到字符串中,尽管它的类型相当强(请参见我在此方面的回答)。我同意Paul的观点,您似乎更多地谈论静态类型,但即使是这样,您也可以隐式定义字符串连接(就像Java一样)。但这仍然是一个坏主意;-)字符串插值更加美观和可控:“您是第${count}位访问者。” - Peter Becker

14

“强类型”和它的相反概念“弱类型”在意义上有些含糊,部分原因是因为什么被认为是“强”取决于你问谁。例如,不同的作者曾经把C语言称为“强类型”和“弱类型”,这实际上取决于你要比较什么。

一般来说,如果一个类型系统可以表达与另一个系统相同的约束条件并且更多,那么该类型系统应该被认为更强。但是往往两个类型系统无法进行比较,因为一个可能具有另一个缺乏的特性,反之亦然。任何关于相对强度的讨论都取决于个人口味。

拥有更强的类型系统意味着编译器或运行时将报告更多错误,这通常是一件好事,尽管这可能需要手动提供更多类型信息,这可能被认为是不值得的努力。我会说,“强类型”通常更好,但你必须考虑代价。

还要注意,“强类型”经常被错误地用于表示“静态类型”甚至是“显式类型”。 “静态类型”意味着在编译时进行类型检查,“显式类型”意味着类型被明确声明。 显式类型可能是使类型系统更强大的最常见方式(例如Java),但你也可以通过其他方式添加强度,比如类型推断。


5
我想重申弱类型和动态类型是不同的。这篇文章写得很好,如果你对强、弱、静态和动态类型系统之间的区别不确定,我一定会推荐你阅读它。它比一个简短的回答更详细地说明了这些区别,并且有一些非常启发性的例子。请参考http://en.wikipedia.org/wiki/Type_system

4

强类型是现代编程语言中最常见的类型模型。这些语言具有一个简单的特性 - 在运行时了解类型值。我们可以说,强类型语言防止在两种或更多不同类型之间混合操作。以下是Java的示例:

String foo = "Hello, world!";
Object obj = foo;

String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error

前面的例子在程序执行到代码的最后一行时能够正常工作,但是由于Java是强类型语言,因此将抛出ClassCastException。

当我们谈论弱类型语言时,Perl是其中之一。下面的例子展示了Perl如何毫无问题地混合使用两种不同类型。

$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a

我希望你会发现这很有用, 谢谢。

2
这篇文章很棒:http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html。当我在研究类似问题时,这篇文章为我解决了很多问题,希望其他人也会发现它有用。
强类型和弱类型:
可能最常见的类型系统分类方式是“强类型”或“弱类型”。这是不幸的,因为这些词几乎没有任何意义。在有限的情况下,可以将两种具有非常相似类型系统的语言进行比较,并指定其中一种具有更强的系统。除此之外,这些词毫无意义。
静态类型和动态类型:
这几乎是唯一具有真正意义的类型系统常见分类。事实上,它的重要性经常被低估[...] 动态类型系统和静态类型系统是两个完全不同的东西,其目标部分重叠。
静态类型系统是编译器检查源代码并为语法片段分配标签(称为“类型”),然后使用它们推断程序行为的机制。动态类型系统是编译器生成代码以跟踪程序使用的数据类型(巧合的是,也称为其“类型”)的机制。在这两个系统中使用相同的“类型”一词当然不是完全巧合的;但最好将其理解为具有某种弱的历史意义。试图找到“类型”在这两个系统中真正意味着相同事物的世界观会导致极大的混乱。它们并不相同。
显式/隐式类型:
当使用这些术语时,它们指的是编译器将推理程序部分的静态类型的程度。所有编程语言都对类型进行某种形式的推理。有些比其他的更多。ML和Haskell具有隐式类型,因为不需要(或者根据使用的语言和扩展名很少)类型声明。Java和Ada具有非常明确的类型,人们经常声明事物的类型。与C和C++相比,以上所有语言都具有(相对而言)强的静态类型系统。

1
这个很准确。 - isekaijin

1

语言中的强/弱类型与类型转换的难易程度有关:

例如,在Python中:

str = 5 + 'a' 
# would throw an error since it does not want to cast one type to the other implicitly.

就 C 语言而言:

int a = 5;
a = 5 + 'c';
/* is fine, because C treats 'c' as an integer in this case */

因此,从这个角度来看,Python比C更加强类型化。

0
也许这可以帮助您理解强类型和弱类型......。 强类型: 它尽早检查变量的类型,通常在编译时进行。它防止了不匹配类型之间的混合操作。
强类型编程语言是指:
  • 所有变量(或数据类型)在编译时都已知
  • 严格执行类型规则(不能将字符串用于期望整数的地方)
  • 所有违反类型规则的异常都会导致编译时错误
弱类型: 而弱类型是尽可能延迟系统类型检查,通常到运行时才进行。在这种情况下,您可以混合使用类型而不需要显式转换。
“弱类型”编程语言只是指不是强类型的编程语言。 哪种更好 取决于您想要什么。对于脚本和好东西,通常希望使用弱类型,因为您希望尽可能少地编写代码。在大型程序中,强类型可以减少编译时的错误。

-2

弱类型意味着您不指定变量的类型,而强类型则意味着您为每个变量提供严格的类型。

两者都有其优点,弱类型(或常称为动态类型)更灵活,需要程序员编写的代码较少。另一方面,强类型需要开发人员进行更多的工作,但是作为回报,它可以在编译代码之前警告您许多错误。动态类型可能会延迟发现这些简单问题直到执行代码。

根据手头的任务,弱类型可能比强类型更好,或反之亦然,但这主要是一种口味问题。弱类型通常用于脚本语言,而强类型则用于大多数编译语言。


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