没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记127(2005)197-205www.elsevier.com/locate/entcsFresco:灵活可靠的组件Yves Vandewoude伊夫·范德伍德1,2 和YolandeBerbers3计算机科学系B-3000 Leuven,比利时摘要Fresco是一种允许动态适应面向组件的应用程序的方法Fresco旨在支持开发人员在组件的整个生命周期中实现动态适应在设计时,工具(DeepCompare)帮助程序员准备具有实时更新功能的组件在运行时,一个名为Draco的中间件环境指导替换过程本身,并确保正确执行组件替换。在本立场文件中,重点是设计时支持和工具DeepCompare。在组件的功能开发之后,DeepCompare从旧的和新的组件版本构建一个元模型这些模型进行了比较,并确定了等效的数据结构。该信息随后用于部分地生成状态转换函数。可能的好处包括使用组件不变量验证更新的正确性,以及估计升级的复杂性,以便向开发人员解释某些问题场景。关键词:软件演化,变更检测,实时更新,状态转移1介绍研究表明,超过80%的软件产品成本是由维护引起的,超过20%的产品初始规格在部署后一年内被认为过时([15])。保持软件的最新是一个主要的问题,一个开发人员和用户一样。最后一1由法兰德斯科技创新促进研究所(IWT-Vlaanderen)支持2电邮地址:yves. cs.kuleuven.ac.be3电邮地址:yolande. cs.kuleuven.ac.be1571-0661 © 2005 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2004.08.044198Y. Vandewoude,Y. Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197-205近几年来,出现了通过采用面向组件的方法对软件进行模块化来解决这一问题的趋势。应用程序是由松散耦合的功能单元组成的:组件。重用组件缩短了开发时间并提高了健壮性。但对于用户来说,问题依然存在。更新软件需要将其关闭并安装新版本,这可能是一项风险和昂贵的操作。这个问题的一个可能的解决方案可以在实时更新中找到:在运行时修改软件然而,在实践中,这些技术由于其高复杂性和成本而很少使用。这种复杂性的很大一部分是由软件的旧版本和新版本之间的状态转移引起的。组件状态的转移和转换必须手动实现。这是一项乏味且容易出错的任务。在本文中,我们提出了壁画,它提供了一个实用的方法,实时更新。我们首先对第2节中的方法进行概述。 由于本立场文件的重点是设计时间方面,本文的第二部分详细介绍了工具DeepCompare。第3节介绍了该工具的通用架构和功能。我们通过使用DeepCompare处理一个小例子来说明我们方法的潜力。示例及其结果见第4节。第5节讨论了今后的工作。重要的相关工作见第6节。我们在第7节结束本文。2适应基于代理的应用程序Fresco的主要目标是增加实时更新的适用性。它通过以下方式实现这一目标:有限的手动准备:Fresco在组件开发过程中几乎不需要程序员的干预。预处理器用于添加可用于访问内部结构的接口组件的更新版本。这是通过添加getter方法来实现的,如果这些方法还不可用的话,并且是全自动的。对组件插装的工具支持:在组件替换期间最困难的问题之一是在组件的旧版本和新版本 Fresco方法将此转移的责任与新组件版本放在一起。在更新过程中,对旧版本的引用被赋予新创建的实例,该实例解释其前身的内部结构并随后导入其状态。这种功能远非微不足道,新组件的插装通常留给程序员。法斯科是创新的能力,以产生大部分的这种转让Y. Vandewoude,Y.Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197199代码(见第3和第4节)。高级更新支持:Fresco在运行时提供实时更新支持。这个方面是作为DRACO中间件环境的扩展实现的. 这个动态更新模块(DUM)负责在运行时正确执行更新。它将活动组件置于非活动4状态,然后加载并实例化新的组件版本。DUM随后将旧版本传递到新版本-stance,它允许它使用来自其前身的状态信息来初始化自己(此功能的方法是由DeepCompare在插装阶段添加的)。最后,DUM将连接从旧组件重新路由到新组件。由于DRACO中间件系统和动态更新模块不是本文的重点,我们参考[19,20]了解有关Fresco方法论动态方面的更多信息3设计时支持3.1直接与间接国家转移Fresco进化系统基于根据Cocones组件方法([3,17])设计的组件这些组件被实现为一组紧密耦合的Java对象。运行时系统保证组件在更新期间处于非活动状态(没有方法是活动的)。因此,组件的状态包含在组成其结构的对象的实例变量中。在文献中,存在两种方法来在版本之间转移状态:直接状态转移:旧版本的实现直接使用。新版本负责解释和转换先前版本的状态。间接状态传输:旧版本以抽象表示形式导出其状态,稍后新版本将使用该抽象表示形式。虽然后一种方法的好处是,当涉及许多不同的版本时,它允许轻松升级,但该技术强烈依赖于构建定义抽象形式的本体的能力。因此,这种方法仅用于特定和定义明确的领域,如协议栈(见[10])。此外,以抽象形式导出其状态的功能必须由每个组件实现,即使它不确定是否会被动态替换。[4]更准确地说:静态(参见[11])。200Y. Vandewoude,Y. Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197-205因此,第一种方法被用于Fresco方法。由于新组件的插装很复杂,并且依赖于以前的版本,因此为该活动提供了工具支持:DeepCompare。3.2DeepCompare状态转换功能的生成包括两个步骤。首先,必须识别等价的数据结构然后,该信息用于生成状态转换函数。相似性识别DeepCompare首先解析组件的两个版本,并构建一个元模型。然后对两个项目的所有类型进行比较,并构建了相似性模型。该模型由每对类型的变更描述组成相似性模型,然后使用和更新的一个链的harvesters。每个采集器从两个组件版本中检索信息,并通过向该模型添加语义链接来更新相似性模型因此,相似性模型表示比较过程的每个阶段的所有已知相似性每个收集器封装不同的算法。除了普通匹配(例如,在同一个类中具有相同名称和类型的变量被认为是等效的),可以派生出更复杂的匹配。例如,当前的工具能够检测添加的封装、类型重命名和类型之间的变量移动(参见第4节)。目前研究了三种类型的算法:(i) 结构算法将识别已知相似性和两个组件结构的新相似性。Lerner([12])在Database scheme evolution的上下文中使用了这个原则。使用结构化算法的收集器的一个示例是将搜索已在类层次结构中上下移动的类变量的收集器。(ii) 剽窃检测器([14,21])的技术可以用来识别不同程序之间的相似结构。由此产生的相似性可以直接利用(例如,在相同的上下文中使用相似的变量名称或注释),也可以由其他收集器间接使用(例如,通过识别类似的方法(iii) 重构检测器(例如[5])利用软件渐进进化的原理由于极限编程的流行([2]),重构在再工程领域变得非常重要。 后如果在不同版本之间发现重构,则可以识别潜在的结构相似性。中检测变量的封装Y. Vandewoude,Y.Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197201ADAPTORADAPTOR类型池-变压器代码生成器相似模型附加信息的语义链接(例如:不确定性)Fig. 1. DeepCompare概述复合类型是重构检测的一个例子。虽然理论上可以使用ab-语法树来实现DeepCompare,但我们认为这种表示太低级了。Meta模型用于验证底层代码的正确性,并允许轻松检查和操纵底层源代码。由于我们的组件是用Java实现的,因此可以使用现有的基于Java的元模型。文献中存在许多元模型,每一个都有不同的哲学和复杂性。在撰写本文时,JNome([6])被用作底层元模型。然而,由于可以想象其他模型可能稍后出现更合适的,因此收割机使用的实际元模型是使用适配器模式抽象的[7])。状态转移码的生成在第二阶段,DeepCompare将生成两个版本之间的转换函数此过程的基本构建块是类型Transformer。每个Transformer将给定类型的结构转换为另一种类型(例如,Transformer可以将数组转换为Vector,反之亦然)。类型转换器手动实现并添加到存储库中. DeepCompare将通过基于相似性模型中包含的信息选择适当的类型转换器来构建状态转换功能。复合类型是通过递归地将已知的转换器应用于该类型来转换的新添加的变量,如果在以前的版本中没有找到等效的变量,默认情况下会初始化为类型默认值。用户可以更改此参数。该工具的类型转换功能尚未完全实现。4工作中的DeepCompare:一个简单的例子一般来说,不可能正确地识别组件的不同版本之间的语义等效结构,因为并非所有语义信息都202Y. Vandewoude,Y. Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197-205信息包含在源代码中。一个典型的例子是三角形的表示。在版本n中,可以使用三个点,而版本n+1使用两条边和一个角度。因此,相似性的识别本质上是一个交互式和半自动的过程。在任何时候,DeepCompare的用户都可以通过添加或删除类型之间的语义链接来指导工具。然而,我们相信,组成组件状态的大多数结构在版本之间具有足够的相似性,可以通过工具检测到。一个小例子如图2所示。在此图中,矩形表示组成组件的对象。与这些矩形连接的椭圆是与这些对象关联的实例变量。蓝色和红色项目分别是原始/新版本程序的一部分黄色类型是JDK的一部分,被认为是固定的。橙色表示原始类型。这个例子由一个Line和一些相关的方法组成。在原来的例子中,有四个实例变量代表这条线上两点的坐标。在新版本中,Line对象引入并使用了一种新类型(Point)。此外,该对象已重命名。在这种情况下,DeepCompare成功地识别了两个版本之间的所有等效类型和成员。在第一步中,基于类似的实现功能,类型Line和LineRenamed被发现表示相同的类型后来,链中更下游的一个采集器检测到了封装的使用,并成功地关联了表示定义我们的线的点的坐标的变量。虽然这种规模的例子很难证明DeepCompare的普遍适用性,但已经执行了更大项目的实验,并显示出有希望的结果。对一个更大的例子的全面描述超出了本立场文件的范围。5今后工作Fresco方法的大部分(例如整个运行时平台:Draco及其动态更新扩展)即将完成。设计时工具DeepCompare正在积极开发中。目前,该工具的功能与简单的算法。在不久的将来,重点将放在实施更复杂的收割机,以提高识别等效结构。该工具将针对较大的项目进行测试,并将调查成功和失败的案例,以进一步改进该工具。未来的工作还包括代码生成器的完整实现,并使用不变检查器对其进行这将允许DeepCompare验证所提出的转换的正确性未来的工作还包括Y. Vandewoude,Y.Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197203图二. DeepCompare在工作中为清楚起见,未显示JDK类型之间的其他检测到的相似性。将可能存在问题的结构标记给程序员(例如,在实时更新期间需要太长时间转换的结构,需要手动验证的复杂)的。6相关工作实时更新领域的大部分工作都集中在动态方面。对于过程系统,Hicks([9])使用由可验证的本机代码组成的动态补丁使用CONUS,程序员可以使用所需更改的声明性规范来替换组件([11])。对于用Java编写的面向对象的应用程序,提出了使用各种方法来修改正在运行的应用程序的系统。使用的技术包括对Java虚拟机的修改([1,13]),语言扩展([4,8])和元架构([16])。对现有系统进行详尽的概述超出了本文的范围,我们参考[9,18]以获得更完整的调查。状态转移的问题通常留给程序员,或者完全忽略。虽然某些系统包括一些工具支持([1,9]),204Y. Vandewoude,Y. Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197-205通常限于生成用户可以在其中实现转换的框架。Hicks开发的系统甚至可以自动生成变量名保持不变的转移代码。然而,在一般情况下,很少有智力支持被用来转移状态本身。对于某些系统,例如由Jesus提出的基于委托的方法(参见[8]),状态转移是不相关的。7结论在这份立场文件中,我们介绍了Fresco方法的运行时evolution面向组件的应用程序。在设计时,组件使用状态传输功能进行检测。开发人员在这项任务中得到了一个工具的帮助:DeepCompare。该工具在组件的两个版本中搜索等效数据结构,并使用此信息部分生成转换代码。在运行时,中间件平台负责更新本身的所有细节引用[1] Andersson,J.和T. Ritzau,J鼓中的动态代码更新,在:可穿戴和普适计算软件工程研讨会,2000年。[2] Beck,K.,“Extreme Programming Explained: Embrace Change,”[3] 柏柏尔人,Y.,P. Rigole,S.诉Baelen和Y.Vandewoude,嵌入式系统软件开发中的组件和合同,在:Proc. of the first ECUMIS,2004,pp.219-226.[4] Costanza,P.,Dynamic Object Replacement and implementation-only classes,in:Proc. ofWorkshop on Convenient-Oriented Programming at ECOOP,2001.[5] Demeyer,S.,S. Ducasse和O. Nierstrasz,Finding refactorings via change metrics,in:Proc. of OOPSLA,2000,pp. 166-177。[6] Dockx,J.,N. Smeets,K. Mertens和E. Steegmans,jnome:A java meta model in detail,Technical Report CW323,KULeuven Department of Computerscience(2001).[7] 伽马,E.,R.赫尔姆河Johnson和J.Vlissides,[8] GU? nt erKniesel , Type- 安 全 的 elegationforrrun-timecom eponen t adaptation , in : P roc.ofECOOP 99,里斯本,葡萄牙,1999年。[9] 希克斯,M.,“动态软件更新”博士论文,计算机和信息科学系,宾夕法尼亚大学(2001年)。[10] Janssens,N.,S. T.P. Mahieu和P. Verbaeten,Towards transparent hot-swapping supportfor producer-consumer components , in : Second Int. Workshop on Unexpected SoftwareEvolution,Warshau,2003,pp. 9比16[11] Kramer,J.和J. Magee,进化哲学家问题:动态变更管理,IEEE软件工程学报16,pp.1293-1306.[12] 勒纳湾美国,A model for compound type changes encountered in schema evolution,ACMTransactions on Database Systems25(2000),pp.83比127Y. Vandewoude,Y.Berbers/Electronic Notes in Theoretical Computer Science 127(2005)197205[13] Malabarba,S.,R. Pandey,J. Gragg,E. Barr和J.F. Barnes,《对类型安全动态Java类的支持》,Proc. of ECOOP,2000年。[14] Malpohl,G.,J. Hunt和W. Tichy,重命名检测,第15届自动软件工程,2000年。[15] Rausch,A.,构件中的软件演化--一种实用方法,见:澳大利亚软件工程会议论文集,2000。[16] 雷德蒙湾和V. Cahill,Iguana/j:Towards a dynamic and efficient receivative architecture forjava. 2000年,第14届欧洲面向对象编程会议上的再现和元级架构研讨会[17] Urting,D.,T. Holvoet,P. Rigole,Y. Vandewoude和Y. Berbers,嵌入式软件基于组件设计的工具,Proc.of Tools Paci fic 2002。[18] Vandewoude,Y.和Y. Berbers,面向组件的嵌入式系统动态更新方法的概述和评估,在:Proc.《软件工程研究与实践》,2002年,pp. 521-527[19] Vandewoude,Y.和Y. Berbers,Supporting runtime evolution in seescoa,Journal of DesignProcess science8(2004),pp. 七十七比八十九[20] Vandewoude , Y. , P. Rigole , D. Urting 和 Y. Berbers , Draco : An adaptive runtimeenvironment for components,Technical Report CW372,Department of Computer Science,Katholieke Universiteit Leuven,Belgium(2003).[21] 怀斯,M.J.,计算机程序和其他文本中相似性的改进检测,见:第二十七届SIGCSE技术研讨会,费城,1996年。
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 探索数据转换实验平台在设备装置中的应用
- 使用git-log-to-tikz.py将Git日志转换为TIKZ图形
- 小栗子源码2.9.3版本发布
- 使用Tinder-Hack-Client实现Tinder API交互
- Android Studio新模板:个性化Material Design导航抽屉
- React API分页模块:数据获取与页面管理
- C语言实现顺序表的动态分配方法
- 光催化分解水产氢固溶体催化剂制备技术揭秘
- VS2013环境下tinyxml库的32位与64位编译指南
- 网易云歌词情感分析系统实现与架构
- React应用展示GitHub用户详细信息及项目分析
- LayUI2.1.6帮助文档API功能详解
- 全栈开发实现的chatgpt应用可打包小程序/H5/App
- C++实现顺序表的动态内存分配技术
- Java制作水果格斗游戏:策略与随机性的结合
- 基于若依框架的后台管理系统开发实例解析
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功