基于程序切片的软件度量算法设计与实现.docx

上传人:b****4 文档编号:5084249 上传时间:2022-12-13 格式:DOCX 页数:20 大小:38.06KB
下载 相关 举报
基于程序切片的软件度量算法设计与实现.docx_第1页
第1页 / 共20页
基于程序切片的软件度量算法设计与实现.docx_第2页
第2页 / 共20页
基于程序切片的软件度量算法设计与实现.docx_第3页
第3页 / 共20页
基于程序切片的软件度量算法设计与实现.docx_第4页
第4页 / 共20页
基于程序切片的软件度量算法设计与实现.docx_第5页
第5页 / 共20页
点击查看更多>>
下载资源
资源描述

基于程序切片的软件度量算法设计与实现.docx

《基于程序切片的软件度量算法设计与实现.docx》由会员分享,可在线阅读,更多相关《基于程序切片的软件度量算法设计与实现.docx(20页珍藏版)》请在冰豆网上搜索。

基于程序切片的软件度量算法设计与实现.docx

基于程序切片的软件度量算法设计与实现

基于程序切片的软件度量算法设计与实现

摘要

面向对象的广泛应用,之前的以过程间为主的软件度量标准也随之进行改变。

软件切片一直备受关注,切片的度量迅速发展,一方面是源于随着技术的发展更有质量的软件需求越来越迫切,另一方面对于度量对于所有的工程学科都有着举足轻重的作用。

M.wiser很早提出五个度量指标,但是很少有人把五个定性的度量指标运用到实际的度量中,本文以此非形式化度量指标为出发点,研究讨论了另外一种软件度量的方案,相对于热门的内聚度量和耦合度量,该方面的度量有另外的度量价值。

本文中首先介绍了一些基本的概念(如切片,系统依赖图等),之后分别对于度量指标给出形式化的公式,并在最后给出测试实例与分析结果,得出有效的分析结论。

关键词:

面向对象,切片,度量,形式化,度量指标

DESIGNANDIMPLEMENTATIONOFSOFTWAREMEASUREMENTALGORITHMBASEDONPROGRAMSLICING

Abstract

Basedonthewideapplicationofobject-oriented,priortotheprocessbasedsoftwaremetricsalsowillbechanged.Programslicinghasattractedalotofattention,therapiddevelopmentofslicingmeasurement,ontheonehandissourcealongwiththetechnologydevelopmentofbetterqualitysoftwareneedsmoreandmoreurgent.Anotheraspecttomeasureforallengineeringdisciplineshaveapivotalrole.

M.wiserveryearlyputforwardfivemetrics,butfewpeopleputfivequalitativemetricsappliedtoactualmeasurement.Thispapersetthesenonformalmeatricsindexasthestartingpointtostudyanddiscussanorhermeasureofthescheme.Withrespecttothepopularcohesionmetricsandthemetricsofcoupling,themetricsmetricvalueofalso.

Thispaperfirstintroducedsomebasicconcepts(suchasslicing,systemdependencegraph,etc.),respectivelyafterformetricsarepresentedintheformoftheformulaandfinally,testandanalysisofthecaseresultsinthattheeffectiveanalysisconclusion.

第一章绪论

1.1引言

在当今这个高速发展的信息时代,计算机软件已普及到人们生活中的方方面面,同时软件的开发过程也面临着前所未有的挑战:

不断扩大的应用范围使得人们对软件质量的要求变得越来越高;而不断增大的软件规模却使得其开发过程越来越复杂,其中的风险因素也越来越多。

应用程序接口API(ApplicationProgrammingInterface),又称为应用编程接口,就是软件系统不同组成部分衔接的约定。

随着技术的发展,软件的结构,规模越来越难以缩减,更多的要求使得软件规模越来越庞大,复杂系统拆分化,使之形成容易辨识,容易理解,容易优化的小的组成部分便尤为重要,因此编程接口的设计十分重要。

在实际的程序设计当中,编程接口的设计需要能够合理的划分软件系统各个部分的不同职责。

