Motivation

So why, exactly, do we want to do all this weird stuff?

The motivation comes from a surprisingly large number of goals, all of which depend on more thorough analysis of control flow and data flow in existing applications.

Prolint certainly comes to mind. There are many types of static code checking that could be done with more complete control and data flow analysis. For example, checking for problematic transaction scopes that span multiple compile units is difficult or impossible without a complete grasp of control flow.

Reverse engineering existing 4GL/ABL applications can hardly be considered complete without full data flow analysis. Work flow for data through an application is key to how well that application can be understood, yet there just aren't any tools which gather this information in a complete and detailed fashion.

Finally, re-engineering projects cannot be automated to any significant extent without better semantic understanding. When an OpenEdge application needs that "complete rewrite", there aren't yet enough tools out there to make this task anything less than enormous. The existing application needs to be reverse-engineered, optimized and cleaned, re-architected, and then finally re-generated for the new OpenEdge framework (OO, OERA, etc). There are plenty of techniques which already exist for optimizing and cleaning, but most of those depend on the existence of a suitable Intermediate Representation.