CSC/ECE 517 Fall 2014/ch1a 14 yz
Refactoring Software Reengineering Toolkit
Design Maintenance system (DMS) is a software engineering environment that supports the incremental engineering and maintenance of large application systems, driven by domain knowledge, semantics, captured designs and automation.The DMS Software Reengineering Toolkit is a proprietary set of program transformation tools available for automating custom source program analysis, modification, translation or generation of software systems for arbitrary mixtures of source languages for large scale software systems <ref>DMS: Program Transformations for Practical Scalable Software Evolution. Proceedings International Conference on Software Engineering 2004 Reprint</ref>
DMS has been used to implement a wide variety of practical tools, include domain-specific language (such as code generation for factory control), test coverage<ref>Branch Coverage for Arbitrary Languages Made Easy</ref> and profiling tools, Clone detection,<ref>clone Detection Using Abstract Syntax Trees. Proceedings International Conference on Software Maintenance 1998</ref> language migration tools, C++ component reengineering.,<ref>Case study: Re-engineering C++ component models via automatic program transformation Information and Software Technology 2007</ref> and for research into difficult topics such as refactoring C++ reliably.<ref>Small Business Innovation Research (DoE): Refactor++</ref>
Introduction to the DMS Software Reengineering Toolkit
The DMS Software Reengineering Toolkit is a set of tools for automating customized source program analysis, modification or translation or generation of software systems containing arbitrary mixtures of languages ("domains"). The term "software" for DMS is very broad and covers any formal notation, including programming languages, markup languages, hardware description languages, design notations, data descriptions, and domain-specific languages. This toolkit is the first step towards the implementation of the Design Maintenance System®, an ambitious vision of a 21st Century software engineering environment that supports the incremental construction and maintenance of large application systems, driven by semantics and captured designs.
DMS is additionally unusual in being implemented in a parallel programming language, PARLANSE <ref>A Parallel Language for Symbolic Expression for 80x86 Symmetric Multiprocessors under Windows </ref>, which uses symmetric multiprocessors available on commodity workstations. This enables DMS to provide faster answers for large system analyses and conversions.
A very simple model of DMS is an extremely generalized compiler, having a parser, a semantic analyzer, a program transformation engine (to do code generation and optimization), and final output formatting components (producing source code rather than binary code). It is particularly important that the analyzer output can be used to choose the desired transforms. Unlike a conventional compiler, in which each component is specific to its task of translating one source language to one target machine language, each DMS component is highly parameterized, enabling a stunningly wide variety of effects. This means one can change the input language, change the analysis, change the transforms, and change the output in arbitrary ways. Also, unlike a conventional compiler, DMS can process thousands of files from multiple languages at the same moment, allowing analyses and/or consistent code changes across complex systems of files. (An interesting property is that DMS reads formal descriptions of languages, analyses and transforms, and is consequently used to support itself.) The following diagram shows the process flow and different components of a DMS model.
Many program analysis and transformation tools are limited to ASCII or Western European character sets such as ISO-8859; DMS can handle these as well as UTF-8, UTF-16, EBCDIC, Shift-JIS and a variety of Microsoft character encodings.
DMS uses GLR parsing technology, enabling it to handle all practical context-free grammars. Semantic predicates extend this capability to interesting non-context-free grammars (Fortran requires matching of multiple DO loops with shared CONTINUE statements by label; GLR with semantic predicates enables the DMS Fortran parser to produce ASTs for correctly nested loops as it parses).
DMS Capabilities
DMS provides a large set of robust, integrated facilities for building analysis and modification tools<ref>Program Transformations for Practical Scalable Software Evolution </ref>:
- Full UNICODE-based parser and lexer generation with automatic error recovery. Accepts/generates files encoded in UTF-8 and UTF-16, 7 bit ASCII (ISO-646-US), 8 bit ASCII (ISO-8859-1 thru -16), EBCDIC (CP-37, CP-500), a number of Microsoft code pages (CP-1250 thru -1258), and Japanese Shift-JIS (CP-932 and JIS-0208). Standard support is included for reading multiple source files to enable INCLUDE file management and construct suitable preprocessors. The parser technology is based on GLR, and can handle any context-free language, even with ambiguities (much stronger than YACC/LALR).
- Automatic construction of abstract (not concrete) syntax trees (non-value-carrying terminals and unit productions are suppressed; syntax-lists are converted into AST list nodes). Literal values (numbers, escaped strings) are converted to native, normalized binary values for fast internal manipulation. Source comments are captured and attached to AST nodes.
- Pretty-printer generation converts ASTs back to nicely formatted legal source file form, according to a specified layout information, including source comments. In fidelity-printing mode, comments, spacing and lexical formatting information of unchanged code is preserved. Customizing allows generation of source code HTML form, or even as obfuscated source text. Trees may be output directly in XML format.
- Multi-pass attribute-evaluator generation from grammar, to allow arbitrary analysis (including name/type analysis procedures) to be specified in terms of the concrete grammar provided.
- Sophisticated symbol-table construction facilities for global, local, inherited, overloaded and other language-dependent name lookup and namespace management rules.
- Control-flow graph construction including traditional entry/exit/action/condition nodes, but also fork/join nodes to model parallelism and/or indeterminate order (e.g., C sequence points). There predefined analyzers for constructing (post) dominators, and inducing structured control-flow regions. Additional machinery can compute compilation-unit local and system/global call graphs.
- Data flow analysis framework, to allow data-flow analysis problems to be posed and answered, including predefined analyzers for constructing use-def and def-use chains. (See sample control and data flow graphs)
- Points-to analysis for computing local or global points-to data, tested on systems of 13+ million lines of code.
- Symbolic Range Analysis computing range constraints on program variables in terms of other variables. This is useful to detecting array-access errors, determining which switch case is selected, ... in conjunction with other analyses.
- Multiple domains (notations/languages) can be represented at the same time. This enables processing or generating systems composed of parts from more than one domain (COBOL and JCL, C and Makefiles, etc.), and/or translation from one domain language to another.
- Transforms and patterns can be written directly in surface-to-surface domain syntax form. Patterns can be matched against syntax trees and return bindings for parameter subtrees. Alternatively, procedural code can implement transforms, or refer to existing transforms and patterns to enable construction of very sophisticated transforms.
- A full Associative/Commutative rewrite engine that operates on trees and DAGs, which can be used to apply sets of transforms.
- An algebraic specification subsystem can be used to specify arbitrary algebras (this is just a DMS domain!). The axioms can be treated as a set of rewrite rules. (This allows one to code arbitrary simplification procedures.
The features of DMS and how each of the features work in a DMS model is shown in the diagram below.
Available Languages
DMS has a variety of predefined language front ends, which allows the construction of custom compilers, analysis tools, or source transformation tools<ref>Language/Compiler Front Ends</ref>. Predefined languages enable customizers to immediately focus on their reengineering task rather than on the details of the languages to be processed.
The list of major language modules includes:
- C(ANSI, GNU, C99, Microsoft dialects), with intelligently managed include and preprocessor directives, full name and type resolution, control and data flow analysis, system-wide call graph, system-wide points-to analysis
- C++ (ANSI, GNU, Microsoft dialects), including C++0x with intelligently managed include and preprocessor directives, and full name and type resolution
- C# (Microsoft's .NET language) versions 1.2, 2.0, 3.0 and 4.0
- COBOL 85 ("ANSI"), IBM VS COBOL II, IBM Enterprise COBOL with preprocessor, COPYLIB management and Report Writer, having full name and type resolution, and control and data flow analysis
- Fortran 95/90/77
- Java 1.1,1.2,1.3,1.4,1.5,1.6, with full name and type resolution including the JDK and class files, control flow analysis and call graph construction.
- MATLAB M-files and Simulink
- Perl 5
- PHP: PHP3, PHP4 and PHP5
- Python 2.6 and 3.1
- Verilog 1995, 2001 and SystemVerilog 3.1a
- VHDL 1993
- Visual Basic (VB.net, VB6, VBScript+ASP)
Compare to other Analysis and Transformation Technology
The DMS Software Reengineering Toolkit ("DMS") is used to automate program analyses and transformations. It consequently shares a number of properties with other compiler technologies, but goes beyond them often in a variety of ways. This section explores other technologies that are available in practice and compares DMS to them. Only the C++ Front ends and the compiler infrastructure will be shown, for a complete list, please refer to the DMS website. <Ref>comparison of DMS to other well-known types of compiler technologies</ref>
C++ parsers ("front ends") are intended to read C++ source code and build compiler data structures representing that code, with the expectation that a custom tool will be build to process the compiler data structures, for analysis or C++ transformation.
C++ Front Ends | Status | C/C++ Dialects Available | Scale | Performance | Implementation Language |
---|---|---|---|---|---|
DMS | Production; Commercial; Active Enhancement |
Production; C & C++; C++0x; ANSI,GCC, MSVC6, MS Studio 2005, SystemC; |
Tens of thousands of source files; Multilingual processing | Parallel implementation | PARLANSE |
GCC | Production; Open Source; Active Enhancement | GCC; ANSI | One source plus includes | Fast, hand tuned | GCC C |
EDG | Stable; Academic | Most C/C++ dialects | One Source file plus includes | Fast hand tuned | C |
OpenC++ | Stable; No preprocessor; Open Source | Most of ANSI C++; Limited template handling | Single file plus includes | Unknown | C++ |
Columbus | No preprocessor | ANSI C++ | Single plus includes | unknown | C++ |
Compiler infrastructures are intended to make it easier to construct compilers or compiler-like tools such as source code instrumenters.
Compiler Infrastructure | Status | Languages Available | Scale | Performance | Implementation Language |
---|---|---|---|---|---|
DMS | Production; Commercial; Active Enhancement |
C/C++0x, C#, Java1.5, Fortran 77/95, Pascal, Ada, COBOL, Natural, JCL, JavaScript, PHP4/5, VB.net,VBScript,VB6, Python 2/3, HTML, XML, SQL 2011,PLSQL, Matlab M, Simulink, Verilog, VHDL, SystemC; |
Tens of thousands of source files; Multilingual processing | Parallel implementation | PARLANSE |
GCC | Production; Open Source; Active Enhancement | GCC; ANSI | One source plus includes | Fast, hand tuned | GCC C |
LCC | Stable; Academic | ANSI C | One Source file plus includes | Fast hand tuned | C |
Industrial Scale
These foundations have been used for an amazing variety of industrial tasks, including quality analysis, restructuring, automated porting, pretty printing and highly optimized code generation.
DMS is designed to work on large scale source systems
- with up to several million lines of source code or specification
- across tens of thousands of source files
- having multiple languages at the same time
DMS is implemented using parallel language, PARLANSE, to provide computational horsepower consistent with this scale. While DMS runs on a single processor system at unit speed, it also runs on symmetric multiple processor workstations with enhanced performance. As an example, the attribute evaluation process is automatically parallelized, and can often provide a linear speedup on an N-way SMP system.
DMS is hosted on Windows (any version) using Intel or AMD single or symmetric multiprocessing (SMP) hardware. Using Wine, DMS runs on Linux, Solaris and MAC OS X<ref>Google Tech talk on DMS </ref>.
References
<references/>