Вопрос

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

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

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

Решение

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

  

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

     

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

     

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

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

  

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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