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