代码之家  ›  专栏  ›  技术社区  ›  Surya

为什么动态类型语言很慢?

  •  14
  • Surya  · 技术社区  · 17 年前

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

    6 回复  |  直到 17 年前
        1
  •  28
  •   John Millikin    17 年前

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

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

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


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

        2
  •  12
  •   bigmonachus    17 年前

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

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

        3
  •  10
  •   Ben S    17 年前

    某些类型的编译时优化只能在变量的确切类型已知的情况下执行。

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

        4
  •  5
  •   Robert Kozak    17 年前

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

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

    这完全取决于实现:动态类型化语言可能比编译语言更快,但要完成这一点需要更多的工作。

        5
  •  1
  •   simon    17 年前

    你的问题有点离题,因为动态类型语言实际上并不慢。很多例子可能是在实践中,但其他例子是快速的(其中fast的意思是“与c相当”或类似的东西,cf common lisp)。

    但是,如果你只是想说,Python和C++之间的区别,那就不是动态的和静态的,这才是真正的问题。

        6
  •  0
  •   Darin Dimitrov    17 年前

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