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

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

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

8 ответов

Решение

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Другие вопросы по тегам