白 勇
(重慶電力高等??茖W(xué)校,重慶 400053)
近年來,隨著計算機(jī)應(yīng)用越來越多地參與到經(jīng)濟(jì)建設(shè)和家庭生活當(dāng)中來,對計算機(jī)軟件的需求也越來越大。社會不但需要大量的專業(yè)化定制軟件來滿足實際應(yīng)用的需求,同時對于軟件行業(yè)人員來講,集成開發(fā)環(huán)境(IDE)的易用性、功能強(qiáng)大性和安全性,直接關(guān)系到軟件開發(fā)的效率和質(zhì)量,因此,擁有高質(zhì)量的集成開發(fā)環(huán)境是必須的。
但是我們需要看到,在大型商業(yè)化集成開發(fā)環(huán)境中,對腳本類語言的支持不足。有的雖然可以編輯和調(diào)試VBScript等腳本類語言,但并未提供與其他編譯運行語言類似的代碼智能提示功能,甚至調(diào)試期間不能斷點執(zhí)行,也不能動態(tài)地獲得變量值,這在網(wǎng)頁和COM類應(yīng)用中大量使用腳本語言的現(xiàn)狀下,令腳本語言開發(fā)者感到十分不便。因此,我們需要一種專門針對于腳本語言的集成開發(fā)環(huán)境。
為解決這個問題,本文提出了一種基于.NET的VBScript集成開發(fā)環(huán)境的系統(tǒng)架構(gòu)及主要功能的設(shè)計思路,并使用.NET平臺的C#語言實現(xiàn)了該集成開發(fā)環(huán)境。該課題具有十分重要的實際應(yīng)用價值和廣闊的市場前景。
在現(xiàn)代互聯(lián)網(wǎng)和應(yīng)用程序中,腳本語言(Javascript,VBScript等)扮演著非常重要的角色,并被越來越多的程序員以及普通用戶認(rèn)識、掌握。腳本語言通過解釋器,邊解釋邊運行,擁有大型編程語言(C++,C#,Java等)所不具有的方便靈活的特性,使用腳本語言進(jìn)行開發(fā),一方面可以最大限度地擴(kuò)展程序的應(yīng)用范圍,另一方面也方便程序員利用現(xiàn)有腳本提供的一些特別的功能(如正則表達(dá)式等),十分有用[1]。
Microsoft Script Control控件是由美國微軟公司推出的一款可調(diào)試Javascript與VBScript腳本的控件,它內(nèi)建了完備的COM接口,包括IActiveScriptSite接口和IActiveScriptSiteWindow接口等,并針對Active Scripting功能提供了面向?qū)ο蠼涌冢?]。使用Microsoft Script Control控件,可以最大限度地利用資源,為腳本代碼提供成熟可靠的調(diào)試環(huán)境。
Microsoft Script Control控件提供的主要接口有以下幾種[3-4]。
(1)Language。該屬性可設(shè)置需要調(diào)試的腳本語言,包括Javascript和VBScript兩個枚舉值。
(2)Timeout。該屬性可設(shè)置腳本引擎調(diào)試時的超時時間,單位是毫秒。當(dāng)某條腳本語句執(zhí)行時間超過該值時,將觸發(fā)一個Timeout事件。設(shè)置為-1表示永不超時。
(3)UseSafeSubset。這是一個布爾值,用于設(shè)置是否在安全模式下運行腳本代碼。安全模式運行時將進(jìn)行代碼檢查,不允許系統(tǒng)級腳本語句的執(zhí)行。設(shè)置為true時將在安全模式下運行,設(shè)置為false時表示不在安全模式下運行。
(4)Error 該屬性返回一個Error類型的錯誤對象,用于程序調(diào)試失敗時獲取錯誤,該屬性為一個只讀屬性。
(5)AddCode(string Code)。該方法允許使用者將腳本代碼添加至腳本引擎中去。被添加的腳本代碼將在稍后被執(zhí)行。
(6)AddObject(string Name,object Object,[Bool AddMembers = False] )。該方法允許使用者添加外部的,非本腳本代碼所創(chuàng)建的對象至腳本引擎中,以便使用該對象的接口等。
(7)Eval(string Expression)。該接口允許使用者對表達(dá)式求值。該表達(dá)式必須為一個值對象,比如返回結(jié)果為string,int,bool對象的表達(dá)式。而返回非值對象(例如返回一個Excel對象的表達(dá)式)則不可以使用該接口獲得其值。
(8)ExecuteStatement(string Statement)。該接口允許使用者執(zhí)行腳本語句。
(9)Reset()。該方法可以將腳本引擎的所有屬性設(shè)為默認(rèn)值,丟棄所有的對象和代碼,并將state屬性置為0。
(10)Error。該事件在腳本執(zhí)行出錯時被觸發(fā)。
(11)TimeOut。該事件在腳本執(zhí)行超時被觸發(fā)。
在VBScript集成開發(fā)環(huán)境中,需要提供以下功能。
文件操作功能:包括了項目文件的新建、打開與保存,以及防止文件因未保存而丟失信息的自動存檔功能。
代碼編輯功能:包括了代碼的錄入、修改和刪除,復(fù)制、粘貼和剪切,操作的撤銷和重做,以及添加或刪除整行功能。
調(diào)試功能:需要提供代碼調(diào)試的方法,包括整體調(diào)試、單步調(diào)試、繼續(xù)調(diào)試以及停止調(diào)試,同時還需要提供錯誤信息提示和超時信息提示功能。對于錯誤信息提示功能來說,需要根據(jù)不同的錯誤,提示詳細(xì)的錯誤信息。
變量提取功能:包括了對用戶輸入代碼的變量檢測功能,將用戶代碼內(nèi)的變量均檢測到,同時還需提供判定變量類型的變量類型確定功能。最后,為了滿足調(diào)試過程中用戶對變量值的跟蹤,還需提供變量值的獲取功能。
智能提示功能:包括了對用戶輸入的對象的接口提示,需要顯示該對象的所有方法和屬性,支持用戶通過鼠標(biāo)或者鍵盤來選取或者添加某個方法或?qū)傩?,同時當(dāng)用戶的輸入發(fā)生改變時,該功能需要動態(tài)更新提示信息以使之符合用戶的最新輸入。同時還包括了對用戶輸入的函數(shù)接口提示,當(dāng)用戶輸入一個函數(shù)名后,需要提示該函數(shù)的形參格式供用戶參考。
其他功能:包括了對象和變量的瀏覽功能,以及通過拖拽對象或者變量,自動生成代碼功能等。
在上述功能中,調(diào)試功能和變量提取功能是關(guān)鍵功能。
基于上面的分析可知,VBScript集成開發(fā)環(huán)境需要提供文件操作、代碼編輯與調(diào)試、變量提取以及智能提示等功能。
在文件操作模塊中,需要定義一種文件格式,用于持久化存儲用戶在集成開發(fā)環(huán)境內(nèi)的編輯內(nèi)容。該文件選用XML格式。
系統(tǒng)的總體架構(gòu)如圖1所示。
圖1 系統(tǒng)總體架構(gòu)圖
調(diào)試功能是集成開發(fā)環(huán)境所必不可少的功能,也是其核心功能之一。我們使用Microsoft Script Control控件來進(jìn)行代碼調(diào)試。在使用之前,需要先對控件進(jìn)行封裝。封裝后的接口如下:
public static ScriptEngine(ScriptLanguage language,bool UseSafeSubset);
這里主要封裝了代碼語言以及是否使用安全運行模式這兩個參數(shù)。封裝后的方法使用了單例模式,當(dāng)?shù)谝淮握{(diào)用該接口時,程序會新建一個Microsoft Script Control對象并對其屬性賦初值;當(dāng)重復(fù)調(diào)用該接口時,程序會令原先的Microsoft Script Control對象執(zhí)行Reset()方法,并重新賦初值。這樣可以使得整個程序在運行期間,只創(chuàng)建一個Microsoft Script Control對象,有效保證了一致性,并節(jié)省了系統(tǒng)資源。
當(dāng)進(jìn)行調(diào)試時,程序首先會脫離編輯狀態(tài),然后調(diào)用封裝的ScriptEngine方法來創(chuàng)建或重置Microsoft Script Control對象;然后程序?qū)⒁来巫x入每一個代碼單元格內(nèi)的代碼,使用AddObject接口將腳本代碼傳遞給調(diào)試引擎并執(zhí)行之。當(dāng)前一個單元格內(nèi)的代碼執(zhí)行完畢時,后面一個單元格內(nèi)的代碼會被讀入并執(zhí)行;當(dāng)所有代碼單元格都被執(zhí)行過時,此時調(diào)試完成,程序結(jié)束調(diào)試任務(wù);當(dāng)調(diào)試中出現(xiàn)錯誤時,調(diào)試會中止執(zhí)行。
整體調(diào)試偽代碼如下:
當(dāng)用戶離開代碼編輯狀態(tài),或者改變單元格時,變量探測器會啟動。首先,它通過換行符將一個單元格內(nèi)的代碼分割成若干個語句,然后逐語句分析,當(dāng)該句由”Dim”,“Set”開頭,含有等號,或者是foreach循環(huán)語句時,變量探測器會根據(jù)不同情況進(jìn)行具體分析,嘗試獲取變量,總體流程圖如圖2所示。
當(dāng)變量探測器探測到變量后,將嘗試獲取該變量的值或類型。這是通過對等號右邊的語句進(jìn)行語法分析得到的[5-6],包括以下幾種情況。
(1)右側(cè)為CreateObject語句。這種情況下,首先截取右側(cè)語句,獲取CreateObject語句傳入的參數(shù)。根據(jù)該參數(shù)的名稱,讀取相應(yīng)的類型定義文件,則該對象的Entrance元素的name屬性值即為該變量的類型。
(2)右側(cè)為表達(dá)式。這種情況下,可以確定該變量為一個泛型變量,因此可以將其Value留空,待調(diào)試時,通過調(diào)試控件的Eval方法來獲得該變量值。
當(dāng)代碼識別出該變量為表達(dá)式后,還需要確定變量的類型。類型一共有4種:整型、浮點型、布爾型以及字符型。系統(tǒng)根據(jù)如下規(guī)則來確定變量類型:
若表達(dá)式中有雙引號,則該變量為字符型;
若表達(dá)式為”true”或者”false”,則該變量為布爾型;
若表達(dá)式中含有點號,則該變量為浮點型;
否則,該變量為整型。
圖2 變量探測與類型確定流程圖
(3)右側(cè)為變量。此時左側(cè)與右側(cè)變量類型相同,將右側(cè)變量類型賦給左側(cè)變量即可。
(4)右側(cè)為變量的子方法或子屬性。這種情況下,需要先獲得右側(cè)變量的類型,然后在該對象的類型定義文件中,以右側(cè)變量的類型為入口,逐級查找方法或?qū)傩缘姆祷刂担罱K確定左側(cè)變量的類型。例如,有如下語句:
Set worksheets1 = xlsName1.Workbooks.Add.Sheets
則判定步驟如下:首先通過前面的語法分析,得知右側(cè)變量的類型為Excel Application;然后打開文件,先查詢Entrance元素,然后跳轉(zhuǎn)到ApplicationClass元素;接著在ApplicationClass元素中搜索Workbooks屬性,得知其返回類型為Workbooks;這時跳轉(zhuǎn)到Workbooks元素,查找到Add方法的返回值為Workbook;最后跳轉(zhuǎn)至Workbook元素,判定其Sheets屬性返回值為Worksheets。則最終可確定worksheets1的類型為Worksheets。
在上一小節(jié)中,我們討論了系統(tǒng)如何探測到變量,以及變量類型的確定。而對于基本數(shù)據(jù)類型來說,其值的獲取與顯示,對于調(diào)試程序也擁有重要意義,本小節(jié)討論基本數(shù)據(jù)類型值的獲取。
在變量探測器探測到變量并確定類型后,它會將變量存入一個Dictionary中,格式如下 :
Dictionary
其中l(wèi)ineIndex存儲了單元格的行號,而后面的Vector則存儲了該單元格內(nèi)代碼的變量信息。當(dāng)用戶調(diào)試程序時,每當(dāng)一個單元格的代碼成功執(zhí)行,系統(tǒng)會去該Dictionary中讀取該行的變量列表。對于列表中的每一個變量,若其類型為基本數(shù)據(jù)類型,則會通過Microsoft Script Control控件提供的Eval方法來獲取其變量值,方法如下:
object obj = scriptEngine.Eval(varName);
執(zhí)行該方法后,變量varName的值會被存儲至obj對象中。至此,我們已獲得了該變量的值,然后將其更新至變量列表即可。
系統(tǒng)最終實現(xiàn)的界面如圖3所示。
圖3 系統(tǒng)界面圖
系統(tǒng)界面的最上方為標(biāo)題欄,接下來為菜單欄和工具欄。下方的主要部分為代碼編輯區(qū),右側(cè)為對象瀏覽器和變量瀏覽器,彈出的窗體為智能提示窗體。
最終實現(xiàn)的系統(tǒng)可以對VBScript代碼提供編輯、調(diào)試、保存和導(dǎo)出功能,整個系統(tǒng)魯棒性佳,具有重要的實用價值。
本文首先對相關(guān)技術(shù)和理論進(jìn)行了介紹,然后提出了一種基于.NET的VBScript集成開發(fā)環(huán)境的系統(tǒng)架構(gòu)和主要功能的設(shè)計思路,并給出實現(xiàn)方案。該系統(tǒng)彌補(bǔ)了現(xiàn)有集成開發(fā)環(huán)境對腳本語言支持的不足,具有重要的現(xiàn)實意義和廣闊的市場前景。
[1] 陳立平,劉媛杰,王志勇.結(jié)合Script Control組件實現(xiàn)GIS應(yīng)用的二次開發(fā)功能[J] . 塔里木大學(xué)學(xué)報,2007,(2):43-44,59.
[2] 劉日仙,袁利永. Script Control在VB自動閱卷系統(tǒng)中的應(yīng)用[J] .計算機(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] 范忠鋒,劉堅.用詞/語法分析器生成器實現(xiàn)軟件系統(tǒng)的輸入[J] .計算機(jī)應(yīng)用. 2002,(1): 39-41.
[6] 溫敬和.LR分析法在詞法分析器自動構(gòu)造中的應(yīng)用[J] .計算機(jī)工程,2001,(7): 188-190.