In this section, we describe several issues you may face in reverse engineering and architectural reconstruction. Tool Support Versus Manual EffortArchitecture reconstruction and reverse engineering can be completely manual or tool supported but are not yet a completely automated activity. For example, manual code reading is an essential part of architectural reconstruction. Performing these tasks manually has the advantage of being a hands-on activity. Developers spend time directly evaluating legacy system artifacts instead of relying on tools to do this job. However, given the large amount of code in some systems and the amount of data to be extracted and analyzed , tool support is often a practical necessity. Tools are more exhaustive in their evaluation, but manual evaluation may discover information, such as source code comments, that might not be evaluated in an automated approach. As a result, most reengineering efforts will use some combination of manual and tool-supported activities. Decompilation/DisassemblyIn some circumstances, legacy source code may not be available. If the system is being reengineered through code transformation, the source code ”or at least a higher-level language representation ”must be recovered from the available executable or object code. Recovering source code can be accomplished through disassembly and decompilation. Disassembly translates an executable program into its equivalent assembly representation. Decompilation translates an executable file into a higher-level language. Companies providing these types of services focus mainly on mainframe applications written in COBOL and RPG. For example, these services were used extensively to fix Y2K bugs in older applications. More recent applications of disassembly and decompilation include the javap program included with the Sun JDK for disassembling Java bytecodes and various decompilers , including Deja Vu, Jad, and Mocha. Decompilation is not a straightforward process, and there are difficulties in trying to do it. The main problems are separating data and code ”that is, obtaining a complete disassembly of the program ”reconstructing control structures, and recovering high-level data types. To achieve a greater percentage of the decompilation/disassembly automatically, you can use decompilers that apply knowledge about the specific compilers and libraries used in the original compilation. |