【发布时间】:2023-04-09 19:53:01
【问题描述】:
谁能告诉我强类型和弱类型是什么意思,哪个更好?
【问题讨论】:
-
这里的大多数答案都不正确。见:stackoverflow.com/questions/2351190/…
标签: prototyping static-typing dynamic-typing strong-typing weak-typing
谁能告诉我强类型和弱类型是什么意思,哪个更好?
【问题讨论】:
标签: prototyping static-typing dynamic-typing strong-typing weak-typing
这将是理论答案的照顾,但实践方面似乎被忽视了......
强类型意味着您不能在预期使用另一种类型的变量的地方使用一种类型的变量(或者这样做有限制)。弱类型意味着你可以混合不同的类型。例如,在 PHP 中,您可以混合使用数字和字符串,PHP 不会抱怨,因为它是一种弱类型语言。
$message = "You are visitor number ".$count;
如果它是强类型的,则必须将 $count 从整数转换为字符串,通常使用强制类型转换:
$message = "you are visitor number ".(string)$count;
...或者一个函数:
$message = "you are visitor number ".strval($count);
至于哪个更好,这是主观的。强类型的拥护者会告诉你,它会帮助你避免一些错误和/或错误,并帮助传达变量的用途等。他们还会告诉你弱类型的拥护者将称之为强类型“常识认为毫无意义的不必要的语言绒毛”,或类似的东西。作为弱打字组的持卡成员,我不得不说他们有我的号码......但我也有他们的,我可以把它放在一个字符串中:)
【讨论】:
interest_rate(或interestRate 或$interest_rate,或者你想要大写/空格)的变量非常清楚地传达了它的目的,无论它是强类型还是弱类型、静态还是动态。
“强类型”及其相反的“弱类型”在含义上相当弱,部分原因是什么被认为是“强”的概念可能会因您询问的对象而异。例如。 C 被不同的作者称为“强类型”和“弱类型”,这实际上取决于您将其与什么进行比较。
通常,如果一个类型系统可以表达与另一个相同的约束,甚至更多,则应该认为它更强大。但是,通常两种类型的系统是不可比较的——一种可能具有另一种缺乏的功能,反之亦然。任何关于相对优势的讨论都取决于个人喜好。
拥有更强大的类型系统意味着编译器或运行时将报告更多错误,这通常是一件好事,尽管它可能以必须手动提供更多类型信息为代价,这可能被认为是努力而不是值得。我会声称“强类型”通常更好,但您必须考虑成本。
认识到“强类型”通常被错误地使用而不是“静态类型”甚至“清单类型”也很重要。 “静态类型”意味着在编译时进行类型检查,“清单类型”意味着类型被显式声明。清单类型可能是使类型系统更强大的最著名方法(想想 Java),但您可以通过类型推断等其他方式来增加强度。
【讨论】:
我想重申,弱类型不与动态类型相同。
这是一篇写得很好的关于该主题的文章,如果您不确定强、弱、静态和动态类型系统之间的区别,我绝对建议您阅读它。它详细说明了差异,比简短回答中的预期要好得多,并且有一些非常有启发性的例子。
【讨论】:
强类型是现代编程语言中最常见的类型模型。这些语言有一个简单的特性——在运行时了解类型值。我们可以说强类型语言防止两种或多种不同类型之间的混合操作。下面是一个 Java 示例:
String foo = "Hello, world!";
Object obj = foo;
String bar = (String) obj;
Date baz = (Date) obj; // This line will throw an error
前面的示例将运行良好,直到程序遇到将引发 ClassCastException 的最后一行代码,因为 Java 是强类型编程语言。
当我们谈论弱类型语言时,Perl 就是其中之一。下面的例子展示了 Perl 如何在混合两种不同类型时没有任何问题。
$a = 10;
$b = "a";
$c = $a . $b;
print $c; # returns 10a
我希望你觉得这很有用,
谢谢。
【讨论】:
这篇文章很好读:http://blogs.perl.org/users/ovid/2010/08/what-to-know-before-debating-type-systems.html在研究试图回答类似问题时为我清理了很多东西,希望其他人也觉得它有用。
强类型和弱类型:
类型系统最常见的分类方式可能是“强” 或“弱”。这是不幸的,因为这些话几乎没有 完全的意思。在有限的范围内,可以比较两个 具有非常相似类型系统的语言,并指定一种具有 这两个系统中的强者。除此之外,这些话毫无意义 完全没有。
静态和动态类型
这几乎是类型系统的唯一常见分类 这有真正的意义。事实上,它的意义在于 经常被低估的 [...] 动态和静态类型系统是 两个完全不同的东西,它们的目标恰好是部分 重叠。
静态类型系统是编译器检查的一种机制 源代码并将标签(称为“类型”)分配给 语法,然后使用它们来推断程序的 行为。动态类型系统是一种机制,编译器通过该机制 生成代码以跟踪数据类型(巧合的是, 称为程序使用的“类型”)。同一个词的使用 当然,这两个系统中的“类型”并不完全是 巧合;但最好理解为有一种弱 历史意义。试图找到一个非常混乱的结果 世界观中,“类型”在两者中确实意味着相同的东西 系统。没有。
显式/隐式类型:
当使用这些术语时,它们指的是 编译器将推理程序部分的静态类型。全部 编程语言对类型有某种形式的推理。一些 比别人拥有更多。 ML 和 Haskell 具有隐式类型,因为没有 (或很少,取决于使用的语言和扩展)类型 需要声明。 Java 和 Ada 有非常明确的类型,并且 一是不断声明事物的类型。以上都有 (例如,相对于 C 和 C++)强静态类型 系统。
【讨论】:
语言中的强/弱类型与您进行类型转换的难易程度有关:
例如在 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 强(从这个角度来看)。
【讨论】:
也许这可以帮助你理解强类型和弱类型......
强类型:它会尽快检查变量的类型,通常是在编译时。它可以防止不匹配类型之间的混合操作。
一种强类型的编程语言是这样一种语言:
弱类型化:虽然弱类型化会尽可能晚地延迟检查系统类型,通常延迟到运行时。在这种情况下,您可以混合类型而无需显式转换。
“弱类型”编程语言只是一种非强类型的编程语言。
哪个是首选取决于你想要什么。对于脚本和好东西,您通常需要弱类型,因为您希望编写尽可能少的代码。在大型程序中,强类型可以减少编译时的错误。
【讨论】:
弱类型意味着您不指定变量的类型,而强类型意味着您为每个变量指定严格类型。
每个都有其优点,弱类型(或动态类型,通常称为),更灵活,需要程序员的代码更少。另一方面,强类型需要开发人员做更多的工作,但作为回报,它可以在编译代码时提醒您许多错误,然后再运行它。动态类型可能会延迟这些简单问题的发现,直到代码被执行。
根据手头的任务,弱类型可能比强类型更好,反之亦然,但这主要是个人喜好问题。弱类型通常用于脚本语言,而强类型则用于大多数编译语言。
【讨论】: