Почему виртуальные машины на основе регистров лучше, чем виртуальные машины на основе стека?

Почему виртуальные машины на основе регистров лучше, чем виртуальные машины на основе стека?

В частности, в документе Parrot VM дизайнер объясняет преимущества регистровых машин. :

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

но почему одни и те же операнды нажимаются много раз?


person Pteromys    schedule 01.01.2012    source источник
comment
возможный дубликат регистров и стеков   -  person user703016    schedule 01.01.2012


Ответы (1)


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

x = first(a,b,c)
y = second(a,b,c)
third(y,x)

В системе на основе регистров вы можете просто поместить аргументы в любую позицию, которую они ожидают (если регистры могут использоваться для передачи аргументов). Если все регистры являются «глобальными», а не для каждой функции (или, по крайней мере, восстанавливаются при заполнении стека вызовов), возможно, вам не потребуется ничего делать между вызовом first и second.

Если у вас есть виртуальная машина на основе стека, вы получите что-то вроде (надеюсь, у вас есть swap):

push a
push b
push c
call first
push a # pushing same arguments again
push b
push c
call second
swap
call third

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

push a
push b
add
push a
push c
add
add

вместо (при условии, что есть регистры a, b, c, и вы можете уничтожить содержимое b и c):

add b, a
add c, a
add b, c # result in b

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

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

person viraptor    schedule 01.01.2012