регистры против стеков - PullRequest
       13

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

52 голосов
/ 02 октября 2008

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

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

Ответы [ 8 ]

38 голосов
/ 02 октября 2008

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

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

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

31 голосов
/ 03 октября 2008

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

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

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

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

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

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

20 голосов
/ 11 марта 2011

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

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

12 голосов
/ 02 октября 2008

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

7 голосов
/ 02 октября 2008

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

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

3 голосов
/ 15 октября 2008

Виртуальные машины на основе стека проще, а код гораздо компактнее. В качестве примера из реальной жизни, друг построил (около 30 лет назад) систему регистрации данных с помощью доморощенной виртуальной машины Forth на Cosmac. Размер Forth VM составлял 30 байт кода на машине с 2 КБ ПЗУ и 256 Байт ОЗУ.

3 голосов
/ 03 октября 2008

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

1 голос
/ 03 октября 2008

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

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

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

...