The R language is a high-level language with special constructs to enforce reversibility so that programs written in that language can be translated to machine code of reversible computers [39]. Another interesting application of reversible computation is in garbage collection. The Psi-Lisp language presented in [3] uses reversible constructs to efficiently implement garbage collection. Other applications for reversible execution are in the areas of database transaction support, debugging support and checkpointing for high-availability software [10,66,95].
In [11], reversible computing has been suggested as a method
for testing failures in real-time systems, but with admittedly high
forward and reverse computing overheads, and without treatment of
complex instructions such as inter-mixing jumps. An initial attempt
at automatically generating symbolic inverses of reversible
functions is made in [34], but it relies on heuristics for
correctness. A more theoretical approach is taken in
[25], by using inversion of invariants to prove the
correctness of inverse programs. A debugging system is described in
[10] that executes
programs in interpreted mode in forward and reverse directions.
Although their approach using interpretation is well suited for
debugging systems, the performance characteristics of their techniques
are unclear when applied to high-performance simulations. An
interesting use of reversible computing is its application in the
automatic differentiation of functions expressed in a high-level
computer language, such as
[52,53]. For
this, reverse execution of certain intermediate computations is
necessary, which is achieved via operator-overloading techniques of
.
Fujimoto's Virtual Time Machine [43] is a hardware-based state-saving algorithm that allows for the optimistic use (i.e., reads and writes) of globally shared state. The major hardware innovation is a Space-Time Memory system. Lin et al. [68] define an analytic model for determining the optimal checkpoint interval for optimistic simulations when infrequent state-saving is used. The state-saving techniques presented in [51] utilize a limited form of the reverse computation approach and is the first work we are aware of to specifically discuss reverse computation for simulation, but no performance results are provided. Finally, in [102], a rollback relaxation scheme is presented that automatically identifies certain types of history-independent logical processes and optimizes the performance of rollback activity for those processes.