张志宏 包东辉
【摘 要】软件分析、演化和再工程是软件生命周期的重要领域。维护大型软件的任务一直是软件从业者面临的挑战。本文从程序理解、源代码建模、组件恢复、二进制逆向工程和重构、网络为中心的平台迁移、工具和环境六个软件逆向工程领域探讨了研究新趋势,以更好地满足软件分析、进化和再工程的需要。
【关键词】软件逆向工程;软件演化;软件再工程
一、前言
软件分析、演化和再工程技术在过去几年中已经显著成熟,并且已经与软件工程的其他几个领域形成了强有力的技术联系,例如解析和编译技术、软件建模和可视化、模式分析和集成开发环境等。同时,由于迭代和增量开发模型的引入,例如极限编程(XP)和统一过程(RUP),为软件分析、演化和再工程领域提供了新方向。在这种迭代和增量模型的上下文中,软件开发可以采取模型的分析、演化和转换的形式,这些模型涉及广泛的软件组件,例如业务模型、需求模型、体系结构和设计模型,以及实现和测试模型。在这些方面,产生了很多新的研究方向,从而将软件分析和演化技术纳入此类工程模型。
本文对软件分析、演化和再工程的六個主要领域进行研究:
1、程序理解:该领域涉及支持源代码分析和设计恢复的技术。
2、源代码建模和表示:该领域涉及在更高抽象级别上对源代码建模的技术。
3、组件恢复:该领域涉及大型软件系统的架构分析和模块化技术。
4、二进制代码逆向工程:该领域涉及分析二进制代码和反编译复杂系统的技术。
5、网络为中心的平台迁移:该领域涉及支持遗留系统演化到支持Web环境的技术。
6、工具和环境:该领域主要关注系统分析和重构的实用方法和支持工具。
二、研究综述
程序理解一直被认为是逆向工程和软件维护的核心工作,高达50%的维护工作用于程序理解任务,而最近的研究表明,涉及的时间甚至更多,高达70%。程序理解被定义为“在不同抽象层次上构建底层软件的模型,从代码本身的模型到底层应用领域的模型”[1]。因此,这是一个开发人员根据所面临的维护任务、程序的功能、工作方式、体系结构或资源使用情况来识别的过程。到目前为止,对程序理解的研究主要集中在两个问题上:程序的哪种表示方式能够帮助开发人员在执行任务时恢复适当的模型,以及如何通过工具自动构建这种表示方式。
奥本大学的D.A.Umphress,D.Hendrix,J.H.Cross II在文章《改进和测量源代码可理解性的软件可视化》中介绍了软件可视化的两种形式,并在实验中验证了它们如何帮助程序理解,为了便于理解程序的结构和执行,分析了控制结构图,并分析了复杂度图对源代码可理解性的测量能力。两种方法都被证明是有效的,并被纳入了Grasp IDE项目。然而,软件可视化的有效性仍然需要在实际环境中得到更多证明。
CWI和Delft大学的A.van Deursen和L.Moonen在Cobol程序环境下使用类型来记录软件系统的方法,提出了一种自动程序理解工具构建的解决方案。它引入了TypeExplorer,一种基于推断类型浏览Cobol遗留系统的工具。TypeExplorer首先从源文件中提取信息,分析它并使它来推断类型,然后构建一个基于超文本的文档,该文档可供浏览,以便发现单个变量的低级结构以及整个系统架构的全局概览。该项目的一个重要特点是支持将遗留Cobol-85代码迁移到面向对象的Cobol标准中来。多年来,几个研究小组开发了程序分析技术和工具,不同研究人员之间展开合作,所面临的关键问题是需要工具的互操作性,即一个工具从另一个工具导入数据并将其结果导出到另一个工具的能力。基于此一个新的研究领域诞生了,同时也得到了第一届标准交换格式研讨会的认可。
滑铁卢大学的R.C.Holt,达姆施塔特理工大学的A.Shuerr,加利福尼亚大学的S.E.Sim和科布伦茨兰道大学的A.Winter,提出了一种基于图的标准交换格式,描述了这种协作的工作模式,并介绍了作为标准交换格式的GXL语言。这可看成是软件分析的统一源代码建模和表示的重要里程碑。GXL是一种基于XML的语言,用于表示类型图、属性图、有向图、有序图以及超图和层次图。基于此,实例图可以用GXL表示并与相应的模式信息交换。同时,介绍了标准交换格式的基本要求,详细说明了GXL,并讨论了使用GXL交换图形。
逆向工程不仅是一门理论研究学科,也是一个应用领域。当软件必须转移使用一种新开发技术或一种新平台上时,现有软件的应用程序块(称为组件)应该被提取并用作构建新软件。在软件再工程的背景下,当前还须解决两个主要问题:一个是识别现有软件的哪些部分是潜在可重用的,另一个是开发能够围绕已有代码块构建新软件的技术。
德国斯图加特大学的R.Koschke和J.czeranski以及意大利RCOST大学的G.Canfora对组件恢复的dIC方法,提出了识别潜在可重用代码片段的解决方案。更具体地说,通过dIC方法来检测抽象数据对象,dIC方法也被扩展到检测抽象数据类型和集成一个良好的内聚度量来识别候选组件。由于文献表明,任何一种构件恢复方法的有效性在很大程度上取决于主体系统的特性,因此有必要进一步研究构件恢复方法与系统特性之间的关系。
亚利桑那州立大学的S.V.Mudiam、G.C.Gannod的文章《使用适配器将遗留组件进行集成》,提出了一种通过重用现有代码片段和将遗留组件迁移到以网络为中心的平台来构建软件的解决方案。具体来说,它提出了将组件视为服务的观点,然后可以构建客户机应用程序来与这些被视为数据和行为提供者的服务进行交互。该技术利用架构描述语言将组件描述为服务,并使用包装器或适配器生成“粘合代码”,实现服务的运行时集成。工作包括开发一个环境,通过提供服务浏览和将建议技术迁移到.NET和web服务框架,来帮助创建基于服务的应用程序。到目前为止,提到的所有方法都依赖于源代码可用于分析的假设,同时允许使用多种标准技术,通常基于编译,如抽象语法树构造或依赖关系识别。不幸的是,在许多实际的工业应用中,程序分析有时必须在没有完全访问源代码的情况下开始。二进制分析可能是唯一有效的替代方法,即直接分析程序的二进制机器代码。
昆士兰大学的D.Ung的发表了《带运行时反馈的二进制代码动态重构》。二进制翻译是一种允许为一台机器编译的软件被转换成在另一台机器上高效运行的技术。这种重构活动在逆向工程阶段分解。在逆向工程阶段,二进制指令被解码到更高的抽象级别,然后是正向工程阶段,在此阶段,抽象数据被编码成另一种二进制形式。该文介绍了UQDBT二进制转换器,它通过指定机器属性及其指令集来提供适应性,它以一种特殊的方式处理频繁执行的代码,获得比其他转换器更快的翻译。
【参考文献】
[1]刘彦宇,唐运乐.支持源代码逆向建模的关系模型设计[J].河池学院学报,2013,33(02):91-96.
作者简介:张志宏(1990-),男,山西忻州人,汉族,本科,单位:北海职业学院,研究方向:计算机网络技术。包东辉(1971-),男,广西北海人,汉族,本科,讲师,单位:北海职业学院,研究方向:职业教育。
课题项目:2018年度广西高校中青年基础能力提升项目(2018KY1190 )《支持信息检索的程序理解辅助系统设计与实现》。