alex 解釋器 alexinterpreter

jopen 12年前發布 | 14K 次閱讀 解釋器

一種面向alex語法規則的腳本解釋器, 此解釋器執行過程是通過內部實現的基于stack設計的虛擬機。與多數基于虛擬機的解釋器執行過程大致相同: 詞法分析(lex)->語法分析(parse)->編譯處理(com,編譯成alex虛擬機支持的匯編指令)->虛擬機執行(vm)。由于在編譯階段中沒法脫離虛擬機,所以無法直接生成laxc的二進制文件,這樣的流程跟一般的編譯器的流程不甚相同,所以對此程序命名時由原來的編譯器改成了解釋器,但從宏觀的角度上來說,現在對于編譯與解釋的定義與經典的編譯和解釋已經越來越不相同,兩者之間的設計多有交集。所以對于腳本語言來說,并沒有嚴格意義上的編譯和解釋這樣的區分。

alex的特性:

語法類C,屏蔽了類型定義,以及內存管理; 數據類型:number string arraylist 解釋器會對string arraylist 進行GC 處理,其中arraylist是集合定義,組員可以泛型存儲。

GC特性:

GC的回收是通過最古老的計數回收算法,對string會有特殊處理,避免了重復字符串。由于是計數回收,所以會存在循環引用導致的內存無法釋放問題,后續版本會將GC改為標記遍歷機制。

ANI特性:

加入了關鍵字using "XXX.DLL" ,其中"xxx.DLL"為所要引入的DLL路徑。可以引入dll中注冊給alex虛擬機的函數的接口。從而在腳本中你能夠調用dll中的函數; 所引用的dll必須要實現跟alex解釋器約定好的接口函數:alex_dll_reg(其中實現了dll中注冊給alex解釋器的函數),同時實現的導出函數必須是int func(void*p)類型,參數通過ani_pop_xxx(p)來獲得,返回值通過ani_push_xxx(),具體請參閱 a_window.dll的實現代碼。(沒有JNI強大,看看YY下就行了,呵呵)

COM特性:

編譯生成alex自定義的匯編二進制指令,其中指令集是基于stack而設計的,指令長度是單地址訪問,由于對全局變量和常量string的定義與vm耦合性過高,沒法在com 編譯階段直接生成可執行的二進制文件。輸出的alex匯編指令沒有做過多的優化,所以存在一定的效率問題。

VM 特性:

虛擬機基于stack設計,輸入為alex匯編指令,內部設置5個堆棧:

code stack:代碼段,vm解析的匯編指令流。 local stack:局部變量堆棧段。 data stack:vm執行指令時用到的運算堆棧。 call stack:函數調用堆棧。 global stack:全局變量堆棧,保存全局聲明的變量以及函數。 由于com編譯生成的指令過程沒有過多的優化,大面積的pop push 堆棧;以及設計的訪問local 和global地址存在效率問題,導致此虛擬機在執行過程中會出現一定量的冗余。

項目主頁:http://www.baiduhome.net/lib/view/home/1340875495608

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!