Почему виртуальные машины на основе регистров лучше стековых? - PullRequest
6 голосов
/ 01 января 2012

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

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

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

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

1 Ответ

7 голосов
/ 01 января 2012

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

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

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

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

...