对于开发者来说,软件不仅是一个用来满足需要的工具,更是一种服务的态度。

软件的质量能够更好的满足客户的需要,能够更直接的打动给客户的心,让客户满意是其打开并迅速占领市场,继而形成良性循环,使得事业更好发展的关键因素。

日益市场化的经济条件下,更加激烈的竞争要求软件能够在最短时间内做出最好的产品,用最廉价的成本和最好的技术,满足服务于客户的需求从而赢得市场与用户的青睐。

程序切片[1](ProgramSlicing)技术由MarkWeiser第一次在他的博士论文中提出程序切片这一概念以来,作为又一新生的重要程序分析技术。

它通过确定切片准则,可以更加快捷的筛选出对某一特定准则能够造成影响的程序代码。

它带来的便利便是可以是人们更快速的定位到自己所关心的代码部分,节约更多的经历和资源来对所需要关注的部分能够集中的进行深入的研究。

这一技术的种种优势让它快速的在多个领域占据一席之地,例如在调试,测试,逆向工程,度量以及软件质量保证等方面都有广泛的应用。

软件度量(SoftwareMeasurement)就是衡量软件品质的一种手段。

软件度量是一个以软件本身为输入,以软件的某个有针对性的指标为输出的函数。

软件度量存在的意义是在一定意义上可以解释这一特定的属性指标对软件的软质量有着怎样的影响。

软件度量的出现主要用于对在软件开发的预测和评估,它不像测试可以有效针对软件的硬性指标判断对与错,它存在的意义更多的作用是在于如何让软件变得更“好”。

程序的编写会有多方面的判断,例如程序的复杂性,易维护性,可扩充性等等。

软件度量可以从软件本身出发,对这些指标进行合理的分析和判断,从而开发出更加高质量的软件,更能满足越来越高要求的软件。

没有软件度量,就不能从软件开发的暗箱中跳将出来。

软件度量的存在未改进软件卡法过程,促进项目成功提高软件产品质量有着重要的作用。

并且软件度量可以在对项目进行预估、通过软件度量,可以帮助我们对项目进行预估、跟踪项目进展、决定相关复杂性以及分析缺陷所在及修改对策。

简而言之,通过软件度量,软件工程师可以做出更好的决策,从而给软件工业生产带来极大便利,同时带来巨大的经济效益。

良好的API设计可以降低系统各部分的相互依赖,提高组成单元的内聚性,降低组成单元间的耦合程度,从而提高系统的维护性和扩展性,是顺利进行系统开发、测试以及验证成功的重要保证。

由此可见,利用程序切片技术对API进行度量,可以使得目标软件质量得到保障,在软件维护中就具有非常重要的价值和意义。

1.2程序切片研究现状

1.2.1面向对象的切片

从大的方面来看,程序分为面向过程和面向对象两种,相对应的,我们也把切片技术分为面向过程程序切片和面向对象程序切片两种。

其中获取面向对象的切片有两种方法:

一种是对面向对象程序进行切片,另一种是利用UML模型进行切片。

1.2.1.1利用依赖图对面向对象程序进行切片

对象程序切片分为静态切片和动态切片。

静态切片会计算所有可能的输入值,因此切片中会包含更多语句。

动态切片则只计算特定输入值,相对静态切片体积较小。

在切片过程中,如何表示一个程序十分重要。

因此,依赖图的概念被提出。

Horwitz[2]提出了系统依赖图SDG(SystemDependenceGraph)的概念。

Larson和Harrold在Horwitz的系统依赖图基础上进行扩展[3],得到适用于面向对象程序的依赖图。

Larson同时提出了面向对象的类依赖图(ClDG),ClDG表示了类的控制依赖和数据依赖关系。

他们还提出了过程依赖图(ProcedureDependenceGraph),用以表示ClDG中的每个方法。

Liang[4]进一步改善了系统依赖图,在SDG中增加数据成员用以表示对象。

