基于语法重构的代码级构件组装方法
技术领域
本发明涉及软件工程技术领域,尤其是指软件开发中基于语法重构的代码级构件组装方法。
背景技术
构件是指具有相对独立功能和可复用的软件模块,它使得软件开发人员在开发新系统时能够充分利用过去的经验和功能模块,而不必重复“制造轮子”,从而避免了软件开发中的重复劳动。随着CBSE(Component-Based Software Engineering,基于构件的软件工程)成为一种重要的中间件技术以来,在金融、教育、电子商务、电子政务、医疗卫生等应用领域中得到了大量应用,为提高软件利用程度和软件开发的效率发挥了很好的作用。
作为基于构件的软件开发的核心技术,构件组装技术的研究已得到了广泛开展。构件组装方法一般分为“黑盒”、“白盒”、“灰盒”三种,其中“灰盒”组装方法-直备受关注。其研究重点主要集中在基于框架的方法、基于连接子的方法和基于胶合代码的方法等,本发明提出的基于语法重构的代码级构件组装方法与其中的胶合代码的方法相近。
在软件开发过程中,选择使用哪种程序语言往往是依据领域需求而定。例如,在流程处理较为明显的软件系统中,通常使用面向过程的语言(如C,Pascal,COBOL等)来编程,而在信息处理较为常见的软件系统中,则多数采用面向对象的语言(如C++,Java等)。程序语言的分类不只这两种,但目前存在的大多数程序语言普遍都有一个缺陷,那就是不支持代码的构件化和组装,而这将大大阻碍代码片断的复用。而今,许多粗粒度构件的复用已经得到了大量的研究,而程序语言缺乏内建的可重用和可组装机制这一缺憾,无疑阻碍了针对细粒度的代码级构件的复用研究。
发明内容
为解决以上问题,本发明提出了一种灵活,开放,且独立于各类语言的基于语法重构的代码级构件组装方法。
一种基于语法重构的代码级构件组装方法,包括如下步骤:
1)将程序语言的语法规范进行扩展,建立使该语言可构件化、可组装化的新语法规范,其中,所述将程序语言的语法规范进行扩展为在任一个语法项目下添加语法子项,作为组装时的插槽;
2)对依据所述新语法规范创建的代码级构件进行组装。
进一步的,所述步骤1)具体包括以下步骤:
(1)从程序语言的语法规范中分离出抽象语法和具体语法;
(2)在任一个语法项目添加可用来作为之后构件组装时的插入口的新的语法子项,成为新的语法项目,并针对新的语法项目,分别编写其抽象语法与具体语法;
(3)根据扩展后的语法规范,创建其语法识别及分析器,
其中,所述抽象语法是对语法树的层次和语法节点间的关联关系进行描述;所述具体语法是编译器可用的语法规则。
进一步的,所述步骤2)具体包括以下步骤:
①建立符合所述新语法规范的代码级构件;
②进行图形化的构件组装,以组装节点的形式展示构件,以连接线的形式展示组装过程;
③在组装脚本的执行阶段中针对相应的组装图形,后台自动生成组装脚本。更进一步的,所述步骤②中图形化的构件组装,包括各个构件的关联和对各个构件类型进行匹配验证。
本发明提出了一种在现有的程序语言中添加可构件化以及可复用性的方法,对程序语言的固有语法进行拓展,从而能够依据此新语法,创建并组装代码级构件,增加代码片断的可重用性,快速生成新的程序。首先对程序语言的语法模型进行扩展,建立一套促进该语言可构件化、可组装化的新语法规范,进而对依据新语法规范创建的代码级构件进行组装,保证代码级构件的可复用性。
本发明的方法,同一个构件在不同应用中复用时,只要拥有相同的程序语言拓展基础,就能方便地起到构件复用的效果;在保持组装图形不修改的情况下,只要构件名称和类型未经改动,其他构件内的变更都可实时反映到组装结果中,这对于程序的开发、集成、演化具有十分重大的意义。本发明具有语言独立的优点,可用于各类领域中的软件复用。结合领域构件库,可支持不同应用领域的业务流程集成、复用,以及面向用户的个性化服务的定制和集成。
附图说明
图1为本发明所述的组装方法整体方案图
图2为本发明一实施例的组装过程示意图
具体实施方式
以下结合附图和具体实例对本发明进行详细说明。
一种基于语法重构的代码级构件组装方法,如图1,包括两大步骤,一是对程序语言的语法进行抽象和拓展,二是通过语法重构的方式对代码级构件进行组装。其中,前者是后者得以成功进行的基础,后者则体现了前者的功用。
由于本方法具有语言独立的优点,在本实例中,我们暂以流行的Java语言为例,将其语法进行拓展后,针对Java语言的代码级构件实现组装。
接下来,依序对本实例的各个步骤进行说明。
Java语言语法拓展部分:
步骤一、抽象出Java语言的语法规范,分别列出其抽象语法与具体语法。
由于Java语言的语法结构相当庞大,本例中仅抽取其中较为简单的语法片断为例子,对其进行拓展。以类的成员变量声明语法片断为例,我们抽取出其相对应的抽象语法和具体语法分别如下:
如上是成员变量声明(AttributeDeclaration)的抽象语法,其中Modifier类型是一个语法终结符,即各类修饰符,如public,private,protected,final,static等;Identifier是一般字符串类型。
如上是以EBNF规范表达的具体语法,以正则表达式的方式确定了AttributeDeclaration的具体书写规范。
步骤二、针对AttributeDeclaration这一节点,我们对其进行扩展。首先在其下增加一个新的语法子项AttributeSlot,作为组装时的插槽,并为之编写相应的抽象和具体语法。
如上是AttributeSlot的抽象语法,表明AttributeSlot同时继承自Java语法(先前定义的Java语法)中的AttributeDeclaration属性以及一个Slot属性(本方法已内建了Slot语法的定义)。
如上是AttributeSlot的具体语法,要求其在代码中书写为“《name:type》”形式。
步骤三、从拓展后的语法生成相应的语言解析器,此步骤可通过一些编译器框架实现。
在本例中我们采用了ANTLR框架实现。
Java代码级构件组装部分:
步骤四、创建符合新的Java语法规范的代码构件。在语法完备的情况下,所有的Java文件应该都可以作为新规范的代码级构件。但根据组装的需要,我们在Java构件中添加了相应的Slot语法,作为组装时的插槽,如下即是一个相对简单的Java构件片断,用作组装时的宿主构件:
其中,《myAttribute:java.AttributeDeclaration》句便是符合AttributeSlot规范的一个组装插槽定义,并且规定了可插入此处的代码必须符合AttributeDeclaration语法规范。
接下来,准备一个符合AttributeDeclaration规范的代码片断,如下所示:
步骤五、对两个代码级构件进行组装。根据本发明,可以设计出多种不同的组装方法,从最基本的插入组装,到可依据用户需求定制的其他组装(抽取、声明、调用等)均可实现。以下我们介绍最基本的插入组装,此类组装要求将一个代码级构件插入到一个指定类型的Slot中(即前者的代码类型与后者Slot中指定的类型相同)。
出于用户操作便利性的考虑,本发明中提供了图形化的组装方式,以组装节点的形式展示构件,以连接线的形式展示组装过程。
如图2所示,从代码级构件Engine指向Car构件中的MyAttribute这个Slot,即构成了我们的插入组装,并且将组装后的Car输出到一个NewCar文件中。
第六步、针对相应的组装图形,后台自动生成组装脚本,脚本的内容是依照组装图形自动转换的。如上图中,相应的组装脚本如下:
执行组装脚本后,即进行组装,最终的组装结果如下: