alex 解釋器 alexinterpreter
一種面向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地址存在效率問題,導致此虛擬機在執行過程中會出現一定量的冗余。
本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!