Krishnaswamy[5]提出了面向对象程序依赖图OPDG(ObjectOrientedProgramDependencyGraph)。

OPDG表示了控制流、数据依赖和控制依赖关系。

OPDG由三层结构组成:

类层次子图、控制依赖子图和数据依赖子图。

Chen[6]提出了面向对象依赖图ODG(Object-OrientedDependencyGraph)作为面向对象程序的中间表示层。

ODG增加了许多条边、结点属性以及属性关系。

在ODG的基础上,Chen提出了面向对象程序的切片算法。

Chen[7]描述了两种类型的程序切片,一种是基于状态,另一种是系统行为。

状态切片基于消息和控制切片,行为切片基于属性和影响类行为的方法。

Gupta[8]认为使用动态切片计算内聚性得到的结果比静态切片更加准确。

Agrawal和Horgan[9]讨论了四种计算动态切片的方法。

前两种方法基于利用系统依赖图的静态程序切片。

第三种方法利用动态依赖图DDG(DynamicDependenceGraph)计算精确的动态切片。

由于DDG的体积太过庞大,作者提出了简化动态依赖图(ReducedDynamicDependenceGraph)。

在RDDG中,只有形成新的动态切片时,该结点才会被创建。

Zhao[10]在Agrawal和Horgan的DDG进行扩展,提出了动态面向对象依赖图DODG(DynamicObjectOrientedDependenceGraph)来表示特定执行时语句实例间的动态依赖。

Song[11]提出了动态对象关系图DORD(DynamicObjectRelationshipDiagram),进而提出一个计算面向对象程序DORD的前向动态切片的方法。

当语句被执行时,这个方法的返回值是语句的动态切片。

Mohapatra[12,13]提出了扩展系统依赖图ESDG(ExtendedSystemDependenceGraph)作为面向对象动态切片的中间表示层。

同时还提出了动态切片的边标记EMDS(EdgeMarkingDynamicSlicing)算法,当运行过程中存在依赖时,算法可以对ESDG的边进行标记。

1.2.1.2利用UML图进行切片

Lallchandani和Mall[14]认为传统的依赖图通常是表现程序语句间的数据和控制依赖关系。

为了进行UML图的切片,首先应该有各种类、对象、方法以及它们之间关系的中间表示层。

作者提出了类依赖图和序列依赖图,分别作为类图和序列图的中间表示层,然后二者合并形成模型依赖图MDG(ModelDependencyGraph)。

根据得到的MDG,使用UML体系模型静态切片工具SSUAM(StaticSlicerforUMLArchitecturalModels),可以得到UML体系模型的静态切片。

Lallchandani和Mall[15]在之前的基础上提出整合不同的UML图构成唯一的系统模型,作为软件体系结构的中间表示层,然后形成MDG。

他们还提出一个基于MDG计算动态切片的算法,这个算法被命名为基于状态的UML体系结构模型的动态切片SDSUM(StateBasedDynamicSlicingofUMLArchitecturalModels)。

Bae和Chae[16,17]提出了模块化UML的元模型成一个小型元模型的集合,以此来管理UML元模型复杂度的方法。

Kagdi[18]引入模型切片的概念,通过理解、查询和分析大型UML模型来达成维护的手段。

Kagdi根据UML类模型来构造模型切片,切片方式是通过提取类图的一部分来构造已有系统模型的子模型。

Ray[19]提出了利用活动图的条件切片来生成测试用例。

这个方法首先是从UML活动图生成依赖流图,然后对图中某个谓语结点进行条件切片。

此方法有助于自动生成测试数据,这些数据可以由一个工具来自动测试程序。

该方法通过边界测试标准,实现了完整的路径覆盖,并利用条件谓语将测试输入域划分成子域。

1.3基于程序切片的度量研究现状

早期,M.Weiser在他基于切片的研究工作中,给出了五种基于切片的复杂性度量标准:

紧密度(tightness)、覆盖度(coverage)、重合度(overlap)、并行度(parallelism)、群聚度(clustering)。

