基于.NET的VBScript集成开发环境的设计与实现
2015-12-25白勇
白 勇
(重庆电力高等专科学校,重庆 400053)
近年来,随着计算机应用越来越多地参与到经济建设和家庭生活当中来,对计算机软件的需求也越来越大。社会不但需要大量的专业化定制软件来满足实际应用的需求,同时对于软件行业人员来讲,集成开发环境(IDE)的易用性、功能强大性和安全性,直接关系到软件开发的效率和质量,因此,拥有高质量的集成开发环境是必须的。
但是我们需要看到,在大型商业化集成开发环境中,对脚本类语言的支持不足。有的虽然可以编辑和调试VBScript等脚本类语言,但并未提供与其他编译运行语言类似的代码智能提示功能,甚至调试期间不能断点执行,也不能动态地获得变量值,这在网页和COM类应用中大量使用脚本语言的现状下,令脚本语言开发者感到十分不便。因此,我们需要一种专门针对于脚本语言的集成开发环境。
为解决这个问题,本文提出了一种基于.NET的VBScript集成开发环境的系统架构及主要功能的设计思路,并使用.NET平台的C#语言实现了该集成开发环境。该课题具有十分重要的实际应用价值和广阔的市场前景。
1 Microsoft Script Control 概述
在现代互联网和应用程序中,脚本语言(Javascript,VBScript等)扮演着非常重要的角色,并被越来越多的程序员以及普通用户认识、掌握。脚本语言通过解释器,边解释边运行,拥有大型编程语言(C++,C#,Java等)所不具有的方便灵活的特性,使用脚本语言进行开发,一方面可以最大限度地扩展程序的应用范围,另一方面也方便程序员利用现有脚本提供的一些特别的功能(如正则表达式等),十分有用[1]。
Microsoft Script Control控件是由美国微软公司推出的一款可调试Javascript与VBScript脚本的控件,它内建了完备的COM接口,包括IActiveScriptSite接口和IActiveScriptSiteWindow接口等,并针对Active Scripting功能提供了面向对象接口[2]。使用Microsoft Script Control控件,可以最大限度地利用资源,为脚本代码提供成熟可靠的调试环境。
Microsoft Script Control控件提供的主要接口有以下几种[3-4]。
(1)Language。该属性可设置需要调试的脚本语言,包括Javascript和VBScript两个枚举值。
(2)Timeout。该属性可设置脚本引擎调试时的超时时间,单位是毫秒。当某条脚本语句执行时间超过该值时,将触发一个Timeout事件。设置为-1表示永不超时。
(3)UseSafeSubset。这是一个布尔值,用于设置是否在安全模式下运行脚本代码。安全模式运行时将进行代码检查,不允许系统级脚本语句的执行。设置为true时将在安全模式下运行,设置为false时表示不在安全模式下运行。
(4)Error 该属性返回一个Error类型的错误对象,用于程序调试失败时获取错误,该属性为一个只读属性。
(5)AddCode(string Code)。该方法允许使用者将脚本代码添加至脚本引擎中去。被添加的脚本代码将在稍后被执行。
(6)AddObject(string Name,object Object,[Bool AddMembers = False] )。该方法允许使用者添加外部的,非本脚本代码所创建的对象至脚本引擎中,以便使用该对象的接口等。
(7)Eval(string Expression)。该接口允许使用者对表达式求值。该表达式必须为一个值对象,比如返回结果为string,int,bool对象的表达式。而返回非值对象(例如返回一个Excel对象的表达式)则不可以使用该接口获得其值。
(8)ExecuteStatement(string Statement)。该接口允许使用者执行脚本语句。
(9)Reset()。该方法可以将脚本引擎的所有属性设为默认值,丢弃所有的对象和代码,并将state属性置为0。
(10)Error。该事件在脚本执行出错时被触发。
(11)TimeOut。该事件在脚本执行超时被触发。
2 系统需求分析
在VBScript集成开发环境中,需要提供以下功能。
文件操作功能:包括了项目文件的新建、打开与保存,以及防止文件因未保存而丢失信息的自动存档功能。
代码编辑功能:包括了代码的录入、修改和删除,复制、粘贴和剪切,操作的撤销和重做,以及添加或删除整行功能。
调试功能:需要提供代码调试的方法,包括整体调试、单步调试、继续调试以及停止调试,同时还需要提供错误信息提示和超时信息提示功能。对于错误信息提示功能来说,需要根据不同的错误,提示详细的错误信息。
变量提取功能:包括了对用户输入代码的变量检测功能,将用户代码内的变量均检测到,同时还需提供判定变量类型的变量类型确定功能。最后,为了满足调试过程中用户对变量值的跟踪,还需提供变量值的获取功能。
智能提示功能:包括了对用户输入的对象的接口提示,需要显示该对象的所有方法和属性,支持用户通过鼠标或者键盘来选取或者添加某个方法或属性,同时当用户的输入发生改变时,该功能需要动态更新提示信息以使之符合用户的最新输入。同时还包括了对用户输入的函数接口提示,当用户输入一个函数名后,需要提示该函数的形参格式供用户参考。
其他功能:包括了对象和变量的浏览功能,以及通过拖拽对象或者变量,自动生成代码功能等。
在上述功能中,调试功能和变量提取功能是关键功能。
3 系统总体设计
基于上面的分析可知,VBScript集成开发环境需要提供文件操作、代码编辑与调试、变量提取以及智能提示等功能。
在文件操作模块中,需要定义一种文件格式,用于持久化存储用户在集成开发环境内的编辑内容。该文件选用XML格式。
系统的总体架构如图1所示。
图1 系统总体架构图
4 代码调试
调试功能是集成开发环境所必不可少的功能,也是其核心功能之一。我们使用Microsoft Script Control控件来进行代码调试。在使用之前,需要先对控件进行封装。封装后的接口如下:
public static ScriptEngine(ScriptLanguage language,bool UseSafeSubset);
这里主要封装了代码语言以及是否使用安全运行模式这两个参数。封装后的方法使用了单例模式,当第一次调用该接口时,程序会新建一个Microsoft Script Control对象并对其属性赋初值;当重复调用该接口时,程序会令原先的Microsoft Script Control对象执行Reset()方法,并重新赋初值。这样可以使得整个程序在运行期间,只创建一个Microsoft Script Control对象,有效保证了一致性,并节省了系统资源。
当进行调试时,程序首先会脱离编辑状态,然后调用封装的ScriptEngine方法来创建或重置Microsoft Script Control对象;然后程序将依次读入每一个代码单元格内的代码,使用AddObject接口将脚本代码传递给调试引擎并执行之。当前一个单元格内的代码执行完毕时,后面一个单元格内的代码会被读入并执行;当所有代码单元格都被执行过时,此时调试完成,程序结束调试任务;当调试中出现错误时,调试会中止执行。
整体调试伪代码如下:
5 变量检测与类型确定
当用户离开代码编辑状态,或者改变单元格时,变量探测器会启动。首先,它通过换行符将一个单元格内的代码分割成若干个语句,然后逐语句分析,当该句由”Dim”,“Set”开头,含有等号,或者是foreach循环语句时,变量探测器会根据不同情况进行具体分析,尝试获取变量,总体流程图如图2所示。
当变量探测器探测到变量后,将尝试获取该变量的值或类型。这是通过对等号右边的语句进行语法分析得到的[5-6],包括以下几种情况。
(1)右侧为CreateObject语句。这种情况下,首先截取右侧语句,获取CreateObject语句传入的参数。根据该参数的名称,读取相应的类型定义文件,则该对象的Entrance元素的name属性值即为该变量的类型。
(2)右侧为表达式。这种情况下,可以确定该变量为一个泛型变量,因此可以将其Value留空,待调试时,通过调试控件的Eval方法来获得该变量值。
当代码识别出该变量为表达式后,还需要确定变量的类型。类型一共有4种:整型、浮点型、布尔型以及字符型。系统根据如下规则来确定变量类型:
若表达式中有双引号,则该变量为字符型;
若表达式为”true”或者”false”,则该变量为布尔型;
若表达式中含有点号,则该变量为浮点型;
否则,该变量为整型。
图2 变量探测与类型确定流程图
(3)右侧为变量。此时左侧与右侧变量类型相同,将右侧变量类型赋给左侧变量即可。
(4)右侧为变量的子方法或子属性。这种情况下,需要先获得右侧变量的类型,然后在该对象的类型定义文件中,以右侧变量的类型为入口,逐级查找方法或属性的返回值,最终确定左侧变量的类型。例如,有如下语句:
Set worksheets1 = xlsName1.Workbooks.Add.Sheets
则判定步骤如下:首先通过前面的语法分析,得知右侧变量的类型为Excel Application;然后打开文件,先查询Entrance元素,然后跳转到ApplicationClass元素;接着在ApplicationClass元素中搜索Workbooks属性,得知其返回类型为Workbooks;这时跳转到Workbooks元素,查找到Add方法的返回值为Workbook;最后跳转至Workbook元素,判定其Sheets属性返回值为Worksheets。则最终可确定worksheets1的类型为Worksheets。
6 变量值的获取
在上一小节中,我们讨论了系统如何探测到变量,以及变量类型的确定。而对于基本数据类型来说,其值的获取与显示,对于调试程序也拥有重要意义,本小节讨论基本数据类型值的获取。
在变量探测器探测到变量并确定类型后,它会将变量存入一个Dictionary中,格式如下 :
Dictionary
其中lineIndex存储了单元格的行号,而后面的Vector则存储了该单元格内代码的变量信息。当用户调试程序时,每当一个单元格的代码成功执行,系统会去该Dictionary中读取该行的变量列表。对于列表中的每一个变量,若其类型为基本数据类型,则会通过Microsoft Script Control控件提供的Eval方法来获取其变量值,方法如下:
object obj = scriptEngine.Eval(varName);
执行该方法后,变量varName的值会被存储至obj对象中。至此,我们已获得了该变量的值,然后将其更新至变量列表即可。
系统最终实现的界面如图3所示。
图3 系统界面图
系统界面的最上方为标题栏,接下来为菜单栏和工具栏。下方的主要部分为代码编辑区,右侧为对象浏览器和变量浏览器,弹出的窗体为智能提示窗体。
最终实现的系统可以对VBScript代码提供编辑、调试、保存和导出功能,整个系统鲁棒性佳,具有重要的实用价值。
7 结论
本文首先对相关技术和理论进行了介绍,然后提出了一种基于.NET的VBScript集成开发环境的系统架构和主要功能的设计思路,并给出实现方案。该系统弥补了现有集成开发环境对脚本语言支持的不足,具有重要的现实意义和广阔的市场前景。
[1] 陈立平,刘媛杰,王志勇.结合Script Control组件实现GIS应用的二次开发功能[J] . 塔里木大学学报,2007,(2):43-44,59.
[2] 刘日仙,袁利永. Script Control在VB自动阅卷系统中的应用[J] .计算机时代,2010,(9): 45-47.
[3] Zhao Jialing,Jiao Weifeng,Sheng Wenwen . Examination system based on script engine technology[C] //2009 International Conference on Computational Intelligence and Natural Computing.Wuhan:IEEE,2009.
[4] Yuan NH, Xue YX, Gao A. Interactive distant skill training based on remote control technology[C] // Proceedings of the 2007 1st International Symposium on Information Technologies and Applications in Education. Kunming : IEEE,2007.
[5] 范忠锋,刘坚.用词/语法分析器生成器实现软件系统的输入[J] .计算机应用. 2002,(1): 39-41.
[6] 温敬和.LR分析法在词法分析器自动构造中的应用[J] .计算机工程,2001,(7): 188-190.