如果一种语言是类型安全的,那么这意味着可以自动假设它是静态类型的,因为你必须在编译时检查类型吗?
答案 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中,索引数组末尾是一个类型错误(每个数组的索引都有一个新类型,并且你有一个与该类型不兼容的值)
在编写程序之前,您通常会证明没有此类错误...