The interpretive approach is an appealing program transformation technique. Loosely speaking, it amounts to designing a nonstandard interpreter that exhibits a particular good behavior with regard to some criterion, and then specializing it with regard to a source program. The result is somehow a compiled program that hopefully inherits the good properties of the specialized interpreter.
This paper explores this interpretive approach for optimizing programs written in a simple imperative programming language (a flowchart language with assignments and jumps, but no pointers). In particular, two program transformations--loop invariant code motion and strength reduction--are implemented by specializing an interpreter that is appropriately instrumented. Although the paper does not contain a significant new theoretical contribution, this is one of the few works where the interpretive approach is applied to an imperative language. Thus, it is an interesting read for researchers working on semantics-based transformation techniques for imperative programs.
An important conclusion of the application of the interpretive approach in this context is that it can often give rise to code duplication in transformed programs; to remedy this, the author introduces a new transformation, called rewinding (the main theoretical contribution of the work), that allows one to remove some unnecessary code. Basically, rewinding consists of translating a program into a Moore automaton, minimizing this automaton, and translating the minimized automaton back into a program. A formal proof of correctness is included.