李勇
(中國人民解放軍92941部隊96分隊,遼寧 葫蘆島 125001)
摘要:GIS(地理信息系統)是個復雜的系統,在主要功能一致的前提下,如何為用戶提供專用的系統是迫切需要解決的問題。腳本技術以其靈活的可定制性和可擴展性的優勢解決了此問題。研究了基于腳本引擎的開發技術,分析了基于腳本引擎的GIS結構,設計并實現了腳本引擎。
關鍵詞:3d GIS;腳本引擎;Lub;狀態轉換;虛擬機API
中圖分類號:TP319文獻標識碼:ADOI: 10.19358/j.issn.1674-7720.2017.10.007
引用格式:李勇.腳本引擎在三維GIS系統中的設計與實現[J].微型機與應用,2017,36(10):23-25,29.
0引言
隨著計算機技術的不斷發展,計算機編程語言和技術都發生了很大變化。在傳統的工程應用系統的設計中,軟件往往在實現之前用戶需求就發生變更。因此,人們迫切需要開發出可定制化、可用戶化和可擴展的軟件系統來減少需求變更所帶來的開發和維護成本[1]。
使用基于混合腳本編程的方法是實現擴展靈活的可定制軟件系統的有效方法。近年來,腳本語言憑借其強大的描述能力和靈活的語法結構,為應用程序提供腳本支持,從而進行混合語言開發被,成為實現可擴展和可定制的有效方案[2]。目前,腳本語言已經廣泛應用于計算機軟件領域,如JavaScrip應用于Web網頁設計、微軟的VBA用于Office應用的自動化以及開源領域中Ruby、Python、Jython等腳本語言[3]。
本文主要關注在三維GIS系統中,如何實現可定制、可擴展功能的腳本引擎,來滿足用戶的多元化需求。
1腳本引擎關鍵技術分析
1.1腳本語言簡介
腳本語言是為了縮短傳統的編寫-編譯-鏈接-運行過程而創建的計算機編程語言,用來控制應用程序,具有良好的快速開發能力和與其他語言編寫的程序組件之間通信的功能[4]。很多腳本語言用來執行一次性任務,尤其是系統管理方面,它可以把服務組件粘合起來,廣泛用于GUI創建或者命令行。腳本通常以文本保存,只在被調用時進行解釋或編譯,經常把腳本和其他低級編程語言一起使用,各自發揮優勢解決特定問題[5]。
1.2腳本引擎技術分析
在腳本運行過程中,腳本引擎先將腳本解釋為中間指令,再執行中間指令,所以腳本引擎既是腳本解釋器又是腳本執行器[6]。此外,嵌入腳本引擎、支持腳本語言的應用程序稱為主程序[7]。腳本引擎、腳本程序與主程序之間的關系如圖1所示。腳本程序是用戶事先編寫完的字符串,可以保存到文本文件或特定格式文件中,能被腳本引擎識別;當需要執行某個腳本程序時,主程序通過調用腳本引擎API來啟動腳本引擎和通知腳本引擎執行此腳本程序;腳本引擎加載、解釋、
運行腳本程序,并將結果反饋給主程序。可見,腳本引擎是主程序和腳本程序的紐帶。
2腳本引擎在三維GIS系統中的結構分析
三維GIS是模擬、表示、管理、分析客觀世界中的三維空間實體及其相關信息的計算機系統,能為管理和決策提供更加直接和真實的目標和研究對象。為提高系統的穩定性和可移植性,在設計系統結構時采用先進的NTIER架構。系統軟件部分采用面向對象的設計方法以及基于組件設計的理念和技術,從縱向的架構層面上,該系統提供三大層面、若干小層面的抽象、映射、實現和封裝;應用層對各子系統的用戶業務處理邏輯進行實現和封裝,數據庫層是采用多種形式結構數據庫的總體封裝,提供本地及遠程多種數據連接方式,為應用層提供透明的數據存儲和訪問功能。GIS系統層次結構如圖2所示。
如圖2所示,該系統基于空間GIS數據庫和各類專用數據庫,運用VR技術,通過使用三維引擎及腳本引擎,實現三維地景瀏覽、空間定位查看、空間量測等豐富功能。腳本引擎模塊處于中間層,向下管理著各種專用數據庫數據;同層中,可調用三維引擎模塊,從而控制三維場景和模型的顯示方式;向上提供本模塊的調用接口,供應用層調用,完成資源的控制。
3腳本引擎總體結構設計
腳本引擎模塊結構為上下兩層。上層能識別腳本語言,并將腳本程序編譯成字節碼指令;下層執行字節碼指令。上下層的分離可以提高腳本引擎的可移植性和可擴展性。如圖3所示,上層編譯器負責將腳本源程序的字節流轉換成指令序列,對源程序進行詞法、語法等進行邏輯分析,當出現錯誤時給出錯誤圖3腳本引擎體系結構信息和定位錯位位置;虛擬機負責指令流的解釋執行;API是虛擬機與主程序交互的橋梁,實現兩者之間互相控制、通信。
4腳本引擎設計與實現
本腳本引擎面向的腳本語言為自主設計的語言Lub。Lub語法符合LL(1)型文法,可以采用自頂向下遞歸法進行語法解析。
4.1詞法分析器設計與實現
Lub腳本語言的詞法標記有四類:標識符、關鍵字、常量、特殊符號。標識符用來標識腳本程序中的變量、數組和函數,由字母、數字和下劃線組成,且標識符首字母不能是數字;關鍵字是能夠被詞法分析器識別的具有特定含義的字符串,如定義變量的關鍵字、運算符號、判斷符號、控制符號等;常量指數字和字符串;特殊符號包含注釋符、轉義符。
詞法分析器負責將輸入的源程序按照構詞規則分解成一系列單詞符號,功能可細分如下:輸入、預處理功能、超前搜索功能、狀態轉換功能。詞法分析器工作的第一步是輸入源程序文本,為了更好地對單詞符號識別,對輸入串先進行預處理,主要是過濾掉空格、注釋、換行符等;在詞法分析過程中,為了能確定詞性,需要超前搜索若干字符;詞法分析器使用狀態轉換圖來識別單詞符號。
4.1.1狀態轉換圖實現
狀態轉換圖是一張有限方向圖。在狀態轉換圖中,有一個初態,至少一個終態。輸入的字符信息進入狀態轉換圖的初始狀態,最終會經過一條路徑到達某個終結狀態,并得到其識別的字符串。下面給出注釋的狀態轉換圖,注釋格式:/* 注釋部分*/,轉換圖如圖4所示。
每讀入一個字符,如果字符是“/”,就說明后面的部分可能是注釋,再看下一個輸入字符,如果是“*”, 就是注釋中的“ /*”,那么后面的部分就是注釋部分,然后再用相同的方法找出"*/",對應的邏輯實現代碼如下:
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個關鍵字、5種控制語句和常見運算符,每個單詞符號都有對應的類別碼,見表1。
表1主要關鍵字對應的類別碼
詞法分析過程中會分析所有單詞,并獲得其類別碼,其實現函數定義如下:
Void gettypecode(INT char* string ,OUT BYTE syn,OUT char*toke);
輸入:待分析的源程序字符串。
輸出:syn為單詞類別碼,token為存放的單詞本身字符串。
4.2語法分析器設計與實現
語法分析器的作用是將詞法分析輸出的單詞序列作為輸入,根據語言的文法規則,生成中間代碼,語法分析遇到錯誤時會定位錯誤位置,以便糾錯。本文采用遞歸下降法實現語法分析。
遞歸下降分析法要求是LL(1)文法,其基本思想是對文法中的每個非終結符編寫一個函數,再利用函數之間的遞歸調用模擬語法樹自上而下的構造過程,具體實現方法概述如下:
(1)每個非終結符對應一個解析函數;
(2)產生式右側為該產生式左側非終結符所對應解析函數的“函數體”;
(3)產生式右側終結符對應從輸入串中“消耗”該終結符的操作;
(4)產生式中的‘|’對應函數體中的“ifelse”語句。
對應的邏輯實現主要結構和函數如下:
typedef struct LEX
{
Token read;
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) //執行語句
4.3虛擬機及接口的設計與實現
虛擬機模擬運行環境,執行字節碼,并對腳本得出相應的結果。本文的虛擬機是堆棧結構的,包括模擬處理器、寄存器和堆棧結構。作為三維顯示系統的一個輔助功能模塊,虛擬機需要與三維顯示系統相互調用,它是腳本引擎與三維顯示系統之間交互的平臺。其功能包括:初始化主要的數據結構;指令系統設計;虛擬機API設計。
4.3.1虛擬機主要結構
為了模擬CPU、寄存器等真實的運行環境,虛擬機必須包含與這些單元對應的數據結構,并需要指令執行所需要的結構。
指令流:獲取從語法分析器輸出的中間碼,是需要執行指令的集合。
程序計數器pc:指向下一個需要執行指令的指針。
堆棧:存放重要數據的存放地址,支持系統調用。
4.3.2虛擬機指令系統
虛擬機指令系統是以堆棧為中心設計的,避免了傳統的以寄存器為中心的限制。與硬件平臺的無關性使得虛擬機具有良好的跨平臺性。
每條指令以字節為單位,模擬處理器執行指令。不同的指令對應的操作數個數也不同。獲取字節后,根據字節碼確定其是指令還是數據,若是指令則判斷對應的操作數個數。由于采用堆棧方式,指令需要的參數都存放在堆棧中。主要的指令如下:
POP_LUB:堆棧棧頂出棧指令,沒有操作數。
PUSH_LUB:數據進棧指令,有1個操作數。
GETNUM_LUB:為參數分配內存空間指令,有1個操作數。
CALL_LUB:函數調用指令。
RET_LUB:函數返回指令。
根據功能,指令可分為三類:數據傳輸指令,包括進棧、出棧、變量內存空間分配等指令;運算指令,包括算術運算、邏輯運算和字符串運算指令;轉移指令,包括函數調用、返回、條件轉移等指令。
4.3.3腳本引擎API設計與實現
腳本引擎API是腳本引擎與主程序交互的窗口,負責兩者之間的通信。在三維顯示系統運行過程中,腳本引擎以動態庫的形式加載到主程序中,腳本引擎可以調用主程序中的全局變量、函數,實現對實例的訪問和調用。按照功能可將API劃分為三類。
(1)基礎信息管理類
用于進行全系統的基礎信息的配置維護,包括二維GIS數據的轉換和管理模塊,三維地景數據的轉換、管理和設置,主要API如下:
void CreateEntity (Str Name,Str Type,Str 2DFileName,Str 3DFileName);//為GIS創建物體
void loadearth(FLOAT[3] Pos, FLOAT[3] Pose);
//加載某個地景
void PlayCartoon(STR entityName, STR actionName, BOOL bRecycle);//加載視頻流
voidEntityStartMove (STR Name, STR AirwayName,FLOAT Speed);//模擬運動物體
(2)場景模擬類
用于模擬真實的世界場景,包括氣象天氣的模擬。主要API如下:
Void Rain_SetPara(INT RainAccount,DWORD UpColor,DWORD DownColor,INT RainCourse,INT RainAlpha);//模擬下雨效果
VoidSunshine_SetPara (FLOAT NorthAngle, FLOAT EastAngle);//模擬太陽效果
VOID SetCameraPosAndPose (FLOAT[3]Pos, FLOAT[3]
Pose);//設置相機參數,模擬從某個位置和角度觀察世界的效果。
(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);
5結論
為了提升GIS系統的可定制性,本文提出了基于腳本引擎的GIS系統設計思路,利用腳本技術將各個基礎功能模塊有效地組合起來,為用戶提供了二次開發的功能。
參考文獻
[1] 謝斌,高揚.基于腳本語言的三維動畫技術的研究與實現[D].成都:四川師范大學,2007.
[2] 吳文輝. 輕量級鍵盤鼠標模擬腳本引擎實現[J].軟件,2013,34(8):56-57.
[3] 高明.基于Java平臺的通用腳本引擎的研究與實現[D].北京: 北京郵電工大學,2007.
[4] 王朗.基于虛擬機的腳本引擎的研究與實現[D].長春: 吉林大學,2005.
[5] 謝錦春.基于腳本的三維場景合成和驗證系統[D] .杭州:浙江大學,2013.
[6] 諶勇.游戲腳本引擎設計與實現 [D].昆明:昆明理工大學,2007.
[7] 符盛寶.輕型腳本引擎的研究與開發 [D].北京:北京化工大學,2011.