Подтвердить что ты не робот

Регистры против стеков

В чем преимущества и недостатки использования виртуальной машины на основе реестра в сравнении с использованием виртуальной машины на основе стека?

Для меня казалось бы, что машина, основанная на регистрах, будет более прямолинейной для программирования и более эффективной. Итак, почему все JVM, CLR и Python VM основаны на стеках?

4b9b3361

Ответ 1

Об этом уже был дан ответ на определенный уровень в FAQ по Parrot VM и связанные с ним документы: Обзор попугаев Соответствующий текст из этого документа таков:

Parrot VM будет иметь архитектуру регистров, а не стекную архитектуру. Он также будет иметь чрезвычайно низкоуровневые операции, более похожие на Java, чем операторы среднего уровня Perl и Python и т.д.

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

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

Вы также можете прочитать следующее: Регистрирует vs стеки для дизайна интерпретатора Цитирую немного:

Нет никаких реальных сомнений, проще сгенерировать код для стека. Большинство учеников-компиляторов новичка могут это сделать. Генерирование кода для регистрационной машины немного жестче, если только вы не рассматриваете его как стекную машину с аккумулятором. (Это выполнимо, хотя и несколько менее идеальное с точки зрения производительности). Простота таргетинга - это не такая уж большая сделка, по крайней мере, не для меня, отчасти потому, что мало кто на самом деле собирается направить ее прямо на цель - я имею в виду, давай, сколько людей ты знаешь, кто на самом деле пытается написать компилятор для чего-то, о чем-нибудь, о чем бы тебе ни заботились? Номера малы. Другая проблема заключается в том, что многие из людей, обладающих знаниями компилятора, уже являются удобными системами регистрации таргетинга, как и то, что все используемые аппаратные процессоры используются.

Ответ 2

Реализовано на аппаратном уровне, машина на основе регистров будет более эффективной, просто потому, что доступ к более медленной ОЗУ меньше. Однако в программном обеспечении даже на основе регистровой архитектуры, скорее всего, будут "регистры" в ОЗУ. В этом случае машина на основе стека будет столь же эффективной.

Кроме того, виртуальная машина на основе стека сделает намного проще писать компиляторы. Вам не нужно иметь дело с стратегиями распределения регистров. У вас есть, по сути, неограниченное количество регистров для работы.

Обновление: Я написал этот ответ, предположив интерпретированную виртуальную машину. Это может не соответствовать JIT-компиляции VM. Я столкнулся с этой статьей, которая, по-видимому, указывает, что скомпилированная виртуальная машина JIT может быть более эффективной с использованием архитектуры регистров.

Ответ 3

Традиционно, разработчики виртуальных машин предпочитают архитектуры на основе стека по сравнению с реестром из-за "простоты внедрения ВМ", легкость написания контр-компилятора - большинство виртуальных машин изначально предназначены для размещения единого языка и плотности кода и исполняемых файлов для архитектуры стека неизменно меньше, чем исполняемые файлы для архитектур регистров. Простота и плотность кода - это стоимость исполнения.

Исследования показали, что для зарегистрированной архитектуры требуется в среднем 47% менее выполненных инструкций VM, чем архитектура на основе стека, а код регистра на 25% больше, чем соответствующий код стека, но это увеличивает стоимость получения дополнительных команд VM к большему размеру кода требуется только 1.07% дополнительных реальных загрузок машины на инструкцию VM, которая незначительна. Общая производительность виртуальной машины на основе регистров заключается в том, что в среднем на 32,3% меньше времени для выполнения стандартных эталонных тестов.

Ответ 4

Одной из причин создания виртуальных машин на основе стеков является то, что фактические коды операций VM могут быть меньше и проще (нет необходимости кодировать/декодировать операнды). Это делает сгенерированный код меньшим, а также упрощает код VM.

Ответ 5

Сколько регистров вам нужно?

Мне, вероятно, понадобится хотя бы еще один.

Ответ 6

Для меня не очевидно, что виртуальная машина на основе регистров будет "более прямолинейной для программирования" или "более эффективной". Возможно, вы думаете, что виртуальные регистры обеспечит кратковременное сокращение во время фазы компиляции JIT? Это, конечно, не так, поскольку реальный процессор может иметь больше или меньше регистров, чем виртуальная машина, и эти регистры могут использоваться по-разному. (Пример: значения, которые будут уменьшаться, лучше всего помещаются в регистр ECX на процессорах x86.) Если на реальной машине больше регистров, чем на виртуальной машине, то вы тратите ресурсы, меньше и ничего не набрали, используя "register на основе".

Ответ 7

Виртуальные виртуальные машины на стеке проще, а код намного компактнее. В качестве примера в реальном мире, друг построил (около 30 лет назад) систему регистрации данных с доморощенной Forth VM на Cosmac. Forth VM составляла 30 байт кода на машине с 2k ROM и 256 байтами оперативной памяти.

Ответ 8

Для виртуальных машин на основе стека проще создать код для.

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

Для вашей первой попытки я рекомендую начать с виртуальной машины на основе стека.