3

invokeDynamicについて多くのことを読んだ後、私はまだ少し混乱しています.1つの繰り返しのテーマは、Clojureが実際にそれを必要としないか、少なくともJVM上の他の動的言語実装(Jruby、JPython、Groovyなど)よりも必要が少ないことです。 。)。私はすべての詳細を理解していませんでしたが、型の注釈があることが主な理由であるように思われます。これにより、動的ディスパッチの問題が単純に解消されます。

1-複雑なメソッドディスパッチシナリオを効率的に実装する方法としてinvoke-dynamicを説明するのは安全ですか?(それ以上ありますか?)

2- jitを使用することで、invoke-dynamicの必要性を排除するべきではありませんか?問題はランタイムタイプ情報の欠如から生じているようであり、jitはこの情報を持っている必要があります。

3-JRubyはブースにjitがあり、invokdynamicを使用しているようです。なぜですか?

4

1 に答える 1

3

主な理由は、Clojureがinvokedynamicを「必要としない」ということです。これは、実際にはそれほど動的なディスパッチを行わないためです。特に:

  • Clojureに十分な型情報がある場合(たとえば、型ヒントを使用してJavaクラスを呼び出す場合)、直接メソッドディスパッチを実行します。
  • すべての関数は、インターフェースメソッドディスパッチを使用して呼び出されます(IFn経由)
  • コンパイラは、多くの場合(プリミティブ関数など)インテリジェントなインライン化を行い、あらゆる種類のディスパッチを回避します
  • プロトコル関数は、インターフェイスメソッドディスパッチを介して呼び出されます

これは、ディスパッチケースの大部分をカバーします。

もちろん、invokedynamicが有用であることが証明される可能性のあるディスパッチケースがいくつかあり(マルチメソッドなど)、Clojureの他の部分(var lookupなど)を最適化するために使用できる可能性があるため、Clojureはいくつかの利点を得ることができます。

于 2012-08-01T00:48:22.933 に答える