软件的可编程扩展-脚本控制
稍微上一点年纪的程序员都使用过DOS操作系统,那个操作系统所有的操作都是通过键盘往里敲字符实现的,用得很不方便。后来有了图形界面操作系统,比如Windows,让很多需要看着键盘才能敲出字来的人彻底解放了。在Windows上绝大部分软件只需要用鼠标在屏幕上点点划划就能操作了,而且还支持多任务,同时运行好几个软件。
但即使是图形操作系统也不能完全摒弃文本控制方式,所以每版Windows都保留着DOS操作模块,另外Windows上有很多实用的小工具如网络配置工具等,都没有图形界面,只能用DOS方式操作。很多优秀的软件也都有命令操作功能,如Office系列软件的宏命名,AUTOCAD的函数命令等,命令操作功能是文本控制方式中较简单的一种,本文重点讨论的是文本控制方式中较高级且较复杂的一种-脚本控制。
脚本,就是能用来解释执行的文本,能够解释执行就必须遵循一定的语法,使得解释器能够看得懂,这样脚本就具备编程语言的性质了,脚本所遵循的规则被称为脚本语言。常用的脚本语言有JavaScript,VBScript, ASP,JSP,PHP,SQL等。脚本是命令的集合,典型的应用是AUTOCAD软件的AUTOLISP脚本,AUTOCAD是一个画图软件,画每一个图形都有相对应的函数命令。那么AUTOLISP可以把所需要画的图形对应的函数命令列在一起统一执行,比如画一个简单的油罐车,可以由画圆形(车轮子)、梯形(车头)、长方形(车板)和椭圆柱形(油罐)组合起来,实现高度的自动化,“AUTO”CAD绝对是名副其实的。由此看来由命令组合实现自动化还是比较靠谱的,想想怎么把在屏幕上点点画画这些动作组合起来实现自动化呢?是不是无法可想?并非是不可实现,Office中的宏录制功能就是这样做的,但毕竟太过复杂,而且录制的宏最终还是转化为了文本,从这一点看文本控制方式在很长一段时间内还是比较有优势的。
下面,看看如何让自己写的程序实现文本控制,或者说一步到位,实现脚本控制吧。
脚本控制系统理论上是由三部分组成:被控系统、脚本和脚本引擎组成,举一个简单的例子,被控系统好比是演员,脚本就是剧本,而脚本引擎则是导演,那么写脚本的程序员呢?当然是编剧了。现在,编剧有好点子了,他写出了一个优秀的剧本,然后编剧拿着这个剧本去找导演:你找几个演员,让他们按着这个演!于是,导演就照着这个剧本指挥了:张三,你这么做动作,李四,你给我背这个台词!现在整个戏班子人员都是固定的,这场戏演得怎么样就看这个编剧写的剧本怎么样了。相对于实际系统就是,软件的资源就是这些了,有这函数那函数的,每一个函数实现一个固定的功能,那么脚本怎么组合就是脚本程序员的事的,脚本程序员写脚本,写完脚本交给脚本引擎来执行,脚本引擎根据脚本内容来控制函数的执行。整个脚本控制系统就是这个样子的。
这三部分的相互关系是如上所说的,同时脚本控制系统对这三部分都是有要求的,先说对脚本,当然是脚本必须符合脚本语言的规则,如果不符合规则,就一定不能执行下去,或者说执行不出我们所要的结果。其次,脚本引擎,脚本引擎是脚本控制系统的核心,它负责解释脚本并控制系统的运行。由于其是核心,所以它的复杂度是最高的,一般的程序员写不出来,我们一般用已经写好了的,并且经过无数人验证测试过的脚本引擎,那就是Windows自带的脚本引擎,包括VBScript引擎和Java Script引擎,足够稳定,足够强大。最后说被控系统,对于设计软件的人员来说,这部分是关键的了,因为脚本的质量是由使用软件的程序员来保证的,脚本引擎的质量是由Windows来保证的,对于我们(软件设计人员)来说只能去保证被控系统(也就是软件的可用脚本来编程的部分)的质量了。
不是每个人都能够担当演员的角色,不是所有的软件都能由脚本来控制,从普通人到演员需要有一个培训和包装的过程,使其能够看得懂剧本,听得懂导演的指令,同时演出来是那么回事。脚本控制软件也一样,一定要实现一种接口,即脚本控制接口:IActiveScriptSite,实现了这个接口的程序才能够被脚本引擎访问其函数,IActiveScriptSite中有一个很关键的函数,GetItemInfo,脚本引擎正是通过调用这个函数来获得它所要调用的函数及对象信息的。比如一个窗口上有一个指示灯,脚本引擎要想控制这个指标灯,让它亮或者灭,必须调用GetItemInfo来获得这个指示灯的相关信息,从而达到控制的目的,而被控系统要想脚本引擎能够控制它,则要在GetItemInfo这个函数中实现“提供指示灯的信息”这方面的内容。除此之外,“指示灯”这个词在脚本语言中不是一个专有名词,如果不加以说明的话,会被当成错误的脚本输入,所以在加载脚本引擎之后,要告诉脚本引擎,“指示灯”这个词是一个东西,你可以去访问它。这个过程是通过调用脚本引擎的AddNamedItem函数来实现的。
除了访问对象,调用函数这些动作外,四则运算以及字符串操作等基本功能都是脚本引擎都能够掌握的,也当然是写脚本的程序员能够掌握的了。
基本的脚本控制框架,只能说到这里了,整个架构是基于万能的COM体系统结构之上的,COM结构,是一个无比强大的体系结构,当今流行的架构如DCOM、.net平台,无不由其发展而来。脚本控制的说明,有人用一本书来写,都写得不是很明了,而对于COM,其复杂性用一篇文章来描述,更是都不及它的万分之一。因此对这篇文章感兴趣的同学可以参考一下陆其明写的《脚本驱动的应用软件开发方法与实践》,当然,对COM不熟悉的同学,更是应该先简单了解一下。