输入安全与静态打字?

时间:2012-11-12 14:05:57

标签: language-agnostic programming-languages terminology

如果一种语言是类型安全的,那么这意味着可以自动假设它是静态类型的,因为你必须在编译时检查类型吗?

2 个答案:

答案 0 :(得分:11)

例如,

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

动态类型语言还有一种额外的类型安全措施,即强制。例如,如果您在javascript中键入[] + [],它将看到+的操作数是数组,无法直接添加,因此会将它们都转换为字符串,结果为{{1 (空字符串)。

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

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

""

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

答案 1 :(得分:1)

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

你可以合理地称这种语言为强类型,但我不称其为类型安全的。

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

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

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

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