李 勇
(中國人民解放軍92941部隊96分隊,遼寧 葫蘆島 125001)
腳本引擎在三維GIS系統(tǒng)中的設(shè)計與實現(xiàn)
李 勇
(中國人民解放軍92941部隊96分隊,遼寧 葫蘆島 125001)
GIS(地理信息系統(tǒng))是個復(fù)雜的系統(tǒng),在主要功能一致的前提下,如何為用戶提供專用的系統(tǒng)是迫切需要解決的問題。腳本技術(shù)以其靈活的可定制性和可擴展性的優(yōu)勢解決了此問題。研究了基于腳本引擎的開發(fā)技術(shù),分析了基于腳本引擎的GIS結(jié)構(gòu),設(shè)計并實現(xiàn)了腳本引擎。
3d GIS;腳本引擎;Lub;狀態(tài)轉(zhuǎn)換;虛擬機API
隨著計算機技術(shù)的不斷發(fā)展,計算機編程語言和技術(shù)都發(fā)生了很大變化。在傳統(tǒng)的工程應(yīng)用系統(tǒng)的設(shè)計中,軟件往往在實現(xiàn)之前用戶需求就發(fā)生變更。因此,人們迫切需要開發(fā)出可定制化、可用戶化和可擴展的軟件系統(tǒng)來減少需求變更所帶來的開發(fā)和維護成本[1]。
使用基于混合腳本編程的方法是實現(xiàn)擴展靈活的可定制軟件系統(tǒng)的有效方法。近年來,腳本語言憑借其強大的描述能力和靈活的語法結(jié)構(gòu),為應(yīng)用程序提供腳本支持,從而進行混合語言開發(fā)被,成為實現(xiàn)可擴展和可定制的有效方案[2]。目前,腳本語言已經(jīng)廣泛應(yīng)用于計算機軟件領(lǐng)域,如JavaScrip應(yīng)用于Web網(wǎng)頁設(shè)計、微軟的VBA用于Office應(yīng)用的自動化以及開源領(lǐng)域中Ruby、Python、Jython等腳本語言[3]。
本文主要關(guān)注在三維GIS系統(tǒng)中,如何實現(xiàn)可定制、可擴展功能的腳本引擎,來滿足用戶的多元化需求。
1.1 腳本語言簡介
腳本語言是為了縮短傳統(tǒng)的編寫-編譯-鏈接-運行過程而創(chuàng)建的計算機編程語言,用來控制應(yīng)用程序,具有良好的快速開發(fā)能力和與其他語言編寫的程序組件之間通信的功能[4]。很多腳本語言用來執(zhí)行一次性任務(wù),尤其是系統(tǒng)管理方面,它可以把服務(wù)組件粘合起來,廣泛用于GUI創(chuàng)建或者命令行。腳本通常以文本保存,只在被調(diào)用時進行解釋或編譯,經(jīng)常把腳本和其他低級編程語言一起使用,各自發(fā)揮優(yōu)勢解決特定問題[5]。
1.2 腳本引擎技術(shù)分析
圖1 腳本引擎與主程序關(guān)系
在腳本運行過程中,腳本引擎先將腳本解釋為中間指令,再執(zhí)行中間指令,所以腳本引擎既是腳本解釋器又是腳本執(zhí)行器[6]。此外,嵌入腳本引擎、支持腳本語言的應(yīng)用程序稱為主程序[7]。腳本引擎、腳本程序與主程序之間的關(guān)系如圖1所示。腳本程序是用戶事先編寫完的字符串,可以保存到文本文件或特定格式文件中,能被腳本引擎識別;當(dāng)需要執(zhí)行某個腳本程序時,主程序通過調(diào)用腳本引擎API來啟動腳本引擎和通知腳本引擎執(zhí)行此腳本程序;腳本引擎加載、解釋、運行腳本程序,并將結(jié)果反饋給主程序。可見,腳本引擎是主程序和腳本程序的紐帶。
三維GIS是模擬、表示、管理、分析客觀世界中的三維空間實體及其相關(guān)信息的計算機系統(tǒng),能為管理和決策提供更加直接和真實的目標(biāo)和研究對象。為提高系統(tǒng)的穩(wěn)定性和可移植性,在設(shè)計系統(tǒng)結(jié)構(gòu)時采用先進的N-TIER架構(gòu)。系統(tǒng)軟件部分采用面向?qū)ο蟮脑O(shè)計方法以及基于組件設(shè)計的理念和技術(shù),從縱向的架構(gòu)層面上,該系統(tǒng)提供三大層面、若干小層面的抽象、映射、實現(xiàn)和封裝;應(yīng)用層對各子系統(tǒng)的用戶業(yè)務(wù)處理邏輯進行實現(xiàn)和封裝,數(shù)據(jù)庫層是采用多種形式結(jié)構(gòu)數(shù)據(jù)庫的總體封裝,提供本地及遠(yuǎn)程多種數(shù)據(jù)連接方式,為應(yīng)用層提供透明的數(shù)據(jù)存儲和訪問功能。GIS系統(tǒng)層次結(jié)構(gòu)如圖2所示。
圖2 GIS系統(tǒng)層次結(jié)構(gòu)
如圖2所示,該系統(tǒng)基于空間GIS數(shù)據(jù)庫和各類專用數(shù)據(jù)庫,運用VR技術(shù),通過使用三維引擎及腳本引擎,實現(xiàn)三維地景瀏覽、空間定位查看、空間量測等豐富功能。腳本引擎模塊處于中間層,向下管理著各種專用數(shù)據(jù)庫數(shù)據(jù);同層中,可調(diào)用三維引擎模塊,從而控制三維場景和模型的顯示方式;向上提供本模塊的調(diào)用接口,供應(yīng)用層調(diào)用,完成資源的控制。
圖3 腳本引擎體系結(jié)構(gòu)
腳本引擎模塊結(jié)構(gòu)為上下兩層。上層能識別腳本語言,并將腳本程序編譯成字節(jié)碼指令;下層執(zhí)行字節(jié)碼指令。上下層的分離可以提高腳本引擎的可移植性和可擴展性。如圖3所示,上層編譯器負(fù)責(zé)將腳本源程序的字節(jié)流轉(zhuǎn)換成指令序列,對源程序進行詞法、語法等進行邏輯分析,當(dāng)出現(xiàn)錯誤時給出錯誤信息和定位錯位位置;虛擬機負(fù)責(zé)指令流的解釋執(zhí)行;API是虛擬機與主程序交互的橋梁,實現(xiàn)兩者之間互相控制、通信。
本腳本引擎面向的腳本語言為自主設(shè)計的語言Lub。Lub語法符合LL(1)型文法,可以采用自頂向下遞歸法進行語法解析。
4.1 詞法分析器設(shè)計與實現(xiàn)
Lub腳本語言的詞法標(biāo)記有四類:標(biāo)識符、關(guān)鍵字、常量、特殊符號。標(biāo)識符用來標(biāo)識腳本程序中的變量、數(shù)組和函數(shù),由字母、數(shù)字和下劃線組成,且標(biāo)識符首字母不能是數(shù)字;關(guān)鍵字是能夠被詞法分析器識別的具有特定含義的字符串,如定義變量的關(guān)鍵字、運算符號、判斷符號、控制符號等;常量指數(shù)字和字符串;特殊符號包含注釋符、轉(zhuǎn)義符。
詞法分析器負(fù)責(zé)將輸入的源程序按照構(gòu)詞規(guī)則分解成一系列單詞符號,功能可細(xì)分如下:輸入、預(yù)處理功能、超前搜索功能、狀態(tài)轉(zhuǎn)換功能。詞法分析器工作的第一步是輸入源程序文本,為了更好地對單詞符號識別,對輸入串先進行預(yù)處理,主要是過濾掉空格、注釋、換行符等;在詞法分析過程中,為了能確定詞性,需要超前搜索若干字符;詞法分析器使用狀態(tài)轉(zhuǎn)換圖來識別單詞符號。
4.1.1 狀態(tài)轉(zhuǎn)換圖實現(xiàn)
狀態(tài)轉(zhuǎn)換圖是一張有限方向圖。在狀態(tài)轉(zhuǎn)換圖中,有一個初態(tài),至少一個終態(tài)。輸入的字符信息進入狀態(tài)轉(zhuǎn)換圖的初始狀態(tài),最終會經(jīng)過一條路徑到達某個終結(jié)狀態(tài),并得到其識別的字符串。下面給出注釋的狀態(tài)轉(zhuǎn)換圖,注釋格式:/* 注釋部分*/,轉(zhuǎn)換圖如圖4所示。
圖4 注釋識別的狀態(tài)轉(zhuǎn)換圖
每讀入一個字符,如果字符是“/”,就說明后面的部分可能是注釋,再看下一個輸入字符,如果是“*”,就是注釋中的“ /*”,那么后面的部分就是注釋部分,然后再用相同的方法找出"*/",對應(yīng)的邏輯實現(xiàn)代碼如下:
while((ch=getchar())!=EOF)
switch(state)
case 1 : if ch=="/",state=2,break;
case 2: if ch=="*",state=3
else state=1;break;
case 3: if ch=="*",state=4;
else state=3;break;
case 4: if ch=="/",state=5;
else state=3;break;
case 5: ……
4.1.2 待分析的詞法及類別碼
腳本引擎支持16個關(guān)鍵字、5種控制語句和常見運算符,每個單詞符號都有對應(yīng)的類別碼,見表1。
表1 主要關(guān)鍵字對應(yīng)的類別碼
詞法分析過程中會分析所有單詞,并獲得其類別碼,其實現(xiàn)函數(shù)定義如下:
Void gettypecode(INT char* string ,OUT BYTE syn,OUT char*toke);
輸入:待分析的源程序字符串。
輸出:syn為單詞類別碼,token為存放的單詞本身字符串。
4.2 語法分析器設(shè)計與實現(xiàn)
語法分析器的作用是將詞法分析輸出的單詞序列作為輸入,根據(jù)語言的文法規(guī)則,生成中間代碼,語法分析遇到錯誤時會定位錯誤位置,以便糾錯。本文采用遞歸下降法實現(xiàn)語法分析。
遞歸下降分析法要求是LL(1)文法,其基本思想是對文法中的每個非終結(jié)符編寫一個函數(shù),再利用函數(shù)之間的遞歸調(diào)用模擬語法樹自上而下的構(gòu)造過程,具體實現(xiàn)方法概述如下:
(1)每個非終結(jié)符對應(yīng)一個解析函數(shù);
(2)產(chǎn)生式右側(cè)為該產(chǎn)生式左側(cè)非終結(jié)符所對應(yīng)解析函數(shù)的“函數(shù)體”;
(3)產(chǎn)生式右側(cè)終結(jié)符對應(yīng)從輸入串中“消耗”該終結(jié)符的操作;
(4)產(chǎn)生式中的‘|’對應(yīng)函數(shù)體中的“if-else”語句。
對應(yīng)的邏輯實現(xiàn)主要結(jié)構(gòu)和函數(shù)如下:
typedef struct LEX
{
struct LEX *next;
size_t line;
}MYLEX; //詞法分析得到的所有字符串集合
MYLEX* Read_file(MYLEX* current);
MYLEX* Advance(MYLEX* current); //單詞
int match(Token read ,Token aim);
int Execute_statement(void) //執(zhí)行語句
直腸癌包括齒線至乙狀結(jié)腸直腸交界之間的癌,是最常見的惡性腫瘤之一,目前我國低位直腸癌約占直腸癌總數(shù)的75%[1]。對于低位直腸癌患者,Miles根治術(shù)是普遍采用的手術(shù)方法[2]?;颊咭蛐枰Y(jié)腸造口,即人工肛門,排便方式發(fā)生了很大改變,可能嚴(yán)重影響術(shù)后的生活質(zhì)量[3]。大部分患者出院后因自我護理能力不足,導(dǎo)致了術(shù)后并發(fā)癥的發(fā)生。據(jù)文獻報道,腸造口并發(fā)癥發(fā)生率國外為11.0% ~60.0%;國內(nèi)為16.3% ~53.8%,平均發(fā)生率 20.8%[4]。因此,我們在患者出院后對患者進行綜合社區(qū)干預(yù),探討干預(yù)對患者術(shù)后自我護理能力的影響,現(xiàn)將方法及結(jié)果報道如下。
4.3 虛擬機及接口的設(shè)計與實現(xiàn)
虛擬機模擬運行環(huán)境,執(zhí)行字節(jié)碼,并對腳本得出相應(yīng)的結(jié)果。本文的虛擬機是堆棧結(jié)構(gòu)的,包括模擬處理器、寄存器和堆棧結(jié)構(gòu)。作為三維顯示系統(tǒng)的一個輔助功能模塊,虛擬機需要與三維顯示系統(tǒng)相互調(diào)用,它是腳本引擎與三維顯示系統(tǒng)之間交互的平臺。其功能包括:初始化主要的數(shù)據(jù)結(jié)構(gòu);指令系統(tǒng)設(shè)計;虛擬機API設(shè)計。
4.3.1 虛擬機主要結(jié)構(gòu)
為了模擬CPU、寄存器等真實的運行環(huán)境,虛擬機必須包含與這些單元對應(yīng)的數(shù)據(jù)結(jié)構(gòu),并需要指令執(zhí)行所需要的結(jié)構(gòu)。
指令流:獲取從語法分析器輸出的中間碼,是需要執(zhí)行指令的集合。
程序計數(shù)器pc:指向下一個需要執(zhí)行指令的指針。
堆棧:存放重要數(shù)據(jù)的存放地址,支持系統(tǒng)調(diào)用。
4.3.2 虛擬機指令系統(tǒng)
虛擬機指令系統(tǒng)是以堆棧為中心設(shè)計的,避免了傳統(tǒng)的以寄存器為中心的限制。與硬件平臺的無關(guān)性使得虛擬機具有良好的跨平臺性。
每條指令以字節(jié)為單位,模擬處理器執(zhí)行指令。不同的指令對應(yīng)的操作數(shù)個數(shù)也不同。獲取字節(jié)后,根據(jù)字節(jié)碼確定其是指令還是數(shù)據(jù),若是指令則判斷對應(yīng)的操作數(shù)個數(shù)。由于采用堆棧方式,指令需要的參數(shù)都存放在堆棧中。主要的指令如下:
POP_LUB:堆棧棧頂出棧指令,沒有操作數(shù)。
PUSH_LUB:數(shù)據(jù)進棧指令,有1個操作數(shù)。
GETNUM_LUB:為參數(shù)分配內(nèi)存空間指令,有1個操作數(shù)。
CALL_LUB:函數(shù)調(diào)用指令。
RET_LUB:函數(shù)返回指令。
根據(jù)功能,指令可分為三類:數(shù)據(jù)傳輸指令,包括進棧、出棧、變量內(nèi)存空間分配等指令;運算指令,包括算術(shù)運算、邏輯運算和字符串運算指令;轉(zhuǎn)移指令,包括函數(shù)調(diào)用、返回、條件轉(zhuǎn)移等指令。
4.3.3 腳本引擎API設(shè)計與實現(xiàn)
腳本引擎API是腳本引擎與主程序交互的窗口,負(fù)責(zé)兩者之間的通信。在三維顯示系統(tǒng)運行過程中,腳本引擎以動態(tài)庫的形式加載到主程序中,腳本引擎可以調(diào)用主程序中的全局變量、函數(shù),實現(xiàn)對實例的訪問和調(diào)用。按照功能可將API劃分為三類。
(1)基礎(chǔ)信息管理類
用于進行全系統(tǒng)的基礎(chǔ)信息的配置維護,包括二維GIS數(shù)據(jù)的轉(zhuǎn)換和管理模塊,三維地景數(shù)據(jù)的轉(zhuǎn)換、管理和設(shè)置,主要API如下:
void CreateEntity (Str Name,Str Type,Str 2DFileName,Str 3DFileName); //為GIS創(chuàng)建物體
void loadearth(FLOAT[3] Pos,FLOAT[3] Pose); //加載某個地景
void PlayCartoon(STR entityName,STR actionName,BOOL bRecycle); //加載視頻流
void EntityStartMove (STR Name,STR AirwayName,FLOAT Speed); //模擬運動物體
(2)場景模擬類
用于模擬真實的世界場景,包括氣象天氣的模擬。主要API如下:
Void Rain_SetPara(INT RainAccount,DWORD UpColor,DWORD DownColor,INT RainCourse,INT RainAlpha); //模擬下雨效果
Void Sunshine_SetPara (FLOAT NorthAngle,FLOAT EastAngle); //模擬太陽效果
VOID SetCameraPosAndPose (FLOAT[3] Pos,FLOAT[3]Pose);//設(shè)置相機參數(shù),模擬從某個位置和角度觀察世界的效果。
(3)方案管理類
主要用于制作有特定需求的顯示方案,主要API如下:
bool SkyLine_Create(STR Name);
void SkyLine_AddPoint(STR Name,FLOAT[3] Pos,INT time);
void CurveCreate (STR Name,INT Width,INT Color);
為了提升GIS系統(tǒng)的可定制性,本文提出了基于腳本引擎的GIS系統(tǒng)設(shè)計思路,利用腳本技術(shù)將各個基礎(chǔ)功能模塊有效地組合起來,為用戶提供了二次開發(fā)的功能。
[1] 謝斌,高揚.基于腳本語言的三維動畫技術(shù)的研究與實現(xiàn)[D].成都:四川師范大學(xué),2007.
[2] 吳文輝.輕量級鍵盤鼠標(biāo)模擬腳本引擎實現(xiàn)[J].軟件,2013,34(8):56-57.
[3] 高明.基于Java平臺的通用腳本引擎的研究與實現(xiàn)[D].北京:北京郵電工大學(xué),2007.
[4] 王朗.基于虛擬機的腳本引擎的研究與實現(xiàn)[D].長春:吉林大學(xué),2005.
[5] 謝錦春.基于腳本的三維場景合成和驗證系統(tǒng)[D] .杭州:浙江大學(xué),2013.
[6] 諶勇.游戲腳本引擎設(shè)計與實現(xiàn) [D].昆明:昆明理工大學(xué),2007.
[7] 符盛寶.輕型腳本引擎的研究與開發(fā) [D].北京:北京化工大學(xué),2011.
Design and implementation of script engine in 3d GIS system
Li Yong
(PLA 96 Division of 92941 Unit,Huludao 125001,China)
GIS (Geographic Information System) is a complex system.Under the premise of consistent main function,the problem of how to provide users a dedicated system needs to be solved rapidly.The script technologies solves this problem with its flexible customization and extensibility.The development technology based on script engine is studied.The GIS structure based on script engine is analyzed,and the script engine is designed and implemented.
3d GIS; script engine; Lub; state transition; API of virtual machine
TP319
A
10.19358/j.issn.1674- 7720.2017.10.007
李勇.腳本引擎在三維GIS系統(tǒng)中的設(shè)計與實現(xiàn)[J].微型機與應(yīng)用,2017,36(10):23-25,29.
2016-12-26)
李勇(1983-),通信作者,男,碩士研究生,工程師,主要研究方向:計算機應(yīng)用軟件、系統(tǒng)安全。E-mail:liyong_hld@163.com。