论文部分内容阅读
摘要:讨论了一个源代码自动生成工具的设计思想和实现技术,关键性技术是基于标记语言XML的模板语言。它将被应用到嵌入式组件中去,通过对已有模板的配置来生成源代码。
关键词:模板语言;源代码自动生成;XML
中图分类号:TP311文献标识码:A 文章编号:1009-3044(2007)17-31321-02
Design and Implementation of Auto Code Generation Tool
FU Yu
(Software College, Tongji University, Shanghai 201804,China)
Abstract:It was analyzed the designing idea and technology of an auto code generator tool. Its key technology is template language based on mark language XML. It will be applied into the embedded components and produce the source code through the configuration of the existed Template.
Key words:template language; auto code generation; XML
1 引言
随着软件进入人类社会以来,软件产品需求一直处于增长的状态。面对如此大的软件需求,如何提高软件的生产效率,降低软件开发的周期与成本。便成为软件产业界所关注的焦点。为此业内人士提出了两种解决方案。一是采用更高等级的开发语言来提高开发的效率,二是采用构件和复用技术。而源代码自动生成技术可以说构件和复用技术的核心与基础。
源代码自动生成技术的应用领域相当的广泛,从嵌入式代码的生成到软件工程中UML图的产生都发挥了它重要的作用。在商业领域,在代码自动生成技术上走得最远的恐怕就是微软了。从很久以前,微软的各种开发工具(甚至包括像Office这类非严格意义上的开发工具)就都提供了丰富的代码自动生成功能。这些功能体现在各种各样的开发向导上,如著名的MFC应用程序框架、Visual Basic的“所见即所得”开发环境等等。
本文根据嵌入式方面的实际需求设计并实现了一种基于模板的代码自动生成工具,它将被应用到嵌入式组件中去。该工具是使用基于XML描述的模板,用XML Schema来定义文法,并使用专门的词法分析器来分析模板。
2 系统设计
本工具采用了一种基于模板语言的源代码自动生成技术。它能够通过用户定制或指定的模板来生成个性化的代码。这里所说的模板(Template)是用户想要生成的代码的原型,它代表了代码生成过程中的共性。共性是指在代码生成过程中已经确定的那部分,即不需要进行修改的那部分代码。而与之相对的则是可变性。所谓可变性是指在代码生成过程中需要用户根据自己需要进行配置的那部分代码。整个系统的工作模型如图一所示。具体到工具内部,主要由三个部分组成:模板生成、模板验证解析、代码生成。
图1 源代码生成工具的工作模型
2.1 模板生成
模板生成部分主要完成的功能是将已有的源代码转换成为可以供用户配置的模板。而如何标记原始的代码是实现模板生成部分功能的关键。经过多方面的研究与比较本工具采用了XML语言来标记现有的源代码。XML与HTML不同,HTML只是一种预定义的标记语言,而XML允许用户设计自己的标识,这恰恰适合了程序源代码中变量各不相同且丰富多样的特点。例如,用户可以定义可配置变量并用<var></var>标签标记。同时XML中的标签属性项又可以作为区分不同变量的标识。例如,用户可以用<var varname="A"></var>来表示标记的变量标识是A而用 <var varname="B"><var>来表示标记的变量标识是B。其中,相同变量的关联是在代码标记过程中必需注意的问题。因为,若是不能在标记变量时同时标记下文中存在的相同变量用户很有可能会将相同的变量做了不同的标记。这将导致模板文件的二义性,使得非代码编写者使用模板时出现变量修改不一致的错误。除此之外这也大大的增加了代码编写者的负担。因此,为了能使标记变量时能够同时的标记下文中存在的相同变量,本工具采用了定制的词法分析器对原始的代码进行预分析。当代码生成系统加载原始代码时,词法分析器将自动分析这些代码,将其中的单词元素识别出来,并且存储在一个临时的数组中以备在生成模板时使用。当代码编写者标记一个变量时,代码生成工具在先前那个临时生成的数组中进行扫描,相同的元素将同时被修改。此时程序会同步从数组中再次将元素输出进行及时的更新。同时程序将再次启动一次词法分析器对代码文本进行一次扫描,保证数据的一致性。
为了能够方便地使已标记的原始代码转换成XML的模板文件的形式,本工具采用C#作为编程实现的语言。这是因为C#语言与XML有着非常好的兼容性,兼之.NET系统非常简洁高效。如此一来可以通过C#中已有的XML相关类对模板文件进行转换。
2.2 模板验证解析
模板验证解析部分主要完成的功能是验证导入模板文件的正确性和解析模板文件。模板的解析主要是对XML模板文件进行分析之后再将其以可视化的形式显示。由于C#语言和XML良好的兼容性,可以较方便地运用已有的XML相关类完成。而对于模板的验证是对模板文件的正确性的保证。由于模板文件本身就是XML文件,故可以采用XML的验证方法。目前有2种主要的XML验证方法,一种是DTD,一种是XML Scheme。
XML Schema的作用和DTD类似。但不同的是,Schema文件所描述的是引用它的XML文件中的元素和属性的具体类型。另外,由于它是由XML编写的,Schema和DTD相比较还有以下优点:
?XML Schema内容模型是开放的,可以随意扩充,而DTD无法解析扩充的内容。
?DTD只能把内容类型定义为一个字符串,而XML Schema允许把内容类型定义为整型、浮点型、布尔型或者许多其它的简单数据类型。
?XML Schema利用Namespaces将文档中特殊的节点与Schema相联系,一个XML文件可以有多个对应的Schema,而一个XML文件只能有一个DTD。
因此,本工具采用XML Schema 对导入的模板进行正确性的验证。Schema 是一种描述信息结构的模型,一般定义某种对象的类别特征,或者说是类型。所以根据先前所定义的用于标记模板的XML标签,编写了一个验证这些XML标签的XML Schema文件并且在生成XML模板时自动将模板文件和这个XML Schema验证文件进行关联。当导入模板时,XML Schema 文件将对模板的正确性验证,当出现错误时程序会将检查到的错误输出,错误的模板将不会导入到系统。以下给出本工具中最基本的XML Schema定义:
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="template">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="exp" maxOccurs="unbounded">
<xsd:complexType mixed="true">
<xsd:sequence></xsd:sequence>
<xsd:attribute name="varname" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
2.3 代码生成
代码生成部分主要完成的功能是将用户配置后的模板文件转化成为源代码。在工具将模板转换成为源代码之前用户需要对XML模板文件进行配置,考虑到简洁性和易用性,本工具采用了图形化的界面来配置模板。XML与C#中的Treeview树型控件有着非常好的兼容性,因此使用Treeview控件和导入的XML模板进行绑定。利用C#中已有的XML相关类进行对模板的分析,并且将分析的结果通过Treeview控件显示成树型的结构。其中可以修改的变量将显示成为树型结构中的一个节点。对于用户来说模板文件和具体代码是不可见的。他所看到的只是可以配置的变量。将配置后的模板转化为源代码的过程实质上是模板生成的逆过程,通过对模板文件的解析和提取就可以得到需要的源代码。
3 示例
源代码生成主要由模板生成和代码生成2个步骤。以下给出一个实际的示例。
3.1 模板生成
<?xml version="1.0"?>
<template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="checkxml.xsd">
using System;
namespace <exp varname="Namespacename">CodeBuilding</exp>
{
public class <exp varname="Classname">Class1</exp>
{
public <exp varname="Classname">Class1</exp>()
{
//
// TODO:
//
}
}
}
</template>
3.2代码生成
using System;
namespace CodeBuilding
{
public class Test
{
public Test()
{
//
// TODO:
//
}
}
}
4 结束语
文中论述了一个W i n d o w s 平台上的源代码自动生成工具的设计和实现,它的功能强大,使用方便,效率高,既具有一定的先进性又具有很好的实用性。其适用于各种嵌入式组件,可以极大的减少重复代码的编写,提高开发人员的效率。
参考文献:
[1]Stephen J.Mellor, Kendall Scott.MDA Distilled:Principles of Model-Driven Architecture [M].USA:Addison Wesley,2004:9-23.
[2]Jack Herrington. Code Generation in Action [M]. USA:Manning Publications Company, 2003:16-20.
[3]胡海静,王育平.XMl技术精萃[M].北京:机械工业出版社,2002:50-53.
[4]Mark Birbect .XML 高级编程[M].北京:机械工业出版社,2002:22-27.
[5]Dinar Dalvi,Joe Gray..NET XML高级编程[M].北京:清华大学出版社,2002:63-86.
[6]唐大仕.C#程序设计教程[M].北京:清华大学出版社,2001:35-52.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
关键词:模板语言;源代码自动生成;XML
中图分类号:TP311文献标识码:A 文章编号:1009-3044(2007)17-31321-02
Design and Implementation of Auto Code Generation Tool
FU Yu
(Software College, Tongji University, Shanghai 201804,China)
Abstract:It was analyzed the designing idea and technology of an auto code generator tool. Its key technology is template language based on mark language XML. It will be applied into the embedded components and produce the source code through the configuration of the existed Template.
Key words:template language; auto code generation; XML
1 引言
随着软件进入人类社会以来,软件产品需求一直处于增长的状态。面对如此大的软件需求,如何提高软件的生产效率,降低软件开发的周期与成本。便成为软件产业界所关注的焦点。为此业内人士提出了两种解决方案。一是采用更高等级的开发语言来提高开发的效率,二是采用构件和复用技术。而源代码自动生成技术可以说构件和复用技术的核心与基础。
源代码自动生成技术的应用领域相当的广泛,从嵌入式代码的生成到软件工程中UML图的产生都发挥了它重要的作用。在商业领域,在代码自动生成技术上走得最远的恐怕就是微软了。从很久以前,微软的各种开发工具(甚至包括像Office这类非严格意义上的开发工具)就都提供了丰富的代码自动生成功能。这些功能体现在各种各样的开发向导上,如著名的MFC应用程序框架、Visual Basic的“所见即所得”开发环境等等。
本文根据嵌入式方面的实际需求设计并实现了一种基于模板的代码自动生成工具,它将被应用到嵌入式组件中去。该工具是使用基于XML描述的模板,用XML Schema来定义文法,并使用专门的词法分析器来分析模板。
2 系统设计
本工具采用了一种基于模板语言的源代码自动生成技术。它能够通过用户定制或指定的模板来生成个性化的代码。这里所说的模板(Template)是用户想要生成的代码的原型,它代表了代码生成过程中的共性。共性是指在代码生成过程中已经确定的那部分,即不需要进行修改的那部分代码。而与之相对的则是可变性。所谓可变性是指在代码生成过程中需要用户根据自己需要进行配置的那部分代码。整个系统的工作模型如图一所示。具体到工具内部,主要由三个部分组成:模板生成、模板验证解析、代码生成。
图1 源代码生成工具的工作模型
2.1 模板生成
模板生成部分主要完成的功能是将已有的源代码转换成为可以供用户配置的模板。而如何标记原始的代码是实现模板生成部分功能的关键。经过多方面的研究与比较本工具采用了XML语言来标记现有的源代码。XML与HTML不同,HTML只是一种预定义的标记语言,而XML允许用户设计自己的标识,这恰恰适合了程序源代码中变量各不相同且丰富多样的特点。例如,用户可以定义可配置变量并用<var></var>标签标记。同时XML中的标签属性项又可以作为区分不同变量的标识。例如,用户可以用<var varname="A"></var>来表示标记的变量标识是A而用 <var varname="B"><var>来表示标记的变量标识是B。其中,相同变量的关联是在代码标记过程中必需注意的问题。因为,若是不能在标记变量时同时标记下文中存在的相同变量用户很有可能会将相同的变量做了不同的标记。这将导致模板文件的二义性,使得非代码编写者使用模板时出现变量修改不一致的错误。除此之外这也大大的增加了代码编写者的负担。因此,为了能使标记变量时能够同时的标记下文中存在的相同变量,本工具采用了定制的词法分析器对原始的代码进行预分析。当代码生成系统加载原始代码时,词法分析器将自动分析这些代码,将其中的单词元素识别出来,并且存储在一个临时的数组中以备在生成模板时使用。当代码编写者标记一个变量时,代码生成工具在先前那个临时生成的数组中进行扫描,相同的元素将同时被修改。此时程序会同步从数组中再次将元素输出进行及时的更新。同时程序将再次启动一次词法分析器对代码文本进行一次扫描,保证数据的一致性。
为了能够方便地使已标记的原始代码转换成XML的模板文件的形式,本工具采用C#作为编程实现的语言。这是因为C#语言与XML有着非常好的兼容性,兼之.NET系统非常简洁高效。如此一来可以通过C#中已有的XML相关类对模板文件进行转换。
2.2 模板验证解析
模板验证解析部分主要完成的功能是验证导入模板文件的正确性和解析模板文件。模板的解析主要是对XML模板文件进行分析之后再将其以可视化的形式显示。由于C#语言和XML良好的兼容性,可以较方便地运用已有的XML相关类完成。而对于模板的验证是对模板文件的正确性的保证。由于模板文件本身就是XML文件,故可以采用XML的验证方法。目前有2种主要的XML验证方法,一种是DTD,一种是XML Scheme。
XML Schema的作用和DTD类似。但不同的是,Schema文件所描述的是引用它的XML文件中的元素和属性的具体类型。另外,由于它是由XML编写的,Schema和DTD相比较还有以下优点:
?XML Schema内容模型是开放的,可以随意扩充,而DTD无法解析扩充的内容。
?DTD只能把内容类型定义为一个字符串,而XML Schema允许把内容类型定义为整型、浮点型、布尔型或者许多其它的简单数据类型。
?XML Schema利用Namespaces将文档中特殊的节点与Schema相联系,一个XML文件可以有多个对应的Schema,而一个XML文件只能有一个DTD。
因此,本工具采用XML Schema 对导入的模板进行正确性的验证。Schema 是一种描述信息结构的模型,一般定义某种对象的类别特征,或者说是类型。所以根据先前所定义的用于标记模板的XML标签,编写了一个验证这些XML标签的XML Schema文件并且在生成XML模板时自动将模板文件和这个XML Schema验证文件进行关联。当导入模板时,XML Schema 文件将对模板的正确性验证,当出现错误时程序会将检查到的错误输出,错误的模板将不会导入到系统。以下给出本工具中最基本的XML Schema定义:
<?xml version="1.0" ?>
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<xsd:element name="template">
<xsd:complexType mixed="true">
<xsd:sequence>
<xsd:element name="exp" maxOccurs="unbounded">
<xsd:complexType mixed="true">
<xsd:sequence></xsd:sequence>
<xsd:attribute name="varname" type="xsd:string" use="required" />
</xsd:complexType>
</xsd:element>
</xsd:sequence>
</xsd:complexType>
</xsd:element>
</xsd:schema>
2.3 代码生成
代码生成部分主要完成的功能是将用户配置后的模板文件转化成为源代码。在工具将模板转换成为源代码之前用户需要对XML模板文件进行配置,考虑到简洁性和易用性,本工具采用了图形化的界面来配置模板。XML与C#中的Treeview树型控件有着非常好的兼容性,因此使用Treeview控件和导入的XML模板进行绑定。利用C#中已有的XML相关类进行对模板的分析,并且将分析的结果通过Treeview控件显示成树型的结构。其中可以修改的变量将显示成为树型结构中的一个节点。对于用户来说模板文件和具体代码是不可见的。他所看到的只是可以配置的变量。将配置后的模板转化为源代码的过程实质上是模板生成的逆过程,通过对模板文件的解析和提取就可以得到需要的源代码。
3 示例
源代码生成主要由模板生成和代码生成2个步骤。以下给出一个实际的示例。
3.1 模板生成
<?xml version="1.0"?>
<template xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="checkxml.xsd">
using System;
namespace <exp varname="Namespacename">CodeBuilding</exp>
{
public class <exp varname="Classname">Class1</exp>
{
public <exp varname="Classname">Class1</exp>()
{
//
// TODO:
//
}
}
}
</template>
3.2代码生成
using System;
namespace CodeBuilding
{
public class Test
{
public Test()
{
//
// TODO:
//
}
}
}
4 结束语
文中论述了一个W i n d o w s 平台上的源代码自动生成工具的设计和实现,它的功能强大,使用方便,效率高,既具有一定的先进性又具有很好的实用性。其适用于各种嵌入式组件,可以极大的减少重复代码的编写,提高开发人员的效率。
参考文献:
[1]Stephen J.Mellor, Kendall Scott.MDA Distilled:Principles of Model-Driven Architecture [M].USA:Addison Wesley,2004:9-23.
[2]Jack Herrington. Code Generation in Action [M]. USA:Manning Publications Company, 2003:16-20.
[3]胡海静,王育平.XMl技术精萃[M].北京:机械工业出版社,2002:50-53.
[4]Mark Birbect .XML 高级编程[M].北京:机械工业出版社,2002:22-27.
[5]Dinar Dalvi,Joe Gray..NET XML高级编程[M].北京:清华大学出版社,2002:63-86.
[6]唐大仕.C#程序设计教程[M].北京:清华大学出版社,2001:35-52.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。