并且他对这五个度量指标都给出了相应的定性分析,以及非形式化的计算方式。

Longworth首先提出基于Weiser的切片度量可以用来反映内聚性。

他认为覆盖度反映了程序的内聚性,并且重合度和紧密度可以佐证覆盖度反映出的情况。

Ott和Thuss进一步扩展了的Weiser和Longworth的度量准则。

Thuss通过使用度量切片(metricslice)的概念解决了Longworth提出的某些不一致性。

在Thuss看来度量切片应该考虑到会存在的两种不同数据关系,即使用和被使用,也就是在后来Horwitz等人提出的关于后向切片和前向切片的区分。

后向切片的计算从方法的最后一条语句开始,前向切片的计算是从后向切片的“顶”开始的。

他们的度量准则分别是覆盖度、最小覆盖度、最大覆盖度、重合度和紧密度。

Bieman和Ott提出了一个度量功能内聚的方法。

他们讨论了程序中的胶水(Glue)和强力胶水(Super-Glue)。

一个胶水标记(GlueToken)就是存在于多个切片中的标记,强力胶水标记(SuperGlue)就是存在于所有切片中的标记。

强功能内聚是指强力胶水标记在所有标记中的规模,弱功能内聚是指胶水标记在所有标记中的规模。

另一内聚度量准则是粘性(Adhesiveness),表示某个胶水粘连的切片数,切片数越多粘性越大。

Krinke引入了两种计算语句级内聚的度量:

基于切片和基于砍片(Chop)。

基于切片的度量中,语句的内聚性计算是用所有切片的总数除以出现语句的切片数。

对一个程序做砍片的操作,就是用来识别程序中所有说明在变量定义集(source)中的变量影响变量引用集(sink)中变量值的语句子集的过程。

基于砍片的内聚计算是用所有砍片的总数除以出现语句的砍片数。

Meryers和Binkley对内聚度量进行了广泛的研究,包括基线度量值、以及它与基于大小的度量准则和代码质量之间的关系。

作者对度量值进行了比较,发现紧密度与最小覆盖度有很强的关联,同时最小覆盖度和重合度、紧密度和重合度、最大覆盖度和重合度也有很强的关联。

这些关联表明度量时可能不需要计算所有的度量指标。

模块或组件间的耦合指的是他们之间相互依赖的程度。

传统的耦合度量是基于Henry和Kafura[33]提出的信息流,信息流是指模块的流入信息(inflow)和模块的流出信息(outflow)的总和。

Rilling[34]提出了一个基于程序切片耦合度量框架,用于度量软件质量。

这个框架使用的是基于源代码分析的切片,并结合了许多著名的耦合度量:

对象类间的耦合(couplingbetweenobjectclasses),类的响应(responsefromclasses)和消息传递耦合(messagepassingcoupling)。

BixinLi提出了一种基于程序切片和信息流分析技术的面向对象软件耦合性度量方法。

该方法首先计算面向对象程序的前向切片和后向切片,然后通过信息流分析技术分析程序中可能存在的输入耦合、输出耦合、I/E耦合,单向耦合、双向耦合和无耦合等6种耦合情况,并根据程序切片计算信息流的绝对量和信息流的宽度,进一步在此基础上计算面向对象程序中2个组件之间的耦合系数和某个组件自身的耦合度。

BixinLi[36]提出了一个基于层次切片的模型来度量耦合。

现有的工作已经能够完成关于耦合变量、耦合信息和继承耦合的计算。

层次模型使用抽象技术,包含了面向对象系统的四个层级,因此耦合的度量可以分为语句级、方法级、类级和模块级。

1.3.1现状分析

面向对象程序的API度量,不但可以通过定量的方法来定性的对编程结构的扩展性做出判断,也可以清楚的了解到,在设计中是否切实的体现了验证系统对质量的要求,进而达到对软件产品质量的保证。

虽然利用切片进行度量已经取得了一定的发展,但仍存在如下问题:

