在动态语言(例如JavaScript或Python)中,变量的类型在运行时确定。这就是为什么它们比Java之类的键入语言要慢的原因之一。
如何进行类型检查?这个过程缓慢的根本原因是什么?
在动态语言(例如JavaScript或Python)中,变量的类型在运行时确定。这就是为什么它们比Java之类的键入语言要慢的原因之一。
如何进行类型检查?这个过程缓慢的根本原因是什么?
Answers:
这个问题令人困惑。
假设类型检查很慢,但不一定是这种情况。
这个问题似乎也混淆了类型分配和类型检查的过程,这是两件事。一个是在运行时完成的过程,另一个是在编译时完成的过程。我怀疑这个问题确实是在问类型分配。
类型分配会在运行时引入开销,因为计算会花费时间,这些指令会根据运行时看到的值的类型动态地决定要采取的操作。例如,在动态语言中,如果我在两件事上加上“ +”,则可能表示数字加法或字符串连接,因此我需要花一些时间查看手头上的内容来决定要做什么。有一些评估策略可以降低动态调度的成本。(例如,跟踪JIT)
关于在JavaScript中进行类型检查的信息,请参见:http : //www.cs.brown.edu/~sk/Publications/Papers/Published/gsk-flow-typing-theory/。有关类型检查器如何工作的更一般的概述,标准编程语言教科书将介绍算法。例如,http://www.cs.brown.edu/~sk/Publications/Books/ProgLangs/
基本上,在无类型语言中,每个引用都指向一个既包含类型又包含值的对象。例如,var a = 3
指向包含值3和类型int的实例,如果执行make a = "bla"
,则引用将更新为包含字符串“ bla”和类型字符串的实例,旧对象将被丢弃,等等。
这很慢,因为每次a + b
必须对这些基本类型进行操作(例如)时,运行时都必须首先取消引用对象,检查其类型是否兼容,执行操作,创建新对象。
相反,a + b
在C ++或Java中,在编译时检查类型是否有效和兼容,然后将a和b存储为立即值(而不是引用),并且添加操作是对这些值的简单处理器操作。
当然,这都是非常理论上的。实际上,可以在此过程中进行很多优化来避免大部分开销,并且动态类型化的语言可以很快获得。