摘要:逆向工程是设计恢复的过程,是对遗产系统的有效利用。本文阐述了逆向工程相关的基本概念,介绍了国内外在此领域的研究现状,并且结合我国的具体情况,探讨了逆向工程在军事领域的应用及今后的发展目标。
; D) o. n, S( g关键词:计算机软件;逆向工程;综述;遗产系统;再工程;重构: e% I D8 l- p- s- C( x" b
N M, B( ]( v+ }6 I+ P
1 引言
, X9 s- K4 R3 ~8 S, S4 |: p 软件维护是软件开发中最昂贵的一个阶段,占总开发费用的70%以上,很多原因(比如业务需求改变、科技基础设施现代化等)使得软件系统需要经常更新和改进。一个系统、特别是一个大型遗产系统的维护工作非常困难。由于时间紧或其他原因开发人员忽视代码的文档记录工作,几个月后开发者本人可能都不太清楚代码的逻辑,并且在软件产业中人员流动频繁,对于新加入的程序员,他们首先要花大量时间研究所需要继续维护的软件系统结构,如果软件实现思想没有被很好地记录下来,新加入的开发者可能会曲解这些代码的行为,然后想当然地改变它们。经过几次这样的过程,这个系统已经变得特别难维护,如果重新开发又会使以前投入的人力和财力浪费掉,因此在这种情况下就非常需要借助工具理解现存的代码,逆向工程的方法和工具也就成为了人们关注的热点。
7 N. F& j$ t1 h; n9 u& T2 逆向工程的基本概念
7 z7 y$ l, I* C8 S: y7 o9 o) W2.1 定义及相关术语: C6 l8 Q3 i9 ^, ~7 |4 T
逆向工程(reverse engineering)被定义为分析软件构件和它们的相互关系,从而在较高抽象层次上描述该软件。这个术语最早出现在硬件技术中,指获取对复杂硬件系统的描述过程,现在这个概念转移到软件上。Chikofsky和Cross给出了相关的几个术语的定义,图1显示它们之间的关系。; V4 d2 c3 y& H5 L+ Y6 l
+ r" W; }9 j& N, f& J
a)正向工程:从高层抽象和设计到低层实现;
3 h0 p0 D) I6 ^7 _( c' B6 }b)逆向工程:正向工程的反转过程,限定到调查系统但并不改变系统;. o% K1 L' n. z
c)再文档:主要是在同一抽象层次做语义等价描述,实际上是逆向工程的一种简单形式;! X; x/ m* b) w$ V+ a d; N& n
d)设计再现:利用领域知识和外部信息在较高抽象层次产生系统的等价描述,这样要使用除了源代码外的很多信息;# w1 P" B- ^ g8 S7 m# F& z* Q
e)重构:在同一抽象层次把系统从一种表示方式转换到另一种表示方式,一个重要方面是新系统和原始系统的语义行为应该一样,而且功能也不能变;9 G: A7 c p# C! b! C: z- `/ P% m
f)再工程:目的是研究系统,产生较高抽象层次描述,增加新功能到这个描述,使用正向工程技术在原始系统的基础上开发一个新系统。/ J4 U. ~- k% i# B0 w3 l( C
2.2 目的和意义; A& P* \7 _9 I7 Z
逆向工程的目标是理解一个软件系统以便于更容易地进行增强功能、更正、增加文档、再设计或者用其他的程序设计语言再编码。对一个程序维护者来说,可能重要的一点是能以其他方式而不是靠读源码看到程序关键的部分。逆向工程工具支持产生程序的高层抽象,使维护者更容易理解程序,重用旧代码,以及准确加入新功能,避免死码的产生。这正是逆向工程工具的研究目的和意义。+ A5 m1 J, N8 Q& c
目前很多逆向工程工具支持创建关于程序的结构或执行的各种视图。在正向工程中图形被用于可视化程序,在逆向工程中可以产生一些视图,利用这些视图可以修改现存的文档,避免源代码与文档的不一致性,更方便维护者理解程序的行为。( `" f+ r4 {4 r
3 逆向工程的研究现状; M: E3 ?5 M4 n, G- }* m3 ]
3.1 国外的发展
# _& h. C( Y6 n! N2 B; z' f 从已经搜集到的文献中看,国外应用于逆向工程软件工具很多,它们主要提供三种类型的能力:一是常规的静态模型逆向产生能力,从某种特定语言的源码或编译后的目标码转换出静态模型(如类图、活动图、控制流图等);二是动态模型逆向产生能力,将程序运行过程中的标志性信息进行搜集、存储和整理,再转换成相应的动态模型(如序列图、状态图、协同图等);三是扩展的静态模型逆向产生能力,将常规的静态模型逆向产生能力加以扩展,以体现静态模型的领域特征、提高静态模型的抽象层次或者表现形式,以利于理解和使用。
" P/ H6 A6 e' ]! B2 L: i7 F8 S下面分别给出提供这三种类型能力的典型工具:2 Y( l4 X. W$ A+ C9 N
a)常规的静态模型逆向产生能力
$ m) y+ Y: ?, f8 _# F$ ? Rigi是一个很有名的可扩展、可裁剪的逆向工程环境,主要由三部分构成:Rigireverser(程序静态信息解析器,可以支持C, COBOL等语言)、Rigiserver(程序静态信息库,用于存储从源代码提取的信息)、Rigiedit(交互式的窗口图形编辑器,以图形交互方式展示和操纵程序静态信息)。
9 v& V4 B9 {7 a( n Rose/Rose RealTime (Rose RT)提供了逆向工程工具,可以从多种程序设计语言源程序中自动产生静态设计模型,但目前只能产生类图。& r3 p3 ?8 R4 _3 h9 {8 e, q: J
b)动态模型逆向产生能力- }9 P; j% }1 J
SCED是一种支持面向对象动态建模的环境,可以产生剧情图(类似于UML中的Sequence Diagram)和状态图(类似于UML中的Statechart Diagram). SCED基于OMT方法,也可用于其它方法,尤其是以剧情驱动的方法。. p) E/ J5 A& b4 j1 F( Q
C)扩展的静态模型逆向产生能力
# |, \$ i0 `: G8 a* m& T% j Rose/Architect是USC (University of Southern California)与Rational合作开发的一种可视化工具,用于对UML类图中的实体进行基于规则的等价合并,以突出地呈现系统的软件体系结构成份。
' _& E) ~6 h$ x! L& @3.2 国内的发展( A$ @" s! ]0 s0 X0 V. H8 j
国内开发的用于逆向工程软件工具很少,现在主要是青鸟程序理解系统JBPAS (Jade Bird Program AnalysisSystem),它是一个针对C++语言的程序理解系统,由一个C++分析器前端和一组分析工具组成。该系统是北大青鸟基于异构平台、具有多信息源接口的应用系统集成(组装)环境有导鸟III型(JB3)系统拍勺组成部分。该系统针对C++语言,采用增量分析技术对程序源代码进行静态分析;用EER(Enhanced Entity-Relationship)为C++程序建立概念模型并抽取程序信息,将信息保存在数据库中;按照不同的用户需求组织程序信息,辅助用户理解C++程序;逆向生成源程序的OOD (Object-Oriented Design)文档和Rose文档(但实际所需的时间很长,对于10万行源代码的程序,大约需要6小时)。
. Y+ N# N( ?/ A+ z4 逆向工程在军事领域的应用
; E9 h, u5 e* y: z6 |4.1 军事领域对逆向工程工具的要求" j( L2 m' w( R' D" k
军事电子信息系统是软件密集、结构复杂的大型信息系统。作为高技术战争的重要装备,军事电子信息系统的研制和维护必然立足于国内,必须采用先进的、实用的、符合中国国情的系统分析、设计和实现技术,以及相应的开发环境与工具。1 v+ s6 q" N4 B! Y+ u& [9 S
“九五”以来,我国军事电子信息系统的主要研制与建设单位对采用先进技术和先进工具给予高度重视,开始用面向对象等先进技术进行系统分析、设计与实现,其中使用很普遍的是统一建模语言(UML)和Rational开发环境与工具(如Rose, SODA, C1earCase等)。近年来,一些单位已经将UML, Rational开发环境与工具应用于军事电子信息系统型号项目的研制,培养了一批熟练的开发和管理人员。但是通过几年的应用实践,也发现了一些巫待解决的技术问题,在很大程度上影响着军事电子信息系统的开发质量、开发速度、开发成本。这些问题卞要集中在以下两个方面:
7 ?. g: p2 L* h* g ]- U. y N- l a)保证需求变化后模型与程序的一致性
3 m# a1 ~9 D0 |! y6 ?( N 我国军事电子信息系统中研制需求变化是客观事实,并且由于研制周期缩短,需求变化往往发生在研制后期,这就引起了很多问题。需求发生变化或在现场维护程序时都会引起分析设计模型的变化,由于Rational环境与工具仅支持源程序静态模型的自动修改,所以对于费时费力的动态模型修改由于时间限制可能就被放弃。这样与动态模型相关的文档就很可能与源程序不一致。即使是时间允许也不能保证分析、设计人员建立的动态模型与源程序的必然一致性。但是,对于军事电子信息系统这样以分布、并发为主要特征的系统,其主要设计内涵恰恰是由动态模型来描述的,因此动态模型与实现的不一致,直接降低了研制单位、开发人员对开发
# Y( Q& r5 m3 j! T1 C( ~1 I* D方法、工具与环境的信任程度。
, ~! j% \! e3 |, R; } b)提供不同抽象层次的静态模型 J; I x& V& G
以往成功的军事电子信息系统开发经验表明,开发队伍中拥有对此类系统的框架十分熟悉的技术人员,以及能够根据这些框架实现系统总联与配置的技术人员,对于系统开发的成功是至关重要的。但是,这样的关键技术人员出现流动是不可避免的,如退休、调动、辞职等。一旦出现了关键技术人员的流动,就可能出现以下问题:已有文档中的框架描述和静态模型可能与程序不一致;正向建立的静态模型可能没有正确体现抽象层次较高的程序框架。
$ }* F* j& O3 ?' r7 s8 l 最根本的解决办法是用工具从源程序中抽象出不同层次的静态模型,其中包括系统框架层。但是,目前Rational工具对源程序到类图的自动转换是机械的,有较大的局限性:
. ^! Z$ z3 C: y; g& p& p* s 如果该源程序过去就是用Rational工具产生的,则由于在其注释中加入了模型信息,使得逆向产生的类图与正向建立的相同(包括包结构)。但是在实际应用中,完全可以通过软件过程管理等手段要求开发人员先对类图进行修改,再重新生成源程序代码框架(这时Rational工具可以自动保证以前人工编制的程序保持不变),因此实际上这种情况下可以不用逆向工程工具。
' @0 f: y) r0 E% r9 @; ` 如果该源程序不是用Rational工具产生的,则使用逆向工程工具就是有意义的。但是,这时逆向产生的类图包含了许多并不是类的结构实体,对于类之间的关联也不加区分地展示,使得所产生的类图错综复杂、没有层次,如同蜘蛛网一般,需要有经验的设计人员进行较长时间的人工加工后才能使用,因此这种功能实际上很少在工程中应用。- [% t$ i+ u# D( |3 [
4.2 需求分析
7 W b0 e1 P# E2 ] 针对第一个问题引出的需求是:提供一种工具,它具有一定的层次分析与过滤能力,能够根据不同的抽象层次要求,从同样的源程序中逆向地产生不同抽象层次的静态模型,对系统框架的理解起计算机辅助作用,并使得这样的静态模型在Rational开发环境中与正向建立的静态模型具有相同的表示,以便对其进行人工修改和自动生成士档。( H3 |+ P1 `# i2 w5 p
针对第二个问题引出的需求是:提供一组工具,以支持从源程序逆向地产生相应的动态模型77,如符合UML标准的序列图(Sequence Diagrams)、状态图(Statechart Diagrams)、协同图(Collaboration Diagrams)等,并使得逆向产生的上述动态模型在Rational开发环境中与正向建立的动态模型具有相同的表示,以便自动生成文档。
5 o& m! v8 P& m5 e- y+ b' v/ J2 O5 解决方法9 m( r4 J1 V M( I; A
基于上述项目需求,逆向工程开发工具的研究目标如下:
8 M6 ~/ z8 N4 a4 T3 x a)军事应用的研究目标:研制一组逆向工程工具,以提供符合UIVL标准的动态模型的逆向生成、符合UML标准的静态模型的逆向生成与分层抽象等方面的能力;将这一组工具无缝集成到Rational开发环境中,并与该环境中的其他工具协同工作,以扩充Rational开发环境在逆向工程工具方面的支持能力;在将研制结果应用于实际系统开发后,为提高我国各类军事电子信息系统的面向对象开发、维护和重用水平提供有效的、实用的支持。
, e! j9 }* D& H9 S K% x b)技术发展的研究目标:突破所涉及的逆向工程关键技术;这些关键技术的突破,可以为军事电子信息系统及民用系统开发的其他方面提供相应的技术基础,如程序理解、遗产系统(Legacy Systems)改造、测试用例生成、自由软件重用、软件维护、程序验证等。 |