一种基于模型和模板融合的自动代码生成方法

2019-11-20 08:37华庆一舒新峰
现代电子技术 2019年22期
关键词:代码生成引擎代码

王 博 ,华庆一,舒新峰

(1.西安邮电大学 计算机学院,陕西 西安 710121;2.西安邮电大学 陕西省网络数据智能处理重点实验室,陕西 西安 710121;3.西北大学 信息科学与技术学院,陕西 西安 710127)

0 引 言

随着信息产业的不断深入发展,应用软件需求和开发环境变得越来越复杂。传统软件开发方法开发周期漫长且工作重复较大,为系统演进和维护造成较大困难[1]。与此同时,新软件开发方法和思想以及工具,导致软件工程方法论发生深刻变化,尤其是以对象管理组织(Object Management Group,OMG)提出的模型驱动构架(Model Driven Architecture,MDA)为代表的方法论。在David S.Frankel 的《应用MDA》一书中指出:“把宝贵的时间浪费在‘纸上谈兵’上是一种罪恶。”[2]如果能够把设计直接转换成代码,亦即把设计和实现对应起来,那么无论对于代码质量和效率都会有较高提升。

自动代码生成,即根据用户任务需求建模而自动生成源代码的程序或软件。本文所特指自动代码生成技术是在软件开发过程中由经验而形成的一种软件工程技术,通过自动生成工具或者程序半自动/全自动的生成应用系统所用到的原始框架和代码,一般生成文本形式的源代码[3]。自动代码生成主要的优点和意义在于:减少重复的编码工作,生成代码风格一致良好,系统设计成为开发的主导,易于修改和升级,设计和实现具有连贯性。

本文提出一种采用模型驱动构架的设计思想,灵活配置的、融合模板和模型驱动的自动代码生成方案,称之为混合自动代码生成(Hybrid Automatic Code Generation,HACG)。HACG 自动代码生成方法的创新点如下:

1)HACG 融合基于模板和模型驱动的代码生成的优点,可以简单高效地构建自动代码生成引擎;

2)HACG 提出针对不同语言、不同框架的统一的自动代码生成解决方案;

3)HACG 针对元模型的不同实体关系模型的自动代码生成方案和策略;

4)HACG 具有较高的灵活性、通用性、完整性和可扩充的特点;

5)HACG 对自动代码生成提出一种新的划分,分为基础功能容器、全自动代码生成、代码框架生成和定制代码。

1 基于模板和模型的自动代码生成

当前主要的代码生成主要有基于模板、基于模型驱动、基于对象关系映射、基于文档注释和基于代理的自动代码生成[4]。与HACG 较为相关的是基于模板和基于模型驱动的自动代码生成,下面主要从上述两种方法展开。

1.1 基于模板的自动代码生成技术

基于模板的代码生成(Template-Based Code Generation,TBCG)起源于 20世纪 90年代中期,模板的重用是基于“编写一次,生成多次(Write Once,Produce Many)”的理念[3]。基于模板的代码生成是利用系统共性的需求(模板)和个性的需求(特定的外部输入),通过代码生成引擎来生成系统源代码的方法。基于模板的代码生成较为困难的问题是明确区分输入和转化逻辑,亦即将元数据和具体业务规则进行分离,通过使用模板引擎技术,可将业务规则抽象到模板文件中,将元数据作为动态插入数据[5]。分层技术是基于模板的自动代码生成核心技术之一。

分层技术在当前的软件开发中被广泛的使用。在软件开发过程当中,把具有不同过程的解决方案放置到不同的概念层,随后整个层次形成不够封闭的系统,其中每个层次在级别上具有平等性[6]。 层与层之间通过层接口进行数据交互。分层的优点在于提高系统的灵活性和可复用性,能够提高软件开发的效率。

定义1(分层结构) 约定n层构架的各层编号为1,2,…,n,其中,层的编号越大,则越处于系统的高层。那么分层构架应该满足如下规则:

1)第k层(1<k≤n)层智能依赖于k-1 层,而不能依赖于其他低层;

2)如果p层依赖于q层,则p的编号大于q。

该原则保证层依赖的单向性,减少和降低系统逻辑的复杂性,使得系统在提高功能和可复用性前提下易于控制。

定义2(分层对象模型) 将基于分层体系的对象模型分成数据实体对象、持久层对象和业务逻辑层对象,每层的对象可以表示为一个n元组。

