15

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

4

2 回答 2

15

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

动态类型语言有一个额外的类型安全措施,那就是强制。例如,如果您输入[] + []javascript,它将看到操作数+是数组,不能直接添加,因此会将它们都转换为字符串,并给出""(空字符串)的结果。

一些语言,如 javascript,通常会将其他内容强制转换为字符串,而 PHP 例如会将字符串强制转换为数字以进行比较

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

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

有关类型安全的更完整解释,请参阅此答案

于 2012-11-12T14:08:44.253 回答
1

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

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

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

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

在 SPARK 中,对数组末尾进行索引是一种类型错误(每个数组的索引都有一个新类型,并且您有一个与该类型不兼容的值)

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

于 2012-11-15T13:57:40.050 回答