根据 维基百科
计算机科学家认为一种语言是“类型安全的”,如果它不允许违反类型系统规则的操作或转换。
由于 Python 运行时检查确保类型系统规则得到满足,我们应该将 Python 视为一种类型安全的语言。
Jason Orendorff 和 Jim Blandy 在 Programming Rust 中也提出了同样的观点:
请注意,类型安全与语言是在编译时还是在运行时检查类型无关:C 在编译时检查,并且类型不安全; Python 在运行时进行检查,并且是类型安全的。
静态类型检查和类型安全的独立概念。
那是对的吗?
原文由 user8664060 发布,翻译遵循 CC BY-SA 4.0 许可协议
许多程序员会将静态类型检查等同于类型安全:
可悲的是,事情并没有那么简单。
在现实世界
例如,C 和 C++ 不是类型安全的,因为您可以通过 类型双关 来破坏类型系统。此外,C/C++ 语言规范广泛允许 未定义行为 (UB) 而不是显式处理错误,这已成为 堆栈粉碎 漏洞和 格式字符串攻击 等安全漏洞的来源。这种利用在类型安全的语言中是不可能的。 Java 的早期版本在其 泛型 中存在一个类型错误,证明它不是 完全 类型安全的。
时至今日,对于像 Python、Java、C++…这样的编程语言,仍然很难证明这些语言是 完全 类型安全的,因为它需要数学证明。这些语言非常 _庞大_,编译器/解释器的错误不断被 报告 并得到修复。
在学术界
类型安全和类型系统虽然适用于现实世界的编程,但它们的根源和定义都来自 学术界——因此对“类型安全”到底 是 什么的正式定义很困难——尤其是在谈论真正的编程语言时世界。学术界喜欢在数学上(正式地)定义称为 玩具语言的微型编程语言。只有这些语言才有可能正式证明它们是类型安全的(并证明它们的操作在逻辑上是 正确 的)。
例如,学术界努力证明 Java 是类型安全的,因此他们创建了一个名为 Featherweight Java 的较小版本,并在一篇 论文 中证明它 是 类型安全的。同样,这个 博士。 Christopher Lyon Anderson 的 论文 采用了 Javascript 的一个子集,称为 JS0 并证明它是类型安全的。
实际上假设适当的语言如 python、java、c++ 不是完全类型安全的,因为它们太大了。一个小错误很容易从裂缝中溜走,从而破坏类型系统。
概括
参考资料: http ://www.pl-enthusiast.net/2014/08/05/type-safety/ 和 https://en.wikipedia.org/wiki/Type_system