3

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

1-将调用动态描述为有效实现复杂方法调度场景的方式是否安全?(还有更多吗?)

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

3-JRuby好像有个jit,用invokdynamic,为什么?

4

1 回答 1

3

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

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

这涵盖了绝大多数调度案例。

当然,在一些调度案例中,invokedynamic 可能被证明是有用的(例如多方法),并且它可能用于优化 Clojure 的其他部分(例如 var 查找),因此 Clojure 将能够获得一些好处。

于 2012-08-01T00:48:22.933 回答