考試結(jié)束了,Vczh Free Script 2.0也放出來了,正則表達式的代碼也一并發(fā)包含在VFS 2.0里面了。于是想寫一個關(guān)于如何開發(fā)腳本引擎的系列。過幾天要去實習(xí)了,如果找到晚上上網(wǎng)的辦法的話會陸續(xù)發(fā)出來,要不然的話只能在實習(xí)結(jié)束之后一并發(fā)上來了。
腳本引擎在很多時候都能用上,而且現(xiàn)在也有很多腳本引擎的產(chǎn)品了。為什么還要學(xué)習(xí)如何寫腳本引擎呢?其一是為了學(xué)習(xí),其二是為了了解。學(xué)習(xí)對于自己的編程水平的提高很有幫助,了解對于使用當今的腳本引擎也很有幫助。而且自己開發(fā)腳本引擎的好處在于可以自己控制安全問題。雖然這個在大多數(shù)情況下并不是優(yōu)先考慮的條件。
腳本引擎的開發(fā)是有一定的方法的。首先,要把輸入的腳本代碼變成記號,也就是說把“printf("Hello World");”變成print、(、"HelloWorld"、)和;五個部分。至于開發(fā)可配置的高速詞法分析器可以看這篇文章。接下來就是語法分析器。這個時候首先需要了解為什么代碼是一棵樹(數(shù)據(jù)結(jié)構(gòu)的樹),然后才能開始工作。至于如何寫語法分析器,或者詞法分析器也想手寫的話,可以看這篇文章。為了執(zhí)行效率,我們需要將語言抽象成指令集,就像X86的指令集一樣,但是更加簡單。可以使用堆棧機。
一門支持能垃圾收集的string、array和不能垃圾收集的class的語言是很容易編譯成機器碼的。現(xiàn)在我正在閱讀intel的文檔了解x86(32位)的指令格式。如果在寫文章的過程中這個問題被我解決了的話,我也會順便把如何將腳本編譯成機器碼以便加快執(zhí)行速度的辦法寫出來。現(xiàn)在我對于x86指令集的模式已經(jīng)了解了,剩下具體問題。垃圾收集器的資料并不多,我唯一找到的就是《Garbage Collection,Algorithms for Automatic Dynamic Memory Management》。中文版貌似賣完了,我只能下載英文版的影印版看。很慘。在文章里面我會講述一種比較簡單的單代compact垃圾收集器(.NET用的是多代)。
文章的組織暫時決定使用如下方法:
·如何設(shè)計合適自己使用的語言
·詞法分析器、語法分析器與語法樹的結(jié)構(gòu)(一開始只有函數(shù)、字符串以及能進行垃圾收集的數(shù)組,弱類型語言)
·如何設(shè)計合適的指令集
·指令集(堆棧機)的數(shù)據(jù)結(jié)構(gòu)以及從語法樹翻譯到指令集的方法
·虛擬機的開發(fā)
·如何向虛擬機加入外部函數(shù)以便讓腳本可以調(diào)用程序提供的其他功能
·進一步修改語言,加上其他特性等
如果x86的指令集研究的速度夠快的話,將會添加如下內(nèi)容
·分配寄存器的算法
·x86指令格式
·如何調(diào)用自己產(chǎn)生的機器碼
這個系列持續(xù)的時間將比較久,而且每一篇文章將附帶示例代碼。如果只需要了解方法而不需要看具體的實現(xiàn)的朋友們可以略過這個部分。關(guān)于具體實現(xiàn)的部分我將可能在文章中標明出來。
posted on 2008-07-06 08:37
陳梓瀚(vczh) 閱讀(2280)
評論(5) 編輯 收藏 引用 所屬分類:
腳本技術(shù)