开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题

上传人:M****1 文档编号:498700929 上传时间:2023-11-27 格式:DOCX 页数:25 大小:229.83KB
返回 下载 相关 举报
开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题_第1页
第1页 / 共25页
开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题_第2页
第2页 / 共25页
开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题_第3页
第3页 / 共25页
开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题_第4页
第4页 / 共25页
开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题》由会员分享,可在线阅读,更多相关《开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题(25页珍藏版)》请在金锄头文库上搜索。

1、开源EGL语言开发工具EGLDevelopmentTools,第4部分EGL高级话题开源EGL语言开发工具EGLDevelopmentTools,第4部分:EGL高级话题1. EDT的可扩展性简介EGL作为一门编程语言,它的编译过程遵循一般语言的编译过程:源程序通过编译器生成中间模型(IRModel,IntermediateRepresentationModel),IR模型通过代码生成器被转换成目标代码。EDT中EGL源文件转换成目标语言的过程如下图所示:图1.EGL编译过程:|rw亡泅+支百营,聃。口匚十+覃匚。Antirsm口。叫门呻查看大图。这里IR模型之前的工作通常称为前端编译,模型之

2、后的代码生成工作通常称为后端编译。本文将首先介绍通过扩展后端编译来改变EGL语言的行为或者增加新的运行平台和目标语言,然后将介绍如何扩展前端使新的语言概念能够被编译到模型中。所有的扩展都能够以EclipsePlugin的形式方便的增加到EDT中。这一切,使得创造一种新语言变得前所未有的方便。接下来需要做的仅仅是发挥想象力了。2. EGL模型的可扩展性EGL模型在设计之初就考虑了可扩展性。通过扩展EGL模型,可以引入新的元素和概念,使得EGL代码可以表达更多的信息。而这些新的概念和信息,可以被代码生成器识别并利用从而生成全新的功能。下面介绍最常用的几种语言模型的扩展。NativeTypesNat

3、iveType是纯抽象的类型定义,由代码生成器决定怎样把NativeType映射到目标平台。EGL语言中的大多数系统函数都是用NativeType来定义的。比如下面代码中用到的SysLib.writeStdout()方法只是一个抽象函数定义。在Java代码生成器中,它会被生成System.out.println(),而在COBOL代码生成器中,则会生成DISPLAY语句。清单1.EGL抽象函数SysLib.writeStdout()packagesamples.server;programExamplenamestring;functionmain()name=Joe;SysLib.write

4、Stdout(name);endendSysLib的定义,目前,我们使用externaltypetypeNativeType的形式来定义一个NativeType.使用同样的方法,你可以扩展EGL的系统函数库,或者定义自己的函数库。当然,在定义了新的NativeType之后,需要使用上一章中提到的方法扩展代码生成器使得这些新的元素能够被映射成目标平台可执行代码。清单2.定义新的NativeTypeexternalTypeSysLibtypeNativeTypestaticfunctionwriteStdout(textstringin);endAnnotationAnnotation可以用于给已

5、有的语言类型添加额外的注解信息,这些信息能够被代码生成器识别并生相应的目标代码。Annotation用于为任何成员(Member)添加注解,比如变量,方法等。在下面的代码中Id是一个Annotation,它表明cust_no字段是一个用于标识的字段。清单3.Annotation的使用recordMyRecordtypeEntityTableName=Customercust_nointId;namestring;end相应的,在代码生成器中,就可以对于有Id标识的字段进行特殊的处理,比如,当我们把MyRecord写入关系数据库的时候,cust_no字段会被当作主键进行处理。下面的代码是对IdA

6、nnotation的定义。我们使用recordtypeAnnotation的形式来定义Annotation。targets=FieldMbr表示IdAnnotation可以被用在任何一个FieldMember上。清单4.IdAnnotation的定义packageeglx.persistence;recordIdtypeAnnotationtargets=FieldMbrendIdAnnotation非常简单,没有附带任何额外的信息。下面我们来设计一个略微复杂点的Annotation用于在生成的代码中添加一些注释。如下代码所示,CommentAnnotation同样作用于FieldMember

7、,并且它可以指定一个字符串值text。清单5.可指定字符串text的CommentAnnotation定义recordCommenttypeAnnotationtargets=FieldMbrtextString;end在定义了CommentAnnotation之后,我们就可以在EGL代码中使用它。清单6.使用CommentAnnotationrecordMyRecordtypeEntityTableName=Customercust_nointId,Commenttext=between10000and19999;namestringComment=hello;end为了让Comment这个

