This invention describes a method and several variants for compiling programs
or components of programs in a mixed static and dynamic environment, so as to reduce
the amount of time and memory spent in run-time compilation, or to exercise greater
control over testing of the executable code for the program, or both. The invention
involves generating persistent code images prior to program execution based on
static compilation or dynamic compilation from a previous run, and then, adapting
those images during program execution. We describe a method for generating auxiliary
information in addition to the executable code that is recorded in the persistent
code image. Further, we describe a method for checking the validity of those code
images, adapting those images to the new execution context, and generating new
executable code to respond to dynamic events, during program execution. Our method
allows global interprocedural optimizations to be performed on the program, even
if the programming language supports, or requires, dynamic binding. Variants of
the method show how one or several of the features of the method may be performed.
The invention is particularly useful in the context of implementing Java Virtual
Machines, although it can also be used in implementing other programming languages.