脚本语言在数据采集系统中的应用研究
扫描二维码
随时随地手机看文章
为了解决软件开发的难题,人们发明了汇编语言,通过一些助记符来减轻二进制编码的开发压力。这的确是行之有效的方法,然而,汇编语言太依赖程序员的素质,而且无法适应大规模的开发。
到了上世纪60年代,出现了Fortran,Cobol,Lisp,Algol 60等现代高级语言。程序员可以用接近自然语言的程序语言编制软件,再通过编译器转换成机器可执行的代码。由于使用精确的形式语言来定义程序语言本身,并通过对硬件的抽象使得程序与计算机平台无关,导致高级语言生产效率提高、维护费用降低,计算机软件业得以蓬勃发展。
为了实现生产效率的提高、可靠、易维护、易管理的开发思想和方法。文中在介绍脚本语言及使用的基础上,提出了其在数据采集系统中的使用模型及具体实现。
1 脚本语言简介
脚本语言是为了缩短传统的编写一编译一链接一运行(edit-compile-link-run)过程而创建的计算机编程语言。相对于编译型计算机编程语言,用脚本语言开发的程序在执行时,由其所对应的解释器(或称虚拟机)解释执行。系统程序设计语言是被预先编译成机器语言而执行的。脚本语言的主要特征是:程序代码即是脚本程序,亦是最终可执行文件。脚本语言可分为独立型和嵌入型,独立型脚本语言在其执行时完全依赖于解释器,而嵌入型脚本语言通常在编程语言中(如C,C++,VB,.Java等)被嵌入使用。
脚本技术得益于计算机硬件的加速发展。过去某些情况下甚至系统程序设计语言也不够有效,因此不得不用汇编编写应用程序。而今的机器比1980年的快100~500倍,且仍在以每18个月翻一番的速度增长。计算机性能快速提高,使计算机程序越来越复杂。因此,开发时间已远比运行时间紧迫。这时,脚本语言作为系统程序设计语言的补充,开始被主要的计算机平台所同时提供。编程语言已经由性能低下的硬件与执行效率之间的矛盾,转变为快速变化的市场需要与低效的开发工具之间的矛盾,所以脚本语言的发展在今后的软件开发中有着必然的趋势。
脚本语言和系统程序设计语言,一个重要的不同是脚本语言是被解释而系统程序设计语言是被编译。被解释的语言由于没有编译时间而提供快速的转换,通过允许用户运行时编写应用程序,而不需要耗时的编译/打包过程。解释器使应用程序更加灵活,脚本语言的代码能够被实时生成和执行。脚本语言通常都有简单、易学、易用的特性,目的就是希望能让程序设计师快速完成程序的编写工作。
2 脚本语言的一般应用
脚本语言主要应用在以下几个方面:
(1)作为批次处理语言或工作控制语言。许多脚本语言用来执行一次性任务,尤其是系统管理方面。DOS,Windows的批处理文件和Unix的shell脚本都属于这种应用;
(2)作为通用的编程语言存在,如Perl、Py-thon、Ruby等。由于“解释执行,内存管理,动态”等特性,它们仍被称为脚本语言。但它们已经用于应用程序编写,用户也不把它们看作脚本语言;
(3)许多大型的应用程序都包括根据用户需求而定制的惯用脚本语言。同样地,许多电脑游戏系统使用一种自定义脚本语言来表现NPC(Non-Player Character,Non-Playable Character,Non-Player Class)和游戏环境的预编程动作。此类语言通常是为一个单独的应用程序所设计,虽然它们貌似一些通用语言(如Quake C,Modeled After C),但它们有自定义的功能;
(4)网页中的嵌入式脚本语言。熟知的HTML(Hyper Text Mark-up Language)即超文本标记语言,就是一种脚本语言,它的解释器就是浏览器。JavaScript直到现在仍然是网页浏览器内的主要编程语言,它的ECMAScript标准化保证了它成为流行的通用嵌入式脚本语言。另外,随着动态网页技术发展,ASP、JSP、PHP等嵌入网页的脚本语言正被广泛使用,不过这些脚本要通过Web Server解释为Html而被浏览器执行;
(5)脚本语言在系统应用程序中嵌入使用,作为用户与系统的接口方式。在工业控制领域,PLC编程、组态软件的脚本语言是扩充组态系统功能的重要手段;在通信平台领域,IVR(自动语音应答)流程编程;Office办公软件,提供的宏和VBA;其他应用软件如ER Studio提供的Basic MacroEditor,用户可以编写Sax Basic脚本操作ER图,生成Access库、导出Word文档等扩展功能。
3 脚本语言在数据采集系统中的应用
纵观程序设计语言的发展,一个很显著的特点就是以机器的性能换取人的效率,以提高开发者的工作效率和满足人的需求为目标,在所有资源中人是最昂贵的资源,因而程序的编写从面向机器逐渐向面向人过度。而脚本语言就是可以提高开发效率和满足客户需求程序设计的最好选择。比如在开发中需要对客户自定义表达式计算时,如果自己去写表达式解析,将是一个几乎无法完成的任务。而使用微软的Script控件,把表达式作为脚本函数返回值,让Script控件解释计算,几行代码就完成了,开发效率大大提高。
在软件系统实践中,用的最多的就是把脚本嵌入应用程序中。快速开发工具Delphi除了可用使用ActiveX控件类型的脚本引擎外,也有许多优秀的原生Delphi脚本引擎控件如Scripter Studio,PaxScr4pter,Inner Fuse Pascal Script,Fast Script等。在开发一款通用的数据采集系统中,就采用了核心架构使用高级语言,用户扩展和通讯协议使用Fast Script描述的设计模式。之所以选择FastScript,因为Fast Script是一个交叉平台的语言的脚本引擎。它对希望增加脚本功能的编程人员非常有用。Fast Script是用100%的Object Pascal编写,具有支持OLE和变量数组,可以使用多语言脚本(Pascal Script、C++ Script、JScript和BasicScript),与标准面向对象语言语法相近,可以使用程序内的任何对象、标准库访问基类、控件、窗体和DB;易可扩展的库结构;内存占用小等特点。
系统的结构,如图1所示。采用这种模式,就是要充分发挥系统程序语言和脚本语言的各自优势。因为核心架构需要创建采集线程、进行任务调度、处理系统消息和加载脚本引擎等,而这些需要稳定且处理效率高,所以使用系统程序语言开发;而对于千变万化的通讯协议,如果全都被系统核心架构包括,是不可能的。而把各种通讯协议用不同的脚本语言文件描述,供采集系统调用,问题就可以解决了。
如图1所示,通过系统配置,告诉采集核心需要建立的采集通道(对应采集点,每个通道的任务在自己的线程中调度),以及每个通道的采集任务(对应与通讯协议脚本)和调度方案(何时启动采集或者多长时间周期采集一次)。正是应用了脚本语言描述采集任务,使得系统具有高度灵活的可配置性。
采集任务通过xml文档描述,具体的通讯使用Fast Script描述。xml文档结构如下:
<?xml version=“1.0” encoding=“GBK”?>
<项目名称=“采集器对时”开始流程=“通信步骤1”>
<全局变量初始化脚本=“…”/><!--采集任务必要的全局变量加载脚本-->
<通信流程名称=“通信步骤1”下一流程=“通信步骤2”>
<发送数据脚本=“…”/><!--通信步骤发送数据的脚本-->
<收全判断脚本=“…”/><!--判断通信数据是否收全的脚本,收全后进入下一步骤-->
<正确回复脚本=“…”/><!--判断通信步骤收到数据是否正确的脚本-->
</通信流程>
……
<通信流程名称=“通信步骤n”下一流程=“”>
<发送数据脚本=“…”/>
<正确回复脚本=“…”/>
<收全判断脚本=“…”/>
</通信流程>
<数据处理脚本=“…”/><!--处理收到数据的脚本,一般用于数据解析并保存数据-->
</项目>
在系统核心中,把系统一些常量、函数声明、读入的脚本一起组成完整的脚本。
以下是几个典型脚本的例程(函数声明为系统定义,斜体部分为XML文档中读入系统)。
全局变量初始化脚本如下:
Procedure (Conn: TADOConnection; varGlobalVar:Variant);
begin{全局变量分别为采集点地址,开始地址,结束地址}
系统核心按照XML定义的流程,通过脚本控件的CallFunction、CallFunctionl、CallFunction2方法调用脚本中的函数,根据执行结果执行相关操作并写入日志。在实践应用中发现,整个脚本的语法检查(Compile方法)占用系统的资源最多、对系统影响较大。所以在系统开始时,就把所有任务脚本读人内存中,并通过脚本控件的语法检查,这样虽然加大了系统内存开销,但是整个脚本语法检查只做一次,任务调度时直接执行脚本。比较与每次任务调度时读人脚本、检查语法、执行,效率提高相当明显,几乎可以达到与系统语言相媲美水平。
除了描述采集通讯协议,系统还允许用户通过脚本自定义界面,开发了脚本编辑、调试工具,方便脚本编写,这里不作详述。
从上述应用可以发现,这种脚本的语法与Del-phi十分相似,易于编写,又能描述复杂、变化的任务。即能保持基本框架不变,又能使系统灵活。
4 结束语
今天,用脚本语言编写的应用程序的数目远多于用系统程序设计语言编写的应用程序的数目。在Unix系统中有比C程序更多的外部脚本。当然,多数大型和广泛使用的应用程序都是用系统程序设计语言写成的,但脚本语言已经是应用程序开发的主动力,并且今后它的市场份额会继续提高。脚本将对越来越多的应用程序产生吸引力。以Python,Perl,Tcl,Ruby为代表的动态语言越来越受到开发者的青睐,使用动态语言群体、社区不断壮大,许多开发团队不再单纯使用一种语言编程开发软件,而是混合式编程,动态语言作为胶水语言专为应用程序而设计,在今后的混合式应用中变的越来越重要,甚至有人认为脚本语言是“21世纪更高级的编程语言”。