C
解析:我们首先看两个概念。逆向工程(ReverseEngineering,反向工程)的概念来自硬件。硬件厂商总想弄到竞争对手产品的设计和制造的“奥秘”,但是又得不到现成的档案,只好拆卸对手的产品并进行分析,导出该产品的一个或多个设计与制造的规格说明。软件的逆向工程是完全类似的,由于受到法律的约束,进行逆向工程的程序常常不是竞争对手的,而是自己开发的程序,有些是多年以前开发出来的。这些程序没有规格说明,对它们的了解很模糊。因此,软件的逆向工程是分析程序,力图在比源代码更高的抽象层次上建立程序表示的过程。逆向工程是一个设计恢复的过程,其工具可以从已有的程序中抽取数据结构、体系结构和程序设计信息。再工程(Re-engineering)不仅能从已有的程序中重新获得设计信息,而且还能使用这些信息改建或重构现有的系统,以改进它的综合质量。一般软件人员利用再工程重新实现已存在的程序,同时加进新的功能或改善它的性能。每一个软件开发机构都会有上百万行的老代码,它们都是逆向工程和再工程的可能对象,但是由于某些程序并不频繁使用而且不需要改变,逆向工程和再工程的工具还处于摇篮时代,仅能对有限种类的应用程序执行逆向工程和再工程,代价又十分昂贵,因此对其库中的每一个程序都进行逆向工程和再工程是不现实的。软件再工程旨在对现存的大量软件系统进行挖掘、整理以得到有用的软件构件,或对已有软件构件进行维护以延长其生存期。它是一个工程过程,能够将逆向工程、重构和正向工程组合起来,将现存系统重新构造为新的形式。再工程的基础是系统理解,包括对运行系统、源代码、设计、分析和文档等的全面理解,但在很多情况下,由于各类文档的丢失,只能对源代码进行理解,即程序理解。为了执行预防性维护,软件开发组织必须选择在最近的将来可能变更的程序,做好变更它们的准备,逆向工程和再工程可用于执行这种维护任务。逆向工程可以从源程序抽取出设计信息,但是,抽象的层次、文档的完整性、工具和分析员一起工作的程度以及过程的方向性却是高度可变的。逆向工程过程及用于实现该过程的工具的抽象层次是指可从源代码中抽取出来的设计信息的精密程度。理想地,抽象层次应该尽可能高,即逆向工程过程应该能够导出过程的设计表示(一种低层的抽象);程序和数据结构信息(稍高一点层次的抽象);数据和控制流模型(一种相对高层的抽象);以及实体—关系模型(一种高层抽象)。随着抽象层次增高,软件工程师将获得更有助于理解程序的信息。逆向工程过程的完整性是指在某抽象层次提供的细节程度。在大多数情况下,随着抽象层次增高,完整性就降低。例如,给定源代码列表,得到一个完整的过程设计表示是相对容易的,简单的数据流表示也可被导出,但是,要得到数据流图或状态—变迁图的完整集合却困难得多。