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