(1)一方面自动化工具的支持较少,现有的度量工具不能及时扩充修正其度量指标,度量优化难以持续进行,不能支持对度量指标的扩充和修正。

另一方面,现有的度量工具大多出于非形式化定义的理论,没有系统完整的对于度量标准的定义,使得度量指标一旦固定,形成工具便不可修改和扩充。

(2)度量的可重用性不高。

不同的人对于制定度量的制定有着自己不同的度量指标,每个研究人员制定的度量指标都是根据自己不同的研究方向和内容制定的独立标准,是的整个指标的定义十分混乱,研究结果也很难统一形成完整的定义,并且,每个度量指标的制定,在研究之后都很难更进一步发展和应用,通用性不强。

(3)度量的验证困难。

度量所要实现的最终的目标是想要在现有快速发展要求下对软件产品质量的保证,提高软件产品质量,但是度量本身的数据结果与软件质量的定性理解和要求之间并不能完全的划等号,它们两者之间的关系虽然说有其必然性,但是更多时候对软件理解不同,要求不同,所要度量达到的目的也不尽相同。

1.4本文的研究目的和主要研究内容

综上所述,研究者们对切片及基于切片的度量进行了大量的研究,但大部分研究结果都仍处于理论研究阶段,本文拟根据Weiser有关度量指标(紧密度,覆盖度,重合度,并行度,群聚度)完成对得到切片的度量,并根据度量结果得到相关评估结果。

1.5本文组织结构

第一章为绪论,主要介绍当前研究背景以及切片和度量的发展现状。

第二章为基本理论,主要介绍本文所研究内容需要涉及到的背景知识,包括切片的技术,系统依赖图的构造以及度量的相关概念。

第三章为度量方法的实现,主要介绍程序的实现流程以及相关验证和分析

第四章为对度量的总结,总结了全文所要表达的主要研究结论。

第二章基本理论

本章节主要介绍程序切片与相关度量基本理论,重点介绍度量相关技术以及本文所涉及到的度量相关实现思路。

2.1程序切片技术

2.1.1切片技术发展历程

自1979年,由MarkWeiser第一次在他的博士论文中提出程序切片这一概念以来,为众多的学者打开了一扇天窗,纷纷涌入开始了对于程序切片的研究和探讨。

迄今为止,以有近40年的研究历程的程序切片概念现在已经获得了很大的进步和发展,其研究成果不计其数,研究的方向也各不相同,总体而言,程序切片技术经历了以下3个主要阶段:

第一阶段(1979-1984):

程序切片的概念的形成期。

这一阶段以MarkWeiser博士的研究为主。

他第一个提出了基于控制流图(CFG,ControlFlowGragh)的切片算法。

并且在该算法的支持和影响下,利用数据流和信息流两个方程来获取他所想要的切片。

这样的切片算法有他的优势和时代的局限性,当时的程序并不复杂,近以顺序结构等简单的数据结构为主,所以这一切片算法在当时是可行的,但是这样的算法随着我们程序结构越来越复杂,信息量越来越庞大,开始变得捉襟见肘,并不能够解决适应更复杂程序结构的需求。

因此,切片算法的更新换代迫在眉睫。

第二阶段(1984-1994):

程序切片的图论时期。

这一时期,有一个显著的特点并且该特点对我们现在依旧适用,即开始适用构造系统依赖图,并基于系统依赖图的可达性来完成对于切片的计算。

这一特点首先要归功于Otensteins等人在1984年至1987年之间逐渐的把基于程序依赖图(PDG,ProgramDependenceGraph)的图形可达性算法引入了切片算法的设计中。

可达性算法也很快的被运用在了计算程序过程内后像切片当中。

这十年可以说是对于切片飞速成长的一个阶段。

紧随其后,随着软件规模以及结构的进一步复杂化,前向切片的概念以及其算法,和过程间切片的概念以及其两阶段图形可达性的算法也分别被Horwitz,T.RepsID.Binkley等人分别引入。

与此同时,Korel和Laski等人还引入了动态切片的概念和算法。

