如果一种语言是类型安全的,这是否意味着人们可以自动假定它是静态类型的,因为您必须在编译时检查类型?
2 回答
例如,C 是静态类型的,不是类型安全的,而 Haskell 是静态类型的,类型安全的。大多数(全部?)动态类型语言都是类型安全的,因为它们可以在运行时检查类型以确保它们是正确的。此外,这些语言假设由于您选择包含运行时类型信息会导致性能损失,因此您希望尽可能有效地使用该信息,因此通常不允许将一块内存解释为错误的类型。
动态类型语言有一个额外的类型安全措施,那就是强制。例如,如果您输入[] + []
javascript,它将看到操作数+
是数组,不能直接添加,因此会将它们都转换为字符串,并给出""
(空字符串)的结果。
一些语言,如 javascript,通常会将其他内容强制转换为字符串,而 PHP 例如会将字符串强制转换为数字以进行比较。
编辑:类型安全意味着不允许将持有 A 类型的内存块解释为 B 类型的东西。作为类型不安全的一个例子,C++ 有reinterpret_cast
operator,这意味着“将任何东西转换为其他任何东西,即使它没有”这样做没有意义。” 例如,
float a = 6.2;
int b = reinterpret_cast<int>(a);
//b now contains some form of garbage
有关类型安全的更完整解释,请参阅此答案。
我会犹豫是否将动态类型语言称为类型安全,但它在运行时会严格检查类型,因为运行时可能为时已晚,无法对错误做任何事情!
你可以有理由称这种语言为强类型,但我不会称它为类型安全的。
在编译时捕获错误使您有机会修复它...
有关类型安全语言的一个很好的示例,请查看 SPARK。
在 SPARK 中,对数组末尾进行索引是一种类型错误(每个数组的索引都有一个新类型,并且您有一个与该类型不兼容的值)
您通常会在编译程序之前证明没有此类错误...