类型安全与静态类型?

Posted

技术标签:

【中文标题】类型安全与静态类型?【英文标题】:Type Safe vs Static Typing? 【发布时间】:2012-10-31 23:04:07 【问题描述】:

如果一种语言是类型安全的,这是否意味着人们可以自动假定它是静态类型的,因为您必须在编译时检查类型?

【问题讨论】:

【参考方案1】:

例如,C 是静态类型的并且不是类型安全的,而 Haskell 是静态类型的并且是类型安全的。大多数(全部?)动态类型语言都是类型安全的,因为它们可以在运行时检查类型以确保它们是正确的。此外,这些语言假设由于您选择包含运行时类型信息会导致性能损失,因此您希望尽可能有效地使用该信息,因此通常不允许将一块内存解释为错误的类型。

动态类型语言有一个额外的类型安全措施,即强制。例如,如果你在javascript中输入[] + [],它会看到+的操作数是数组,不能直接添加,所以会将它们都转换为字符串,得到""的结果(空字符串)。

某些语言,如 javascript,通常会将其他内容强制转换为字符串,而 php 例如会coerce strings to numbers to compare them。

编辑:类型安全意味着不允许将持有 A 类型的内存块解释为 B 类型。作为类型不安全的示例,C++ 有 reinterpret_cast operator,这意味着“将任何东西转换为其他任何东西即使这样做没有意义。”例如,

float a = 6.2;
int b = reinterpret_cast<int>(a);
//b now contains some form of garbage

有关类型安全的更完整说明,请参阅this answer。

【讨论】:

感谢您的回复,不过我有一个问题。如果您只在运行时进行类型检查(动态语言),它们怎么能是类型安全的?也许我对类型安全的定义有误,你能详细说明你的答案吗?【参考方案2】:

我会犹豫是否将动态类型语言称为类型安全,但它会在运行时严格检查类型,因为运行时可能为时已晚,无法对错误采取任何措施!

你可以称这种语言为强类型,但我不会称它为类型安全的。

在编译时捕获错误让您有机会修复它...

有关类型安全语言的一个很好的示例,请查看 SPARK。

在 SPARK 中,从数组末尾开始索引是一个类型错误(每个数组的索引都有一个新类型,而您的值与该类型不兼容)

您通常会在编译程序之前证明没有此类错误...

【讨论】:

以上是关于类型安全与静态类型?的主要内容,如果未能解决你的问题,请参考以下文章

Java中静态类型检查是如何进行的

非类类型表达式的静态与动态类型之间的区别

c++ 类包含一个与自身类型相同的静态成员。为啥是这种模式?

类的静态成员是不是可以与 C++ 中它所属的类具有相同的类型

JPA criteria 查询:类型安全与面向对象

如何以与静态类型检查兼容的方式实现接口?