Чому на базі стека JVM базується реєстр Dalvik VM?


98

Мені цікаво, чому Sun вирішив зробити JVM на основі стека, і Google вирішив створити реєстр DalvikVM?

Я припускаю, що JVM насправді не може припустити, що певна кількість регістрів доступна на цільовій платформі, оскільки вона повинна бути незалежною від платформи. З цього приводу він просто відкладає розподіл регістра тощо для компілятора JIT. (Виправте мене, якщо я помиляюся.)

Тож хлопці з Android подумали: "Ей, це неефективно. Давайте відразу ж перейдемо до реєстру, заснованого на vm ..."? Але зачекайте, існує кілька різних пристроїв для Android, на яку кількість реєстрів націлив Дальвік? Чи жорстко кодуються коди Дальвіка для певної кількості регістрів?

Чи мають усі поточні Android-пристрої на ринку приблизно однакову кількість реєстрів? Або є перерозподіл реєстру, який виконується під час завантаження dex? Як все це поєднується?


5
Чи було це рішення Google зробити реєстр DalvikVM? Я думаю, що DalvikVM було впроваджено до того, як Google придбала Android Inc.
RoboAlex,

1
Ви праві, звичайно. (Не надто відносно питання, хоч;)
aioobe

Відповіді:


68

Є кілька атрибутів VM на основі стека, які добре відповідають цілям дизайну Java:

  1. Конструкція на основі стека робить дуже мало припущень щодо цільового обладнання (регістрів, функцій процесора), тому легко реалізувати VM на широкому спектрі обладнання.

  2. Оскільки операнди для інструкцій значною мірою неявні, код об'єкта буде, як правило, меншим. Це важливо, якщо ви збираєтеся завантажувати код через повільне мережеве посилання.

Використання схеми, що базується на регістрі, ймовірно, означає, що генератор коду Дальвіка не повинен працювати так сильно, щоб створити продуктивний код. Працювання на надзвичайно багатій на регістри архітектурі або бідній на регістри, ймовірно, спричинило б дальвік Дальвіку, але це не звичайна мета - ARM - це архітектура, що знаходиться в середині дороги.


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


1
Гаразд, це цікаво. Тож DalvikVM передбачає будь-яку мінімальну кількість регістрів на цільовому пристрої?
aioobe

1
Крім того, я читав, що деякі люди встановлюють Android на своїх ноутбуках, оскільки це "легка вага" ... Це здається поганою ідеєю, якщо ноутбук не ARM, і, можливо, має архітектуру з багатьма регістрами?
aioobe

2
ОК, я щойно дізнався, що байт-код dex визначається в термінах нескінченної машини реєстрації, а коли мова йде про ефективність, то, здається, це стосується переважно пам’яті пам’яті.
aioobe

1
Я не міг пригадати, чи базувався Далвік нескінченний регістр, чи має фіксований розмір файлу реєстру. Якщо він нескінченний, то він буде прагнути оптимально виконувати архітектури, у яких є "достатньо" регістрів для будь-якого коду, який ви використовуєте.
Марк Бессі

Більш детальне пояснення можна знайти тут: markfaction.wordpress.com/2012/07/15/…
noego

31

Я не можу знайти посилання, але я думаю, що Sun вирішив застосувати підхід байт-коду на основі стеку, оскільки це полегшує запуск JVM на архітектурі з невеликою кількістю регістрів (наприклад, IA32).

У Dalvik VM Internals з Google I / O 2008, автор Dalvik Ден Борнштейн наводить такі аргументи для вибору VM на основі реєстру на слайді 35 слайдів презентації :

Реєстраційна машина

Чому?

  • уникати відправлення інструкцій
  • уникайте зайвого доступу до пам'яті
  • ефективно споживати потік інструкцій (вища семантична щільність на інструкцію)

та на слайді 36:

Реєстраційна машина

Статистика

  • На 30% менше інструкцій
  • На 35% менше одиниць коду
  • На 35% більше байтів у потоці інструкцій
    • але ми отримуємо одночасно два

За словами Борнштейна, це "загальне очікування того, що ви могли б знайти, перетворивши набір файлів класу у файли dex".

Відповідна частина презентаційного відео розпочинається о 25:00 .

Існує також проникливий документ під назвою "Віртуальні розкриття віртуальної машини: Стійкі версивні регістри" Ши та ін. (2005) , який досліджує відмінності між віртуальними машинами на основі стека та реєстру.


13

Я не знаю, чому Sun вирішила створити JVM стек. Віртуальна машина Erlangs, BEAM реєструється на основі причин продуктивності. І Далвік також здається зареєстрованим через причини роботи.

З Pro Android 2 :

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

А щодо розміру коду:

Dalvik VM приймає згенеровані файли класу Java та поєднує їх в один або кілька файлів Dalvik Executables (.dex). Він повторно використовує дублюючу інформацію з декількох файлів класу, ефективно зменшуючи потребу в просторі (нестиснений) наполовину від традиційного .jar-файлу. Наприклад, .dex файл програми для веб-браузера в Android становить близько 200 тис., Тоді як еквівалентна нестиснена версія .jar - близько 500 тис. Файл .dex будильника становить приблизно 50 кб і приблизно вдвічі перевищує його розмір у своїй .jar версії.

І як я пам’ятаю комп’ютерну архітектуру: кількісний підхід також приходить до висновку, що машина реєстрації працює краще, ніж машина на основі стека.


2
Якби мені довелося здогадуватися, я б сказав, що Sun вирішив зробити стек JVM на основі, тому що це легше реалізувати, ніж машина реєстрації. (Але за нетривіальну вартість виконання, як тут зазначалося.)
Мейсон Уілер

Я не можу знайти посилання, але я думаю, що Sun вирішила використовувати підхідний байт-код, оскільки це спрощує запуск JVM в архітектурі з низьким регістром.
Потік

1
Щодо апаратної ISA, так, перемогли машини для реєстрації В основному кожен процесор / мікроконтролер є машиною реєстрації, оскільки все інше відсмоктує порівняно. Деякі мають дуже мало регістрів, як-от просто акумулятор і, можливо, один-два регістри вказівника чи індексу, але це все ж більше схоже на машину регістра в сенсі теорії обчислення. Але ми говоримо про віртуальні машини, які інтерпретуються , тому "файл реєстрації", якщо такий є, насправді буде в пам'яті. Якщо ви не компілювали JIT до рідного машинного коду. Причини дуже різні для того, щоб reg був швидшим, ніж стек.
Пітер Кордес
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.