|
|
|
Message from the Chair
|
|
Scope Analysis |
Scope analysis relates the occurrence of a variable to its declaration. |
|
Set Use Analysis |
Set-Use analysis identifies the definitions and usages of variables in a program with respect to usage semantics for each class of constructs occurring in the programming language. |
|
Program Unit Analysis |
Program unit analysis describes the local properties of each designated program unit in the programming language. It describes a data unit's type, and location of its declarations, definitions and references. Program unit analysis describes the signatures of functions: the number, order, type of all procedural objects, declarations, and occurrences. |
|
Physical Data Modeling |
Physical data modeling consists of analyzing each data item and data structure for its size, the byte offsets of every field, field length, and the types of each field. The physical data model is used in alias analysis to compare the properties of data structures. |
|
Alias Analysis |
Alias analysis analyzes every record and field for its occurrence in other programs and the identification of the aliases for data structures that may occur in a disguised or modified form in different programs. |
Table 1: Data and Unit Analysis
Table 2 summarizes the principal control, data flow and program slice analyses that are used to guide the transformation from the source language into C++. The following analyses are performed automatically and made available within the KBAST as auxiliary knowledge-based structures to support analysis and transformation operations.
|
Control Flow Graph |
The Control Flow Graphs of a procedure describe the points of entry and point of exit of each procedure and intermediate control conditions. |
|
Data Flow Graph |
The Data Flow Graph of a procedure describes the definition of each data node and its usages. A Usage – Definition (UD) link connects a usage of a variable to a definition (assignment) of a variable. |
|
Program Slice |
A program slice is the transitive closure of one or more UD arc (usage to definition) with respect to a variable for a scope determined by the slicing criteria. |
Table 2: Control Flow Data Flow and Slice Analysis
Table 3 summarizes the principal "As Is" and "To Be" design artifacts that are the by-products of the transformation from the source language into C++. These design artifacts are hyper-linked to parallel mouse sensitive window views of the source language and target C++. The following documentation is generated automatically and made available within the KBAST to support analysis, documentation, and transformation operations.
|
Object Model Outline Browser |
A structured outline browser for navigating derived objects, classes, methods, and procedures. Popup and Pull down menu provide commands for displaying integrated graphical and textual views of source and target code and derived design and allow operators to perform operations upon the evolving software configuration. |
|
Process Data Flow |
Procedure process dataflow behavior is depicted by process data flow graphs which depict the flow of data through the procedure as data flow graphs whose begin and end-points are data sources and sinks (i.e. parameters and designated classes and their fields) and whose processes are methods. |
|
State Transition Table |
A state-transition table consists of a table depicting one-or more states and the conditions and actions involved in transitions between the states depicted as a limited entry decision table. |
|
State Transition Graph |
The State Transition Graph of a procedure consists of a start state, an end state and a set of intermediate states joined by state transitions. |
Table 3: Derived Design Artifacts
Table 4 summarizes the principal object oriented model components that are partial products of the transformation from a source language into intermediate C++. The following object model components are generated automatically and made available within the KBAST to support analysis, documentation, and transformation operations.
|
OO Data Class |
Top-level OO data classes whose member elements are formed from large-grained or top-level data structures from the legacy application, and whose methods are derived from functionally cohesive slices of code associated with the class’s member elements. |
|
OO Process Class |
OO Process Classes whose instances are transformations of procedures into OO processes, which refer to the elements of classes. Calls to Methods formed from statement can be invoked from OO processes. |
|
OO Methods |
There are several classes of Methods. Data transforming methods are formed from block level slices between designated classes. Side effecting methods are formed from sequences of statements that invoke procedures or use data, but do not directly transform data. |
Table 4: OO Model Entities
Re-factoring: Re-factoring is the process of changing a software system in such a way as to improve the software's structure and performance without altering the functional behavior of the code. Re-factoring operations are primitive transformations of the code that accomplish limited design restructuring to improve the code prior to completing transformation. Larger-grained transformations are accomplished by applying multiple sequential re-factoring operations to accomplish the overall larger restructuring objective.
Re-factoring is used to eliminate, replace, or rewrite code to improve its efficiency and understandability or to transform applications to use a suitable set of modern infrastructure support functions. Re-factoring operations, especially fine-grained operations supported by the technology, but introduced by humans, can potentially change the system behavior, either in ways that are intended or unexpected. Large grained re-factoring operations can be broad scoped re-factoring operations, which preserve functionality, while improving code quality.
Re-factoring encapsulates, abstracts, and/or reorganizes data structures or functionality. Re-factoring introduces modes to decouple a slice of code from its original context and makes it a re-usable component. Re-factoring to introduce parameters into syntactically similar functions or methods for the parts of the code that are dissimilar transforms these components to make them more re-usable. Re-factoring extracts and parameterizes methods; merges and consolidates similar methods; reduces the set of methods associated with a class to the minimal set of well-understood operations; improves the coupling, cohesion and comprehensibility of the overall application; and reduces overall code duplication and code redundancy in the application. Re-factoring to combine classes or extract common data elements of several classes into a common parent class improves the structure of the application data model by reducing data duplication.
Legacy applications often have many dependencies on the legacy software infrastructure. Consequently it is often not directly portable to another software environment. Modernization of applications may require isolating the mission application code from the code associated with various environment specific utility/support functions known as Infrastructure Code.
After isolating the infrastructure from the mission software, the mission-critical software shall be analyzed and re-factored without risk that comprehension of the functional essence of the mission-critical software application is obfuscated by legacy infrastructure code. One key objective for re-factoring the mission-critical software application will be to minimize and isolate the target system's unique features by partitioning the software application into functional-area generic and mission-specific classes. The domain model constructed during the assessment will guide this partitioning.
Infrastructure code of legacy software is sometimes sufficiently similar to the desired modern equivalent that it is practical to achieve operational code directly from the transformation process without any re-factoring. In such cases there is often no need to re-factor infrastructure code as a separate step in the transformation process. Infrastructure code is often tightly coupled or embedded in the mission code in a way that makes it difficult to re-engineer or maintain the code. In such cases re-factoring of the application to isolate the infrastructure code may be necessary.
The development of infrastructure support software, its unit testing, and integrated functional testing, is typically the most time consuming phase of the overall transformation process. Infrastructure support software, often called middleware, provides a layer of functionality in the new target environment that replaces functionality that previously existed in the application legacy environment.
Often the legacy functionality does not exist in the new environment, or only exists in a different form. Thus, this layer of software services must be discontinued, redeveloped, or suitably replaced. The definition or introduction of an appropriate interface to the facilities/services layer into the newly derived application, and the testing of both the interface and the services layers accessed through the facilities/services layer interface, is an iterative process. Subtle changes in the way the application interfaces with its data bases or environment is a common source of errors in a transformation project. Separation of the infrastructure layer from the application layer expedites resolution of errors that are caused by changes in the operational environment. Domain model annotation rules are used to formally document the disposition of the infrastructure support software.
This re-factoring effort entails decoupling the infrastructure code from the application code by encapsulating it into a separate layer of code that is accessible through an API (Application Program Interface). The API hides the complexities of the infrastructure code from the application logic and allows the infrastructure layer code to be maintained without modification of the application code layer. This approach has the twin benefits of: (1) separating the intricacies of the infrastructure code layer from the application logic layer so that the infrastructure code can be easily developed or adapted to different needs without necessitating changes to the application logic; and (2) makes the application logic easier to maintain by separating it from the intricacies of the infrastructure layer implementation.
After the legacy infrastructure software is re-factored or transformed to operate within the target environment, it is practical to complete the translation of the OO model into code, and commence testing. Testing of the infrastructure code is completed before commencing re-factoring of the mission-critical software application.
The degree of reduction and consolidation that the re-factoring transformation brings about is an important property of the transformation process that is indicative of the benefits that conversion to an object-oriented form can bring about. Table 5 summarizes the model metrics that shall be available and used to measure the benefits of re-factoring and other forms of code optimization.
|
Method Instance Table |
The Method-Instance Table (MIT) describes the number of instances created per class. This provides an indication of the amount of code reduction associated with the description of data structures for the target language. It is a partial measure of data redundancy eliminated through object class and instance formation. The C++ application may dynamically create the data structures rather than statically pre-allocate the data. This dynamic allocation is taken into account. The MIT also indicates the number of methods eliminated through method merging. This measure, combined with the amount of code per method, provides a reasonably accurate measure of the amount of code reduction achieved by the transformation and re-factoring processes. |
|
Model Statistics Report |
Model Statistics metrics provide a measure of the amount of functional and structural compression achieved through method merging reductions, and object-instance abstraction. |
|
State Transition Table Parallelism |
An indication of the potential amount of block-level parallelism is indicated by sequence numbers associated with the method invocations in a state transition table. (Methods are independent if they are not dependent upon one another by a Set/Use-chain relationship and hence could be invoked simultaneously rather than sequentially.) In the paragraph state-transition table, invocations of a transition’s action are independent of one another if their invocation sequence numbers are identical. |
Table 5: Transformation Metrics
Web-enablement: Web-enablement entails the transformation of an application into a networked distributed application that makes use of browser user-interfaces (BUI), web-based languages, run-time environments such as Java and the Java Virtual Machine (JVM), and web-based data transmission and manipulation protocols, such as the extended markup language (XML) for the interchange of data.
Hybrid web applications are web applications that exhibit some, but not necessarily all of these features. A web-application may be written in C++ and have a BUI front-end that supports interface with users or a back-end database with connectivity via Microsoft's Object Data Base Connectivity (ODBC). Java applications typically employ JDBC (Java Data Base Connectivity) to connect to various vendor data base products with similar functionality as ODBC.
The Common Object Request Broker Architecture (CORBA) has a common Interface Definition Language (IDL) that supports both Java and C++. CORBA is commonly used to provide distributed component services for a smaller number of users with high-performance requirements. CORBA's IDL facilitates the creation of networked distributed applications by simplifying the definition of interfaces that allow components to call one another that reside anywhere in the network and may be implemented in any language that supports IDL. Enterprise Java Beans are frequently used for lightweight Java applets with many users supported by a distributed server. Java applets more frequently use Remote Method Invocation (RMI) rather than IDL as the principal method for transferring data between an application and a remote host.
The prevalence of both CORBA and Enterprise Java Beans for distributed component management architectures often coexists in large applications. For instance CORBA with C++ is often used for highly optimized transaction oriented data base applications, while Java Enterprise Java Beans and Java applets are often used for lightweight interactive end-user applications.
Given the multiple business processes performed by the applications within large confederated legacy systems and the tradeoffs between several possible alternative distributed component web-based architectures, the definition of the most appropriate transformation approach is a complex decision to be evaluated. It requires an in-depth analysis of the customer's applications, analysis of the implications of alternative solutions, and possibly some amount of iteration to define an appropriate transformation pathway. This decision process is driven by the current system architecture, the target architecture objectives, the technical infrastructure, including overall toolset capabilities, and personnel resources available to support this transformation process.
Several approaches to web-enablement are achievable with a relatively high-level of automation.
Transform legacy applications into C++, but componentize and containerize the applications as a CORBA domain within the CORBA framework. Transform the current hierarchical networked databases into a relational or object-oriented database using ODBC for data base access. Transform the user interfaces of the applications to use a Browser User Interface (BUI) by inserting an explicit API layer written in C++ to drive BUI level interactions.
Transform legacy applications into Java rather than into C++. Componentize and containerize the resulting Java Applets as Enterprise Java Beans (EJBs) in an Enterprise Java Architecture. Transform the current hierarchical networked data bases into relational or object-oriented using JDBC for data base access. Transform the user interfaces of the applications to use a browser user interface (BUI) by inserting an explicit API layer written in Java to drive BUI level interactions.
Create a hybrid architecture consisting of both C++ and Java for some legacy systems (or parts of systems) using CORBA IDL or XML-RPC as a connectivity layer between components. Use XML (XML Metadata Interchange) for modeling the distributed architecture. Transform the current hierarchical networked databases into relational or object-oriented databases allowing data access by either JDBC or ODBC. Allow for definition and interchange of data via XML using XSDL (XML Schema Definition Language) and XQL (XML Query Language). Transform application user interfaces to use BULs by inserting an API supporting XHTML and Java or C++ to drive BUL-level interactions.
As today's organizations address the critical structural, cultural, and financial issues surrounding the migration of their often irreplaceable legacy software applications and databases to modern platform-independent computing environments, it is essential that they understand that a new automated low-risk approach is available. Exceedingly advanced toolsets and processes for rapidly re-engineering legacy system software into a modern computing environments provides organizations with a valuable new alternative that is faster, lower cost, lower risk, and higher quality than other methods currently available.

Philip Newcomb, The Software Revolution, Inc. President, Chairman Board of Directors, and Vice President of Research & Development:
An internationally recognized expert in the application of artificial intelligence and formal methods of software engineering, he has published numerous papers in his field. He has graduate work and degrees from Carnegie Mellon University, the University of Washington, Ball State University and Indiana University. He has done groundbreaking research in the applications of artificial intelligence, software engineering, and automatic programming. He formulated the conceptual product framework and developed the software transformation technology, which now resides in the eVolution 2000TM toolset described.
1 Rome Laboratory's Knowledge Based Software Assistant Program.
The Software Revolution, Inc. 08/29/01
|
Send mail to
olsemm@tacom.army.mil with
questions or comments about this web site.
|