没有合适的资源?快使用搜索试试~ 我知道了~
理论计算机科学电子笔记182(2007)123-138www.elsevier.com/locate/entcs应用=组件+GlooMarkus Lumpe1艾奥瓦州立大学Ames,美国摘要我们提倡一种面向组件的软件开发方法,这种方法支持应用程序的计算实体和组合实体之间的明确分离。 应用程序构建范例“应用程序=组件+组件”最好地体现了这一原则。然而,成功使用这一准则的最大障碍来自于选择用于将应用程序定义为可重用软件组件组合的脚本机制。在本文中,我们分析了GLoo,一种新的面向组件的编程框架,它来自一个可扩展的和开放的脚本语言的表达能力。GLoo的设计旨在提供一种更高层次、可扩展和面向问题的软件开发方法,通过定义专门设计的领域子语言,同时实现小型和大型软件开发。保留字:构件组合,语言设计,语义1引言面向组件的软件技术已经成为通用工程原理的真正体现,在这一原理中,新产品的开发是基于积累的、普遍可用的系统知识和经验。通过将某些稳定的实体分解为可重用的组件,其质量有望随着每次重用而提高,基于组件的软件开发方法为开发和演化现代高质量的软件系统提供了一种可行的解决方案[5,24,29]。然而,虽然我们对这项技术的理解在过去十年中有了显著的增长,例如,在工业强度组件模型的定义中,如Java Enterprise Bean [19]和.NET框架[23],大多数现有的组件框架只能有限地支持定义更高级别的、可扩展的和特定于域的组合机制,这些机制反映了组合组件的特征和约束[1,27]。当今世界所采用的机制之间的不匹配1电子邮件地址:lumpe@cs.iastate.edu1571-0661 © 2007 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2006.09.035124M. 理论计算机科学中的集块/电子笔记182(2007)123面向组件的技术和它们应该支持的方法是由于通用编程语言的不适当使用,这些语言不是针对软件组合而定制的[16,20,21]。此外,Aßmann [5]认为,全面的面向组件的软件开发方法不仅需要提供抽象来表示不同的组件模型和组合技术,而且还必须提供构建大型软件系统的系统方法。特别是,需要一种专门设计的组合语言[5,16,20,21],(i)允许异构软件工件的有效集成,(ii)为面向问题的软件开发方法提供支持,(iii)使软件工程师能够按需增量地构建面向组件的领域抽象。满足这些设计标准的语言是GLoo,这是一种基于开放式脚本语言的新型面向组件编程框架,它允许指定可扩展域子语言来捕获面向组件软件应用程序的定义良好的子集。在早期的工作[16]中,我们已经演示了如何使用GLoo来指定易于使用的语言抽象,这些语言抽象作为GLoo框架的语法和语义在这项工作中,我们提出了一种方法,现有的软件工件的集成特别是,我们讨论了改进的GLoo编程模型,并说明了一种方法来定义一个Java服务的存储,以纳入Java将软件工件放入Gloo框架中。Java服务的存储不不仅提供了导入、配置和组合Java工件所需的语言机制,而且还将这些Java工件表示为GLoo框架内的原生第一类其结果是,我们获得直接的互操作性之间的Java和其他,已经存在的,异构的软件工件的GLoo组合框架。本文的其余部分组织如下:在第2节中,我们简要描述了GLoo框架的主要功能和设计原理,并在第3节中介绍了Java服务存储的设计和实现。 在第4节中,我们讨论了相关的工作及其对GLoo框架设计的影响。我们在第5节总结了我们的主要观察结果,并概述了窄域子语言的规范和实现领域的未来活动。2Gloo方法2.1的设计原则设计一种新的编程语言的主要挑战之一是在新语言必须支持的功能和使新语言更加通用的功能之间找到适当的平衡。通用编程语言为这种困境提供了一个很好的例子。一般来说,通用编程语言并不提供非常高级的、现成的即插即用的抽象,而只是提供中级语言结构,M. 理论计算机科学中的集块/电子笔记182(2007)123125以库或API我们在设计组合语言时也面临类似的问题。通用组合语言[17,20,27]应该结合以下方面:(i)架构描述语言,允许我们指定和推理系统架构,(ii)脚本语言,允许我们根据给定的架构风格将应用程序指定为组件配置,(iii)胶合语言,允许我们指定组件适配,以及(iv)协调语言,允许我们指定并发和分布式组件的协调机制和策略。然而,将这些相当正交的方面组合在一种语言中并不是一个可行的选择,因为最终的语言将变得相当庞大并且难以掌握。因此,这样的语言将错过其主要设计目标之一,即提供一个灵活、可靠和可验证的基于组件的软件开发方法。GLoo的设计建立在一种不同的策略之上,这种策略已经在CDL [12]中成功地测试过,CDL是一种专门为编译器构建而设计的语言CDL是一种具有空内核的开放式编程语言。 CDL最独特的特点是它是一种不具有任何优先级的语言除了借用宏库中定义的新语言抽象的扩展机制之外,这些扩展机制因此作为CDL核心的语义扩展。然而,与CDL不同的是,GLoo已经为将应用程序定义为可重用软件组件的组合提供了一些基本支持。GLoo的核心是基于λF演算[15],λ演算的一个变体,在一个正式框架中托管动态绑定,显式命名空间[2],增量细化和外部代码网关作为主要租户。GLoo的目标是一种面向问题的软件开发方法,它为面向组件的软件开发环境中的建模、推理和验证开放式语言机制提供了一个正式的测试平台GLoo的设计旨在为第一级面向主题的开发构件的定义提供可扩展的支持[22],这些构件构成了狭窄的领域特定子语言,例如,这些子语言是为更大的面向组件的软件架构的子集而是的。GLoo是一种纯函数式脚本语言。由于其函数性质,GLoo提供了一种声明式编程范式,支持外源控制风格[3]其中计算被封装在组件中,控制流被编码在作为显式组合运算符的连接器中[13]。此外,GLoo通过其内置的网关机制,允许在GLoo规范单元的范围内同时Java网关代码充当新数据类型的规范和组件配置的粘合代码,以使它们适应实际的组合需求[27]。因此,GLoo网关机制为定义新的域抽象提供了关键的构建块默认情况下,GLoo不提供任何对并发组合的支持。因此,似乎GLoo在这方面表现出严重的缺陷,相对于组合语言的要求[20]。此外,Benton et al.[6]争论126M. 理论计算机科学中的集块/电子笔记182(2007)123并发性是一种语言特性,因此应该成为底层语言规范的组成然而,在给定语言中识别和定义正确的并发抽象集并不是一件容易的事情。例如,考虑工业强度语言Java和C#。这两种语言都提供了丰富的原语集来处理软件系统中的并发活动。然而,这些抽象并不足以将协调与计算问题分开,例如,同步必须在方法级别指定,或者对象实例的生命周期可能会由于.NET Remoting基础设施的生命周期管理控制的应用程序特定设置而改变。我们注意到在PICCOLA[1,17]中也存在类似的问题,可以看出它是Gloo的前身PICCOLA是一种小型组合语言,其中对并发的支持是语言模型的主要租户,因为PICCOLA的语义基于π演算的变体[18]。然而,PICCOLA的语言元素,它的支持表示并发活动是非常低级别的,这给了PICCOLA的“并发汇编程序”的绰号。此外,PICCOLA不提供任何形式的支持,以封装组件因此,通信和计算问题混合并散布在典型的PICCOLA规范中,阻碍了底层合作模式的清晰识别以及规范设计之外的上下文中有意义的重用如上所述,GLoo方法建立在可扩展的语言模型之上。并发性可以被看作是一个领域方面,它应该由一个特定的领域子语言来捕获,该子语言为并发活动的表示及其协调提供支持。这种观点是Benton等人的一个微妙但有趣的变化。因为它坚持要求concur-concur必须成为语言的一个组成部分。然而,通过捕获所需的语言抽象在一个可扩展的领域子语言,我们实现了更好的通用性的语言支持。定义这种子语言的一个合适的模型是,例如,理想化工人理想化管理者模型(IWIM)[3]。例如,在GLoo中IWIM模型的具体实现可以模仿Reo [4],这是一种基于通道的外生协调语言,具有第一类连接器,可以在基于组件的应用程序中安排组件协作。2.2GLoo编程模型任何全面的面向组件的软件开发方法都需要在构成应用程序的计算实体和组合实体之间进行明确的分离[27]。因此,施耐德创造了“ApplicationsM. 理论计算机科学中的集块/电子笔记182(2007)123127Gloo输入单元Gloo中间代码输出GLoo前端GLoo后端Gloo扩展组件Fig. 1. Gloo执行模型。这一格言不仅抓住了基于组件的软件工程的本质,而且强调了这样一个事实,即基于组件的软件开发方法,为了真正实现其目标,必须产生可扩展的软件系统,以便在不破坏现有功能的情况下添加新功能它们必须是可组合的,以便可以重新组合功能以反映不断变化的架构和设计要求Gloo方法遵循这一准则。在GLoo中,应用程序是以特定的单位来定义的,这些单位定义了值或组件,这些值或组件可以与系统中已经存在的其他值或组件组合。通过使用GLoo框架,Schneider“Applications = Components +GLoo框架构建在基于解释器的执行模型之上,如图1所示。Gloo前端分析给定的输入单元,从Gloo扩展库导入所需的附加单元,并生成Java支持类每一个被使用的Gloo单位支持类作为语义扩展,GLoo运行时系统,由GLoo前端生成,该前端将任何指定的网关代码提取到给定支持类中相应的Java抽象中。GLoo系统使用com.sun.tools.javac编译支持类。当支持类的编译没有错误地完成时,后端将生成的Java类加载到内存中,并开始评估从输入单元派生的中间代码作为第一个示例,考虑清单1中所示的规范。 本单元演示了如何在GLoo中使用Java类java.util.Hashtable。第2行中的load语句将Java-Services的封装添加到当前GLoo单元的本地作用域。 单元JavaServiceOfJavaServices.lf使用了第三个额外的单元JavaClass.lf,它实现了一组抽象来表示Java类和Java对象作为GLoo中的第一类值。 行中的声明4导入类java.util.Hashtable,它在第5行中用于创建新的Hashtable对象。在其当前版本中,Java-Services封装不提供任何使用泛型的工具。但是,我们将探讨Java编译器Java支持类(*.class)Java支持类(*.java)128M. 理论计算机科学中的集块/电子笔记182(2007)1231让2负载“扩展/封装JavaServices。如果”34Hashtable=JavaClass(|className=“爪哇。util. Hashtable“|)5obj=新Hashtable(||)6放=服务obj“put“(|key:0 =“java. lang.Object“,7值:1=“爪哇。lang. 对象“|)8size=服务obj“size”(||)9在10调用把(|关键=“uid“, value=“马库斯“|);11调用把(|关键=“ home“, value= “/用户/Markus“|);12调用燃料电池)尺寸||)13端清单1: 在GLoo中使用java.util.Hashtable通过Java-Services在今后的工作中。在第6行和第7行中,我们定义了两个服务:put和size。服务的行为类似于方法指针或委托[23],定义了由目标对象和方法描述符组成的可执行记录结构。服务的指定需要三个元素:(i)目标对象,(ii)表示方法名称的字符串,及(iii)该方法的签名。签名定义了一个基于关键字的参数列表,其中每个参数都被分配了一个位置和类型。GLoo使用动态绑定将参数传递给函数,也就是说,参数的位置无关紧要。另一方面,Java使用位置相关的参数传递机制。GLoo仅使用绑定的位置指定作为排序标准。更准确地说,如果函数的参数拥有明确指定的位置,GLoo会创建一个参数列表,其中位置绑定以指定的顺序放置在任何位置无关绑定之前但是,读者应该注意,在调用Java方法时,位置无关的参数会被忽略 因此,与服务放置相关联的方法需要两个arguments:key在位置0,value在位置1,两个参数都是类型java.lang.Object,而服务大小根本没有参数。然后在第10-12行中使用这些服务,其中我们定义了一个服务调用序列,该序列产生最后一次抽象调用接受一个服务和一组参数,其被编码为位置无关的可扩展记录(即,一种形式[15])。在内部,抽象调用使用服务的签名将位置分配给相应的参数,并将结果参数列表应用于关联的Java方法。2.3构建域抽象GLoo不使用任何预定义的抽象来表示算法,除了序列化。然而,GLoo允许语法和语义扩展。此外,尽管GLoo识别大多数Java操作符,但它们的实际语义是不明确的,也就是说,用户必须为GLoo系统提供适当的实现。GLoo扩展机制允许定义任意领域抽象,从新的数据类型到复杂的领域子语言,M. 理论计算机科学中的集块/电子笔记182(2007)123129包JavaSupport; importLambdaF.*;公共类JavaClassValueextends LiteralValue{私人类fClass;公共类getClassValue() {返回fClass;}public String toString(){ return fClass. getString();}清单2:将Java类表示为第一类值。为特定问题域提供以用户为中心的视图(例如,Java API的面向服务的接口)。然而,所有领域抽象的共同点是它们都需要Meta级别和编程级别。Meta级别的目的是将新的域抽象合并到GLoo运行时系统中,而编程级别必须提供一组更高级别的编程抽象,这些抽象封装元级别,以保护应用程序程序员免受定义的域抽象的底层(可能非常复杂)基础设施的影响在GLoo框架中定义和集成新领域抽象的能力在全面的面向组件的软件开发方法中非常重要例如,即使GLoo不提供任何预定义的并发和协调抽象,对这些概念的适当支持也可以定义为对GLoo系统的语法和语义扩展,随着时间的推移,这些扩展逐渐成熟,为系统架构师提供不断改进的支持,以构建可靠,可验证和健壮的基于组件的软件系统。3Java服务的封装3.1类和对象作为第一类值为了定义Java-Services的封装,我们需要在GLoo框架中集成Java类和Java对象作为第一类值。更重要的是,我们需要定义两种容器值类型,它们封装类和对象,re-configuration,以及一个JavaClassMeta级别,它定义核心抽象以加载类,创建对象,调用方法,并将GLoo值映射到Java值,反之亦然。容器值类型直 接 在 Java 中 指 定 , 作 为 JavaSupport 包 的 一 部 分 , 当 处 理 指 定 单 元 时 ,JavaSupport包会自动加载到GLoo系统中Java类的容器值类型的定义如清单2所示。类型JavaClassValue定义了一个只读值,表示一个运行时实例一个Java类除了getter方法getClassValue()之外,我们还必须重新定义toString()方法,以获得新定义的数据类型的标准文本表示。此外,通过从类LiteralValue派生JavaClassValue,我们保证了新容器值类型,并将Java类提升为GLoo系统中的第一类值。130M. 理论计算机科学中的集块/电子笔记182(2007)123%{/*辅助胶代码*/}%letJavaClass = %{/*load Java class*/}%newInstance = %{/*反射式对象实例化*/}% invoke = %{/*反射式方法调用*/}%在(|JavaClass=JavaClass,newInstance=newInstance,调用=调用|)端清单3:GLoo单元JavaClass.lf的示意图。3.2Meta Level清单3提供了JavaClass.lf2的概述,它实现了Java-Services封装的Meta级别。单元JavaClass.lf由三个部分组成(i)辅助粘合代码,(ii)Meta级网关方法,以及(iii)导出声明。辅助粘合代码定义网关方法所需的附加行为(例如,将GLoo值转换为Java值)。辅助代码被原封不动地复制到底层支持类JavaClass.lf中。两 者 都是,辅助代码和网关方法包含在分隔符%{和}%中。的封闭的程序文本被GLoo前端视为单个标记网关方法在本地定义Java服务的存储的元级别,它由方法JavaClass(用于加载Java类)、方法newInstance(用于为给定Java类创建新Java对象)和invoke(用于调用Java方法)组成 读者应该注意到,通过分析invoke的接收器参数,invoke允许基于类和基于对象的方法调用。为了发布Meta级别,我们创建了一个新的可扩展记录,其中网关方法绑定到外部可见的标识符。尽管不是必需默认情况下,按照惯例,我们以相同的名称发布网关函数,以保留本地和外部标识符之间的连接3.3核心语言域子语言可以最好地描述为多排序代数,其中组件类型是代数的排序,并且域子语言的语法由代数的签名捕获域子语言的这种代数观点为我们提供了一种精确的方法,不仅可以捕获特定的问题域,而且可以以简洁而优雅的方式推理它们的属性当定义一个领域子语言时,我们总是瞄准一个占用空间小的解决方案,也就是说,一种发现实际功能的方法,直到实际上需要相应的信息时,才进行组件的更新。例如,使用这种技术,我们可以防止Gloo运行时系统创建昂贵且可能不必要的适配器抽象来桥接Gloo和Java。此外,我们赞成应用延续传递风格(CPS)来定义子语言的元素。使用在这种技术中,函数名扮演了定义的子语言的关键字的角色其含义提供控制上下文以评估给定的编程抽象。换句话说,每个子语言都定义了一个连续传递解释器2 由于篇幅有限,我们省略了嵌入式Java代码的介绍。M. 理论计算机科学中的集块/电子笔记182(2007)123131让Java = load“Extensions/JavaClass. 如果”传播位置为(\位置::(\参数::(|位置#论点|)))在(|JavaClass=Java. JavaClass,新= (\Class::(\Args::Java. newInstance (|Args同学们=类|)))|)端清单4:Java服务语言的核心。其中延续模仿底层句法类别的解析过程。清单4显示了Java-Services存储的核心。核心部分公开了两个抽象:类型构造函数JavaClass和函数new,该函数接受类容器值并返回函数,该函数期望一个可扩展记录,表示要传递给Meta级别函数的构造函数参数Java.newInstance.术语(|Args,class=类|)定义了一个所谓的binding- ing扩展,其中记录Args由binding class = Class定义。同样,可扩展记录中绑定的顺序是无关紧要的。但在在出现具有相同标签的绑定的情况下,最右边的绑定具有优先级。此外,核心还定义了函数传播位置,仅对单元的局部作用域此函数的目的是将 签 名 记 录 中 指 定 的 位 置 信 息 与 参 数 记 录 中 的 绑 定 相术 语 ( | 立 场#Arguments|),表示两个记录的绑定优先于参数的绑定[15],产生一个与Arguments具有相同绑定的记录,只是在必要时添加了位置。更准确地说,如果Arguments中的绑定没有显式指定的位置,则会参考记录Positions来为该绑定分配位置。3.4一种类似Smalltalk的程序设计模型为了向核心语言添加消息范例,我们定义了函数send和to,如清单5所示。函数send接受一个方法名和一个消息描述符,用@Args3(一个开放上下文参数)表示,以返回一个需要continuation的新函数 这个continuation是函数to,它将编码的方法发送到接收方对象Object。 底层Meta级函数invoke不区分不同的调用范例。它使用记录(|Args,receiver = Object|)来确定并调用所需的方法。为了演示Smalltalk类编程模型的使用,考虑清单6中给出的规范,它演示了SwingHello World应用程序的设置。这个例子不仅演示了抽象send3形式参数Args用作显式查找环境的占位符,用于函数send主体中变量的自由发生器(即,签名、参数和参数)。132M. 理论计算机科学中的集块/电子笔记182(2007)123发送= (\MethodName::(\@Args::letnew_args = propagate_positions签名参数NewArgs=(|Args,arguments = new_args|)在(\Receiver::Receiver(|NewArgs,方法=methodName|))结束)),to=(\Args::(\Object::Java.调用(|Args,接收器=对象|)))清单5:类似Smalltalk的扩展。让负载“扩展/封装JavaServices。如果”JFrame = JavaClass(|className =“javax. 秋千JFrame“|)JLabel = JavaClass(|className =“javax. 秋千JLabel“|)在发送“setDefaultLookAndFeelDecorated“(|参数=(|defaultLookAndFeelDecorated:0=true|)的方式|)到JFrame;让帧=新JFrame(|论点= (|标题:0 = “HelloWorldSwing” |)|)在发送“添加“(|sign=(|comp:0=“java. 一个wt。 “t”字|),参数=(|comp=新JLabel(|参数=(|text:0=“Hello World“|)的方式|)的方式|)的方式|)to(send“getContentList”(||)toframe);结束结束清单6:使用类似Smalltalk的编程模型。和to,但也表明Java类是第一类值(例如,JFrame)。该规范显然比其对应的Java程序更详细,因为我们需要显式指定方法的签名。但是,实际的代码部分是相同的。此外,由于底层元的占用空间较小,级别,在GLoo中设置Swing应用程序所需的运行时开销可以忽略不计。3.5一种面向服务的编程模型面向消息的编程模型为Java软件构件提供了一个纯面向对象的视图。此外,每个方法调用都需要显式的签名,这使得Smalltalk类抽象更适合于配置而不是控制流程。为此,我们扩展了Java的存储器-面向服务范式的服务。 更准确地说,我们添加函数service和invoke(如清单7所示),作为对核心语言的最小扩展,以便为面向服务的编程模型提供支持。函数服务创建一个记录,该记录表示面向服务的编程模型中的方法指针。为了调用与方法指针相关联的方法,函数invoke(i)将服务的签名中定义的位置传播到实际参数,(ii)用方法指针组成结果参数列表,以及(iii)调用Meta级别函数Java。M. 理论计算机科学中的集块/电子笔记182(2007)123133来执行服务。通过面向服务的编程模型,我们实现了一个面向组件的视图,在该视图中,组件封装了计算和控制流,并将其编码为服务调用序列,这些服务调用充当显式的组合操作符。service=(\Obj::(\MethodName::(\Sig::(|接收r=Obj,方法d=方法名称e,签名e=Sig|),调用= (\@服务::(\Args::letargs=传播位置签名Args在Java.调用 (|服务,参数=args|)结束))清单7:面向服务的扩展。4相关工作GLoo框架的许多设计原则都归功于PICCOLA,P iccola是一种实验性编程语言,已经证明了高级组合语言的可行性,该语言为不同宿主语言定义的软件工件提供了面向组件的视图[1,14,27]。然而,与GLoo不同的是,PICCOLA基于PICCOLA演算[1],这是π演算的一个变体,试图将异步通信范式与显式通信概念命名空间[2]。PICCOLA使用组合脚本作为主要的编程单元,它表示单个组件或应用程序。编译后的脚本存储在PICCOLA组件库4中,其中包含两种信息:二进制文件和组件接口定义。组件二进制文件是一种对象文件,需要通过组件链接器转换为可执行的代理映像另一方面,当脚本中使用相应的组件时,PICCOLA为了无缝集成外部软件工件,PICCOLA提供了所谓的对等形式,它定义了类似包装器的抽象,以在PICCOLA表示和服务的主机表示之间进行调解[1]。对等形式依赖于内置的Java-Piccola-Brigde,它使用所谓的对等类来实例化外部主机对象。对等类是PICCOLA运行时系统的一个组成部分,并且是将现有软件工件合并到PICCOLA框架中的唯一方法。但是,使用对等类来执行服务发现会带来很大的运行时开销。为了减少这种开销,PICCOLA使用了所谓的惰性服务评估。不幸的是,PICCOLA4 此功能仅在-1\f25 PICCOLA-1\f6134M. 理论计算机科学中的集块/电子笔记182(2007)123因此,尽管PICCOLA是一种表达性语言,但它远不能提供构建可靠的基于组件的应用程序所需的易用性和可扩展性。原因有二。首先,PICCOLA的语言抽象所提供的机制和它应该支持的面向组件的方法之间仍然存在概念上的差距。其次,PICCOLA提供的语言抽象仍然是非常低级的,并且不支持定义语言的语法和/或语义扩展,因此更高级别的软件抽象的编码对于实际的编程任务来说变得笨拙。GLoo提供了一种面向问题的软件开发方法,允许小型编程和大型编程。用于定义狭义领域特定子语言的GLoo模型由面向主题的编程方法[22]管理。 面向主题的编程是面向对象范例的一种推广。 一个主题大致相当于一个面向对象语言的整个程序,其中该主体中的所有代码共享同一组类和类型层次结构、操作和对象状态。此外,为了构建更强大的面向主题的实体,存在允许主题组合的各种这些规则指定组合主题中类和类型层次结构之间的映射,并描述从一个主题中分派的方法如何影响混合物. 换句话说,一个主题可以被看作是一种作曲风格,封装了特定于某个领域的一流开发工件,帮助开发人员以更有效的方式解决该领域中的问题人们对可扩展性问题的可行解决方案重新产生了浓厚的兴趣。为了保持其在现实世界环境中的实用性,软件系统必须不断地进行调整。然而,成功的软件演化方法的关键在于承认可扩展性问题设计一个系统,使它可以按需进化。已经出现了几种方法(例如,Smalltalk [11],CLOS [28],Ruby [30],Tcl [32],Mixins [9],Traits [25],或Classboxes [7])专注于特定的技术,称为类扩展。类扩展允许将新类和新操作模块化地添加到现有的类层次结构中,而不依赖于标准的继承机制。此外,类扩展提供了一种可控的机制,将新的行为合并到现有的应用程序中,因此,允许一个可靠的,可验证的和健壮的软件进化方法。由GLoo提出的扩展机制促进了类扩展的定义。此外,由于能够定义语法和语义扩展,GLoo并不局限于一个特定的类扩展模型。新模型可以通过定义对应的域子语言引入到GLoo系统中,该域子语言表示所需的编程抽象,就好像它们是GLoo语言本机的一样(例如,[16]第十六话M. 理论计算机科学中的集块/电子笔记182(2007)1231355结论和今后的工作软件项目成败的关键不仅在于我们对问题域的理解,还在于编程语言的选择及其对问题域建模的支持。通用编程语言提供了对领域专家封装在预制软件实体中的合理支持,预制软件实体可以通过在新的组合中重新排列它们来重用[29]。然而,通用编程语言在将应用程序指定为可重用软件组件的组合时不太有用,因为它们表现出所支持的语言构造的抽象级别与软件组合发生的抽象级别之间的不匹配。在本文中,我们分析了GLoo,这是一种新型的面向组件的编程框架,它允许定义窄聚焦的组合域子语言,为应用程序员提供给定问题域的以用户为中心的视图(即,组件汇编器[29])。GLoo是一种动态的、开放式的组合语言,它依赖于动态绑定、显式命名空间、增量细化和外部代码网关,这些概念对于全面的面向组件的软件开发方法都至关重要。外国代码网关是GLoo相对于其前身PICCOLA最重要的创新,并为我们提供了一种有效的方法,将Java代码直接合并到GLoo规范单元的范围内,以构建面向问题的领域抽象,如Java服务的定义所示。GLoo编程模型允许一种轻量级和可扩展的方法来定义域抽象。而不是建立一个大的,单一的,Gloo方法促进了小型、一流的面向主题的开发工件的定义,这些工件可以组合和扩展以构建更大、更复杂和可能并发的组合编程抽象。然而,网关机制是基于一个非常脆弱的技术。目前,几乎没有执行编译时检查来验证GLoo和嵌入式Java代码之间的桥梁由于绑定到预期参数的值不正确,这可能会导致运行时异常的发生。尽管GLoo系统足够健壮,可以正确处理这些异常,但更可取的做法是在编译和运行时执行某种断言检查因此,我们计划修改网关机制,包括以下方法:合同条款[8]。 合同规范确保给定的特性可以安全地与其他特性组合或部署在新的上下文中。通过将合约的概念添加到getaway函数中,其应用的所有条件都被明确和正式地声明为getaway接口规范的一部分,这将使GLoo编译器能够推导出一组在调用getaway函数之前和之后这种技术与一种向getaway函数传递值和从getaway函数传递值的细化机制相结合,将在未来为我们提供一种更强大的扩展机制,同时保留其具体的可扩展性。136M. 理论计算机科学中的集块/电子笔记182(2007)123GLoo框架还提供了对模型驱动工程的支持[26]。模型驱动工程(MDE)技术将特定领域的建模语言与程序合成工具相结合,用于创建大规模系统的特定领域模型模型被视为第一类实体。GLoo编程范式不会对可定义的开发工件施加任何限制。因此,在未来的工作中,我们计划使用GLoo作为模型集成计算平台和执行可行性研究,以确定代表的有效性GLoo框架中的域模型。致谢。作者感谢匿名评论者的宝贵意见和讨论。引用[1] Achermann,F.,“形式,代理人和渠道:用风格定义组合抽象”,博士。论文,伯尔尼大学计算机科学与应用数学研究所(2002年)。[2] Achermann,F.和O. Nierstrasz,Explicit Spaces,in:J. Gutknecht and W. Weck,editors,ModularProgramming Languages,LNCS 1897(2000). 七十七比八十九[3] Arbab , F. , 并 行 活 动 协 调 的 IWIM 模 型 , 在 : P.Ciancarini 和 C 。 Hankin , editors , CoordinationLanguages and Models,LNCS 1061(1996).34[4] Arbab , F. , Reo : A mixel-based Coordination Model for Component Composition ,Mathematical Structures in Computer Science14(2004),pp.329-366.[5] Aßmann,U.,[6] 本顿,N.,L. Cardelli和C. Fournet,Modern Concurrency Abstractions for C#,in:B. Magnusson,editor,Proceedings ECOOP 2002,LNCS 2374(2002),pp. 415-440[7] Bergel , A. , S. 杜 卡 斯 岛 Nierstrasz 和 R. Wuyts , Classboxes : Controlling Visibility of ClassExtensions,Journal of Computer Languages,Systems Structures31(2005),pp.第107-126页。[8] Be ugnard,A., J.- M. 我也是,N。 PlouzeauandD. Watkins,M aki ngC ompone ntsC ontarare,IEEE Computer 32(1999),pp. 38比45[9] 布 拉 查 湾 和 W. Cook , Mixin based Inheritance , in : N. Meyrowitz , editor , ProceedingsOOPSLA/ECOOP303-311[10] DeRemer,F.和H. H. Kron,Programming in the Large vs. Programming in the Small,IEEETransactions on Software EngineeringSE80比86[11]Goldberg,A.和D.Robson,[12] 科斯特角H. H.- M. Stahl,[13] Lau,K. -K. 和V。在英国,AutomticControlFlowGenerationfromo nf tarchitect uressi n:W. 卢维和M 。Su? dholt , editor s , Proceedingofthe5thIntern ation alSymposiumon SoftwareCompositi n(SC2006)(2006),pp. 325-339[14] Lumpe,M., 伯尔尼大学计算机科学与应用数学研究所论文(1999年)。[15] Lumpe ,M.,A Lambda Calculus With Forms,in:T. Gschwind,U. Aßmann和O. Nierstrasz,编者,第四届软件组合国际研讨会论文集,LNCS 3628(2005),pp.83-98.[16] Lumpe,M.,GLoo:A Framework for Modeling and Reasoning About Comprehensive LanguageAbstractions , in : I. Gorton , editor , Proceedings of 9th International SIGSOFT Symposium onConcentrated Software Engineering(CBSE 2006),LNCS 4063(2006),pp. 十七比三十二M. 理论计算机科学中的集块/电子笔记182(2007)123137[17] Lumpe,M.,F. Achermann和O.Nierstrasz,A Formal Language for Composition,in:G.Leavens和M. Sitaraman,编辑,基于智能系统的基础,剑桥大学出版社,2000页。69比90[18] 米尔纳河,[19] Monson-Haefel河,“Enterprise JavaBeans,” O’Reilly, 2000,[20] 尼尔斯特拉斯岛 和T. D. Meijler,Requirements for a Composition Language,in:P. 钱卡里尼,O. Nierstrasz和A.Yonezawa,editors,Object-Based Models and Languages for ConcurrentSystems,LNCS 924,Springer,1995 pp.147-161
下载后可阅读完整内容,剩余1页未读,立即下载
cpongm
- 粉丝: 5
- 资源: 2万+
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- Fisher Iris Setosa数据的主成分分析及可视化- Matlab实现
- 深入理解JavaScript类与面向对象编程
- Argspect-0.0.1版本Python包发布与使用说明
- OpenNetAdmin v09.07.15 PHP项目源码下载
- 掌握Node.js: 构建高性能Web服务器与应用程序
- Matlab矢量绘图工具:polarG函数使用详解
- 实现Vue.js中PDF文件的签名显示功能
- 开源项目PSPSolver:资源约束调度问题求解器库
- 探索vwru系统:大众的虚拟现实招聘平台
- 深入理解cJSON:案例与源文件解析
- 多边形扩展算法在MATLAB中的应用与实现
- 用React类组件创建迷你待办事项列表指南
- Python库setuptools-58.5.3助力高效开发
- fmfiles工具:在MATLAB中查找丢失文件并列出错误
- 老枪二级域名系统PHP源码简易版发布
- 探索DOSGUI开源库:C/C++图形界面开发新篇章
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功