22

От http://code.google.com/p/unladen-swallow/wiki/ProjectPlan Цитирую:Что такое «регистрационная машина»?

«Использование JIT также позволит нам перейти на Python от машины на основе стека в регистровой машины, которая была показана для повышения производительности в других подобных языках (Ierusalimschy и др 2005 Shi et al, 2005).

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

2 вещи:

1) Правильно ли я полагаю, что то, что я реализовал, будет считаться «машиной на основе стека» с учетом терминологии, используемой в приведенной выше цитате?

2) Если мое предположение в пункте (1) было прав, как работает «регистрирующая машина»? то есть как он отличается от машины на основе стека?

Спасибо!

+0

Кстати, я должен сказать, что ProjectPlan кажется плохо сформулированным, трудно себе представить, что автор действительно верит в то, что он действительно сказал. Разница между интерпретируемой и JIT просто должна была бы полностью похоронить разницу между виртуальной машиной SW SW и SW-регистром VM, разница, которая на самом деле даже не сохранилась бы после транскода JIT. – DigitalRoss

ответ

20

Регистратор - это аппаратное или программное обеспечение, которое при работе с данными берет его из памяти, помещает его в место, где оно может работать с ним быстро, а затем возвращает результат.

Например, обычный ЦП является регистрационной машиной. Поскольку ALU (блок, который работает с числами в CPU) может работать только с числами в регистре.

Машина на основе стека добавляет данные в стек, а затем либо всплывает, либо нажимает на нее вещи.

Например, сложение двух чисел будет

Push 2 // Push 2 onto the stack 
Push 3 // Push 3 onto the stack 
Add // Add the top two things on the stack. 

Когда в регистровой машине было бы что-то вроде этого.

Load x, r0 // Load x onto register 0 
Load y, r1 // Load y onto register 1 
Add r0, r1, r2 // Add 1 and 2 and store the result in register 2 
2

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

В машине регистрации: add может быть определен так, чтобы принимать три имени регистра в качестве операндов, добавлять содержимое первых двух и поместить результат в третий. (Более распространенным является дизайн, в котором названы только один или два, и результат всегда идет в специальном регистре накопителя, но это не главное.)

В стековой машине: add может быть определено, чтобы поместить два операнда из стек, добавить их и направить результат в стек.

5

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

На основе стека используется стек для хранения промежуточных значений во время вычисления. Например, чтобы добавить два числа, инструкции «добавить» выталкивают два значения из стека, добавляют их и возвращают результат в стек.

2

Был ли ваш компилятор сгенерирован машинный код? Если это так, то его целью была машина регистрации (почти все проекты ЦП являются регистрационными машинами).

В стековых машинах хранятся все значения в стеке, тогда как в регистрационных машинах имеется фиксированное количество слотов для хранения, чьи «адреса» не меняются (в отличие от стековых машин).

+0

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

4

1) Правильно ли я думать, что я реализован будет считаться «машины на основе стека» учитывая терминологию, используемую в цитате выше?

Не совсем. Стопка какого-то рода является практически единственным способом реализации рекурсивных вызовов функций. Но «машина на основе стека» идет намного дальше, делая все через стек. Не только вызовы функций, но и арифметические операции. В некотором смысле, они ведут себя так, как будто каждая машинная инструкция представляет собой вызов функции, обрабатываемый через стек. Это делает очень простой дизайн машины, но довольно сложный для записи ассемблер/машинный код.

2) Если мое предположение в пункте (1) было права, как же "зарегистрировать машину" работы? то есть, как он отличается от машины на основе стека ?

Регистратор имеет быструю внутреннюю память (регистры) и выполняет большую часть своих операций с данными в этих регистрах. Существуют дополнительные машинные инструкции для копирования данных между регистрами и основной памятью.

IIRC есть два вида стека машин:

  • Аккумуляторные машины имеют «аккумулятор», который является в основном один регистр, который содержит результат вычислений (и может также подавать операнд), при этом большинство машинные инструкции, работающие на аккумуляторе.
  • «Чистые» стековые машины ставят результат вычислений поверх стека после использования операндов.
11

У регистрационной машины почти всегда есть стек.

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

У регистрационной машины могут быть некоторые операторы стека и могут даже иметь режим адресации стека.

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

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

Теперь причины, по которым аппаратные регистраторы работают быстрее, чем аппаратные стековые машины, возможно, не связаны с тем, что программное обеспечение «регистрирует» виртуальные машины быстрее, в соответствии с цитированной бумагой, чем программные «стековые» машины.

Для программных виртуальных машин, по-видимому, дело в том, что нужно выполнить меньшее количество инструкций.Это было определено эмпирически в соответствии с претензиями в цитированной статье, но я предполагаю, что это связано с тем, что в регистрационной машине должно быть сделано намного меньше служебных инструкций, таких как push, pop и exchange, и потому, что машина регистрации может легко использовать операнды, если они все еще остаются лежащий в регистровом файле, без необходимости загрузки или push-операций. Конечно, все это просто память; они являются виртуальными регистрами.