Почему байт-код JIT компилируется во время выполнения, а не во время установки? - PullRequest
7 голосов
/ 19 июня 2011

Компиляция программы для байт-кода вместо нативного кода обеспечивает определенный уровень переносимости, пока существует подходящая виртуальная машина.

Но мне интересно, зачем откладывать компиляцию?Почему бы просто не скомпилировать байт-код при установке приложения?

И если это сделано, почему бы не перенести его на языки, которые напрямую компилируются в нативный код?Скомпилируйте их в промежуточный формат, распространите компилятор "JIT" вместе с установщиком и скомпилируйте его на целевой машине.

Единственное, о чем я могу думать, - это оптимизация времени выполнения.Это единственная важная вещь, которую нельзя сделать во время установки.Мысли?

Ответы [ 3 ]

1 голос
/ 08 августа 2011

Некоторые JIT-компиляторы (например, Java HotSpot) используют тип обратной связи на основе встраивания.Они отслеживают, какие типы фактически используются в программе, и вызывают встроенные вызовы функций, основываясь на предположении, что то, что они увидели ранее, это то, что они увидят позже.Чтобы это работало, им нужно запустить программу через несколько итераций ее «горячей петли», чтобы узнать, какие типы используются.

Эта оптимизация полностью недоступна во время установки.

1 голос
/ 19 июня 2011

Часто это предварительно скомпилировано. Рассмотрим, например, прекомпиляцию кода .NET с помощью NGEN .

Одной из причин некомпиляции всего является расширяемость. Рассмотрим те языки, которые позволяют использовать отражение для загрузки дополнительного кода во время выполнения.

0 голосов
/ 19 июня 2011

Байт-код был скомпилирован так же, как был скомпилирован код C ++.

Также JIT-компилятор, т.е. .NET и среды выполнения Java, массивны и динамичны;И вы не можете предвидеть в программе, какие части приложения используют, поэтому вам нужна вся среда выполнения.

Также необходимо понимать, что язык, ориентированный на виртуальную машину, имеет цели проектирования, совершенно отличные от языка, ориентированного на голое железо.

Возьмите C ++ против Java.

  • C ++ не будет работать на виртуальной машине, в частности, большая часть дизайна языка C ++ ориентирована на RAII.
  • Java не будет работать на голом металле по многим причинам,примитивные типы для одного.

РЕДАКТИРОВАТЬ: Как Delnan указывает правильно;JIT и аналогичные технологии, хотя и весьма благоприятные для производительности байт-кода, скорее всего, будут недоступны во время установки.Кроме того, компиляция для ВМ сильно отличается от компиляции в нативный код.

...