腳本技術(shù)
描述跟腳本相關(guān)的各種技術(shù)
手把手教你寫(xiě)腳本引擎(五)——簡(jiǎn)單的高級(jí)語(yǔ)言(3,符號(hào)表)
摘要: 符號(hào)表的結(jié)構(gòu)的復(fù)雜度跟語(yǔ)言的語(yǔ)義規(guī)則的復(fù)雜度有關(guān)。對(duì)于C#來(lái)說(shuō),每一個(gè)符號(hào)都附帶了一大堆信息,譬如位置啦,所在的namespace啦,類型啦什么的。對(duì)于JavaScript來(lái)說(shuō),符號(hào)表幾乎是不需要的,因?yàn)闁|西都動(dòng)態(tài)了,編譯時(shí)幾乎不檢查內(nèi)容。語(yǔ)義分析的輸出是符號(hào)表,代碼生成的輸入是符號(hào)表和語(yǔ)法樹(shù)。因此語(yǔ)法樹(shù)除了放語(yǔ)法相關(guān)的內(nèi)容,語(yǔ)義相關(guān)的內(nèi)容最好放到符號(hào)表里面(譬如說(shuō)表達(dá)式的類型啦,語(yǔ)句的scope結(jié)果啦)。
閱讀全文
posted @
2009-05-10 18:48 陳梓瀚(vczh) 閱讀(7252) |
評(píng)論 (1) 編輯
手把手教你寫(xiě)腳本引擎 PPT與Demo(一)
摘要:
華南理工大學(xué)微軟俱樂(lè)部程序設(shè)計(jì)語(yǔ)言特別興趣小組——手把手教你寫(xiě)腳本引擎系列(一)
陳梓瀚
PPT內(nèi)容:
1、簡(jiǎn)單指令集的設(shè)計(jì)方法(支持分支、循環(huán)、函數(shù)、遞歸)。
2、編譯控制流程(分支和循環(huán))的一般模式。
3、函數(shù)調(diào)用的詳細(xì)過(guò)程。
4、5個(gè)示例程序。
Demo內(nèi)容:
PPT中5個(gè)示例程序的運(yùn)行過(guò)程(動(dòng)畫(huà)),左邊是單步,右邊是堆棧內(nèi)容。
含下載,內(nèi)詳。
閱讀全文
posted @
2009-03-28 01:43 陳梓瀚(vczh) 閱讀(10627) |
評(píng)論 (11) 編輯
Kernel FP的圖形Demo實(shí)現(xiàn)!
摘要: 其實(shí)有了一整套的Kernel FP API之后,只需要插入幾個(gè)外部函數(shù)就可以讓Kernel FP繪圖了。現(xiàn)在我們看一看這個(gè)Demo的樣子。
閱讀全文
posted @
2008-12-29 10:41 陳梓瀚(vczh) 閱讀(2719) |
評(píng)論 (0) 編輯
Kernel FP編譯器工具實(shí)現(xiàn)
摘要: 這次終于實(shí)現(xiàn)了兩個(gè)exe,一個(gè)是編譯器,一個(gè)是提供控制臺(tái)API的虛擬機(jī)。等提供GUI的虛擬機(jī)出來(lái)之后就開(kāi)放出來(lái)(內(nèi)有圖和代碼)。
閱讀全文
posted @
2008-12-26 08:07 陳梓瀚(vczh) 閱讀(2052) |
評(píng)論 (5) 編輯
Kernel FP 編譯器MakeFile開(kāi)發(fā)完成
摘要: Kernel FP的MakeFile可以指定輸出文件、報(bào)告文件以及代碼文件,并且可以繼承其他的MakeFile。MakeFile的格式和分析器代碼如下:
閱讀全文
posted @
2008-12-24 05:20 陳梓瀚(vczh) 閱讀(1789) |
評(píng)論 (1) 編輯
Kernep FP實(shí)現(xiàn)虛擬機(jī)的序列化與反序列化
摘要: 由于Kernel FP的編譯結(jié)果是獨(dú)立的,執(zhí)行的時(shí)候不需要源代碼的符號(hào)的參與,因此可以將編譯結(jié)果進(jìn)行序列化與反序列化。
閱讀全文
posted @
2008-12-23 00:50 陳梓瀚(vczh) 閱讀(1569) |
評(píng)論 (0) 編輯
Kernel FP添加反射API
摘要: 為了讓宿主程序可以更加清楚一份Kernel FP代碼的內(nèi)容,我今天為Kernel FP添加了反射的API。
閱讀全文
posted @
2008-12-20 06:10 陳梓瀚(vczh) 閱讀(1416) |
評(píng)論 (0) 編輯
使用Kernel FP的do-end語(yǔ)法糖添加自己的異常處理系統(tǒng)
摘要: 有的時(shí)候,IO的異常處理由于需要一個(gè)IOEnv類型的參數(shù)而顯得非常麻煩。這個(gè)時(shí)候我們可以定制自己的一套異常處理系統(tǒng),從而讓程序變得清晰起來(lái)。自己的異常處理系統(tǒng)不同于IO,是沒(méi)有副作用的函數(shù)集合。下面讓我們看一看如何使用自定義的異常處理系統(tǒng)來(lái)分析一個(gè)四則運(yùn)算表達(dá)式。
閱讀全文
posted @
2008-12-18 21:23 陳梓瀚(vczh) 閱讀(1448) |
評(píng)論 (0) 編輯
使用Kernel FP API實(shí)現(xiàn)一個(gè)運(yùn)行Kernel FP代碼的控制臺(tái)程序
摘要: 說(shuō)到底Kernel FP是一個(gè)腳本引擎,所以是需要API的。接下來(lái)的代碼用來(lái)加載一些Kernel FP代碼文件,并執(zhí)行main函數(shù)。
閱讀全文
posted @
2008-12-17 19:15 陳梓瀚(vczh) 閱讀(1634) |
評(píng)論 (1) 編輯
在純函數(shù)式語(yǔ)言內(nèi)實(shí)現(xiàn)有關(guān)IO的循環(huán)
摘要: 我們知道,循環(huán)本身是沒(méi)有返回值的。所以在純函數(shù)式語(yǔ)言下,跟IO有關(guān)的循環(huán)才有足夠的副作用來(lái)產(chǎn)生價(jià)值。于是利用IO Monad,我們就可以實(shí)現(xiàn)循環(huán)了。循環(huán)是一個(gè)函數(shù):
閱讀全文
posted @
2008-12-15 07:56 陳梓瀚(vczh) 閱讀(2155) |
評(píng)論 (2) 編輯
Kernel FP的do-end IO語(yǔ)法糖實(shí)現(xiàn)!
摘要: 前面說(shuō)過(guò),需要一個(gè)語(yǔ)法糖來(lái)組織IO,并且在其中的一步產(chǎn)生錯(cuò)誤的時(shí)候立刻返回錯(cuò)誤。現(xiàn)在我們看一段代碼:
閱讀全文
posted @
2008-12-15 06:22 陳梓瀚(vczh) 閱讀(1475) |
評(píng)論 (0) 編輯
Kernel FP 的四則運(yùn)算式子分析程序
摘要: 為了測(cè)試Kernel FP的健壯性以及進(jìn)行一些bug的排除,一個(gè)四則運(yùn)算式子的分析程序理所當(dāng)然地就被實(shí)現(xiàn)了。代碼如下:
閱讀全文
posted @
2008-12-13 07:13 陳梓瀚(vczh) 閱讀(3349) |
評(píng)論 (2) 編輯
Kernel FP成功運(yùn)行一部分列表處理程序
摘要: 經(jīng)過(guò)1個(gè)小時(shí)的奮斗,修了3個(gè)bug,終于使得Kernel FP能運(yùn)行的代碼漸漸多了起來(lái)。現(xiàn)在可以看看純函數(shù)式語(yǔ)言簡(jiǎn)潔的代碼及運(yùn)行結(jié)果啦!
下面是很多用于測(cè)試的main函數(shù):
閱讀全文
posted @
2008-12-12 10:03 陳梓瀚(vczh) 閱讀(1451) |
評(píng)論 (1) 編輯
Kernel FP成功運(yùn)行小程序
摘要: Kernel FP已經(jīng)可以運(yùn)行小程序了。現(xiàn)在還處于測(cè)試階段,過(guò)于復(fù)雜的程序估計(jì)是跑不過(guò)的。先簡(jiǎn)單介紹一下如何在C++調(diào)用Kernel FP的代碼。
閱讀全文
posted @
2008-12-10 23:03 陳梓瀚(vczh) 閱讀(1716) |
評(píng)論 (2) 編輯
Kernel FP:Expected語(yǔ)法完全支持!
摘要: 新加入的Expected語(yǔ)法已經(jīng)完全支持了。使用了Expected的符號(hào)會(huì)因?yàn)檎{(diào)用者的不同而使用不同的scope內(nèi)的函數(shù)。代碼如下:
閱讀全文
posted @
2008-11-03 05:41 陳梓瀚(vczh) 閱讀(1673) |
評(píng)論 (0) 編輯
Kernel FP的Expected語(yǔ)法實(shí)驗(yàn)
摘要: 有了Expected語(yǔ)法之后總是要實(shí)驗(yàn)一下的。現(xiàn)在給出一個(gè)非完整函數(shù)eq的聲明,并用一個(gè)列表查找函數(shù)使用eq。已知代碼如下:
閱讀全文
posted @
2008-11-02 07:36 陳梓瀚(vczh) 閱讀(1516) |
評(píng)論 (0) 編輯
決定為Kernel FP加入一個(gè)跟模板函有關(guān)數(shù)的語(yǔ)法
摘要: Kernel FP的模板函數(shù)比較嚴(yán)格。對(duì)于任意的模板函數(shù)的類型參數(shù),這個(gè)參數(shù)必須能夠接受所有類型。當(dāng)然,類型推導(dǎo)會(huì)通過(guò)閱讀代碼來(lái)精確化程序員設(shè)定的類型。譬如說(shuō)一個(gè)函數(shù)F的類型是T->T,但是經(jīng)過(guò)閱讀代碼發(fā)現(xiàn),參數(shù)只能是某種類型的列表,那么類型推導(dǎo)就會(huì)將這個(gè)函數(shù)的類型修改為list T->list T。
但是這樣會(huì)有一個(gè)問(wèn)題。類型推導(dǎo)只能夠推導(dǎo)已知的函數(shù)。如果一個(gè)模板函數(shù)里面用了操作符,而這個(gè)操作符暫時(shí)只為幾個(gè)類型定義的話,那么由于不是所有的類型都能夠接受該操作符,所以這個(gè)操作符就沒(méi)辦法給未知確切類型的參數(shù)使用。下面就有一個(gè)例子:
閱讀全文
posted @
2008-11-02 06:52 陳梓瀚(vczh) 閱讀(1328) |
評(píng)論 (0) 編輯
Kernel FP 模板函數(shù)實(shí)例化
摘要: 今天寫(xiě)了Kernel FP模板函數(shù)實(shí)例化的代碼。雖然還有一點(diǎn)小bug,不過(guò)還是說(shuō)一下。
閱讀全文
posted @
2008-11-01 07:05 陳梓瀚(vczh) 閱讀(1393) |
評(píng)論 (0) 編輯
改進(jìn)Kernel FP編譯器,生成類型推導(dǎo)的調(diào)試信息
摘要: 類型推導(dǎo)過(guò)于復(fù)雜,已經(jīng)到了無(wú)法Step In/Over的地步了,于是只好靠輸出大量調(diào)試信息來(lái)解決問(wèn)題。這里給出了我為Kernel FP開(kāi)發(fā)的一些簡(jiǎn)單的調(diào)試用宏。在不需要調(diào)試信息的時(shí)候,可以通過(guò)簡(jiǎn)單關(guān)閉調(diào)試而將產(chǎn)生調(diào)試信息的運(yùn)行時(shí)負(fù)擔(dān)完全去除。
閱讀全文
posted @
2008-10-29 10:04 陳梓瀚(vczh) 閱讀(2257) |
評(píng)論 (3) 編輯
是時(shí)候重構(gòu)了!
摘要: 實(shí)習(xí)的時(shí)候,自己的時(shí)間明顯沒(méi)有在學(xué)校的時(shí)候多啊。這次Kernel FP拖了很久,一個(gè)多月都還沒(méi)寫(xiě)完。幸好語(yǔ)法分析器用了之前開(kāi)發(fā)的Syngram,要不得多花一個(gè)月。Kernel FP的類型推導(dǎo)的代碼實(shí)在是很難看,趁著又發(fā)現(xiàn)了一個(gè)Bug,重構(gòu)一下。
內(nèi)含代碼
閱讀全文
posted @
2008-10-27 05:23 陳梓瀚(vczh) 閱讀(1989) |
評(píng)論 (6) 編輯
Kernel FP 虛擬機(jī)結(jié)構(gòu)
摘要: Kernel FP的虛擬機(jī)設(shè)計(jì)起來(lái)比較別扭,主要還是因?yàn)閘aziness的問(wèn)題。不過(guò)現(xiàn)在已經(jīng)有了一個(gè)能用的想法了。
閱讀全文
posted @
2008-10-18 23:29 陳梓瀚(vczh) 閱讀(1537) |
評(píng)論 (1) 編輯
Kernel FP 指令集
摘要: 類型推導(dǎo)到這里也就結(jié)束了。雖然可能有點(diǎn)小bug,不過(guò)這個(gè)以后遇到再處理了。接下來(lái)的一個(gè)模塊是跟類型推導(dǎo)沒(méi)有耦合的新模塊,兩邊可以平行處理。
Kernel FP的指令集不同于以往的指令集。因?yàn)樽鳛橐婚T(mén)純函數(shù)式語(yǔ)言,就必須要有l(wèi)aziness。這就是說(shuō),凡是可以不運(yùn)行的代碼都一定不運(yùn)行,凡是可以晚一點(diǎn)執(zhí)行的代碼一律等到需要的時(shí)候再執(zhí)行。也就是說(shuō),參數(shù)傳進(jìn)函數(shù)的時(shí)候,傳的是代碼而不是值。因此指令集只能用來(lái)表達(dá)代碼的邏輯結(jié)構(gòu)。
閱讀全文
posted @
2008-10-11 02:10 陳梓瀚(vczh) 閱讀(1441) |
評(píng)論 (1) 編輯
Kernel FP let-in表達(dá)式子函數(shù)包含父函數(shù)對(duì)象的類型推導(dǎo)
摘要: 有一些主函數(shù)的某些參數(shù)只在let-in表達(dá)式所定義的子函數(shù)使用,然后被主函數(shù)間接使用。今天修了一個(gè)bug支持了這種函數(shù)的類型推導(dǎo)。例子如下:
閱讀全文
posted @
2008-10-08 08:19 陳梓瀚(vczh) 閱讀(1357) |
評(píng)論 (0) 編輯
Kernel FP 更多的類型推導(dǎo)
摘要: 今天將Haskell的一部分列表處理函數(shù)抄進(jìn)了Kernel FP里,堅(jiān)持所有函數(shù)(模板函數(shù))不寫(xiě)類型,而讓編譯器進(jìn)行類型推導(dǎo):
閱讀全文
posted @
2008-10-07 08:10 陳梓瀚(vczh) 閱讀(1279) |
評(píng)論 (0) 編輯
Kernal FP所有表達(dá)式種類實(shí)現(xiàn)類型推導(dǎo)!
摘要: 經(jīng)過(guò)上一次的成功試驗(yàn),這次終于完成了剩余的表達(dá)式類型的類型推導(dǎo)。過(guò)程及結(jié)果如下:
閱讀全文
posted @
2008-10-06 06:47 陳梓瀚(vczh) 閱讀(1506) |
評(píng)論 (1) 編輯
Kernel FP 類型推導(dǎo)(Type Inference)實(shí)驗(yàn)成功!
摘要: 我終于在實(shí)驗(yàn)階段解決了這個(gè)困擾了我5個(gè)月(雖然實(shí)際上我花了3個(gè)星期)的問(wèn)題。目標(biāo)是這樣的:你寫(xiě)程序,可以盡可能的不寫(xiě)一些類型信息,譬如函數(shù)參數(shù)和返回值的類型信息等。我的編譯器幫你把它的類型算出來(lái)。
內(nèi)詳,有例子、方法和模型。
閱讀全文
posted @
2008-10-04 07:19 陳梓瀚(vczh) 閱讀(1838) |
評(píng)論 (3) 編輯
Kernel FP符號(hào)表完成
摘要: 經(jīng)過(guò)了5個(gè)小時(shí)的艱苦奮斗,符號(hào)表終于計(jì)算出來(lái)了,而且也做了一部分語(yǔ)法分析。接下來(lái)的工作是類型推導(dǎo)。今天的結(jié)果如下。
閱讀全文
posted @
2008-10-02 07:46 陳梓瀚(vczh) 閱讀(1686) |
評(píng)論 (1) 編輯
KernelFP 寫(xiě)的一個(gè)用通配符匹配字符串的程序
摘要: 輸入:
pattern : 含有通配符*與?的字符串
string : 被匹配的字符串
輸出:true與false代表匹配成功與失敗
僅19行
閱讀全文
posted @
2008-10-01 09:41 陳梓瀚(vczh) 閱讀(1471) |
評(píng)論 (0) 編輯
Kernel FP 語(yǔ)法分析完成
摘要: 語(yǔ)法分析器終于完成了,總共花了7個(gè)小時(shí)的時(shí)間。其中遇到了一些小問(wèn)題,譬如lambda expression的\param->expression和let-in expression的let declaration-list in expression里面的expression需要盡可能長(zhǎng)的解決辦法。因?yàn)橛昧薙yngram,所以不得不調(diào)整出符合需求的文法。
為了大概看一看文法有沒(méi)有寫(xiě)對(duì),我寫(xiě)了一個(gè)程序,讀入KernelFP語(yǔ)言寫(xiě)的一份代碼,將其格式化并輸出。
閱讀全文
posted @
2008-10-01 01:31 陳梓瀚(vczh) 閱讀(1565) |
評(píng)論 (0) 編輯
最小內(nèi)核語(yǔ)言
摘要: 國(guó)慶7天容易無(wú)聊,于是我打算實(shí)現(xiàn)一下以前失敗過(guò)的一種語(yǔ)言的特性:類型推導(dǎo)。于是順便做一做惰性計(jì)算吧。于是我嘗試設(shè)計(jì)了一門(mén)特性盡可能少的語(yǔ)言,并且強(qiáng)制讓一個(gè)函數(shù)的返回值僅跟輸入的參數(shù)有關(guān)。雖然這個(gè)特性不適合用來(lái)做IO,但是是有辦法解決的,而且不需要修改語(yǔ)言就可以直接支持。
這門(mén)語(yǔ)言的定義及其簡(jiǎn)單,需要預(yù)先定義的部分也是很少的,于是我嘗試實(shí)現(xiàn)了if、邏輯運(yùn)算符以及itoa和atoi兩個(gè)函數(shù)
閱讀全文
posted @
2008-09-28 07:14 陳梓瀚(vczh) 閱讀(2149) |
評(píng)論 (4) 編輯
自定義數(shù)據(jù)結(jié)構(gòu)的語(yǔ)法分析器成功!
摘要: 經(jīng)過(guò)三個(gè)小時(shí)的努力,一個(gè)供調(diào)試用的模擬器終于做出來(lái)了。對(duì)于一份語(yǔ)法說(shuō)明來(lái)講,我們需要提供調(diào)試器,一直到調(diào)試完了才生成代碼,這樣比較容易找到問(wèn)題。同時(shí)為了驗(yàn)證自己的那個(gè)設(shè)計(jì),于是做了一個(gè)調(diào)試器出來(lái)。這個(gè)調(diào)試器使用了這篇文章里的數(shù)據(jù)結(jié)構(gòu)文件以及文法文件,以及使用了這篇文章里開(kāi)發(fā)的一個(gè)樹(shù)到圖的轉(zhuǎn)換程序,成功得到結(jié)果!
閱讀全文
posted @
2008-09-14 07:22 陳梓瀚(vczh) 閱讀(1837) |
評(píng)論 (1) 編輯
語(yǔ)法分析器定義接近完成!
摘要: 除了錯(cuò)誤處理文件還沒(méi)有定義好以外,現(xiàn)在語(yǔ)法定義跟語(yǔ)法樹(shù)的數(shù)據(jù)結(jié)構(gòu)定義以及分析器都完成了!有了這兩個(gè)文件,我的工具就可以替你生成一個(gè)函數(shù)和一堆類,讓你使用這個(gè)函數(shù)就可以將一份代碼轉(zhuǎn)換為一顆語(yǔ)法樹(shù)啦。娃哈哈……
現(xiàn)在讓我們來(lái)看一個(gè)例子
閱讀全文
posted @
2008-09-14 00:53 陳梓瀚(vczh) 閱讀(1423) |
評(píng)論 (3) 編輯
項(xiàng)目實(shí)驗(yàn)2:動(dòng)態(tài)生成編譯器前端
摘要: 我們知道Yacc和Bison都是產(chǎn)生C++的代碼作為編譯器的前端的。但是有時(shí)候我們需要?jiǎng)討B(tài)地產(chǎn)生一個(gè)編譯器前端,極端一點(diǎn)講,譬如“文法調(diào)試器”。調(diào)試器總不能動(dòng)態(tài)生成.y文件,讓yacc編譯,讓gcc再度編譯,然后execute,最后將程序的輸出結(jié)果讀進(jìn)來(lái)。這樣就太麻煩了,于是我們需要重新寫(xiě)一個(gè)生成編譯器前端的程序。
閱讀全文
posted @
2008-09-06 02:45 陳梓瀚(vczh) 閱讀(2296) |
評(píng)論 (3) 編輯
項(xiàng)目實(shí)驗(yàn)1:將算法與數(shù)據(jù)結(jié)構(gòu)分開(kāi)
摘要: 現(xiàn)在的OOP都提倡將操作與數(shù)據(jù)結(jié)構(gòu)結(jié)合在一起。為什么這里要提出將算法與數(shù)據(jù)結(jié)構(gòu)分開(kāi)呢?第一個(gè)原因是一個(gè)算法可能是用來(lái)處理一組數(shù)據(jù)結(jié)構(gòu)的。第二個(gè)原因是算法并不屬于操作。我們可以借鑒訪問(wèn)者模式來(lái)實(shí)現(xiàn)這個(gè)分離,但是這里有一個(gè)特別之處:我們要將訪問(wèn)者模式帶給我們的那個(gè)接口實(shí)現(xiàn)得讓我們用起來(lái)很漂亮。
閱讀全文
posted @
2008-09-02 04:43 陳梓瀚(vczh) 閱讀(2614) |
評(píng)論 (10) 編輯
Syngram Helper開(kāi)始設(shè)計(jì):一個(gè)能用來(lái)寫(xiě)編譯器的工具
摘要: 大概一年前曾經(jīng)用C++開(kāi)發(fā)了一個(gè)可以在C++中直接寫(xiě)上下文無(wú)關(guān)文法的上下文無(wú)關(guān)文法分析器。這玩意兒叫Syngram。Syngram曾經(jīng)做了兩次,第一次做成了用一個(gè)類去讀文法文件,后來(lái)不爽就改成了直接在C++里面寫(xiě)的。我弄了一個(gè)叫Term的類,重載了一些操作符,于是你可以搞分支、可選、錯(cuò)誤處理等復(fù)雜的文法推導(dǎo)式。現(xiàn)在打算做一個(gè)周邊工具。
閱讀全文
posted @
2008-08-27 05:11 陳梓瀚(vczh) 閱讀(1860) |
評(píng)論 (5) 編輯
手把手教你寫(xiě)腳本引擎(四)——簡(jiǎn)單的高級(jí)語(yǔ)言(2,處理語(yǔ)法)
摘要: 有了全盤(pán)的計(jì)劃之后,我們必須先處理輸入的腳本,才能夠進(jìn)行下一步的工作。字符串處理方面可以參照一下三篇文章:《構(gòu)造可配置語(yǔ)法分析器》、《構(gòu)造正則表達(dá)式引擎》以及《如何手寫(xiě)語(yǔ)法分析器》。作為補(bǔ)充,這里再說(shuō)一說(shuō)其他的辦法。
閱讀全文
posted @
2008-08-01 23:19 陳梓瀚(vczh) 閱讀(5193) |
評(píng)論 (4) 編輯
手把手教你寫(xiě)腳本引擎(三)——簡(jiǎn)單的高級(jí)語(yǔ)言(1,基本原理)
摘要: 這一篇文章開(kāi)始講述如何實(shí)現(xiàn)一個(gè)高級(jí)語(yǔ)言的腳本引擎了。由于工程量較為龐大,因此將分開(kāi)幾篇文章講。學(xué)習(xí)做腳本還是要從簡(jiǎn)單的東西做起的。上一篇文章介紹的命令腳本為實(shí)現(xiàn)高級(jí)語(yǔ)言的原理做了鋪墊。首先,高級(jí)語(yǔ)言和低級(jí)語(yǔ)言腳本的架構(gòu)是一致的。其次,為了具有較大的優(yōu)化的空間,我們將把高級(jí)語(yǔ)言轉(zhuǎn)換成低級(jí)語(yǔ)言,并配合一個(gè)低級(jí)語(yǔ)言的腳本引擎來(lái)實(shí)現(xiàn)高級(jí)語(yǔ)言的腳本引擎。當(dāng)然,習(xí)慣上,在這種情況下我們把低級(jí)語(yǔ)言叫『指令』。
閱讀全文
posted @
2008-07-18 20:31 陳梓瀚(vczh) 閱讀(6639) |
評(píng)論 (8) 編輯
手把手教你寫(xiě)腳本引擎(二)——命令腳本
摘要: 這次要實(shí)現(xiàn)的是一個(gè)形式最簡(jiǎn)單的腳本。這種腳本僅有命令、標(biāo)號(hào)及跳轉(zhuǎn)構(gòu)成,看起來(lái)就跟匯編一樣,不過(guò)好是比較好讀的。雖然這種腳本語(yǔ)言的語(yǔ)法非常簡(jiǎn)單,但是最基本的要素還是要有的。
作為一個(gè)腳本引擎,為了可以在各種各樣的合適的宿主程序中使用,腳本本身最好不要涉及到具體的領(lǐng)域。當(dāng)然,如果這個(gè)腳本被創(chuàng)建的目的僅僅是為了某個(gè)領(lǐng)域的話,那就無(wú)所謂了。因此,一個(gè)腳本引擎需要一個(gè)檢查和運(yùn)行代碼的機(jī)制、運(yùn)行時(shí)環(huán)境的維護(hù)以及一個(gè)功能足夠使用的插件系統(tǒng)。一個(gè)完整的腳本引擎至少需要如下部件:
閱讀全文
posted @
2008-07-09 21:43 陳梓瀚(vczh) 閱讀(8873) |
評(píng)論 (10) 編輯
手把手教你寫(xiě)腳本引擎(一)——挑選語(yǔ)言的特性
摘要: 腳本引擎的作用在于增強(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) 閱讀(21639) |
評(píng)論 (12) 編輯
使用高階函數(shù)開(kāi)發(fā)語(yǔ)法分析器
摘要: 這篇短文的Idea來(lái)源于一篇論文。這篇論文的題目是Higier-Order Functions for Parsing,Graham Hutton寫(xiě)的。論文中使用了一種叫Miranda的函數(shù)式語(yǔ)言來(lái)講述如何使用高階函數(shù)開(kāi)發(fā)語(yǔ)法分析器。
高階函數(shù)很多語(yǔ)言都支持,譬如JavaScript啊,C#的lambda expression啊,或者是我自己做的語(yǔ)言Vczh Free Script 2.0。不過(guò)Miranda是惰性計(jì)算的語(yǔ)言,我們常用的語(yǔ)言都不具有惰性計(jì)算的特性。因此我閱讀了這篇文章之后,自己用Vczh Free Script 2.0寫(xiě)了一個(gè)等價(jià)的小規(guī)模的語(yǔ)法分析器。結(jié)構(gòu)跟論文中所提到的那個(gè)有所區(qū)別,不過(guò)相同的經(jīng)驗(yàn)可以直接應(yīng)用在JavaScript里面或其它語(yǔ)言(例如Python等)的lambda expression里。C#我不知道行不行,沒(méi)去考證。
這里首先要解決一個(gè)問(wèn)題,就是如何引用沒(méi)被定義的名字的問(wèn)題。譬如如下文法:
Term=
| "(" Exp ")"
Fa 閱讀全文
posted @
2008-05-21 00:57 陳梓瀚(vczh) 閱讀(8161) |
評(píng)論 (5) 編輯
如何實(shí)現(xiàn)語(yǔ)言中的閉包(Closure)
摘要: 已經(jīng)忘了是去年還是前年聽(tīng)到微軟說(shuō)要在C# 3.0里為C#添加lambda表達(dá)式,與此同時(shí)Java的團(tuán)隊(duì)也一直在說(shuō)想為Java添加lambda表達(dá)式。到了今天,C#似乎已經(jīng)把這個(gè)特性加進(jìn)去了,Java還沒(méi)有。Java說(shuō)這個(gè)特性還在計(jì)劃列表之中,不過(guò)暫時(shí)可以使用匿名類來(lái)代替。想必是因?yàn)樵贘ava中表示函數(shù)指針的方法比較奇怪罷……
其實(shí)無(wú)論是lambda表達(dá)式(事實(shí)上應(yīng)該叫匿名函數(shù))或是匿名類,都能歸屬到一種叫閉包的東西上面。閉包原來(lái)是代數(shù)中的用語(yǔ),只是那些研究理論的老大們覺(jué)得這玩意兒也能拉到“閉包”里面去,于是就叫閉包了。匿名函數(shù)原本是丘奇發(fā)明的一個(gè)lambda-calculus的其中一部分,后來(lái)計(jì)算機(jī)的老大們突然發(fā)現(xiàn)lambda-calculus非常適合用來(lái)充當(dāng)程序設(shè)計(jì)語(yǔ)言的模型,于是就對(duì)它進(jìn)行了非常多的擴(kuò)充,還弄了個(gè)什么類型理論出來(lái)。好像扯遠(yuǎn)了。
想象一下如下使用閉包的代碼:
MyClosure=func(Number1)
{
return func(Numbe
閱讀全文
posted @
2008-04-20 21:55 陳梓瀚(vczh) 閱讀(7711) |
評(píng)論 (5) 編輯