• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-341  評(píng)論-2670  文章-0  trackbacks-0
            腳本技術(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)  編輯
            關(guān)于腳本引擎
            posted @ 2008-07-06 08:37 陳梓瀚(vczh) 閱讀(2280) | 評(píng)論 (5)  編輯
            使用高階函數(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)  編輯

            国产成人香蕉久久久久| 亚洲午夜久久久| 亚洲AV无码久久精品蜜桃| 久久人人爽人人澡人人高潮AV | 久久国产视频网| 久久综合九色综合久99| 精品久久久久久综合日本| 久久久久亚洲AV无码网站| 亚洲人成伊人成综合网久久久| 亚洲日本va午夜中文字幕久久| 人人狠狠综合久久亚洲高清| 久久久久久av无码免费看大片| 久久精品一区二区三区中文字幕| 国产 亚洲 欧美 另类 久久| 色偷偷888欧美精品久久久| 狠狠色噜噜狠狠狠狠狠色综合久久| 久久电影网一区| 国产精品亚洲美女久久久| 久久久久无码中| 国产香蕉久久精品综合网| 亚洲精品乱码久久久久久蜜桃图片 | 亚洲va久久久噜噜噜久久| 亚洲乱码中文字幕久久孕妇黑人 | 国产精品成人久久久久久久| 久久精品国产福利国产琪琪| 亚洲欧美一级久久精品| 久久国产劲爆AV内射—百度| 久久精品国产亚洲av日韩| 久久综合久久综合久久| 久久精品视屏| 亚洲精品乱码久久久久66| 2020久久精品国产免费| 久久本道久久综合伊人| 无码人妻久久一区二区三区蜜桃| 日本欧美久久久久免费播放网| 精品久久久久久| 一本久久a久久精品综合香蕉| 人妻无码久久一区二区三区免费| 国产AⅤ精品一区二区三区久久| 中文字幕无码久久久| 欧美喷潮久久久XXXXx|