为什么类型检查很耗费资源?

3

我听说动态类型语言的一个大问题是类型检查非常慢。但为什么会慢呢?使用运行时分配的可能会改变的类型,导致计算效率大幅降低的计算机科学原理是什么?

1个回答

14
动态类型语言必须在代码运行时进行类型检查,虽然它们有时可以编译,但为了合理的性能表现,它们需要削减许多角落。运行时检查的一个显著缺点是,如果类型无效,则解释器只能抛出异常或停止执行。
因此,它们经常试图强制转换类型以防止异常,即使可能不希望这样做。在Python中,很常见发现简单的整数除法意味着我的用户输出突然充满了“2.0”,因为我没有明确地转换回int。
计算机科学的基本原则是,类型检查是一种非常繁重的算法。对于每个调用的函数,所有涉及的类型都必须进行验证(或强制转换,这可能是另一个函数调用),并且必须在之后更新类型信息。在运行时,您只能承担简单的类型系统和极少量的优化。相比之下,编译器可以利用即使是弱类型系统来优化您的低效算法。
静态类型语言通常被编译,动态类型语言通常被解释。这是因为如果一种语言被设计用于编译器,将类型检查的责任交给编译器是毫不费力的选择,以便您的代码将更加优化,不需要在运行时管理类型。您需要在运行时携带的内容越少,代码执行速度就越快。
最终,这意味着为解释器设计的语言无法承担编译器可以承担的类型级别。除了具有较少的自由度以利用类型信息进行优化-影响性能之外,它们还必须在运行时携带和修改类型信息-影响性能。较弱的类型系统还会引入许多类型安全问题。
当然,也有许多情况下弱类型是可取的。动态语言通常充当脚本编写的角色;它们编写迅速,易于解释,并且可以更快地移植到新平台上比编译器更快!这使它们对于将非常不同的系统粘合在一起至关重要。一份脚本可以与操作系统和其中的许多程序交互,以安排每天从您最喜欢的网站下载所有最新的猫视频。

一如既往,我强烈建议你掌握动态语言和静态语言。拥有强类型保证的同时也能获得弱类型编程的便利,这非常宝贵。成为一个代码万能者吧 :)


这是一个全面而深思熟虑的答案。感谢您的整理,非常感激! - user3325789

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接