8、新的语言元素能够真正起作用,最后要做的是使用扩展代码生成器。当发现一个CommentAnnotation时,读取text值并在目标代码中生成相应的注释。StereotypeStereotype的概念和Annotation相同,不同的是Stereotype作用于EGL类型,包括DataItem,Record,Program,Library,Service,Interface,Handler,ExternalType。Stereotype的定义和Annotation基本相同,需要注意的是targets必须是EGL类型,并且需要增加Stereotype注解。下面的代码实例是EGL中对于RUIHand

9、lerstereotype的定义。清单7.RUIHandlerStereotype的定义RecordRUIHandlertypeAnnotationtargets=ElementKind.handlerPart,StereotypedefaultSuperType=View,onConstructionFunctionFunctionMemberRef;includeFileString;cssFileString;titleString;themeString;endStereotype的使用也和Annotation不用,如下代码所示,在EGL类型之后可以使用type关键字来指定stereo

10、type。清单8.RUIHandlerStereotype的使用handlerHelloWorldtypeRUIhandler抽象IO语句EGL通过抽象的数据操作语句(add,get,replace,delete,open,close)来简化数据读写工作。EDT现有版本已经对关系型数据库SQL实现了这些操作语句。语言的可扩展性决定了这些数据操作语句可以被扩展到任何一个数据存储平台,比如针对文件系统的扩展,针对XML文件的扩展,针对云数据存储的扩展等。下面将以云存储为例简单介绍扩展IO语句的方法。EGL前端编译器通过datasource来决定将抽象IO操作语句编译成哪种特定实现的中间模型(IR)

11、。为了扩展到云存储,首先必须定义一个代表云存储的新datasource。如下代码所示。这里我们又看到了熟悉的NativeType。清单9.云存储CloudDataSource定义externalTypeCloudDataSourceextendsDataSourcetypeNativeTypeend接下来需要定义代表Cloud存储访问的IO语句,这里仅以add作为例子。清单10.云存储CloudDataSourceAdd语句定义externalTypeCloudAddStatementextendsCloudActionStatement,AddStatementtypeMofClassend

12、然后我们需要告诉编译器:当add语句的目标datasource是CloudDataSource时,把该条add语句编译成CloudAddStatement。这条规则需要写成Java代码并包含在Plugin中。最后需要做的是扩展代码生成器,为CloudAddStatement增加新的template以生成相应的目标代码。在完成了所有上述扩展后,用如下EGL代码即可把record添加到云存储中。最终使用者(写这段EGL程序的人),不需要了解存储服务的技术细节也可以方便的使用云存储或者SQL存储,甚至可以将同一个程序在不同存储之间随意的切换。清单11.云存储CloudDataSourceAdd语句使

13、用programPgmdsCloudDataSource?Resource;functionmain()ds=newCloudDataSource();customerCustomer;customer.id=10001;customer.name=Joe;addusertods;endend回页首3.EGL代码生成器的可扩展性从图1中可以看出,EGL代码生成器的作用是把EGL模型翻译成目标语言代码,它的输入是EGL模型,输出是目标语言代码。以下是代码生成器中的一些关键概念。Template对象Template对象是EGL代码生成器中的主要部分,EGL模型中的一个元素类型般会对应一个Templ

14、ate类型。一个Template对象的主要功能有两个:1 .把EGL模型中的一个元素转换成目标代码2 .调用EGL模型中一个元素的子元素对应的Template以下图展示了Template的作用:图2.代码生成过程查看大图。一个简单的IR模型,包含一个Program和定义在此Program中的一个Function。从Program中的属性可知,止匕Program的包名是pkgl,程序的名字是HelloWorld;从Function的属性可知,止匕Function的名字是main,没有参数和返回值。当此模型作为输入进入Java代码生成器,ProgramTemplate会对Program进行处理,读

15、取Program对象的属性,生成右边框中红色的代码;然后会调用FunctionTemplate,并把Function对象作为参数,FunctionTemplate读取Function对象的属性,生成右边框中蓝色的代码。对于复杂的IR模型,Template采用以上描述的流程,生成复杂的代码。生成器配置文件IR模型中的对象如何匹配其对应的Template对象呢,在EDT中,是通过一个配置文件实现的。除了Templates配置文件,EDT中还有NativeTypes配置文件和PrimitiveType配置文件。代码生成器的配置文件是Properties文件,由key-value对组成。1.Templates配置文件此文件描述了EGL模型中的一个元素类型和一个Template的对应,在目标代码生成过程中,生成器通过此文件把EGL模型的中的元素类型和Templat

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 商业/管理/HR > 市场营销

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号