1)数据实体对象 MO=(mo_id,mo_name,attr_set,op_attr)。其中:mo_id,mo_name 分别对应模型实体对象MO 的唯一的标识和名称;attr_set 代表该实体的属性集;op_attr 代表对该属性的操作,一般对应该实体的可读和可写算子。

2)持久层对象 PO=(po_id,po_name,mo,dll_set)。其中:po_id,po_name 分别对应持久层对象PO 的唯一的标识和名称;mo 为持久层关联的模型层实体对象和实体对象集合;dll_set 为持久层对应的操作集合,如添加、删除、修改、查询、分页和排序等操作。

3) 业 务 逻 辑 层 对 象 BO=(bo_id,bo_name,mo,bll_set)。其中:bo_id,bo_name 分别对应业务逻辑层 BO的唯一的标识和名称;mo 为持久层关联的模型层实体对象和实体对象集合;bll_set 为业务逻辑层对应的操作集合,如登录、注册、审核等业务逻辑层的功能。

由于模板文件基于文本易于定制和调整,结合成熟的模板语言可使代码生成过程更具灵活性,故其在中小企业中应用较为广泛[7]。在自动代码生成方案中,模板、元数据和业务规则三个元素是必要的[8]。基于模板的代码生成过程见图1,图1a)描述基于模板的自动代码生成过程,图1b)说明基于模板的自动代码生成的各个组成部分。

基于模板的自动代码生成的过程如下:首先对用户需求进行分析,进行初步的分析和设计,在实现阶段制定要采用的框架和何种分层结构,根据功能需求,设计相应的模板文件,并根据设计模型或元数据模型,使用代码生成引擎去生成程序的源代码。对生成的基础源代码进行代码调整和特定代码的添加,调试之后将代码部署到基础平台和框架中。

1.2 基于模型驱动的自动代码生成

模型驱动构架的出现使得解决传统软件的开发问题并且以工厂化开发软件成为可能。模型驱动构架支持基于可视化模型驱动的软件设计、内容存储与交换,是一种基于模型的软件开发构架[2]。其最终目标是把针对特定计算平台的编码工作交由机器完成,从此将业务逻辑与实现技术结合,很大程度地提升软件开发效率和质量,降低开发成本,延长软件寿命,并实现工厂化开发软件。

图1 基于模板的代码生成过程Fig.1 Process of code generation based on template

1.2.1 模型层次结构

模型驱动构架中的模型组织分成四层结构[2],依次为 M0,M1,M2,M3。M3 是元-元模型,元对象机制(Meta Object Facility,MOF)位于该层。MOF 提供定义 M2层元模型所需要的更抽象一级的建模支持。MOF 是M2层所有元模型的元模型,同时它也是自描述的,即MOF可以描述MOF 元模型本身。在MDA 框架中,M3 层只有MOF 这一个模型,它是MDA 中基础和核心的标准,为MDA 框架中的所有模型/元模型提供统一的语言基础,为模型语言(元模型)定义提供公共标准。M2 层为元模型,代表建议MOF 之上的各种模型语言,提供对应不同领域的领域建模语言,为M1 层的建模提供建模符号。M1 层为模型层,是建模人员通常面对的模型,即采用模型语言为企业应用建立的模型描述。MDA 的CIM,PIM和PSM 模型都位于该层,M0 层为实例层,是M1 层模型的实例化,对应模型的具体应用程序,是模型描述的最终目标。MDA 四层元模型体系结构如图2所示。

1.2.2 MDA 应用模型

MDA 应用模型包括计算无关模型(Computation Independent Model,CIM),平台无关模型(Platform Independent Model,PIM)和平台特定模型(Platform Specific Model,PSM)。它们与实例模型中的实现特定模型(Implementation Specific Model,ISM)关系如图3所示。

图2 MDA 四层元模型体系Fig.2 Architecture of meta-model of MDA four tier

图3 应用模型之间的转换Fig.3 Transformation relation among applied models

CIM 计算无关模型用于描述系统需求、功能、行为和运行环境,也称为业务模型。PIM 平台无关模型是抽出的业务逻辑,不包括与实现平台的技术相关的特定信息。PSM 平台特定模型,从相应的PIM 转换而来。 ISM 实现特定模型是PSM 的实例化,包括PSM 用于构建一个系统并使之运行的所有信息,如程序代码、装载规格、部署说明以及配置规范等,是一个可以实际运行的软件系统[2]。

