The solution techniques used in the Navigator implementation are also applicable in other situations. It is likely that macros in source programs could be handled by a method similar to Navigator's handling of inline procedures. Furthermore, as discussed in Chapter 4, the invisible breakpoint technique for collecting dynamic information could be used to collect data information for handling the code motion optimization. Alternatively, if the code motion optimization were altered to save the old value every time, dynamic control-flow information similar to the path determiner information could be used.
In addition, the Navigator system tested only a few techniques from the rich assortment proposed in Chapter 4. The remaining techniques deserve attention, both individually and in concert.
There are several unexplored points regarding static information: exactly what to save for a given set of optimizations, how to generate and store it efficiently in the compiler, and how to access it efficiently from the debugger. The trick of storing some of it and recreating the rest on demand through recompilation could prove useful.
Regarding optimization restrictions, special attention should be paid to the development of new variants of the classical optimizations that provide similar optimization benefits but impair debugging less, such as the new variant of code motion discussed above. Once designed, implementations of these new variants should be measured to determine their compile-time efficiency and their relative effectiveness at reducing code size and execution time.
There are also unanswered questions concerning the provision of truthful behavior:
" How can the effects of optimization be effectively displayed? In Chapter 4, I conjectured that displaying a new version of the entire program would be less useful—and more overwhelming—than a localized view of an area of current interest, such as a proposed breakpoint location. User studies would shed light on this issue.
" What other new debugging commands would be useful? Chapter 4 suggests semantic and syntactic versions of statement breakpoints and a few other examples.
The level of user acceptance of high-quality truthful behavior—that is, a localized description of the effects of the optimizations, lists of possible alternatives for variable values and program locations, and good debugging commands—should also be studied. High-quality truthful behavior is generally much easier to provide than expected behavior, as Navigator illustrates. It may be sufficient for the construction of a very effective debugging tool.
Overall, it is clear that there is a useful middle ground between fully optimized programs with no debugging capabilities on the one hand and completely debuggable programs with no optimization on the other. The selection of a suitable level of use for each technique, hiding the effects of some optimizations and displaying the effects of others, thus providing the optimal mix of optimization and debugging capabilities, is a particularly important area for future research.
Finally, theoretical studies of the effects of limited groups of optimizations (using specific models of optimization) upon debugging information or computational behavior would provide useful support for the more practical studies suggested above. Interesting optimization groups include local optimizations using a quad model, local optimizations using a dag model, and code motion alone.