[1] We assume here that user_read, parse, and the various printing operations are available as primitive machine operations, which is useful for our simulation, but completely unrealistic in practice. These are actually extremely complex operations. In practice, reading and printing would be implemented using low-level input-output operations such as transferring single characters to and from a device.
[2] There are other errors that we would like the interpreter to handle, but these are not so simple. See exercise 5.30.
[3] We could perform the stack initialization only after errors, but doing it in the driver loop will be convenient for monitoring the evaluator's performance, as described below.
[4] This manifests itself as, for example, a kernel panic or a blue screen of death or even a reboot. Automatic rebooting is an approach typically used on phones and tablets. Most modern operating systems do a decent job of preventing user programs from causing an entire machine to crash.
5.4.4   Running the Evaluator