Sur*_*rya 17 programming-languages
与静态类型语言相比,是什么使得加速动态类型语言变得困难.换句话说,静态类型语言的固有属性是什么使它们易于优化执行速度?
Joh*_*kin 25
在以静态类型语言访问属性/方法时,查找通常可以简化为静态函数地址.即使在较慢的虚拟方法的情况下,查找只是从vtable读取偏移量.
在动态语言中,名称基于字符串.想抬头foo.bar?查找foo在局部变量哈希表,然后找到bar在foo的哈希表.在某些动态语言中,如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?这是一个数字吗?它是一个字符串?它是你之前定义的一个类吗?编译器无法知道它将获得什么输入.您必须在运行时进行大量检查,这意味着您正在为简单操作执行更多隐式工作.
动态类型语言必须在运行时进行所有检查,因为类型可能在执行过程中发生变化.
静态类型语言在编译期间解析所有类型,因此预先消耗成本一次.
这是动态类型语言通常较慢的主要原因.但还有其他事情要考虑.很大程度上取决于编译器或解释器,GC实现,调度表布局和查找算法以及其他优化.
这一切都取决于实现:动态类型语言可能比编译语言更快,它只需要更多的工作来完成它.