淺析J2ME Snake腳本引擎用法
本文向大家描述一下J2ME Snake腳本引擎,主要包括高級(jí)代碼編寫,低級(jí)代碼編寫和腳本虛擬機(jī)(SVM)等內(nèi)容,相信本文介紹一定會(huì)讓你有所收獲。
J2ME Snake腳本引擎簡(jiǎn)介
一、J2ME Snake腳本引擎高級(jí)代碼編寫:
1,語法類似于C。
2,支持函數(shù)定義,函數(shù)調(diào)用,數(shù)組,表達(dá)式,循環(huán),分支。
3,弱類型(lua也是),內(nèi)建類型有string,int,float,boolean
如定義變量varx;可以給x賦的值有x="你好Snake";x=32;x=32.23;x=true;
4,內(nèi)建35個(gè)運(yùn)算符,適用于所有的表達(dá)式,如位運(yùn)算>>邏輯運(yùn)算&&賦值運(yùn)算|=等等,運(yùn)算符優(yōu)先級(jí)簡(jiǎn)化為4級(jí),由高到低為單目運(yùn)算>算數(shù)運(yùn)算>關(guān)系運(yùn)算>邏輯運(yùn)算,如果你寫代碼是不確定運(yùn)算符的優(yōu)先級(jí)保險(xiǎn)起見加上括號(hào)就不會(huì)有錯(cuò)。
5,支持轉(zhuǎn)義字符輸入。
6,支持注釋,如行注釋符//及塊注釋符/**/
二、J2ME Snake腳本引擎低級(jí)代碼編寫:
1,語法類似于8086匯編,但要比它簡(jiǎn)單的多,有33種虛擬指令可供選擇,并且可以定義方法演示一個(gè)完整的加法函數(shù)及函數(shù)調(diào)用(分號(hào)是行注釋符):
- myAdd()
- {
- paramy;函數(shù)參數(shù)y
- paramx;函數(shù)參數(shù)x
- Addx,y;將y的值與x相加并賦給x
- Mov_RetVal,x;將x值賦給寄存器(只有一個(gè)寄存器即_RetVal)
- Ret;方法返回符(可以省略)
- }
- _Main()
- {
- varx;定義局部變量x
- vary;定義局部變量y
- varz;定義局部變量
- Movx,2;將2賦給x
- Movy,3;將3賦給y
- Pushx;將x壓棧,調(diào)用方法需要將參數(shù)壓棧
- Pushy;將y壓棧
- CallmyAdd;調(diào)用方法
- Movz,_RetVal;將寄存器的值賦給z
- }
判斷和分支的低級(jí)代碼我就不給出了,想了解的話可以先寫高代碼,再用編譯器編譯成低級(jí)代碼(在編譯器中輸入?yún)?shù)-A)再參照低級(jí)代碼來研究
話說回來,為什么要設(shè)計(jì)低級(jí)代碼呢,干脆直接寫高級(jí)代碼多方便,之所以這樣設(shè)計(jì)是由于編譯器編譯跳轉(zhuǎn)分支那部分都非常的精簡(jiǎn),運(yùn)行速度非常的快,但是編譯表達(dá)式就比較繁瑣,雖然在3個(gè)星期前我壓根不知道什么叫編譯原理,但是通過寫腳本的詞法分析,語法分析,匯編等程序我才發(fā)現(xiàn)它的難度和復(fù)雜度超出想象好幾倍,當(dāng)前***的編譯器如C++編譯器是用狀態(tài)機(jī)進(jìn)行語法分析,在表達(dá)式的編譯上做足了優(yōu)化,可是我才是個(gè)初學(xué)者,為了加快研發(fā)速度我使用了半狀態(tài)機(jī)半遞歸下降的方式進(jìn)行編譯,所以在效率上沒有做太多優(yōu)化,所以如果您想寫復(fù)雜表達(dá)式求值并需要快速運(yùn)行的代碼,還是建議用低級(jí)代碼編寫,***可以和高級(jí)代碼進(jìn)行合并,用匯編器匯編成二進(jìn)制。#p#
三、J2ME Snake腳本引擎之腳本虛擬機(jī)(SVM)
1,虛擬機(jī)的執(zhí)行是基于字節(jié)碼的,只有一個(gè)寄存器_RetVal用來存放返回值,運(yùn)行時(shí)堆棧是用來進(jìn)行函數(shù)調(diào)用的大小默認(rèn)是512K,可以自己更改比如在低級(jí)代碼上頭部加入關(guān)鍵字SetStackSize1024虛擬機(jī)會(huì)根據(jù)設(shè)置來修改堆棧大小
2,和主游戲引擎通信是基于方法調(diào)用,需要自己寫方法庫類,這個(gè)類需要繼承Lib.class,在自己的方法庫中實(shí)現(xiàn)方法,考慮到效率,沒有通信是沒有用到對(duì)象,并且也不是基于RTTI機(jī)制,所以使用時(shí)務(wù)必要注意2點(diǎn),這兩點(diǎn)寫在測(cè)試包里,可以去看一下。
3,錯(cuò)誤處理也是考慮到效率沒有基于java的異常,而是只打印錯(cuò)印并且虛擬機(jī)會(huì)正常運(yùn)行,可是一旦打印出錯(cuò)誤,需要做的就是停下運(yùn)行的程序檢查腳本有沒有,或者是虛擬機(jī)的核心執(zhí)行單元有沒有BUG如果不這樣做,那么后面的腳本數(shù)據(jù)已經(jīng)成臟數(shù)據(jù),會(huì)對(duì)游戲邏輯造成潛在的危險(xiǎn)。
4,多線程:J2ME Snake腳本引擎能加載多個(gè)腳本并發(fā)執(zhí)行,并且每個(gè)線程有個(gè)優(yōu)先級(jí),優(yōu)先級(jí)高的腳本能分到更多的時(shí)間片,SVM來管理這些線程的運(yùn)行,并且主游戲引擎能方便的操作腳本虛擬機(jī)加載,暫停,停止,恢復(fù)這些腳本線程。(0.8版提供多線程功能)
5,運(yùn)行方式:主游戲引擎在while循環(huán)中,每次調(diào)用虛擬機(jī)的runScript(inttime)方法,通過傳入時(shí)間片來決定虛擬機(jī)在這個(gè)循環(huán)周期運(yùn)行多長(zhǎng)時(shí)間,所以腳本里就可以寫這樣的循環(huán)while(true)也就是腳本有自己的邏輯死循環(huán),但是它不會(huì)干擾主引擎的邏輯死循環(huán),因?yàn)樵趥魅氲臅r(shí)間片運(yùn)行完時(shí),腳本引擎會(huì)自動(dòng)跳出來讓主引擎繼續(xù)運(yùn)行下一個(gè)循環(huán),而這些對(duì)編程人員都是透明的。
【編輯推薦】
- 術(shù)語匯編 J2ME 3D技術(shù)簡(jiǎn)介
- 深入了解J2ME Polish+Eclipse配置過程
- 探究J2ME中cookie庫的管理
- 深入了解J2ME網(wǎng)絡(luò)程序設(shè)計(jì)
- 解析Linux下如何用eclipse搭建J2ME開發(fā)環(huán)境