In order to gain a good understanding of the design of register
machines, we must test the machines we design to see if they perform
as expected. One way to test a design is to hand-simulate the
operation of the controller, as in exercise
. But this is
extremely tedious for all but the simplest machines. In this section
we construct a simulator for machines described in the
register-machine language. The simulator is a Scheme program with
four interface procedures. The first uses a description of a register
machine to construct a model of the machine (a data structure whose
parts correspond to the parts of the machine to be simulated), and the
other three allow us to simulate the machine by manipulating the
model:
As an example of how these procedures are used, we can define
gcdmachine to be a model of the GCD machine
of section
as follows:
(define gcd-machine
(make-machine
'(a b t)
(list (list 'rem remainder) (list '= =))
'(test-b
(test (op =) (reg b) (const 0))
(branch (label gcd-done))
(assign t (op rem) (reg a) (reg b))
(assign a (reg b))
(assign b (reg t))
(goto (label test-b))
gcd-done)))
The first argument to make-machine is a list of register names.
The next argument is a table (a list of two-element lists) that pairs
each operation name with a Scheme procedure that implements the operation
(that is, produces the same output value given the same input values).
The last argument specifies the controller as a list of labels and
machine instructions, as in section
.
To compute GCDs with this machine, we set the input registers, start the machine, and examine the result when the simulation terminates:
(set-register-contents! gcd-machine 'a 206) done (set-register-contents! gcd-machine 'b 40) done (start gcd-machine) done (get-register-contents gcd-machine 'a) 2This computation will run much more slowly than a gcd procedure written in Scheme, because we will simulate low-level machine instructions, such as assign, by much more complex operations.
Exercise.
Use the simulator to test the machines you designed in
exercise
.