Почему на основе стека на основе JVM и на основе реестра Dalvik VM?

StackOverflow https://stackoverflow.com/questions/2719469

Вопрос

Мне любопытно, почему солнце решило заставить JVM-стек, и Google решил сделать на основе реестра Dalvikvm?

Я полагаю, что JVM не может действительно предположить, что на целевой платформе доступно определенное количество регистров, поскольку она должна быть независимой от платформы. Там просто откладывается в отсрочке реестра и т. Д., К компилятору JIT. (Поправьте меня если я ошибаюсь.)

Таким образом, андроид, ребята, подумал: «Эй, это неэффективно, пойдем на виртуальную машину на базе регистрации ...»? Но подождите, есть несколько разных устройств Android, какое количество регистров сделала цель Dalvik? Опкоды Dalvik Hardcoded для определенного количества регистров?

Все текущие устройства Android на рынке имеют одинаковое количество регистров? Или, есть ли реструктурирование регистрации в течение DEX-Loading? Как все это соответствует?

Это было полезно?

Решение

Есть несколько атрибутов виртуальной машины на основе стека, которые хорошо вписываются с целями дизайна Java:

  1. Дизайн на основе стека делает очень немногие предположения о целевом аппаратном обеспечении (регистры, функции ЦП), поэтому легко реализовать виртуальную машину на широком спектре оборудования.

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

Собираясь с системой на основе регистров, вероятно, означает, что генератор кода Dalvik не должен работать как сложно, чтобы произвести исполнительный код. Бег на чрезвычайно богатую зарегистрирующуюся или неграмотную архитектуру, вероятно, следил, будет следить за Dalvik, но это не обычная цель - ARM - это очень середина дороги архитектуры.


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

Другие советы

Я не могу найти ссылку, но я думаю, что Sun решил, что Sun решил подход Bytecode на основе стека, потому что он позволяет легко запустить JVM на архитектуре с несколькими регистрами (например, IA32).

В Dalvik VM Internals. от Google I / O 2008, создатель Dalvik Дэн Борштейн дает следующие аргументы для выбора виртуальной машины на основе регистров на слайде 35 Слайды презентации:

Регистрация машины

Почему?

  • Избегайте отправки инструкции
  • Избегайте ненужного доступа к памяти
  • Потребляйте поток потока эффективно (более высокая семантическая плотность на инструкцию)

А на слайде 36:

Регистрация машины

Статистика

  • 30% меньше инструкций
  • 35% меньшего количества кодовых единиц
  • На 35% больше байтов в поток инструкций
    • Но мы должны потреблять два одновременно

По словам Bornstein, это «общее ожидание того, что вы можете найти, когда вы преобразуете набор файлов классов в файлы dex».

Соответствующая часть Представление видео начинается в 25:00.

Также есть проницательная статья под названием «Виртуальная машина Showdown: Stack Versus Registers» Shi et al. (2005), что исследует различия между виртуальными машинами стека и регистрируйте виртуальные машины.

Я не знаю, почему Солнце решило сделать стек JVM на основе. ERLANGS Virtual Machine, Beam является реестрами на основе причин производительности. И Дальвик также кажется зарегистрированным из-за причин производительности.

От Про андроид 2.:

Dalvik использует регистры как в основном единицы хранения данных вместо стека. Google надеется достичь на 30 процентов меньше инструкций в результате.

И относительно размера кода:

Dalvik VM принимает генерируемые файлы классов Java и объединяет их в один или несколько файлов исполняемых файлов Dalvik (.dex). Он повторно использует дублирую информацию из нескольких классов файлов, эффективно снижая требования к пространству (несжатым) половиной от традиционного файла .jar. Например, файл .dex приложение веб-браузера в Android составляет около 200 тыс., В то время как эквивалентная несжатая версия .Яр составляет около 500к. Файл будильника .dex примерно в 50 тыс., А примерно вдвое больше, чем в его размере.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top