理论计算机科学电子笔记238(2009)63-80www.elsevier.com/locate/entcs使用第三方组件开发产品线Merijn de Jonge1荷兰埃因霍温飞利浦研究院摘要产品线开发和采用更多第三方软件的趋势很难结合起来。原因是产品线需要对软件进行精细控制(例如,对于多样性管理),而第三方软件(几乎从定义上来说)只提供很少或根本没有控制。因此,越来越多地使用第三方软件可能会导致对产品开发过程的控制减少,反之亦然,需要对软件进行大量控制可能会限制使用第三方组件的能力。既然两者都是降低成本和缩短上市时间的手段,问题是它们是否能有效地结合起来。在本文中,我们描述了我们的解决方案,这个问题相结合的考拉组件模型在飞利浦内部开发的概念,构建级组件。我们表明,通过将Koala组件的组件粒度从单个C文件提升到构建级组件,这两种趋势可以统一起来。Koala架构描述语言用于编排产品组合和管理多样性,而构建级组件构成第三方组件组合的单元。关键词:Koala,软件产品线,构建级组件,第三方软件,软件组合。1介绍降低成本和缩短上市时间是开发软件产品线的驱动因素专有技术通常用于管理多样性,以实现快速产品开发。直到最近,通常的做法是在内部开发大多数(如果不是全部)软件,特别是对于工业产品线架构。今天,降低成本和缩短时间的趋势,1电子邮件:Merijn.de.Jonge@philips.com1571-0661 © 2009 Elsevier B. V.在CC BY-NC-ND许可下开放访问。doi:10.1016/j.entcs.2009.09.04164M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63继续扩大市场,即采用更多的第三方软件,包括开放源码软件。期望通过采用第三方软件,可以提高软件质量和上市时间,同时降低开发成本。不幸的是,第三方软件通常不能很好地与专有产品线技术集成。产品线技术通常要求对组件进行专门的封装,并对软件工件进行细粒度的控制由于产品线技术没有标准化,很可能第三方软件不适合,并且不允许或不可能使其适合。因此,要么使用第三方软件优于产品线技术,要么相反。显然,这不是最佳情况。Koala [10,11]就是这样一种用于创建生产线的专有组件技术它已经成功地用于定义和构建各种各样的产品约10年。其主要特征是通过组合和变化进行多样性管理,以及使用架构描述语言(ADL)来定义组件组合并驱动代码生成。尽管取得了成功,但Koala目前还不具备采用外部软件的能力。因为它是专有技术,所以不是工业标准。由于它假设专门定制的组件实现,因此需要进行排序以使第三方组件适合。此外,由于它在单个C文件级别上运行,因此很难集成更粗粒度的组件。因此,在目前的形式下,Koala无法协调由专有和第三方组件组成的产品的组成。独立于Koala,构建级组件的概念[4]已经开发出来。构建级组件由源代码和构建指令(例如,它提供了一个构建和配置接口,以抽象特定于组件的构建和配置过程。因此,构建级组件可以以统一的方式组合和绑定,类似于其他组件模型中的组件。构建级组件易于开发,并且符合标准技术。因此,它们有望在构建级提高第三方软件的可组合性。在本文中,我们探讨了将Koala组件模型和构建级组件相结合的想法,我们展示了如何使用Koala通过利用从C模块到构建级组件的组件粒度来编排构建级组件的组成和可变性。这样才能M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6365适应使用第三方组件的趋势,而不仅仅是使用专有软件。通过这种方法,我们可以从Koala的架构语言、多样性机制和工具中受益。这样,即使在未来的异构环境中,也可以继续使用Koala进行产品线开发。本文的结构如下。第2节简要概述了Koala组件模型。在第3节中,我们将详细介绍Koala第4节给出了构建级组件的快速概述。在第5节中,我们解释了如何将Koala和构建级组件结合起来。在第6节中,我们讨论了使用Koala实现构建级组合在第7节中,我们将讨论Koala编译器作为构建级组件的组合的开发第8章得出最终结论2Koala in a nutshellKoala [10,11]是一个由体系结构描述语言(ADL)和工具支持组成的组件模型。ADL用于定义接口、数据类型、基本组件和组合(它们本身就是组件)。该工具用于从组件组合生成产品。Koala主要是为资源受限的软件而设计的,并应用于消费电子领域。Koala是一个层次化的组件模型,其中较大的组件通过实例化较小的组件来构造合成树的叶子2Koala工具包括一个编译器,它创建组件之间的绑定,创建代码来管理未绑定的多样性参数,并生成一个脚本来编译/链接组合。下面我们将简要描述考拉ADL的一个子集。接口定义在最简单的形式中,Koala接口定义由一系列函数原型,参数和常量组成,采用类似C的语法。举例来说:int foo(void);int n(int n,int n);从概念上讲,Koala组件模型并不局限于C语言(参见第3节),但实际上,Koala工具只支持C语言,所有现有的组件都是用C语言编写的。66M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63int a_parameter= 10;int a_parameter;}这个接口定义了两个函数(foo和bar),一个常量(constant)和一个参数(parameter)。组件定义组件定义由名称和部分列表组成举例来说组件FooBar {提供IFooBarp;需要IFoo rFoo;IBar rBar;包含组件Foo foo;组件Bar bar;模块m;连接p=m;m =rFoo;m =rBar;}这个组件定义定义了组件FooBar。它指定了三个接口实例:一个提供IFooBar类型的接口,两个分别需要IFoo和IBar组件定义进一步包含两个组件实例(一个Foo实例和一个Bar实例)和一个模块m。注意,与接口和组件相反,模块没有类型,并且是隐式实例化的。最后,组件定义指定接口如何连接。所提供的接口p连接到模块m。这意味着对接口p的每个函数调用都被路由到模块m。此模块必须实现这些功能。模块m连接到rFoo和rBar。这意味着模块m可以使用这些接口的函数,尽管它仍然不确定这些函数在哪里实现。模块的连接是无类型的。因此,任何接口都可以连接到模块。配置为了从一组组件构建一个产品,必须定义一个配置配置是一个没有提供或要求接口的组件定义。它必须绑定其组成组件实例的所有未绑定需求接口。在上面的例子中,这意味着绑定rFoo和rBar接口。M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6367模块模块是Koala的原子组成单位。它通常对应于C文件。Koala模块不能实例化。对应于Koala模块的C文件必须满足一些规则:它应该只有一个特定的#include语句,并且应该使用特定的命名约定来实现来自provides接口的函数和访问来自requires接口的函数,例如:public void foo(){return();}int p_bar(int x,int y){ return r_bar(x,y);}intp_a_parameter = 10;从这个例子中可以看出,来自接口的函数以它们的实例名为前缀这些在Koala中被称为逻辑名称。在其最简单的形式中,Koala组合的编译包括根据Koala组合中的接口绑定将C函数绑定是通过将函数调用和定义的逻辑名称映射到公共物理名称来完成的。这些绑定具有以下形式:#define logical_name physical_name每个C模块必须包含的单个文件包含这样的绑定。此文件由Koala编译器生成示例中的文件FooBar. h可能包含以下绑定:#define p_fooMain_FooBar_foo#define r_fooMain_Comp_Demo_foo #define r_barMain_Test_Bar_bar多样性其中,多样性是通过交换机结构来支持的。例如:交换机表达式在{i1 i2}在v1{o3,o 4},否则如果expr的计算结果为v1,则此开关将接口i1和i2连接到o1和o2,否则连接到o3和o4。Koala编译器执行部分评估,以便尽可能评估如果可以静态确定切换条件(基于接口中的参数绑定),则相应的路由68M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63通过交换机被解除为静态绑定,而剩余的路由则被删除。这形成了一个重要的优化,它允许在ADL中定义一个巨大的配置空间,而不会对运行时行为和/或结果可执行文件的大小产生重大影响,因为产品的大多数对于没有静态绑定的变异点,Koala编译器在运行时生成代码来处理变异点3深入了解Koala模块Koala模块是无类型的。这意味着任何接口都可以连接到模块。 原因是模块形成了架构级和实现级之间的连接。由于Koala没有关于C的概念,它无法对C文件进行类型检查来验证绑定到文件的正确性。因此,在架构级别,我们关注的是接口和组件以及它们如何连接。在实现层面上,我们关注的是C文件(在某种程度上也包括库),以及它们如何被编译成可执行文件。由于Koala模块对应于一段具体的源代码,因此模块不能被实例化,因为这意味着纯粹的代码重复。Koala语言(和概念)和Koala编译器(生成C代码)一起开发和使用。因此,它们通常被视为一个整体的组合。实际上,几乎没有将Koala语言与其编译器和C编程语言解耦的经验。然而,从概念上讲,Koala是一个分层的组件架构,其中模块是组成的原子单元因此,Koala组件组合相当于组合Koala模块。通过将Koala模块与具体的可组合类型的工件相关联,Koala成为该类型工件的组件架构。Koala模块与C源文件的关联只是一种可能的关联。重要的是要理解Koala语言对于特定的关联是不可知的;它是Koala编译器知道的。本质上,Koala编译器由两部分组成:前端和后端。前端与Koala语言有关这包括类型检查、合成接口绑定和部分计算。前端的结果是一个标准化为某种规范形式的Koala组合后端涉及代码生成。给定一个规范化的Koala组合,它会为目标语言生成适当的绑定(例如,在C中使用#include因此,编译器后端知道特定的模块M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6369all构建所有构建目标clean删除(中间)构建目标install安装构建目标卸载移除已安装的构建目标检查构建并执行已注册的测试dist构建软件分发版distcheck构建和测试发行版a:构建接口。表1--help显示配置开关--prefix= p>在
--disable-f>关闭功能--enable-f>打开功能--with-f>= v>将特征绑定到值b:配置界面。构建级组件的构建接口和配置接口。协会这种分离使得Koala语言和前端能够驱动C源文件以外的其他工件的合成。正是这一观察结果引发了本文的想法,将Koala的应用程序扩展到更粗粒度的组件,以支持第三方软件的采用为此,我们将提出构建级组件作为组成的原子单元4简而言之,构建级组件构建级关注的是从源文件构建软件产品这被称为软件构建过程,通常包括编译和链接等任务因此,构建级关注(源)文件,它们在目录中的结构,编译器(以及相关工具和它们的设置),依赖关系(即,需要什么其他软件),以及配置(即,控制需要构建什么特征以及如何构建它们)。构建过程本质上是困难的,因为有许多不同的编程语言在构建过程中需要不同的步骤,因为有许多可用的工具,因为缺少标准化,并且因为构建过程(通常)不是为组合而设计的。因此,构建过程通常是定制的,并且非常难以理解和维护。此外,它们通常只在非常特定的环境中工作(由于隐含的依赖性,很难重建这样的环境)。最后,它们不能很容易地集成到另一个构建过程中。构建级组件的动机就是为了改善这种情况。构建级组件引入了一些开发规则,这些规则将基于组件的软件工程(CBSE)的原则带到了构建级[4]。特别地,构建级组件是独立部署的单元,第三方组合的单元,并且没有(外部)可观察的状态[8]。构建级组件的概念促进了将大型软件系统分解为更小的可重用构建块。这些可以组成70M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63以系统的方式形成复杂的软件系统。他们从他们的内部细节中抽象出来(例如,它们是如何准确构建的,以及它们的源文件在目录中的组织)。构建接口指定构建组件所需的步骤,配置接口指定组件的变化点,而需求接口指定组件的需求(即,的依赖)。在[4]中,我们建议遵守开源社区的规定,并采用autotools [12]的语法来定义构建和配置接口(见表1a和1b)。要求接口通过组件配置接口的--with-下面我们给出一个使用GNU Automake和Autoconf的构建级组件的小示例该组件名为Foo,由单个库libfoo. a组成。它的实现包含在C源文件libfoo.c中。组件对组件Bar有一个依赖项。 它的构建接口由Automake根据以下构建过程描述生成lib_LIBRARIES=libfoo.alibfoo_a_SOURCES =libfoo.clibfoo_a_CPPFLAGS =-I$(BAR)/include这个Automake make文件定义libfoo. a将是构建过程的结果。这个库是在libfoo. c中定义的,使用单个依赖栏。通过使用GNU Autoconf,可以从以下configure.ac文件自动生成适当的构建级配置接口:AC_INIT(foo,0.1,you@your.organization)AM_INIT_AUTOMAKEAC_PROG_CCAC_ARG_WITH([bar],AS_HELP_STRING(. . .),[BAR=${withval}])AC_SUBST([BAR])AC_CONFIG_FILES([foo/Makefile])AC_OUTPUT这个配置文件指定了构建级组件的名称、版本和维护者更重要的是定义组件Bar的依赖参数。生成的配置脚本将理解--with-bar开关,并通过变量BAR将值传递给make文件。5将Koala模块链接到构建级组件在本节中,我们将展示如何将Koala编译器前端与新的后端一起使用,以形成构建级组件的组合工具。这结合了具有用于描述组合物和人的ADL的愿望M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6371一BCM4M1DM3M2Fig. 1. Koala组件配置和相应的组合树。老化的多样性与采用第三方软件的愿望由于构建级组件相当容易构造(并且[4]的设计规则无论如何都很好应用),因此在构建级集成第三方软件的工作量其基本思想是:• 在Koala ADL中定义接口、组件、组件组合、组件绑定• 使用Koala前端工具来管理多样性,分析正确性,并将组合转换为正常形式。• 给定规范化的组合规范,生成此组合的构建级实现实现构建级组合包括创建包含一组组件实例的目录层次结构,在顶层构建过程定义中集成构建过程,以及通过为所需接口和多样性参数合成大小绑定来集成组件配置这些将在下面描述。5.1构建级组合层次结构规范化的组合规范定义了一个组合树,其中节点表示组件,叶子表示模块。在构建级,我们将遵循这个组合树。目录将代表组件和模块。Koala模块映射到构建级组件。构建级组件放置在相应模块的目录组件的目录是一个容器,它将所有构建级操作委托给其子目录。图1显示了一个Koala配置和相应的组成树。在构建级,创建相同的结构:对应于模块的四个构建级组件被放置在目录m1中,72M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63m2、m3和m4;目录b、c和d是向构建级添加结构的容器35.2构建级组件实例构建级组件实例是包含构建级组件内容的目录。对于每个Koala模块,创建一个单独的目录,其中存储构建级组件。也就是说,每个对应于Koala模块的目录都包含一个构建级组件的实例。这意味着可能存在多个构建级组件的实例具有构建级组件的多个实例的能力使得能够同时使用相同组件的不同版本,以及使用相同组件的但是,这取决于如何使用组件实例,多个实例是否有效。例如,单个可执行文件通常不能同时使用库的两个不同版本5.3顶层构建过程定义构建级组合本身就是构建级组件这意味着组合有自己的构建过程定义。这个构建过程很简单,因为顶层目录只是作为容器。因此,大多数构建操作只是委托给子目录。dist和distcheck操作是特殊的,不能委托。这些操作通过打包组合中所有需要的文件来构建分发。复合构建过程是构建过程的顺序组合单个构建过程不能以任意顺序执行。它们必须考虑组件依赖性。顺序构建过程通过以深度优先顺序遍历组合树而从组合树形成,以这样的方式,如果以x为根的子树中的构建级组件具有依赖于以y为根的子树中的构建级组件,则y为在x之前遍历。这确保了构建级组件在使用之前已经构建。注意,对于具有循环依赖关系的组件,不可能确定正确的构建顺序。这些组件必须重构[4]。3在 [3]我们描述了一种构建级组件组合的方法,其中COM-位置树始终是不可见的。一个抽象的组件结构阻碍了真正的抽象,因为一个组件不能嵌入另一个组件实例。我们现在提出的(子)目录结构更加灵活,并允许在构建级别上使用复合组件。M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63735.4构建级接口绑定Koala有三种类型的接口:提供接口、需要接口和多样性接口。所有三种类型都可以连接到模块。Koala后端负责实现接口绑定。在构建级组件的情况下,这相当于绑定需要接口和多样性参数.绑定a需要接口r,这意味着为组件配置过程的--with-r开关指定一个值。绑定分集接口d意味着为d的每个接口元素v指定--with-v的值(例如,--with-v =value)。如果绑定是静态的(即, 当它的值在运行Koala编译器时计算为常量时),绑定是直接的。 它类似于[ 3 ]中描述的绑定机制,相当于以--with-switch的形式使用特定绑定运行配置工具。在Koala中,配置可能更复杂,因为它还支持运行时接口绑定。在C语言中,运行时接口绑定意味着在执行时评估切换条件以确定函数绑定。对于构建级组件,运行时意味着运行配置工具。然后,在运行configure时动态合成--with开关的值。在下一节中,我们将讨论技术细节。C版本的Koala编译器要求顶层组件本身不能有接口(这样的组件被称为配置)。这是必不可少的,因为编译器产生可执行文件,如果没有特殊的技术,编译和链接应用程序与未绑定的要求接口将导致无法解决的符号错误。如果是构建级组件,则不需要此要求因此,每个构建级组件本身都是一个组件,可以根据需要拥有尽可能多的provides、requires和多样性接口。通过将Koala模块链接到构建级组件,我们获得了构建构建级组件的强大手段。它支持从粗粒度的构建级组件构建软件系统它形成了一种构建软件系统的一致方式,而不是从单个但依赖的块集合中构建它们,这些块需要独立构建和确认,或者集成意味着手动开发复杂的构建脚本。不过,它并没有像Koala那样为组成C模块提供精细的粒度。74M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63图二. Koala编译器(产品线)的运行时组件的组成。6执行我们开发了一个原型Koala编译器来实验Koala组件架构和概念。它被实现为一个使用XplogoXT的转换管道[2]。每个转换都需要一个特定的编译步骤。这使我们能够轻松地尝试新的语言结构,并根据我们的需求调整/扩展管道。编译器是一个产品线,其中输入处理机制和产生的输出是变化点。图2描述了Koala编译器的运行时组件的组成灰色的节点构成了实现构建级组件组合的管道由于篇幅限制,我们将只讨论在koala-stc后端执行的这个管道的代码生成部分。该后端创建一个目录结构,下载并解包该目录结构中的构建级组件,为每个Koala组件定义创建Automake make文件,并创建顶级Autoconf配置脚本。构建级组件在对应于Koala模块的目录中解包(参见第5节)。从模块依赖合成构建顺序后,make文件的生成就很简单了。每个make文件都包含一个声明:子方向= A B C其中,A、B和C表示按正确构建顺序的子目录。合成构建顺序是一个递归过程,其中在合成树中的每个节点处,兄弟节点根据对应子树中的模块依赖关系以正确的顺序放置后端更复杂的部分是生成一个顶层自动配置脚本,该脚本驱动所有构建级配置的配置M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6375ponents。通常,自动配置脚本处理配置开关,驱动子目录中配置进程的执行,并生成make文件。它还执行平台检查,但这些与我们的讨论无关。为我们的目的生成一个配置脚本并不简单,因为它必须处理构建级组件之间的接口绑定,并且因为它必须处理管理和取消(动态,配置时)绑定。未绑定接口在顶层配置接口中添加了(顶层组件的)未绑定需求和多样性接口。对于未绑定的需要接口,这涉及到将接口实例名称添加到配置接口。对于未绑定的多样性接口,它相当于为接口d的每个元素e添加参数d-e到配置接口。 这样,多样性接口的元素可以单独绑定。 来自分集接口d的元素e可以通过开关--with-d-e=v绑定到v。A需要接口r可以通过在配置时传递开关--with-r=v绑定到v实现构建级绑定构建级组件的绑定是在配置时通过将绑定以--with--开关的形式传递给各个配置过程来实现的。要求接口绑定到相应连接链末端的模块这些连接端点由 koala 归 一 化 器 合 成 多 样 性 接 口 绑 定 到 Koala 编 译 器 合 成 的 值 如 果requires/diversity接口没有被Koala编译器绑定,它的绑定可以在配置时通过顶层配置接口指定。配置时绑定必须为强制性需求接口定义,否则将引发错误。对于多样性和可选的接口需求,可以省略这种绑定动态分集由于连接链可能由于开关而产生分叉,因此绑定的实现必须通过在配置时评估开关条件来动态执行如果分叉链不能被简化为单个端点,因为开关条件不能被评估,则绑定不能实现并且产生错误。我们通过一组M4宏为GNU Autoconf实现了这种行为这些宏的76M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63宏扩展为函数调用链,这些函数调用链表示Koala绑定的动态约束。例如,对于根据不同接口A配置中的调试字段将接口r3连接到r1或r2的简单switch语句,将生成以下代码(使用宏Kokala_Kokala([A_switch],[expr=$(A_configdebug)],[KOALA__OUT([${expr}],[”yes“],[A_r1])KOALA__OUT([],[],[A_r2])])然后,GNU Autoconf将此代码扩展为以下shell脚本代码,这些代码将成为配置脚本的一部分:A_switch(){ expr=$(A_configdebug)如果test“a${expr}”=“ayes”;则echo$(A_r1 $*)elif test“a”=“a”; thenecho $(A_r2 $*)fi}此片段显示为switch语句生成的函数调用此函数会导致另一个函数调用,根据switch表达式的计算,调用A r1或A r2这演示了如何在配置时动态评估r3的绑定如前所述,构建级组件组合的结果生成的配置脚本形成其配置接口,顶层make文件形成其构建接口。新组件形成组成单元并隐藏其内部结构(即,其内部构建级组件)。7为例在本节中,我们将演示如何根据自身定义Koala编译器(即,作为Koala组件的组合)以及如何通过实际运行编译器来实现这种我们展示了Koala如何根据我们的需求构建组件,如何嵌套组件(重新),),以及如何轻松集成第三方组件。图3描述了Koala编译器的构建级结构。注意,这个构建时结构与图2中描述的运行时结构非常不同。基本上,构建级结构由五个构建块组成:i)用于数据表示和交换的ATflibrary [9], ii)用于解析技术的sdf2组件,iii)用于transfor的GargoXT程序。M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6377图三. Koala编译器的构建级组件结构。mation环境,iv)语言工具包,以及v)Koala编译器本身。有多种方法来组织这些块的结构。我们的示例显示了一个由4个可扩展组件和1个嵌套组件(sdf2)组成的组合。嵌套组件由一个解析器(sglr)、一个解析器生成器(pgen)和几个实用组件(为了提高可读性,我们省略了组件sdf2中的接口绑定)组成由于sglr和pgen通常一起使用,因此它们被放置在同一个组件中。我们故意不导出实用程序组件的接口,因为我们将它们视为实现组件。在其他地方需要它们的罕见情况下,Koala允许创建它们的其他实例。这是一个很好的例子,说明了Koala如何使组件结构化以隐藏组件实现。一旦定义,sdf2组件就可以实例化为单个组件。图3的所有其他组件也都是因此,我们没有将它们放入任何嵌套结构中。给定一组组件定义,我们的Koala编译器可以通过三种方式执行组合:(i) 通过指定一组组件,Koala编译器通过传递查找实现组件的所需接口的组件来合成组合,这是最隐式的形式,因为没有指定封闭的组件集,也没有指定接口绑定。78M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63(ii) 通过显式指定哪些组件应该是组合的一部分,Koala编译器合成了它们之间的在这种形式中,组件集是指定的,但它们之间的绑定不是。(iii) 通过显式指定所有组件及其所有绑定。这是最明确的形式,因为所有成分和绑定都是指定的。对于隐式形式,我们不需要顶层组件定义。相反,我们将一组强制组件传递给Koala编译器,并让编译器合成一个顶级组合。在我们的示例中,我们可以使用以下命令创建这样的组合koala-stc --parser auto-pack-I. -d out -c考拉熊此命令指定必须使用隐式组件组合的自动打包工具输出应该放在'out'中在Koala编译器准备好之后,可以通过在out目录中运行configure和make来配置和构建组合。为了最终从这个组合中创建一个构建级组件,可以发出命令make dist。这将所有组件捆绑到一个单独的归档文件中,该文件已准备好分发。除了Koala编译器之外,图3中描述的所有组件都是第三方(开源)组件。它们已经在不同的研究所开发,它们在不同的编程语言中实现,并且它们正在许多不同的软件系统中使用这些组件的共同点是它们遵循[4]中定义的构建级规则。因此,它们可直接用于构建级组合。8总结发言贡献本文件探讨的问题是,一方面,采用第三方(开放源码)软件的需求日益增长,另一方面,需要对软件进行精细控制,以实现快速可靠的产品开发。大多数情况下,这些都是相互矛盾的需求,因为人们(根据定义)对第三方软件几乎没有控制权,而为了加快产品开发,技术,例如,多元化管理和产品线开发是必需的,这确实需要重大的控制。因此,存在一个潜在的风险,即越来越多地使用第三方软件,而对产品开发过程的控制却越来越少M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)6379或者,反过来说,要求对软件的大量控制限制了使用第三方软件的能力。我们在飞利浦内部观察到了这种趋势,第三方(开源)软件没有与成功的Koala组件模型无缝集成。在本文中,我们描述了一个可能的解决方案,这个问题结合考拉组件模型和构建级组件的概念我们已经证明,通过将Koala组件的组件粒度从单个C文件提升到构建级组件,这两种需求可以统一起来。Koala ADL可用于编排产品组合和管理多样性,构建级组件可以形成第三方组件组合的单元在本文中,我们解释了Koala模块如何形成从架构级别到实现级别的映射,并且它们可以表示任意的组合单元(除了普通的C文件)。然后,我们定义了如何将Koala模块的组合映射到构建级组件的组合接下来,我们用一个新的后端扩展了我们的Koala编译器产品线,以在构建级自动实现组合最后,我们展示了我们的方法如何在实践中使用,通过根据构建级组件的组成来定义相关工作有几种可供选择的成分lanagues考拉。参见例如,很少有技术能够解决第三方(开放源代码)组件的编排组合和多样性问题例如,典型的包管理器,如RPM [1],只处理构建/安装单个包。有两种整合工具,它们结合了多样性、组合和第三方软件。第一个是齿轮[7]。这是一个软件产品线开发工具,它明确支持现有(即,不变)软件。这意味着GEARS可以处理无法控制的软件。第二个系统是Nix部署系统[6,5]。Nix是一个很有前途的安全软件部署工具Understanding是一种函数式语言,提供了高级多样性功能。Nix是为管理开源软件组合的多样性和安全编排而设计的可用性Koala编译器产品线作为开源发布 它可以从http://www.pro下载。o r g/Too ls/Ko al aCo m ile r.80M. de Jonge/Electronic Notes in Theoretical Computer Science 238(2009)63引用[1] Bailey,E. C.的方法, “Maximum RPM,” Red Hat Press,[2] Bravenboer,M.,K. T.卡勒贝格河 Vermaas和E. Visser,Peggo/XT 0.16. 转换系统的组件,在:ACM SIGPLAN 2006部分评估和程序操作研讨会(PEPM'06)(2006),pp。95比99[3] de Jonge , M. , 源 树 组 成 , 在 : C 。 Gacek , editor , Proceedings : Seventh InternationalConference on Software Reuse,LNCS2319(2002),pp. 十七比三十二[4] de Jonge,M.,构建级组件,IEEE软件工程学报31(2005),pp. 588-600[5] Dolstra , E. , M. de Jonge 和 E. Visser , Nix : A safe and policy-free system for softwaredeployment. Damon , editor , 18th Large Installation System Administration Conference(LISA79比92[6] Dolstra,E.,E. Visser和M. de Jonge,Imposing a memory management discipline on softwaredeployment , in : J. Rosenblum , editors , 26th International Conference on SoftwareEngineering(ICSE583[7] 克鲁格角W.,简化向软件大规模定制的过渡,在:E。S.研究所,编辑,第四届产品族工程国际研讨会论文集(PFE-4),毕尔巴鄂,西班牙,2001年,页。265-277。[8] Szyperski , C. , “Component Software: Beyond Object-Oriented Programming,” Addison-Wesley,[9] van den Brand , M. , H. A. de Jong , P.Klint 和 P.A. Olivier , E. C. Annotated terms ,Softw,Pract. Exper30(2000),pp.259-291。[10] van Ommering,R.,“用软件组件构建产品群体”,博士论文,格罗宁根大学(2004年)。[11] van Ommering,R.,F. van der Linden,K. Je Magee和J. Magee,消费电子软件的Koala组件模型,计算机33(2000),pp. 78比85[12] 沃恩湾五、B.埃利斯顿,T.特拉米和我。Taylor,http://sourceware.org/autobook/。