摘要: 腳本引擎的作用在于增強(qiáng)程序的可配置性。從游戲到管理系統(tǒng)都需要腳本,甚至連工業(yè)級(jí)產(chǎn)品的Office、3DS Max以及AutoCAD等都添加了屬于自己的腳本語(yǔ)言。DHTML的出現(xiàn)讓我們可以在網(wǎng)頁(yè)代碼中嵌入腳本語(yǔ)言,PHP和ASP等技術(shù)的出現(xiàn)讓我們可以將一個(gè)應(yīng)用程序的界面換成網(wǎng)頁(yè),而邏輯使用腳本語(yǔ)言編寫(xiě)。現(xiàn)在腳本語(yǔ)言的種類繁多,Python的發(fā)展讓BOOST庫(kù)擁有了對(duì)Python的支持,Rails框架的出現(xiàn)壯大了Ruby的實(shí)力,LUA更是被大量應(yīng)用在游戲開(kāi)發(fā)中。Windows甚至提供了wscript以便讓我們能夠調(diào)用javascript和vbscript的代碼。
既然有了這么多可供選擇的腳本引擎,為什么我們?nèi)匀灰_(kāi)發(fā)自己的腳本引擎呢?
閱讀全文
posted @
2008-07-07 07:45 陳梓瀚(vczh) 閱讀(21697) |
評(píng)論 (12) |
編輯 收藏
考試結(jié)束了,Vczh Free Script 2.0也放出來(lái)了,正則表達(dá)式的代碼也一并發(fā)包含在VFS 2.0里面了。于是想寫(xiě)一個(gè)關(guān)于如何開(kāi)發(fā)腳本引擎的系列。過(guò)幾天要去實(shí)習(xí)了,如果找到晚上上網(wǎng)的辦法的話會(huì)陸續(xù)發(fā)出來(lái),要不然的話只能在實(shí)習(xí)結(jié)束之后一并發(fā)上來(lái)了。
腳本引擎在很多時(shí)候都能用上,而且現(xiàn)在也有很多腳本引擎的產(chǎn)品了。為什么還要學(xué)習(xí)如何寫(xiě)腳本引擎呢?其一是為了學(xué)習(xí),其二是為了了解。學(xué)習(xí)對(duì)于自己的編程水平的提高很有幫助,了解對(duì)于使用當(dāng)今的腳本引擎也很有幫助。而且自己開(kāi)發(fā)腳本引擎的好處在于可以自己控制安全問(wèn)題。雖然這個(gè)在大多數(shù)情況下并不是優(yōu)先考慮的條件。
腳本引擎的開(kāi)發(fā)是有一定的方法的。首先,要把輸入的腳本代碼變成記號(hào),也就是說(shuō)把“printf("Hello World");”變成print、(、"HelloWorld"、)和;五個(gè)部分。至于開(kāi)發(fā)可配置的高速詞法分析器可以看這篇文章。接下來(lái)就是語(yǔ)法分析器。這個(gè)時(shí)候首先需要了解為什么代碼是一棵樹(shù)(數(shù)據(jù)結(jié)構(gòu)的樹(shù)),然后才能開(kāi)始工作。至于如何寫(xiě)語(yǔ)法分析器,或者詞法分析器也想手寫(xiě)的話,可以看這篇文章。為了執(zhí)行效率,我們需要將語(yǔ)言抽象成指令集,就像X86的指令集一樣,但是更加簡(jiǎn)單。可以使用堆棧機(jī)。
一門(mén)支持能垃圾收集的string、array和不能垃圾收集的class的語(yǔ)言是很容易編譯成機(jī)器碼的。現(xiàn)在我正在閱讀intel的文檔了解x86(32位)的指令格式。如果在寫(xiě)文章的過(guò)程中這個(gè)問(wèn)題被我解決了的話,我也會(huì)順便把如何將腳本編譯成機(jī)器碼以便加快執(zhí)行速度的辦法寫(xiě)出來(lái)。現(xiàn)在我對(duì)于x86指令集的模式已經(jīng)了解了,剩下具體問(wèn)題。垃圾收集器的資料并不多,我唯一找到的就是《Garbage Collection,Algorithms for Automatic Dynamic Memory Management》。中文版貌似賣完了,我只能下載英文版的影印版看。很慘。在文章里面我會(huì)講述一種比較簡(jiǎn)單的單代compact垃圾收集器(.NET用的是多代)。
文章的組織暫時(shí)決定使用如下方法:
·如何設(shè)計(jì)合適自己使用的語(yǔ)言
·詞法分析器、語(yǔ)法分析器與語(yǔ)法樹(shù)的結(jié)構(gòu)(一開(kāi)始只有函數(shù)、字符串以及能進(jìn)行垃圾收集的數(shù)組,弱類型語(yǔ)言)
·如何設(shè)計(jì)合適的指令集
·指令集(堆棧機(jī))的數(shù)據(jù)結(jié)構(gòu)以及從語(yǔ)法樹(shù)翻譯到指令集的方法
·虛擬機(jī)的開(kāi)發(fā)
·如何向虛擬機(jī)加入外部函數(shù)以便讓腳本可以調(diào)用程序提供的其他功能
·進(jìn)一步修改語(yǔ)言,加上其他特性等
如果x86的指令集研究的速度夠快的話,將會(huì)添加如下內(nèi)容
·分配寄存器的算法
·x86指令格式
·如何調(diào)用自己產(chǎn)生的機(jī)器碼
這個(gè)系列持續(xù)的時(shí)間將比較久,而且每一篇文章將附帶示例代碼。如果只需要了解方法而不需要看具體的實(shí)現(xiàn)的朋友們可以略過(guò)這個(gè)部分。關(guān)于具體實(shí)現(xiàn)的部分我將可能在文章中標(biāo)明出來(lái)。
posted @
2008-07-06 08:37 陳梓瀚(vczh) 閱讀(2295) |
評(píng)論 (5) |
編輯 收藏
摘要: 作者保留對(duì)源代碼的一切權(quán)利
文件是一個(gè)rar壓縮包,結(jié)構(gòu)如下:
【產(chǎn)品】
【Demo】?jī)蓚€(gè)Demo的編譯結(jié)果。這個(gè)文件夾里面的腳本代碼僅供測(cè)試用。
【庫(kù)】編譯結(jié)果以及Vczh Free Script 2.0提供的插件封裝,使用Vczh Free Script腳本語(yǔ)言編寫(xiě)。
【文檔>】使用說(shuō)明書(shū)。
【源代碼】源代碼僅能使用Visual C++ 2005或以上編譯器編譯。
【FreeScript】使用FsRuntime.dll寫(xiě)的C++Demo,控制臺(tái)虛擬機(jī)。
【FreeScript_CSharp】使用FsRuntime_clr.dll寫(xiě)的C#Demo,控制臺(tái)虛擬機(jī)。
【FsRuntime】Vczh Free Script 2.0 DLL接口。
【FsRuntime_CLR】使用FsRuntime.dll寫(xiě)的.NET接口。
【Library】
【Data】數(shù)據(jù)輸出以及必要的操作系統(tǒng)接口封裝。
閱讀全文
posted @
2008-07-01 05:35 陳梓瀚(vczh) 閱讀(11218) |
評(píng)論 (23) |
編輯 收藏
摘要: 玩了幾天空之軌跡 FC,終于快結(jié)束了。距離最后一門(mén)考試還有3天,于是把整個(gè)XPath的代碼寫(xiě)完了。于是試用一下。
現(xiàn)在展示一下我那個(gè)XPath的使用方法:
1 VL_List
Result;
2 VL_XPath XPath(L"http://Files//File[contains(@RelativePath,\".cpp\") or contains(@RelativePath,\".h\")]");
3 XPath.Query(Doc.GetRootElement(),Result); 第一行聲明一個(gè)XML節(jié)點(diǎn)列表,第二行構(gòu)造一個(gè)XPath,第三行將XPath作用在一個(gè)XML文檔的根節(jié)點(diǎn)上。這個(gè)XPath用于把VC++9.0的工程文件中包含的所有.h文件和.cpp文件提取出來(lái)。雖然Files里面包含若干Filter,每一個(gè)Filter包含一些Filter和File,不過(guò)輸出結(jié)果Output.xml把所有的滿足要求的File節(jié)點(diǎn)都找了出來(lái)。
閱讀全文
posted @
2008-06-27 20:55 陳梓瀚(vczh) 閱讀(2436) |
評(píng)論 (2) |
編輯 收藏
摘要: 花了2個(gè)小時(shí)終于把XPath的數(shù)據(jù)結(jié)構(gòu)和語(yǔ)法分析做完了。這個(gè)XPath的語(yǔ)法完全按照MSDN所說(shuō)的做,除了減少了2個(gè)跟DTD相關(guān)的函數(shù)和11個(gè)Microsoft擴(kuò)展的"ms:"開(kāi)頭的函數(shù)以外,剩下的功能將一概支持。
代碼寫(xiě)完了之后,我打開(kāi)MSDN找里面的幾十條XPath Example進(jìn)行測(cè)試,發(fā)現(xiàn)了一些Bug,然后修正。現(xiàn)在MSDN所列舉的所有例子都通過(guò)了,接下來(lái)只有自己寫(xiě)Example進(jìn)行測(cè)試了。因?yàn)镸SDN的例子并沒(méi)有覆蓋所有等價(jià)類。
下面是運(yùn)行結(jié)果和測(cè)試程序的代碼:
閱讀全文
posted @
2008-06-21 00:34 陳梓瀚(vczh) 閱讀(2472) |
評(píng)論 (2) |
編輯 收藏
摘要: 為了整理出可以實(shí)現(xiàn)的XPath,我把根DTD相關(guān)的兩個(gè)內(nèi)置函數(shù)去掉了,Microsoft擴(kuò)展的11個(gè)函數(shù)也沒(méi)有考慮進(jìn)去。XPath是一門(mén)非圖靈完備的、沒(méi)有副作用的、弱類型以及很難看的語(yǔ)言,用于把一個(gè)XML的某個(gè)節(jié)點(diǎn)轉(zhuǎn)換成一些節(jié)點(diǎn)。
Context:上下文。指的是使用指定條件正在搜索的XML路徑的節(jié)點(diǎn)。
ContextList:被PREDICATE過(guò)濾的列表... 閱讀全文
posted @
2008-06-20 01:44 陳梓瀚(vczh) 閱讀(4922) |
評(píng)論 (1) |
編輯 收藏
摘要: 為了紀(jì)念自己為了明天的XML考試復(fù)習(xí)了半天,特地根據(jù)MSDN描述的標(biāo)準(zhǔn)做了一個(gè)XML的解釋器。接口類似DOM和SAX的混合體。
目前什么都不支持,不過(guò)以后打算做完DTD和XPath。XSD和XSL就先算了。反正是寫(xiě)著玩的。把代碼貼出來(lái)先。這個(gè)代碼使用了自己開(kāi)發(fā)的一套C++基礎(chǔ)庫(kù)。
閱讀全文
posted @
2008-06-19 05:28 陳梓瀚(vczh) 閱讀(3180) |
評(píng)論 (8) |
編輯 收藏
摘要: 首先吐槽一下:今天考IT項(xiàng)目管理,100道選擇題。前幾天考配置管理,10道大題。如今的老師都喜歡走極端……
這個(gè)方法是在考完試回宿舍的路上想到的,適用于2D與3D。主要想法是這樣的。給定兩個(gè)幾何圖形A、B,把A和B都分成『內(nèi)『、『外』兩部分。A的『內(nèi)』就是處于B內(nèi)部的部分。于是A和B就變成了A內(nèi)、A外、B內(nèi)、B外。然后就有如下公式:
·A and B=A外+B外
·A sub B=A外+B內(nèi)
·A or B=A內(nèi)+B內(nèi)
·A xor B=A外+B外+A內(nèi)+B內(nèi)
這種數(shù)據(jù)結(jié)構(gòu)是為了滿足如下算法:一個(gè)A點(diǎn)在圖形內(nèi)<==>過(guò)這個(gè)點(diǎn)的直線交圖形與點(diǎn)集P,其中|{Pi|Pi<=A}|和|{Pi|Pi>=A}|都是奇數(shù)。注意我們使用的是<=和>=,這樣的話兩個(gè)集合的數(shù)量的奇偶性都是一致的。這個(gè)算法無(wú)論2D、3D多邊形還是3D多面體都能適用,就算是這個(gè)圖形有孔(鑲嵌)也可以,而且跟凹凸體無(wú)關(guān)。這個(gè)算法只有一種情況是不能用的:就是自己跟自己有交叉,譬如我們習(xí)慣的5條直線構(gòu)成五角星的畫(huà)法。這 閱讀全文
posted @
2008-06-16 19:20 陳梓瀚(vczh) 閱讀(4612) |
評(píng)論 (7) |
編輯 收藏
摘要: 網(wǎng)龍公司招聘
網(wǎng)龍公司是中國(guó)網(wǎng)絡(luò)游戲開(kāi)發(fā)商和運(yùn)營(yíng)商的領(lǐng)導(dǎo)者之一,總部位于中國(guó)福建省福州市。
1、大型WEB2.0網(wǎng)站架構(gòu)師
2、3D游戲引擎程序設(shè)計(jì)師
3、游戲客戶端程序員
4、游戲服務(wù)端程序員
5、游戲工具開(kāi)發(fā)程序員
6、手機(jī)平臺(tái)開(kāi)發(fā)程序員
7、驅(qū)動(dòng)開(kāi)發(fā)程序工程師
8、B/S程序員
9、WEB2.0游戲社區(qū)軟件開(kāi)發(fā)工程師
10、應(yīng)用軟件開(kāi)發(fā)程序員
月薪6千起,優(yōu)秀者月薪不封頂。享受基本養(yǎng)老、醫(yī)療、失業(yè)、工傷、生育等保險(xiǎn),以及公積金和公司福利。
聯(lián)系方式:
QQ:611990694(請(qǐng)備注:您的姓名和應(yīng)聘崗位)
EMAIL:hr@nd.com.cn
內(nèi)詳,版主勿刪。 閱讀全文
posted @
2008-06-16 07:35 陳梓瀚(vczh)|
編輯 收藏
摘要: 在寫(xiě)可配置的語(yǔ)法分析器之前,我覺(jué)得還是先說(shuō)說(shuō)如何手寫(xiě)語(yǔ)法分析器好。因?yàn)閷?duì)于大部分人來(lái)說(shuō),開(kāi)發(fā)一個(gè)可配置的語(yǔ)法分析器并沒(méi)有什么作用,反而針對(duì)某種特定的語(yǔ)法開(kāi)發(fā)特定的語(yǔ)法分析器是特別有必要的。典型的有表達(dá)式計(jì)算器、某種格式化的文件(HTML、XML等)或者是其他的復(fù)雜而且符合樹(shù)型結(jié)構(gòu)的字符串。根據(jù)目前論壇的反應(yīng)來(lái)看,有一些朋友們對(duì)如何開(kāi)發(fā)一套自己的腳本引擎比較感興趣。等基礎(chǔ)的文章都寫(xiě)完以后我會(huì)考慮撰寫(xiě)一個(gè)系列的文章介紹如何開(kāi)發(fā)自己的腳本引擎。
這篇文章會(huì)附帶一些必要的代碼以便幫助讀者們理解。為了方便,代碼使用DevC++開(kāi)發(fā)。 閱讀全文
posted @
2008-06-15 05:59 陳梓瀚(vczh) 閱讀(40218) |
評(píng)論 (28) |
編輯 收藏