Разве наличие jit не должно уменьшить потребность в invokeDynamic?

После того, как я много прочитал в invokeDynamic, я все еще немного сбит с толку. Кажется, одна повторяющаяся тема заключается в том, что Clojure на самом деле не нуждается в этом или, по крайней мере, нуждается в нем меньше, чем в других реализациях динамического языка на JVM (Jruby, JPython, Groovy и т. д. .). Я не понял всех деталей, но кажется, что наличие аннотаций типов является основной причиной, которая просто устраняет проблему динамической отправки.

1. Безопасно ли описывать Invoke-Dynamic как способ эффективной реализации сложных сценариев диспетчеризации методов? (Есть ли еще что-нибудь?)

2- Разве наличие jit не должно устранять необходимость в invoke-dynamic ? Проблема, по-видимому, возникает из-за отсутствия информации о типах среды выполнения, и jit должен иметь эту информацию.

3-JRuby, кажется, имеет jit и использует invokdynamic, почему?


person GreyGeek    schedule 31.07.2012    source источник
comment
почему Clojure действительно нуждается в invokedynamic, см. в этом блоге Чарльза Наттера: blog.headius.com/2011/10/   -  person Nathan Hughes    schedule 31.07.2012
comment
Из того, что я читал, он говорит о случае, когда вы не можете предоставить аннотации типов...   -  person GreyGeek    schedule 31.07.2012


Ответы (1)


Основная причина в том, что Clojure не «нуждается» в invokedynamic, потому что на самом деле он не выполняет динамическую диспетчеризацию. Особенно:

  • Всякий раз, когда Clojure имеет достаточно информации о типе (например, вызов класса Java с подсказкой типа), он выполняет прямую отправку метода.
  • Все функции вызываются с помощью диспетчеризации методов интерфейса (через IFn)
  • Компилятор выполняет интеллектуальное встраивание во многих случаях (например, примитивные функции), избегая какой-либо диспетчеризации.
  • Функции протокола вызываются через диспетчеризацию метода интерфейса

Это охватывает подавляющее большинство случаев отправки.

Конечно, есть несколько случаев диспетчеризации, в которых invokedynamic может оказаться полезным (например, мультиметоды), и его, вероятно, можно использовать для оптимизации некоторых других частей Clojure (например, поиска var), поэтому Clojure сможет получить некоторые преимущества.

person mikera    schedule 01.08.2012