為了解決軟件開發(fā)的難題,,人們發(fā)明了匯編語言,,通過一些助記符來減輕二進制編碼的開發(fā)壓力。這的確是行之有效的方法,,然而,,匯編語言太依賴程序員的素質(zhì),而且無法適應(yīng)大規(guī)模的開發(fā),。
到了上世紀60年代,,出現(xiàn)了Fortran,Cobol,,Lisp,,Algol 60等現(xiàn)代高級語言。程序員可以用接近自然語言的程序語言編制軟件,,再通過編譯器轉(zhuǎn)換成機器可執(zhí)行的代碼,。由于使用精確的形式語言來定義程序語言本身,并通過對硬件的抽象使得程序與計算機平臺無關(guān),,導(dǎo)致高級語言生產(chǎn)效率提高,、維護費用降低,計算機軟件業(yè)得以蓬勃發(fā)展,。
為了實現(xiàn)生產(chǎn)效率的提高,、可靠、易維護,、易管理的開發(fā)思想和方法,。文中在介紹腳本語言及使用的基礎(chǔ)上,提出了其在數(shù)據(jù)采集系統(tǒng)中的使用模型及具體實現(xiàn),。
1 腳本語言簡介
腳本語言是為了縮短傳統(tǒng)的編寫一編譯一鏈接一運行(edit-compile-link-run)過程而創(chuàng)建的計算機編程語言,。相對于編譯型計算機編程語言,用腳本語言開發(fā)的程序在執(zhí)行時,,由其所對應(yīng)的解釋器(或稱虛擬機)解釋執(zhí)行,。系統(tǒng)程序設(shè)計語言是被預(yù)先編譯成機器語言而執(zhí)行的。腳本語言的主要特征是:程序代碼即是腳本程序,,亦是最終可執(zhí)行文件,。腳本語言可分為獨立型和嵌入型,,獨立型腳本語言在其執(zhí)行時完全依賴于解釋器,而嵌入型腳本語言通常在編程語言中(如C,,C++,,VB,.Java等)被嵌入使用,。
腳本技術(shù)得益于計算機硬件的加速發(fā)展,。過去某些情況下甚至系統(tǒng)程序設(shè)計語言也不夠有效,因此不得不用匯編編寫應(yīng)用程序,。而今的機器比1980年的快100~500倍,,且仍在以每18個月翻一番的速度增長。計算機性能快速提高,,使計算機程序越來越復(fù)雜,。因此,開發(fā)時間已遠比運行時間緊迫,。這時,,腳本語言作為系統(tǒng)程序設(shè)計語言的補充,開始被主要的計算機平臺所同時提供,。編程語言已經(jīng)由性能低下的硬件與執(zhí)行效率之間的矛盾,,轉(zhuǎn)變?yōu)榭焖僮兓氖袌鲂枰c低效的開發(fā)工具之間的矛盾,所以腳本語言的發(fā)展在今后的軟件開發(fā)中有著必然的趨勢,。
腳本語言和系統(tǒng)程序設(shè)計語言,,一個重要的不同是腳本語言是被解釋而系統(tǒng)程序設(shè)計語言是被編譯,。被解釋的語言由于沒有編譯時間而提供快速的轉(zhuǎn)換,,通過允許用戶運行時編寫應(yīng)用程序,而不需要耗時的編譯/打包過程,。解釋器使應(yīng)用程序更加靈活,,腳本語言的代碼能夠被實時生成和執(zhí)行。腳本語言通常都有簡單,、易學(xué),、易用的特性,目的就是希望能讓程序設(shè)計師快速完成程序的編寫工作,。
2 腳本語言的一般應(yīng)用
腳本語言主要應(yīng)用在以下幾個方面:
(1)作為批次處理語言或工作控制語言,。許多腳本語言用來執(zhí)行一次性任務(wù),尤其是系統(tǒng)管理方面,。DOS,,Windows的批處理文件和Unix的shell腳本都屬于這種應(yīng)用;
(2)作為通用的編程語言存在,,如Perl,、Py-thon,、Ruby等。由于“解釋執(zhí)行,,內(nèi)存管理,,動態(tài)”等特性,它們?nèi)员环Q為腳本語言,。但它們已經(jīng)用于應(yīng)用程序編寫,,用戶也不把它們看作腳本語言;
(3)許多大型的應(yīng)用程序都包括根據(jù)用戶需求而定制的慣用腳本語言,。同樣地,,許多電腦游戲系統(tǒng)使用一種自定義腳本語言來表現(xiàn)NPC(Non-Player Character,Non-Playable Character,,Non-Player Class)和游戲環(huán)境的預(yù)編程動作,。此類語言通常是為一個單獨的應(yīng)用程序所設(shè)計,雖然它們貌似一些通用語言(如Quake C,,Modeled After C),,但它們有自定義的功能;
(4)網(wǎng)頁中的嵌入式腳本語言,。熟知的HTML(Hyper Text Mark-up Language)即超文本標記語言,,就是一種腳本語言,它的解釋器就是瀏覽器,。JavaScript直到現(xiàn)在仍然是網(wǎng)頁瀏覽器內(nèi)的主要編程語言,,它的ECMAScript標準化保證了它成為流行的通用嵌入式腳本語言。另外,,隨著動態(tài)網(wǎng)頁技術(shù)發(fā)展,,ASP、JSP,、PHP等嵌入網(wǎng)頁的腳本語言正被廣泛使用,,不過這些腳本要通過Web Server解釋為Html而被瀏覽器執(zhí)行;
(5)腳本語言在系統(tǒng)應(yīng)用程序中嵌入使用,,作為用戶與系統(tǒng)的接口方式,。在工業(yè)控制領(lǐng)域,PLC編程,、組態(tài)軟件的腳本語言是擴充組態(tài)系統(tǒng)功能的重要手段,;在通信平臺領(lǐng)域,IVR(自動語音應(yīng)答)流程編程,;Office辦公軟件,,提供的宏和VBA;其他應(yīng)用軟件如ER Studio提供的Basic MacroEditor,,用戶可以編寫Sax Basic腳本操作ER圖,,生成Access庫,、導(dǎo)出Word文檔等擴展功能。
3 腳本語言在數(shù)據(jù)采集系統(tǒng)中的應(yīng)用
縱觀程序設(shè)計語言的發(fā)展,,一個很顯著的特點就是以機器的性能換取人的效率,,以提高開發(fā)者的工作效率和滿足人的需求為目標,在所有資源中人是最昂貴的資源,,因而程序的編寫從面向機器逐漸向面向人過度,。而腳本語言就是可以提高開發(fā)效率和滿足客戶需求程序設(shè)計的最好選擇。比如在開發(fā)中需要對客戶自定義表達式計算時,,如果自己去寫表達式解析,,將是一個幾乎無法完成的任務(wù)。而使用微軟的Script控件,,把表達式作為腳本函數(shù)返回值,,讓Script控件解釋計算,幾行代碼就完成了,,開發(fā)效率大大提高,。
在軟件系統(tǒng)實踐中,用的最多的就是把腳本嵌入應(yīng)用程序中,??焖匍_發(fā)工具Delphi除了可用使用ActiveX控件類型的腳本引擎外,也有許多優(yōu)秀的原生Delphi腳本引擎控件如Scripter Studio,,PaxScr4pter,,Inner Fuse Pascal Script,F(xiàn)ast Script等,。在開發(fā)一款通用的數(shù)據(jù)采集系統(tǒng)中,,就采用了核心架構(gòu)使用高級語言,用戶擴展和通訊協(xié)議使用Fast Script描述的設(shè)計模式,。之所以選擇FastScript,,因為Fast Script是一個交叉平臺的語言的腳本引擎,。它對希望增加腳本功能的編程人員非常有用,。Fast Script是用100%的Object Pascal編寫,具有支持OLE和變量數(shù)組,,可以使用多語言腳本(Pascal Script,、C++ Script、JScript和BasicScript),,與標準面向?qū)ο笳Z言語法相近,,可以使用程序內(nèi)的任何對象、標準庫訪問基類,、控件,、窗體和DB,;易可擴展的庫結(jié)構(gòu);內(nèi)存占用小等特點,。
系統(tǒng)的結(jié)構(gòu),,如圖1所示。采用這種模式,,就是要充分發(fā)揮系統(tǒng)程序語言和腳本語言的各自優(yōu)勢,。因為核心架構(gòu)需要創(chuàng)建采集線程、進行任務(wù)調(diào)度,、處理系統(tǒng)消息和加載腳本引擎等,,而這些需要穩(wěn)定且處理效率高,所以使用系統(tǒng)程序語言開發(fā),;而對于千變?nèi)f化的通訊協(xié)議,,如果全都被系統(tǒng)核心架構(gòu)包括,是不可能的,。而把各種通訊協(xié)議用不同的腳本語言文件描述,,供采集系統(tǒng)調(diào)用,問題就可以解決了,。
如圖1所示,,通過系統(tǒng)配置,告訴采集核心需要建立的采集通道(對應(yīng)采集點,,每個通道的任務(wù)在自己的線程中調(diào)度),,以及每個通道的采集任務(wù)(對應(yīng)與通訊協(xié)議腳本)和調(diào)度方案(何時啟動采集或者多長時間周期采集一次)。正是應(yīng)用了腳本語言描述采集任務(wù),,使得系統(tǒng)具有高度靈活的可配置性,。
采集任務(wù)通過xml文檔描述,具體的通訊使用Fast Script描述,。xml文檔結(jié)構(gòu)如下:
<項目名稱=“采集器對時”開始流程=“通信步驟1”>
<全局變量初始化腳本=“…”/>
<通信流程名稱=“通信步驟1”下一流程=“通信步驟2”>
<發(fā)送數(shù)據(jù)腳本=“…”/>
<收全判斷腳本=“…”/>
<正確回復(fù)腳本=“…”/>
</通信流程>
……
<通信流程名稱=“通信步驟n”下一流程=“”>
<發(fā)送數(shù)據(jù)腳本=“…”/>
<正確回復(fù)腳本=“…”/>
<收全判斷腳本=“…”/>
</通信流程>
<數(shù)據(jù)處理腳本=“…”/>
</項目>
在系統(tǒng)核心中,,把系統(tǒng)一些常量,、函數(shù)聲明、讀入的腳本一起組成完整的腳本,。
以下是幾個典型腳本的例程(函數(shù)聲明為系統(tǒng)定義,,斜體部分為XML文檔中讀入系統(tǒng))。
全局變量初始化腳本如下:
Procedure (Conn: TADOConnection,; varGlobalVar:Variant),;
begin{全局變量分別為采集點地址,開始地址,,結(jié)束地址}!--處理收到數(shù)據(jù)的腳本,,一般用于數(shù)據(jù)解析并保存數(shù)據(jù)-->!--判斷通信步驟收到數(shù)據(jù)是否正確的腳本-->!--判斷通信數(shù)據(jù)是否收全的腳本,,收全后進入下一步驟-->!--通信步驟發(fā)送數(shù)據(jù)的腳本-->!--采集任務(wù)必要的全局變量加載腳本-->
系統(tǒng)核心按照XML定義的流程,,通過腳本控件的CallFunction、CallFunctionl,、CallFunction2方法調(diào)用腳本中的函數(shù),,根據(jù)執(zhí)行結(jié)果執(zhí)行相關(guān)操作并寫入日志。在實踐應(yīng)用中發(fā)現(xiàn),,整個腳本的語法檢查(Compile方法)占用系統(tǒng)的資源最多,、對系統(tǒng)影響較大。所以在系統(tǒng)開始時,,就把所有任務(wù)腳本讀人內(nèi)存中,,并通過腳本控件的語法檢查,這樣雖然加大了系統(tǒng)內(nèi)存開銷,,但是整個腳本語法檢查只做一次,,任務(wù)調(diào)度時直接執(zhí)行腳本。比較與每次任務(wù)調(diào)度時讀人腳本,、檢查語法,、執(zhí)行,效率提高相當明顯,,幾乎可以達到與系統(tǒng)語言相媲美水平,。
除了描述采集通訊協(xié)議,系統(tǒng)還允許用戶通過腳本自定義界面,,開發(fā)了腳本編輯,、調(diào)試工具,方便腳本編寫,,這里不作詳述,。
從上述應(yīng)用可以發(fā)現(xiàn),這種腳本的語法與Del-phi十分相似,,易于編寫,,又能描述復(fù)雜、變化的任務(wù),。即能保持基本框架不變,,又能使系統(tǒng)靈活。
4 結(jié)束語
今天,,用腳本語言編寫的應(yīng)用程序的數(shù)目遠多于用系統(tǒng)程序設(shè)計語言編寫的應(yīng)用程序的數(shù)目。在Unix系統(tǒng)中有比C程序更多的外部腳本,。當然,,多數(shù)大型和廣泛使用的應(yīng)用程序都是用系統(tǒng)程序設(shè)計語言寫成的,,但腳本語言已經(jīng)是應(yīng)用程序開發(fā)的主動力,并且今后它的市場份額會繼續(xù)提高,。腳本將對越來越多的應(yīng)用程序產(chǎn)生吸引力,。以Python,Perl,,Tcl,,Ruby為代表的動態(tài)語言越來越受到開發(fā)者的青睞,使用動態(tài)語言群體,、社區(qū)不斷壯大,,許多開發(fā)團隊不再單純使用一種語言編程開發(fā)軟件,而是混合式編程,,動態(tài)語言作為膠水語言專為應(yīng)用程序而設(shè)計,,在今后的混合式應(yīng)用中變的越來越重要,甚至有人認為腳本語言是“21世紀更高級的編程語言”,。