为什么动态类型语言会变慢?

时间:2009-04-17 17:35:07

标签: programming-languages

与静态类型语言相比,是什么使得加速动态类型语言变得困难。 换句话说,静态类型语言的固有属性是什么使它们易于优化执行速度?

6 个答案:

答案 0 :(得分:25)

当访问静态类型语言中的属性/方法时,查找通常可以简化为静态函数地址。即使在虚拟方法较慢的情况下,查找只是从vtable读取偏移量。

在动态语言中,名称基于字符串。想查找foo.bar?在局部变量哈希表中查找foo,然后在bar的哈希表中找到foo。在一些动态语言中,如Python和Ruby,可能会有额外的查找/方法调用来实现动态生成的属性。

所有这些查找非常很难快速完成。 Python拥有世界上调整最好的哈希表实现之一,并且JavaScript已经投入了数百万美元的研究资金来快速实现。这些策略有效 - 将Chrome的JavaScript与IE 5进行比较,看看有多少 - 但它们比静态生成函数调用要困难得多。


我应该提到语言的“动态”程度可能会有所不同。 Python有几种不同的方式可以与变量查找进行交互,这在某些情况下很好,但是很难进行优化。其他动态语言,例如Common Lisp和Smalltalk,可以在许多用例中与静态语言均匀竞争,因为动态查找/修改更受控制。

答案 1 :(得分:12)

看看这个python示例:

def fact(n):
    if n==0:
        return n
    return n*fact(n-1)

什么是n?这是一个数字吗?它是一个字符串?它是你之前定义的一个类吗? 编译器无法知道它将获得什么输入。您必须在运行时进行大量检查,这意味着您正在为简单操作执行更多隐式工作。

答案 2 :(得分:10)

只有知道变量的确切类型,才能执行某些类型的编译时优化。

动态类型语言通常还添加了逻辑来确定类型并确保该类型的值正确。

答案 3 :(得分:5)

动态类型语言必须在运行时进行所有检查,因为类型可能会在执行过程中发生变化。

静态类型语言在编译期间解析所有类型,因此预先消耗成本一次。

这是动态类型语言通常较慢的主要原因。但还有其他事情要考虑。很大程度上取决于编译器或解释器,GC实现,调度表布局和查找算法以及其他优化。

这一切都取决于实现:动态类型语言比编译语言更快,只需要做更多的工作就可以完成。

答案 4 :(得分:1)

你的问题有点过时,因为动态类型的语言实际上并不慢。许多例子可能在实践中,但其他例子很快(其中快速意味着“与c相当”或类似的东西,参见普通的lisp)。

许多动态语言在VM上运行甚至被解释,这可能导致可以避免的减速。在某种程度上,静态语言编译器(或那些使得正确的承诺不是动态的动态的)在完全动态的情况下是不可能的优化。

但是,如果您正在考虑例如,python和c ++之间的差异,那么实际上问题不在于动态与静态。

答案 5 :(得分:0)

这是因为静态类型语言通常被编译为机器代码,而动态类型语言在大多数情况下由解释器运行。