Вопрос

От http://code.google.com/p/unladen-swallow/wiki/ProjectPlan Я цитирую:

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

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

2 вещи:

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

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

Спасибо!

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

Решение

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

Например, обычный процессор — это регистровая машина.Поскольку АЛУ (устройство, работающее с числами в ЦП) может работать только с числами в регистре.

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

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

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

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

Регистровая машина почти всегда имеет стек.

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

Регистровая машина может иметь несколько операций стека и даже режим адресации стека.

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

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

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

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

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

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

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

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

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

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

IIRC существует два типа стековых машин:

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

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

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

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

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

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

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