这一阶段应该说是程序切片技术发展的比较成熟的阶段。

其中,两阶段图形可达性程序切片算法的提出是这一阶段的标志性成果之一。

第三阶段(1994一至今):

程序切片的成熟阶段。

从1994年开始,面向队形的编程语言及设计分析方法深入人心,整个学科领域更多的设计和研究逐渐围绕面向对象更多的展开,当然面向对象的程序切片的研究也随之开始了它的发展历程。

面向对象的语言是更加成熟的计算机机器语言,切片的研究终归到底还是为了对程序做服务,所以面向对象的程序切片技术兴起没有一点意外,基于上一个阶段的切片理论基础,这一时期出现了更多的切片的辩题,这类变体(例如体系结构切片、无定型切片等)的出现为切片注入了更多新鲜的血液,使得整个切片技术的发展到达了一个巅峰时期。

到如今更多的人把目光集中在切片技术上,可以预见,未来的切片技术将会达到一个更加辉煌的程度。

这一时期的主要代表人物有FrankTip,MaryJeanHorrald,ChristophSteindl,MarkHarman,ZhaoJianjun等人。

2.1.2程序切片技术的应用

切片技术本身是一个为了可以简化矛盾,缩小关注范围的存在,因此,这项技术更多的被应用于回归测试以及软件调试等技术领域,下面简单介绍切片在这些领域当中存在的方式以及它的工作原理。

逆向工程:

在过去的几年里,逆向工程逐渐的发展成为一个软件工程下的新的研究分支,它的存在关心的是怎样理解一个已经存在的工程或者软件,这样的过程大多数时候是人为对现有软件所表现出来的外在,进行逆向的推导,包括对程序源代码的抽象判断,以及对程序中涉及到的基本内在算法和结构设计方案等的理解判断。

在这样的工作中,程序切片技术就可以有效的被利用起来,对这项工作提供强有力的支撑。

具体来讲,程序切片可以通过构造对现有程序的切片,或者对不同切片模式下得到不同版本切片的比较,可以对源代码中无关的因素进行筛选,保留其中有效部分,如界面管理输入输出等不重要,逆向工程不需要关心的部分,我们可以做出筛选,进行有效合理的剔除,而把真正对分析理解有帮助,有效的关键部分做针对性的分析,这样的过程就省去了很多不必要的麻烦。

软件测试:

回归测试是软件测试中很重更要的一部分,它一直是备受测试行业关注的重点问题,通过Gupta,Horrold和Sofa的描述,我们可以找出使用程序切片技术对回归测试有效的方法。

即在回归测试中,我们可以针对有更新,有改动的部分,做双向的切片,在得到的切片中,可以找出与之相关联的程序代码段,那么,在执行回归测试时候,就可以有针对的这些有关联性,在修改中受到影响的部分定义引用对的测试用例来进行定向的测试,避免了无效测试的资源浪费。

对于部分代码的有效测试,对于回归测试来讲是一件极有意义的事情。

3、程序调试:

程序调试一直是所有程序编写人员操作最为复杂的部分,在程序编写中有绝大部分是正确的,而出现的一小部分确需要在大量无关因素中发现其中有影响的部分做修改调试。

这样的工作正是程序切片技术所善于处理的。

正如之前所言,我们需要在无关排除无关因素,那么对于某一个变量的不正确计算,我们就可以肯定的是错误一定是发生在与计算这一变量相关的程序中。

那么利用程序切片技术可以针对这一变量进行切片处理,找到所有可以与之相联系的部分,这样便可以缩小所要定位纠错的范围,使得调试更具有针对性。

并且在找到某条错误语句并进行修正之后还可以通过所有受到这一语句影响的所有变量,进而更进一步修改和纠正,这样的过程是一个有效的自动化过程,不仅可以精简操作,更节约了大量资源,提高效率。

静态切片和动态切片分别可以对不同的错误和调试有帮助。

对于那些对程序输出不产生任

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 初中教育 > 其它课程

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1