1.2.3 基于模型驱动的自动代码生成过程

基于模型驱动的自动代码生成的过程如下:首先根据用户的需求编写PIM,再根据PIM 和目标平台编写转换规则,MDA 代码生成引擎根据转换规则自动将PIM转化成PSM,最后将PSM 转换成代码[9]。MDA 通过两次模型转换和代码生成技术提高软件开发的效率,并使得系统具有较好的可一致性和可复用性。基于模型驱动的代码生成过程见图4。图4a)是模型驱动工程(Model Driven Engineering,MDE)的总体说明,图4b)是源模型到目标模型的模型转换过程,图4c)描述基于模型驱动的自动代码生成过程。

2 混合自动代码生成HACG

2.1 混合自动代码生成的基本思想

基于模板的自动代码生成具有较高的灵活性,定制和开发较为容易,可提高软件开发的可复用度;但也有其缺点,模板化的程序可读性差,生成的代码依赖于某种语言和框架,移植性差。在其他类似项目中使用,如果不同框架或语言,需要重新构建自动代码生成引擎。

图4 基于模型驱动的代码生成过程Fig.4 Process of code generation driven by model

MDA 相比于传统的软件开发方式和基于模板的自动代码生成方式,具有开发效率高、可维护性、可扩展性强的特点,系统具有良好的可移植性[10]。MDA 也存在一些缺点:虽然MDA 的目标远大,但实现MDA 的技术模糊,基础规范MOF 和UML 都存在着语义不精确、语言不可执行的问题;PIM 到PSM 的转换同样也存在不精确的问题。

基于模板的自动代码生成和基于模型的自动代码生成两者各有其优点和缺点,前者更注重于时效性,后者更注重于通用性,两者之间有一道鸿沟。基于模板的代码生成可以认为更关注类似PSM 到代码的生成,基于模型的自动代码生成更关注于模型的转换和平台无关模型到平台相关模型之间的转化。因此,可以在两者之间架起一座桥梁,融合现有的基于模板的技术和基于模型的代码生成基础。因此产生本文提出的基于模型驱动和模板的混合自动代码生成方法。

前面对两种自动代码生成的优缺点进行分析,综合基于模型和模板的自动代码生成的方式,本文提出一种基于模板和模型的混合自动代码生成方案。该方法可以根据现有的设计模型或者遗产系统,生成不同框架和语言下的软件系统代码。该方案从不同的设计模型开始,如统一建模语言(Unified Modeling Language,UML)、概念数据模型(Concept Data Model,CDM)和 XML 等设计模型,将这些设计模型转化成统一的平台无关的设计模型,通过模型转换变成平台相关模型。结合通过模板编辑器生成的基础模板、界面模板和扩展模板,通过代码和引擎生成选定目标语言下的源代码,最终将生成的源码部署到不同容器和系统基础框架中。在模板编辑器中的界面生成器,可以根据用户要求,快速可视化地生成视图层代码,云代码仓库存储大量的子模板和工具。可用性测试用来评估反馈生成代码的优劣,对自动代码生成引擎进行评估,以期发现代码生成引擎的缺陷。在框图中的底端是底层的技术框架支持,HACG 的代码生成方案适合于不同的底层框架,如工作流、Web服务、面向服务构架(Service Oriented Architecture,SOA)等技术框架。总体框图如图5所示。

图5 基于模型和模板融合的自动代码生成方法Fig.5 Method of automatic code generation based on fusion of model and template

2.2 HACG的分析与设计

根据混合自动代码生成的基本思想,下面给出一种混合自动代码设计和实现过程,最后给出采用该方案的自动代码生成器实现的原型系统。该原型系统的主要功能如下:

1)代码生成。代码生成是整个软件的核心,负责将元数据与模板文件结合进行代码生成,主要包含代码生成、模型保存等功能。

2)元数据管理。文件模板主要包含对MetaModel、UML 文件、CDM 文件或者其他格式的数据的解析和存储功能。

3)逆向生成。主要功能是将数据库中的表信息映射为元数据信息,然后进行代码生成,包含两个功能:建立连接以及逆向生成。

