理论计算机科学电子笔记181(2007)49-61www.elsevier.com/locate/entcs一种软构件Marco Antonio Barbosa1DepartamenodeInform'ticaUniversidade do Minho Braga,Portugal卢修斯苏亚雷斯巴博萨2DepartamenodeInform'ticaUniversidade do Minho Braga,Portugal摘要组合和编排软件组件是现代软件工程中的一个基本问题本文讨论了这种编排是动态的可能性,在这个意义上说,组件的互连模式的结构所设想的方法扩展了作者以前关于使用共代数模型来指定软件连接器的工作。关键词:移动性,软件连接器,组件。1介绍对复杂和无处不在的应用程序的日益增长的需求对软件的设计和开发方式提出了新的挑战。其中一个挑战涉及应用程序处理其组件动态重新配置的方式。实际上,组件不再是在编译时组装的静态代码片段,而是动态实体,通常在不同的处理单元中执行,仅通过定义良好的公共接口进行交互。组件组装被理解为在这样的接口中声明的端口的互连,并且通常这样的互连模式在运行时改变这就解释了为什么自20世纪801 电子邮件:marco. di.uminho.pt2 电子邮件地址:lsb@di.uminho.pt1571-0661 © 2007 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2007.01.05350M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)49从基础的角度来看,米尔纳,帕罗和沃克在1992年发表的关于π演算的原始报告[20]是一个基本的里程碑。从那时起,这个话题在理论和应用研究中越来越受欢迎。例如,它与软件架构(例如,,[7,22,21,13]),协调模型(例如,,[17,16])或编程语言(例如,,[15,10]),仅举几例。但是,在软件工程的实践中,移动性仍然很难表达和推理。移动性在结构上与分布、系统的时间演化以及过程、链接或组件实例的动态创建或重新配置相关联。在之前的一组出版物[5,4]中,作者提出了一种基于独立的通用连接器(共代数建模)[25]来指定应用程序协调级别的方法。这种方法的灵感来自于对协调语言的研究[12,23],并且有利于严格的组件解耦,以支持更松散的组件间依赖性。与其他方法类似,如REO[2]或PICCOLA[26,21],计算和协调被明确分离,通信变得匿名,组件互连受到外部控制。然而,这样的模型假设了所涉及的组件和连接器之间的固定互连结构,使所设想的方法静态。本文报告了关于[4]中框架的可能扩展以处理动态重构的初步工作。更确切地说,该模型通过显式包含一个特殊的连接器(称为orchestrator)来扩展,该连接器扮演连接管理器的角色。这是通过一组基本原语在运行时断开或重建组件实例和连接器之间的链接来实现的所提出的解决方案基本上是可操作的:它并不有助于解释流动性的数学,但提供了一种可能的方式来处理外生协调模型中的动态重构。由模型的外生性质提出的基本要求是组件实例之间没有直接通信。例如,其中一个可能在某个时候决定断开连接器的端口,让我们假设,将该端口标识符发送到新连接的一部分。然而,它所能做的就是通过另一个连接器的端口发布端口标识符。在- word之后会发生什么,特别是哪个其他组件的实例(如果有的话)将重用这样的端口,并不受原始组件的控制,实际上甚至不为原始组件所知。每个组件这就是为什么通信是匿名的,没有直接的重新配置命令(如记法。本文采用了通常用于面向模型的规范方法的标准数学符号,如VDM[14],Z[27]或B[1]。 我们领养,然而,一个无点规范风格(例如,,[9]),这导致更简洁的描述和增加的计算能力。基本的数学领域是集合和集合论函数的范畴,M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)4951标识分别由·和id表示。符号(φ→f,g)代表一个条件语句:如果φ,则应用函数f,否则g。通常,基本集合构造是乘积(A×B)、和或不交并(A+B)和函数空间(BA)。 我们用π1:A×B−→A表示乘积的第一个投影,用ι1:A−→A+B表示和的第一个嵌入(其他的也是一样)。×和+都以通常的方式扩展到函数,并且作为通用构造,一个标准箭头被定义为从任何集合C到A×B,并且对称地,从A+B到任何集合C,分别给定函数f:C−→A,g:C−→B和l:A−→C,h:B−→C。前者称为分裂,记为[l,h],后者为任一,记为[l,h],满足k=f,g ⇔ π1·k=f<$π2·k=g(1)k= [l,h] ⇔k·11=1k·12=h(2)符号BA用于表示函数空间,即,从A到B的(全部)函数的集合。它还具有一个普适性质:对于所有函数f:A×C−→B,存在唯一的f:A−→BC,称为f的curry,使得f= ev·(f× C)。当然,所有的数据类型构造都可以扩展到函数。例如,符号f+ g:A + B−→AJ+BJ表示一个函数,它根据参数是A还是B类型,应用f或g,分别返回AJ或BJ类型的值。 函数复合表示为f·g和函数应用通过并列(如fx)。标识函数表示为id。最后,我们还假设存在几个基本集合,即空集合和1,(同构类)单例集。按照惯例,选择1作为1的唯一元素(的代表)。还要注意的是,虽然一般情况下只能非确定性地访问集合的元素,但函数the以一种非常确定性的方式返回单例的唯一元素纸结构。下面的部分回顾了[4]中软件连接器的正式定义,并引入了一个配置的概念来指代连接器。组件实例的行为和连接它们的连接器。第3节报告了本文的主要贡献,解释了模型在什么意义上[4]可以适应动态重构,并为第3节中给出的配器连接器的正式定义铺平道路。第四节举了一个例子。本文件最后在第5节提出了今后工作的一些相关它特别报告了在HASKELL中实现该模型的原型[8]。2连接器、组件和配置2.1软件连接器在[4]中提出的模型中,给出了软件连接器的规格说明 通过一个聚集了多个端口的接口。每个端口都有一个相关的操作,通过对端口对消息的反应进行编码来调节其行为52M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)49越过连接器的边界。设U为连接器内部状态空间的类型有三种端口3具有以下签名:post:U−→UM(3)得到:U−→U×(M+1)(4)读作:U−→(M+1)(5)请注意,端口具有交互极性,输入或输出,并且是唯一标识的。只有一种输入端口,而输出端口可以是破坏性的,也就是说,一旦读取数据值就从端口中删除,或者是非破坏性的。具体来说,直觉如下:• POST是类似于传统编程语言中的写操作的输入操作(参见例如,,[2])。通常,post端口接受数据项并以某种形式将其存储在内部。• 读取是非破坏性输出操作。这意味着通过读端口,环境可以“观察”数据项,但连接器的状态空间保持不变。当然,读是一个部分操作,因为不能保证数据可用于读取。• GET是读取端口的破坏性变化。在这种情况下,数据项不仅可以在外部使用,而且还可以从连接器的存储器中删除在所有情况下,在创建时,端口都被唯一地标记有从可分配集合P中获取的可区分标识符。(全局)唯一端口标识符的存在,以及它们通过通道进行通信的可能性,使得动态重新配置成为可能。实际上,这与作者以前的工作(如[5,4]中所记录的)是一个根本的区别,M类型的消息可以是(通用类型D的)数据值或端口标识符(P)。形式上,消息集被定义为M=D+P,其中+如上所述是数据类型sum。2.2一般情况软件连接器由一个接口指定,该接口聚集了许多Ppost,Gget和R读取端口。这样的聚合导致了以下连接器的一般定义,作为状态空间U上的余代数[25]c=<$u∈U,<$γ,ρ<$:U−→(U×(M+1))P×M+G×(M+1)R<$(6)C c其中ρ c是R个读取端口的拆分,即、ρ c:U−→(M + 1)×(M + 1)×. ×(M+1)(7)3 根据客户的名称(即,连接器M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)4953C−−−−−→−−−−−→并且γc收集可能需要执行状态更新的POST或GET类型的端口。实际上,(6)中余代数的余域的类型可以重写作为一名医生,U=(U+U×(M+1))×(M+1)(8)i∈Pj∈Gk∈R这是更直观的,但是,在证明中不太容易受到符号操作的影响。作为连接器定义的一个例子,考虑二元连接器的构造。二进制连接器由两个端口的聚合构建,假设相应的操作在相同的状态空间上定义。特别是,这例如,post和read端口的聚合导致c=<$u∈U,<$post,读作<$:U→UM×(M+1)<$(9)另一方面,用get替换上面的读端口会强制进行加法聚合,以避免同时更新导致C= <$u∈U,γ:U→(U×(M +1))M+1<$(10)其中4γc=U×(M+1)−d−r→U×M+Upost+getU+U×(M+1)−→U×1 +U×(M+1)[id×ι2,id]U×(M+1)不同种类的通道是这种类型的连接器。同步和异步通道是最著名的例子。读者可以参考[4],了解所设想的连接器的语义和构造的完整说明2.3组件和配置在外生协调模型中,组件实例总是被视为黑盒(参见,例如,[3])。所有被认为是已知的关于他们是• 端口接口签名,即,其每个端口的标识符和极性• 接口行为的规范,定义了这里所谓的组件这是由一个类似进程代数的表达式给出的,旨在定义组件接口的激活模式。比如说,beh(C)=(in.in.out)确定组件实例C的端口激活模式需要在激活端口输出之前激活两次端口输入。使用的符号基于4 dr是右分配同构,o是定义为两个恒等式之一的共对角函数,即,o=[id,id]。54M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)49CCS[18]过一组Act动作,每个动作对应一个端口激活5.然而,与CCS不同的是,动作配备了一个同现算子A--动作a+b代表a和b同时出现。具体如下:B::= 0| B号法案|B + B|B|B|B\K|[σ] B|B组其中,·是前缀运算符,+和|分别表示非确定性选择和参数组合。记法B\K表示对动作集合K的限制,[σ]表示根据置换σ的动作重命名,而表示迭代。如上所述,连接器在内部被指定为通过端口聚合构建的余代数。然而,它的外部行为也由进程代数表达式给出例如,具有端口输入和输出”(《说文》卷100)“以其为义,以其为义组件实例从不直接相互交互,而是总是通过连接器网络。事实上,他们甚至没有意识到对方的存在。整个系统由多个组件实例和从基本连接器构建的连接器同步和异步通道)使用[ 4 ]中正式描述的连接器这个代数包括一个并行聚合(c1<$c2)和一个反馈机制(Ct),它选择性地链接C中极性相反的端口。连接器和组件实例在特定设置中的联合行为称为配置。这特别描述了端口之间的实际连接。在[6]中报告了配置的语义,它是沿着[243飞行器连接器3.1协调器我们的方法的核心是存在一个特定的协调连接器,称为协调器,其作用是管理架构网络中所有其他元素之间的交互。在某种意义上,协调器相当于组件和普通连接器之间的中间层,即,它充当组件和连接器之间的桥梁。编配器是一个监听器,它永久地关注不包含数据但包含端口标识符的消息的流。这样的消息将被理解为控制转移的命令。实际上,每当带有端口标识符的消息到达特定组件实例的端口时,这意味着在执行读取或获取操作时进行拦截。在这一点上,它拦截消息,并根据一些重新配置脚本重新组织整个网络连接。不过,请注意[5][24,6]中提出了一种更有表现力的行为规范符号,但这对本文的目的并M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)4955组件为了完成它的角色,协调器被定义为状态空间U上的余代数指定为数据类型U:P×Cmp× P(P×P)(11)其中P是协调器已知的端口标识符集,P(P×P)是活动连接集,Cmp是定义为函数的组件管理器Cmp=(PP)cmpId(12)其将每个组件实例的端口集合与有一个明显的类型不变式与U相关联,说明所有连接都是点对点的:invu= πp∈π1u. 卡{c∈π3u|π1c = p<$π2c = p} ≤ 1(13)3.2飞行器操作基础操作定义如下• 获取连接(getCon):此操作接受端口标识符,如果该标识符是连接的一部分,则返回相应的端点。从形式上讲,getCon :U×P→P+1getCon(u,p)让e= {π2c|c∈π3u<$π1c = p}<${π1c|c∈π3u<$π2c = p}在(e/=π →π1the(e),π2π)• Disconnection(disCon):此操作通过删除现有连接来更新连接器的状态空间。disCon:U×(P×P)→UdisCon(u,(p,pJ))(π1u,π2u,(π3u)\{(p,pJ)})• AddPort(addPort):此操作通过添加新的可用端口来更新连接器的状态空间。addPort :U×P →UaddPort(u,p)({p}<$π1u,π2u,π3u)• 可用端口(avPort):此操作搜索给定组件中的端口56M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)49当截获一个包含端口标识符m的消息到达端口p时,编排器识别出p所属的组件实例,并尝试在其中找到另一个端口来连接到m。如果m以前是另一个连接的一部分,则必须跟踪并断开这种连接。实例可用于连接。avPort:U×cmpId→ P(P)avPort(u,i)让使用=P(π1)(π3u)<$P(π2)(π3u)在(π3u)i• Make Connection(mkCon):此操作将新连接聚合到编排器的状态空间。mkCon:U×(P×P)→UmkCon(u,(p,pJ))(π1u,π2u,{(p,pJ)}<$(π3u))3.3协调模式上面的原语集用于构建上面提到的重构脚本,这些脚本构成了协调器对(传入)消息拦截的反应这个想法是协调器让我们考虑这样的模式之一,以说明如何根据编配器原语来指定它们直觉是这样的:从形式上讲,模式1(u,p,m)让在ap=avPort(u,owner(u,p))(ap ∈ p →令r∈ap inreconf(u,p,m,r),u)M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)4957哪里reconf(u,p,m,r)让x=getCon(u,m)在(x = 1(mJ)→ mkCon(disCon(u,(m,mJ)),(m,r)),mkCon(u,(m,r))并且函数所有者检查协调器状态中的组件管理器从形式上讲,所有者(u,p){c∈cmpId|p∈(π2u)c}请注意,在这种协调模式中,如果没有端口可用于新连接,则配置不会更改。然而,这不是唯一的可能性。合理的替代方案是• 在任何情况下断开端口m• 或者挂起直到A端口可用于所有者(u,p)中的连接。这样的备选方案也可以被编码为协调模式,以充当协调器的参数4例如为了说明的目的,让我们考虑如何建模,在前面章节中概述的框架中,[19]中给出的例子的变体在这种情况下,我们将考虑一个无线网络,其中笔记本电脑(组件客户端)连接到一个网络,该网络有两个服务器(基地1和基地2)。这两个服务器相互连接,客户端连接到其中一个。在系统的初始配置中,客户端根据图1与服务器Base1通信。客户端可以通过其输入端口ci和输出端口co与网络永久通信。这种行为是捕获beh(Client)=(ci+co)基座1通过其输出端口b1与基座2永久通信。3和输入端口B1。四、在这样的系统配置中,Base1也使用输出端口b1与客户端通信。1和输入端口b1。二、该行为由下式给出,beh(Base1)=(b1. 1+ b1。2+ b1。3+ b1。4)58M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)49Fig. 1.初始配置。Base2通过其输入端口b2与Base 1通信。3和输出端口B2。四、基座2还具有输入端口b2。1和输出端口B2。二、在这种情况下,两个端口都可用,并且从连接器网络断开连接。基数2的行为由下式给出:beh(Base2)=(b2. 3+ b2。4)网络中涉及的组件通过由图1所示的四个同步通道组成的连接器互连。它的行为beh(C)是通过每个通道的并行合成读者可参考[6]了解详情。目前它是足够的指出,像往常一样,并行组合的语义是根据交织和同步产品。整个系统由配置conf指定,其行为是beh(conf)= beh(Client)[b/c i,c/c o] |beh(C)| beh (Base1)[a/b1. 1,d/b1. 2,e/b1。3,h/b1。四、| beh (Base2)[f /b2. 3,g/b2. 四、请注意,重命名操作将组件端口连接到连接器端口。现在,让我们考虑用户移动并且信号变弱。服务器Base1与服务器Base2通信,并发送端口标识符,以便Base2提供服务。图2表示这种操作的结果。在协调器截获消息后,配置的行为变为beh(c onfJ) =beh(Client)[b/ci,c/co]|beh(C)|beh(Base1)[e/b1. 3,h/b1。四、| beh(Base2)[d/b2. 1,a/b2. 2,f/b2. 3,g/b2. 四、M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)4959图二.最后的配置。现在让我们集中讨论协调员的角色。假设它被参数化为上面的模式1,让它的初始状态是u=
,其中p={c i,co,b1. 1,b1。2,b1。3,b1。4,b2。1,b2. 2,b2。3,b2。(四)cmp={(Client,{ci,co}),(Base1,{b1. 1,b1。2,b1。3,b1。4}),(Base2,{b2. 1,b2.2,b2。3,b2。4)}con={(a,b),(c,d),(e,f),(g,h)}现在,假设发生以下情况:Base1通过连接器C向Base2发送通道ch1的端口标识符a。编排器捕获这样的消息并启动模式1中定义的脚本,如下所示。• 使用avPort,协调器选择端口b2。2作为连接到a的替代方案。• 通过getCon操作,它获得端口b1。1,它以前连接到a。• 由于这样的端口具有当前连接,因此以下步骤是使用disCon。• 最后是新的连接,将a连接到b2。2已完成。5结论和今后的工作本文讨论了对文献[4]中软件连接器形式化的扩展,它采用了一种面向协调的方法来支持更该框架通过一个特殊的连接器(抽象了整个中间件级别)来支持连接的动态重新配置,该连接器管理通信的主动可能性在这个模型中,连接的动态配置的可能性来自两个基本假设:(a)端口有唯一的标识符,可以在消息中交换,(b)有一个特殊的连接器-协调器-来管理网络中所有有了它们,移动性可以在典型的π-演算族进程代数的经典名字传递风格中实现[19]。60M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)49还有许多工作要做。特别是,这种方法应该与动态可重配置架构的正式方法相兼容,例如[11]或[28]。然而,我们目前主要关注的是模型和相关演算的完整描述,以及它在现实案例研究中的应用我们目前还在努力将这个模型作为一个HASKELL库的原型实现,在此基础上可以进行实验。特别是,我们打算建立一个存储库的协调模式作为参数的协调器,以捕捉一些典型的协调情况。确认这项研究是在PURE项目的背景下进行的,葡萄牙科学技术基金会根据合同,POSI/ICHS/44304/2002。引用[1] J. R.阿布里尔B书:从程序到意义。剑桥大学出版社,1996年。[2] F. 阿巴布抽象行为类型:组件及其组成的基础模型In F.S. de Boer,M.Bonsangue,S.格拉夫和W.-P. deRoever,editors,Proc. 第一届组件和对象形式化方法国际研讨会(FMCO'02),第33-70页。Springer Lect.Notes Comp.Sci.(2852),2003年。[3] F.阿巴布Reo:一个基于通道的组件组合协调模型。数学结构在Comp.Sci. ,14(3):329[4] M. Barbosa 和 L. 巴 博 萨 安 装 软 件 连 接 器 。 在 K 。 Araki 和 Z. Liu , editors , Proc. First InternationalColloquim on Theoretical Aspects of Computing(ICTACSpringer Lect. Notes Comp. Sci.(3407),2004年。[5] M. A. Barbosa和L. S.巴博萨组件互连的关系模型。10(7):808-823,2004.[6] M. A. Barbosa和L. S.巴博萨组件如何连接?配置的语义。技术报告DI-PURE-06.03.01,Universidade doMinho,Braga,葡萄牙,2006年3月。[7] K. 贝格纳河Grosu,A.Rausch,A.Schmidt,P.Scholz和M.布洛伊注重流动性。1999年,《社会科学》。[8] R.鸟. 使用Haskell的函数式编程计算机科学系列Prentice-Hall International,1998年。[9] R. Bird和O.摩尔编程的代数。计算机科学系列Prentice-Hall International,1997年。[10] A. R. D. Bois,P.Trinder和H.洛德尔mHaskell:纯函数式语言的移动计算Journal of Universal Computer Science,11(7):1234[11] G. Costa和G.瑞吉欧抽象动态数据类型的具体化:时态逻辑方法。Theor.比较科学,173(2),1997.[12] D. Gelernter和N.载体协调语言及其意义。Communication of the ACM,2(35):97[13] V. 哥和哥。 Schéafer. 一 种针对移动数据结构系统的关键语言。 在R。 M. Flavio Oquendo,Brian Warboys,编辑,Software Architecture - Proceedings of the First European Workshop,EWSA 2004,第212-218页。Springer-Verlag,2004.[14] C. B. 琼斯使用VDM进行系统软件开发。计算机科学系列普伦蒂斯-霍尔国际,1986年。M.A. 巴博萨Barbosa/Electronic Notes in Theoretical Computer Science 181(2007)4961[15] Z. D.基尔利Mobile Computation with Functions,信息安全进展第5卷。施普林格,2002年。[16] A.洛佩斯和L.菲亚代罗关于分配和流动性如何干扰协调。在WADT的Proc.中,第343-358页。Springer Lect.Notes Comp. Sci(2755),2002年。[17] M.兰普一种基于π演算的软件组合方法。博士论文,伯尔尼大学,1999年1月。[18] R. 米尔纳通信和并发。计算机科学系列Prentice-Hall International,1989年。[19] R.米尔纳通信和移动过程:π演算。剑桥大学出版社,1999年。[20] R. Milner,J. Parrow,and D.沃克移动过程的演算(第一部分和第二部分)。信息与计算,100(1):1[21] O. Nierstrasz和F.阿彻曼用于对软件组件建模的演算In F.S. 德波尔,M. Bonsangue,S.格拉夫和W.- P. de Roever,编辑,Proc. First International Symposium on FormalMethods for Components and Objects(FMCOSpringer Lect. Notes Comp. Sci.(2852),2003年。[22] F. Oquendo. π-adl:一种基于高阶类型π演算的体系结构描述语言,用于描述动态和移动软件体系结构。SIGSOFT软件Eng. Notes,29(3):1 -14,2004.[23] G. Papadopoulos和F.阿巴布协调模式和语言。在计算机的进步-大型系统,第46卷,第329-400页。1998.[24] P. R. Ribeiro,M. A. Barbosa和L. S.巴博萨泛型进程代数:一个编程挑战。第10届巴西编程语言研讨会,Itatiaia,巴西,2006年。[25] J. Rutten泛余代数:系统理论。Theor.比较科学,249(1):3-80,2000.(CWI技术报告CS-R9652修订版,1996年)。[26] J. - G. Schneider和O.尼尔斯特拉斯组件,脚本,胶水。在洛Barroca,J. Hall和P. Hall,编辑,软件架构-进展和应用,第13Springer-Verlag,1999.[27] J. M. 斯皮维Z符号:参考手册(第2版)。计算机科学系列Prentice-Hall International,1992年。[28] M. Wermelinger和J. Fiadeiro。用于移动程序的连接器。IEEE软件工程学报,24(5):331