Method and apparatus for resuming execution of a failed computer program. A
program is compiled using two compilers to generate first and second sets
of object code. Checkpoints are identified in the program, and checkpoint
code is generated for execution at the checkpoints. If execution of the
first set of object code fails, checkpoint data is recovered and execution
of the program is resumed using either the first or second set of object
code. In one embodiment, the first set of object code is re-executed
before trying the second set of object code.