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

Sur*_*rya 17 programming-languages

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

Joh*_*kin 25

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

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

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


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


big*_*hus 12

看看这个python示例:

def fact(n):
    if n==0:
        return n
    return n*fact(n-1)
Run Code Online (Sandbox Code Playgroud)

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

  • 实际上有些语言,如Ocaml,F#和Haskell支持类型推断(http://en.wikipedia.org/wiki/Type_inference),因此编译器可以根据其使用情况确定变量的数据类型,而无需使用类型注释.例如,'n == 0',对整数文字的等式测试表明'n'是整数.由于编译器知道'n'是一个整数,因此'return n'意味着该函数也返回一个整数.因此,我们可以确定该函数采用int并返回一个int. (2认同)
  • @Princess:啊,但它是机器大小的int还是bignum?你仍然要测试这个(但它可以有效地完成) (2认同)

Ben*_*n S 10

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

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


Rob*_*zak 5

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

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

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

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

  • 您的意思是动态类型语言的非常好的实现可能比静态类型语言的非常差的实现快。 (2认同)