基于EFSM的代码生成原理与机制
Abstract: Designs and implements a specified CASE platform to support multi-UI application design, http://www.51lunwen.org/master_degree.html and represents a new and useful way to generate codes automatically in this CASE platform. Based on illustrating extended finite state machines (EFSMs) for automatic code generation, a simple example is presented to introduce a process of abstracting resources and building an EFSMs model until the generating codes. In this way is ensured the feasibility of the code generation mechanism based on EFSMs for multi-UI application platform.
Key words: computer aided software engineering; extended finite state machines; automatic code generation
摘 要: 设计和实现一种针对多用户界面应用系统的专用CASE平台,提出在这种CASE平台中具有新意且实用的代码自动生成方法.帮写硕士论文在论述作为代码自动生成机制的EFSM的定义基础上,通过实例介绍了在这种CASE平台中基于设计模型提取资源、建立EFSM模型,直到生成代码的全过程,进而验证了多用户界面应用系统平台上基于EFSM的代码自动生成机制的可行性.
关键词: 计算机辅助软件工程; 扩展的有限状态自动机; 代码自动生成
随着CASE技术的发展,市场上出现了很多成熟的通用CASE平台,如Rational公司的Rational Rose.但这一类CASE平台往往不支持用户界面的设计,用户界面部分的代码需要用户手工生成,这对于多用户界面的应用程序有很大限制[1,2].多用户界面应用程序以无线通信平台应用系统为代表,而这一类应用程序中,界面设计是最繁重的部分.为此,需要开发一个支持多用户界面应用系统设计的专用CASE平台(简称MUI平台).针对无线通信应用目标平台多变的特点,MUI平台在设计上考虑支持多语言的代码生成,创建了自己的系统级扩展的有限状态自动机(EFSM, extended finite state machines)来处理消息循环.系统将过滤掉其它语言的消息处理机制,将消息融合进自身的消息循环,并通过系统级EFSM进行消息的分发、处理.其代码自动生成的过程主要是提取状态,建立系统级EFSM的过程.
1. 扩展的有限状态自动机
扩展的有限状态自动机是一个事件驱动模型.它包括一个有限状态集合.根据接收到的事件,系统从一个状态跳转到另一个状态.EFSM的形式定义:M=(I;O;S;~x;T),式中 I为输入字符的有限集;O为输出字符的有限集;S为有限状态集;~x为变量有限集;T为有限转移集.每一个t∈T的形式定义为t=(st,s′t,et,ot,Pt,At),式中 st和s′t分别表示当前状态和后继状态,st∈S,s′t∈S;et和ot分别表示输入和输出字符集,et∈I,ot∈O;Pt(~x)表示当前变量的~x谓词;At(~x)定义了变量集上的活动.EFSM模型是一个成熟的数学模型,它可以直观地表达一个系统,因此MUI平台采用基于EFSM的代码生成机制.FSM和EFSM是等效的,虽然FSM比EFSM简单,但FSM在状态迁移过程中只默认支持一种活动——识别输入字符.考虑到MUI平台中状态转移过程中可能会伴随复杂的活动,仅用FSM描述会很困难,所以选择采用EFSM代替FSM[3].
2. 基于EFSM的代码生成原理与机制
通过一个简单的模型说明MUI平台中基于EFSM的代码生成原理与机制.首先应用MUI平台建立一个如图1所示的简单模型.图1所示模型中有2个屏幕,左边称为主屏幕,右边称为欢迎屏幕.主屏幕上有2个按钮,点击左边的Exit按钮退出系统,点击右边的Next按钮跳转到欢迎屏幕.欢迎屏幕上有一个Return按钮,点击后返回主屏幕.在主屏幕的右上角有一个电池的图标,将它关联到一个复合状态(Cell),该复合状态Cell的描述如图2所示.运行时,每次进入主屏幕,电池图标就会闪动.
2.1 源自设计模型的资源提取
首先,从设计模型中提取各种资源信息.资源信息包括各控件的大小、相对于屏幕的位置,以及各控件的特殊属性等.资源信息同时还包括各种容器包含信息,记录控件与容器及屏幕之间的所属关系.将提取出来的资源信息存入资源数组中,为代码生成时生成UI界面提供依据.生成的资源数组的子集。
2.2 EFSM的建立
将设计模型中的每一个屏幕抽象为一个状态,同时将设计模型中的起始状态、终止状态、状态、复合状态、帮写硕士论文叉状态、汇合状态等图符也提取为状态,将状态加入其所属的复合状态的状态列表中,并记录所有的复合状态.分析设计模型中的连接线分为事件线、分支线及关联线.事件线表示一个事件,例如按钮的点击事件,事件的发生触发了状态之间的跳转.事件线上还包含条件、活动2个属性.同一事件,当条件不同时将会跳转到不同的状态.状态跳转时将执行活动,活动执行完毕后跳转到后一状态.控件上的事件将根据第1步提取的资源信息归属于其所属的屏幕(状态).每一个事件都有惟一的标识符,且属于惟一的一个状态.分支线表示过程,例如流程图中的顺序执行线及分支选择线.分支线不会触发状态转移,只代表过程,通过分支线可以提取设计模型中的全局函数.
关联线表示关联关系,可以将一个状态基关联到一个屏幕,使之成为该屏幕的子状态.当进入该屏幕后,状态基同时开始运行. MUI平台通过子状态基支持后台事件及同步事件的设计.在设计模型中,叉状态与汇合状态之间的状态将被抽象为一个复合状态,将该复合状态插入原叉状态的位置,取代叉状态、汇合状态以及它们之间的状态.
2.3 全局函数的提取
状态转移时要进行的活动可以对应一个函数调用.在MUI平台中,该函数由一个以函数头符号为起始、以函数返回符号为终止的流程图描述.在代码生成过程中,从设计模型中找到每一个函数头,并从各函数头开始遍历整个流程图,将流程图转化为由特定语言编写的函数.这些函数在生成的代码中作为全局函数出现.在所设计的简单模型中没有使用流程图,所以不生成全局函数.
2.4 设计模型的正确性检查
用户在MUI平台中可以直接设计EFSM模型,但是他们并不能保证各个EFSM模型联接起来在词法、语法及语义上的正确性.因此基于EFSM自动生成代码应该支持对EFSM模型的一致性、正确性检查[4~6].
① 词法检查
设计模型中有很多状态(屏幕及各种状态符号),每一个状态都有惟一的标识符;同时,设计模型中也有很多控件,各控件同各状态一样,在一个设计模型中由惟一的标识符标识.遍历设计模型,检查是否有标识符重复的状态及控件,并给出错误的定性和定位提示.同时,各状态及控件都有各自的命名规则,在词法检查中也需要完成对状态及控件命名正确性的检查.
② 语法检查
在设计模型中,不允许状态基交叉,即不允许一个状态属于一个状态基的同时又在另外的状态基中出现,但允许一个子状态基同时属于多个状态.以递归的方式遍历整个EFSM,保证一个状态只属于一个特定的EFSM,如果违反这一规则,提示出错,整个代