摘 要: 从编译系统的用户界面出发,探讨了不同类型用户界面的优缺点。提出了语句模块预处理-编译器的设计思路,阐述了此设计方法基于树型界面实现可视化编译系统的具体实现步骤,重点讨论了树型系统部分的实现方法。
关键词: 编译系统;预处理;树型界面;可视化
0 引言
编译系统是每一个复杂软件所必需的,而它对应的用户界面则是编译系统与用户进行交互的平台。目前的编译系统用户界面大致可分为三种:(1)纯字符的字符型编辑器界面;(2)图形化界面;(3)图形化与字符兼容的界面。
纯字符型界面的特点是语言编写灵活,与编译系统直接相连,执行效率较高;缺点是语句编写是“流水账式”的,程序长不便于阅读,无法直接看出程序的语义,使用这种界面的往往只能是专业人士。
图形化界面的特点是语句模块化封装,程序隐藏在后台,从图形界面上看,程序结构清晰,便于用户理解;缺点是需要多处理图形部分[1],较之字符型编译系统执行效率较差,编译系统设计比较复杂。
图形化与字符兼容的界面形式兼容了字符型编辑器和图形化界面的特点,既有字符式编写灵活的特点,又具有模块化显示优点,本文讨论如何设计基于图形化和字符编辑器基础之上的树型编辑器系统。
1 树型编译系统构架
编译器的图形化,本文采用树型控件[2]实现,一个语句模块用一个树型节点表示;字符编辑为辅助性语句显示界面,用户可以根据需要查看某一个节点语句。
树型编辑器系统主要分为以下三大部分:
(1)用户界面部分包括一个树型编辑器和一个字符型编辑器,树型编辑器用来显示程序的大的流程,因为它是用树型节点图标显示,用户可以方便看出程序的流程和操作内容;字符型编辑器用来显示节点对应的编程指令。
(2)程序模块化处理部分包括程序指令的模块化封装、模块指令的访问和模块程序运行的控制[3]。
(3)编译系统部分主要完成程序指令的执行工作。
三部分的关系图如图1所示。
这里重点讨论编译系统之上的树型编辑器系统部分。把树型编辑器系统分为两部分,即程序模块化处理部分和界面处理部分。
2 树型编辑系统的程序模块化处理
程序模块化处理部分,主要是把编译器提供的程序指令模块化,形成程序的主体模块序列,用户通过一个个模块查看和访问程序指令。树型程序执行时,程序指令仍然是通过编译系统编译、执行,只是在程序指令执行的同时,还必须处理模块间的调用关系,并把执行效果反映到树型编辑器界面。
程序模块化处理,首先要设计模块结构和包含的语句结构,根据需求定义一个语句模块结构对应一个树型节点,定义如下:
//元素节点结构
struct ST_Node
{
wstring sName;//节点名称
int nType;//节点类型
CObject*pItem;//界面对应节点指针
wstring sInfo;//节点信息
int nState;//节点状态
}
程序语句定义:
//语句定义结构
struct ST_Sen
{
int nType;//语句类型
wstring sSenKey;//语句关键字
wstring sSentence;//语句指令
}
利用上述的节点结构定义和程序定义,实现程序指令的模块化封装。然后,设计用户访问接口,实现模块化语句的添加、删除、查询等操作接口。界面处理部分通过这些接口完成各种操作。部分访问接口定义如下:
//添加模块节点
void AddNode(CString sName, int nType,Cobject * pItem,CString sInfo);
//添加模块节点语句
void AddNodeSen(CString sName, CStringArray & aSentence);
//得到节点类型
int GetNodeType(CString sName);
//删除节点
void DeleteNode(CString sName);
//清除节点语句
void ClearNodeSen(CString sName);
程序模块化处理,最后一个工作就是对程序指令执行时的处理,这里包括两方面的处理,一方面是程序执行前对程序指令的打包,程序指令打包完成后传到编译系统编译、执行;另一方面是对模块调用关系的处理,这里可以使用栈的方法实现这种调用关系[4]。
如果要考虑程序模块化和程序指令建立对应关系,可以把语句模块节点设计成子程序的方式实现,这样在程序结构设计上就会更加合理。
3 树型编辑系统的界面处理
这里的用户界面包括一个树型编辑器和一个字符型编辑器。
树型编辑器是用来显示程序模块的,一个树型编辑器节点对应一个程序模块,程序模块可以分为很多模块类型,这些类型在树型编辑器中可以用不同的图标表示,这样通过树型编辑器的图形化界面就能很好地实现程序指令的图形化功能。树型编辑器界面如图2所示。
字符编辑器主要是为用户提供程序模块指令的操作界面,用户可以用它查看模块的程序指令、修改模块的程序指令。图3为程序模块指令。
用户界面部分的主要工作是定义程序模块的分类,程序模块划分后用树型编辑器的一个树节点代表一个程序模块类型,这样根据设计编译系统的需求,把所有的语义块状划分后,就可以用树型界面描述程序的实现流程。
用户界面的其他工作就是定义界面上各种各样的操作,它们的实现都是在程序模块化处理和定义模块分类两部分基础工作之上。
树型程序执行时,本文采用语句模块预处理-编译器的方式实现,语句模块预处理包括了两方面工作:(1)根据树型编辑器节点的顺序处理程序的流程;(2)根据节点的语句合成程序的流程。上述工作处理完成后,把预处理好的语句传送到底层的编译系统从而完成整个程序的执行流程。图4为树型程序执行流程。
4 结论
基于“语句模块预处理-编译器”的设计方式可以方便快捷地实现编译系统的可视化工作。此方法虽然从设计思路上讲并不是什么复杂的方法,但它却能把程序界面的可视化部分与底层的编译系统有机地组织起来,因能作为一个独立的处理部分,所以在实现可视化编程方面有其一定的优点。
参考文献
[1] 魏兰,李文锋.基于可视化程序设计语言的编译系统[J].计算机工程,2007,33(13):104-106.
[2] PETZOLD C.Windows程序设计[M].北京:北京大学出版社,1999.
[3] 胡远方.面向对象编译技术类库体系结构的研究和设计[D].北京:清华大学,2000.
[4] 张素琴,戴桂兰.面向对象编译类库构造[J].清华大学学报(自然科学版),2003,43(7):965.