不应该有一个jit减少对invokeDynamic的需求?

时间:2012-07-31 15:34:46

标签: clojure jvm jruby invokedynamic

在对invokeDynamic做了很多阅读之后,我仍然有点困惑。一个重复的主题似乎是Clojure并不真正需要它,或者至少比JVM上的其他动态语言实现更少(Jruby,JPython) ,Groovy等。)。我不了解所有细节,但似乎有类型注释是主要原因,它只是消除了动态调度问题。

1-将invoke-dynamic描述为有效实现复杂方法调度方案的方法是否安全? (还有更多吗?)

2-不应该使用jit消除调用动态的需要吗?问题似乎是由于缺少运行时类型信息而jit 应该有这些信息。

3-JRuby似乎摊位有一个jit并使用invokdynamic,为什么?

1 个答案:

答案 0 :(得分:3)

主要原因是Clojure并不“需要”invokedynamic,它实际上并没有那么多的动态调度。特别是:

  • 每当Clojure有足够的类型信息(例如调用带有类型提示的Java类)时,它会直接调度方法
  • 使用接口方法调度(通过IFn)
  • 调用所有函数
  • 编译器在许多情况下(例如原始函数)进行智能内联,避免任何类型的调度
  • 通过接口方法dispatch
  • 调用协议函数

这涵盖绝大多数派遣案件。

当然有一些调度情况,其中invokedynamic可能有用(例如,多方法),它可能可用于优化Clojure的其他部分(例如var lookup),因此Clojure将能够获得一些好处。