2008-10-02 9 views
43

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

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

ответ

26

Это уже ответило, до определенного уровня, в FAQ попугая виртуального машины и связанные с ними документы: A Parrot Overview Соответствующий текст из этого документа заключается в следующем:

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

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

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

Вы также можете прочитать: Registers vs stacks for interpreter design Цитируя это немного:

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

7

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

Возможно, мне понадобится хотя бы еще одно.

+0

Я вижу, что вы получаете, но как это отличается от стека? Стеки также могут быть слишком маленькими. – 2008-10-02 19:43:17

+1

Видя, как виртуальные машины реализованы в программном обеспечении, размер вашего стека практически неограничен. Регистры конечны. Я могу иметь r1-r32. Я мог бы создать r33 в программном обеспечении, но какие другие классы нужно будет знать? – 2008-10-02 19:52:03

+17

Попугай имеет бесконечное количество регистров. Вы уверены, что вам нужно еще одно? – 2010-06-01 12:47:20

34

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

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

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

12

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

1

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

Реестровые виртуальные машины легче создавать быстрые реализации и упростить создание высоко оптимизированного кода.

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

+0

Я не совсем понимаю, что вы имеете в виду, когда говорите: «На основе виртуальных машин, основанных на регистрации, проще создавать быстрые реализации для». Можете ли вы привести пример? – 2011-12-10 14:57:03

3

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

2

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

16

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

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