Разве интерпретаторы с поддержкой JIT и без нее в конечном счете не производят машинный код

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

Однако мой вопрос заключается в следующем:

В конечном счете, разве интерпретатор без поддержки JIT не должен превращать байткод (строка за строкой) в машинный/нативный код для выполнения, точно так же, как это делает JIT-компилятор? Я видел сообщения и учебники, которые утверждают, что да, и сообщения, которые утверждают, что нет. Последний аргумент заключается в том, что интерпретатор/JVM выполняет этот байткод напрямую, без взаимодействия с машинным/нативным кодом.

Если не-JIT интерпретаторы действительно превращают каждую строку в машинный код, то кажется, что основными преимуществами JIT являются...

  1. Интеллект кэширования либо всех (обычный JIT), либо часто встречающихся (hotspot/адаптивная оптимизация) частей байткода, так что шаг компиляции машинного кода не требуется каждый раз.

  2. Любая оптимизация, которую JIT-компиляторы могут выполнить при трансляции байткода в машинный код.

Это точно? Кажется, что разница (кроме возможной оптимизации, или JITting блоков против построчной) между трансляцией байткода в машинный код через интерпретаторы без JIT и с поддержкой JIT невелика.

Заранее спасибо.

7
задан B Mac 23 January 2012 в 17:40
поделиться