4)代码弹性部署。此功能为将生成的代码部署到容器和基础框架中,主要功能有执行SQL、部署单表、部署树形表、部署主表和明细表以及备份原有代码。

5)模板管理。主要功能是创建或者编辑模板文件。

混合自动代码生成引擎通过对生成系统中的基本元数据进行解析,并结合特定语言和框架的模板文件,生成框架和平台相关的代码。其中,模板文件是目标代码的原型,元数据的通信和逻辑基本框架都在模板文件中体现。模板文件可通过模板编辑器以及用户定义规则来生成平台相关模板。系统总体功能结构图见图6。

图6 HACG 功能结构图Fig.6 Function structure diagram of HACG

2.3 HACG引擎和代码生成

HACG 自动代码生成和配置部署过程包含任务分析和需求建模、模板建立、元数据创建、代码生成和弹性部署。首先,用户在进行详细的任务分析和需求建模之后,产生平台无关的元模型数据,根据实际项目需要,将该元数据模型转化成平台相关的数据模型,比如相关于语言和框架等,然后使用自动代码生成引擎生成对应不同实体关系模型的基础源代码,选择对生成的源代码进行部署,可以采用一键部署、手工部署和局部部署等方案。如果需要对生成代码做局部修改,可以进行完善和修改,不过生成代码已经完全可以满足基础框架运行的条件。经过调试部署以及配置,即可实施运行。图7是HACG 自动代码生成详细的流程。

代码生成引擎的工作过程如下:

输入:静态设计模型半形式化描述;

输出:系统可部署源码;

程序:

Begin:

1)初始化代码生成引擎CodeGenerator、MetaData 读写器和模板读写器;

2)选择静态设计视图半形式化描述模型或遗产系统数据库;使用ModelTransformer 转化成统一标准的平台无关语言MetaModel;

3)将生成的MetaModel 转换成平台相关模型SpecificModel;

4)根据选定的语言和框架读取相应的模板;

5)使用自动代码生成引擎CodeGenerator 对SpecificModel 实体和模板进行代码生成,生成的文件包含实体层、持久层、业务逻辑层和展示层;

6)根据选定的关系数据库类型生成相应的SQL 文件;

7)将生成的SQL 文件再进行生成,并根据用户需求将生成的代码弹性部署到基础框架中。

图7 HACG 代码生成流程Fig.7 Flow chart of code generation of HACG

2.4 生成部署配置

将通过代码生成引擎生成的代码部署到基础框架中,这个基础框架是独立的、可运行的Web 框架,主要包含必要的基础功能,如用户管理、权限管理、功能管理、数据字典等[11]。如图8所示,配置生成功能所在的上级菜单、名称、序号和链接位置,就可以在后台系统中通过菜单进行访问管理。图8a)是基于JavaFX 胖客户端CS 结构的HACG 自动代码生成主界面;图8b)是基础功能中的角色权限管理的功能展示;图8c)是对生成代码快速部署之后的配置界面。

3 结 语

本文对两种主流自动代码生成技术进行分析,综合基于模板和模型驱动的代码生成的优点,提出一种融合两种自动代码生成技术的通用的针对不同语言和不同框架的自动代码生成方法——HACG。从实际使用效果来看(软件著作权:基于模型驱动的弹性自动代码生成系统(02646104),登记号:2018SR402480),该方法结构清晰,易于构建自动代码生成引擎,提高了代码的生成率,减少了代码出错率,较大地缩短项目开发工期。

图8 HACG 代码生成器主界面及其基础功能管理界面、功能部署和配置Fig.8 Main interface of the HACG code generator and its basic function management,function deployment and configuration

本文所提供的原型对有效性和生成系统的可用性测试尚不充分,对于特定需求的以用户为中心的高可用性的界面生成考虑不足,在后续的研究中将继续加强生成系统的评估反馈。自动代码生成技术尚在不断发展中,随着人工智能的发展和对程序逻辑的机器学习能力加强,将能够自动生成更加复杂安全的系统代码。

猜你喜欢
代码生成引擎代码
Lustre语言可信代码生成器研究进展
创世代码
创世代码
创世代码
创世代码
蓝谷: “涉蓝”新引擎
代码生成技术在软件开发中的应用
基于XML的代码自动生成工具
无形的引擎
基于Cocos2d引擎的PuzzleGame开发