输入安全与静态打字?

12 language-agnostic programming-languages terminology

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

Dan*_*Dan 12

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

动态类型语言还有一种额外的类型安全措施,即强制措施.例如,如果你键入[] + []javascript,它将看到操作数+是数组而不能直接添加,因此将它们都转换为字符串,给出""(空字符串)的结果.

有些语言,比如javascript,通常会将其他东西强制转换为字符串,而PHP则会将字符串强制转换为数字以进行比较.

编辑:类型安全意味着不允许将存储类型A的内存块解释为类型B的类型.作为类型不安全的示例,C++具有reinterpret_cast运算符,这意味着"将任何内容转换为任何其他东西,即使它没有"这样做是有道理的." 例如,

float a = 6.2;
int b = reinterpret_cast<int>(a);
//b now contains some form of garbage
Run Code Online (Sandbox Code Playgroud)

有关类型安全的更完整说明,请参阅此答案.