• <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  評論-2670  文章-0  trackbacks-0
            腳本技術
            描述跟腳本相關的各種技術
            手把手教你寫腳本引擎(五)——簡單的高級語言(3,符號表)      摘要: 符號表的結構的復雜度跟語言的語義規則的復雜度有關。對于C#來說,每一個符號都附帶了一大堆信息,譬如位置啦,所在的namespace啦,類型啦什么的。對于JavaScript來說,符號表幾乎是不需要的,因為東西都動態了,編譯時幾乎不檢查內容。語義分析的輸出是符號表,代碼生成的輸入是符號表和語法樹。因此語法樹除了放語法相關的內容,語義相關的內容最好放到符號表里面(譬如說表達式的類型啦,語句的scope結果啦)。  閱讀全文
            posted @ 2009-05-10 18:48 陳梓瀚(vczh) 閱讀(7264) | 評論 (1)  編輯
            手把手教你寫腳本引擎 PPT與Demo(一)      摘要:
            華南理工大學微軟俱樂部程序設計語言特別興趣小組——手把手教你寫腳本引擎系列(一)
            陳梓瀚

            PPT內容:
            1、簡單指令集的設計方法(支持分支、循環、函數、遞歸)。
            2、編譯控制流程(分支和循環)的一般模式。
            3、函數調用的詳細過程。
            4、5個示例程序。

            Demo內容:
            PPT中5個示例程序的運行過程(動畫),左邊是單步,右邊是堆棧內容。

            含下載,內詳。  閱讀全文
            posted @ 2009-03-28 01:43 陳梓瀚(vczh) 閱讀(10640) | 評論 (11)  編輯
            Kernel FP的圖形Demo實現!      摘要: 其實有了一整套的Kernel FP API之后,只需要插入幾個外部函數就可以讓Kernel FP繪圖了。現在我們看一看這個Demo的樣子。
              閱讀全文
            posted @ 2008-12-29 10:41 陳梓瀚(vczh) 閱讀(2723) | 評論 (0)  編輯
            Kernel FP編譯器工具實現      摘要: 這次終于實現了兩個exe,一個是編譯器,一個是提供控制臺API的虛擬機。等提供GUI的虛擬機出來之后就開放出來(內有圖和代碼)。  閱讀全文
            posted @ 2008-12-26 08:07 陳梓瀚(vczh) 閱讀(2056) | 評論 (5)  編輯
            Kernel FP 編譯器MakeFile開發完成      摘要: Kernel FP的MakeFile可以指定輸出文件、報告文件以及代碼文件,并且可以繼承其他的MakeFile。MakeFile的格式和分析器代碼如下:  閱讀全文
            posted @ 2008-12-24 05:20 陳梓瀚(vczh) 閱讀(1793) | 評論 (1)  編輯
            Kernep FP實現虛擬機的序列化與反序列化      摘要: 由于Kernel FP的編譯結果是獨立的,執行的時候不需要源代碼的符號的參與,因此可以將編譯結果進行序列化與反序列化。  閱讀全文
            posted @ 2008-12-23 00:50 陳梓瀚(vczh) 閱讀(1575) | 評論 (0)  編輯
            Kernel FP添加反射API      摘要: 為了讓宿主程序可以更加清楚一份Kernel FP代碼的內容,我今天為Kernel FP添加了反射的API。  閱讀全文
            posted @ 2008-12-20 06:10 陳梓瀚(vczh) 閱讀(1422) | 評論 (0)  編輯
            使用Kernel FP的do-end語法糖添加自己的異常處理系統      摘要: 有的時候,IO的異常處理由于需要一個IOEnv類型的參數而顯得非常麻煩。這個時候我們可以定制自己的一套異常處理系統,從而讓程序變得清晰起來。自己的異常處理系統不同于IO,是沒有副作用的函數集合。下面讓我們看一看如何使用自定義的異常處理系統來分析一個四則運算表達式。  閱讀全文
            posted @ 2008-12-18 21:23 陳梓瀚(vczh) 閱讀(1453) | 評論 (0)  編輯
            使用Kernel FP API實現一個運行Kernel FP代碼的控制臺程序      摘要: 說到底Kernel FP是一個腳本引擎,所以是需要API的。接下來的代碼用來加載一些Kernel FP代碼文件,并執行main函數。  閱讀全文
            posted @ 2008-12-17 19:15 陳梓瀚(vczh) 閱讀(1640) | 評論 (1)  編輯
            在純函數式語言內實現有關IO的循環      摘要: 我們知道,循環本身是沒有返回值的。所以在純函數式語言下,跟IO有關的循環才有足夠的副作用來產生價值。于是利用IO Monad,我們就可以實現循環了。循環是一個函數:  閱讀全文
            posted @ 2008-12-15 07:56 陳梓瀚(vczh) 閱讀(2162) | 評論 (2)  編輯
            Kernel FP的do-end IO語法糖實現!      摘要: 前面說過,需要一個語法糖來組織IO,并且在其中的一步產生錯誤的時候立刻返回錯誤。現在我們看一段代碼:  閱讀全文
            posted @ 2008-12-15 06:22 陳梓瀚(vczh) 閱讀(1480) | 評論 (0)  編輯
            Kernel FP的IO實驗
            posted @ 2008-12-14 22:44 陳梓瀚(vczh) 閱讀(1770) | 評論 (0)  編輯
            Kernel FP支持更精細的重載
            posted @ 2008-12-14 19:42 陳梓瀚(vczh) 閱讀(1472) | 評論 (0)  編輯
            Kernel FP 的四則運算式子分析程序      摘要: 為了測試Kernel FP的健壯性以及進行一些bug的排除,一個四則運算式子的分析程序理所當然地就被實現了。代碼如下:  閱讀全文
            posted @ 2008-12-13 07:13 陳梓瀚(vczh) 閱讀(3353) | 評論 (2)  編輯
            Kernel FP成功運行一部分列表處理程序      摘要: 經過1個小時的奮斗,修了3個bug,終于使得Kernel FP能運行的代碼漸漸多了起來。現在可以看看純函數式語言簡潔的代碼及運行結果啦!

            下面是很多用于測試的main函數:  閱讀全文
            posted @ 2008-12-12 10:03 陳梓瀚(vczh) 閱讀(1457) | 評論 (1)  編輯
            Kernel FP成功運行小程序      摘要: Kernel FP已經可以運行小程序了。現在還處于測試階段,過于復雜的程序估計是跑不過的。先簡單介紹一下如何在C++調用Kernel FP的代碼。  閱讀全文
            posted @ 2008-12-10 23:03 陳梓瀚(vczh) 閱讀(1719) | 評論 (2)  編輯
            Kernel FP:Expected語法完全支持!      摘要: 新加入的Expected語法已經完全支持了。使用了Expected的符號會因為調用者的不同而使用不同的scope內的函數。代碼如下:  閱讀全文
            posted @ 2008-11-03 05:41 陳梓瀚(vczh) 閱讀(1677) | 評論 (0)  編輯
            Kernel FP的Expected語法實驗      摘要: 有了Expected語法之后總是要實驗一下的。現在給出一個非完整函數eq的聲明,并用一個列表查找函數使用eq。已知代碼如下:  閱讀全文
            posted @ 2008-11-02 07:36 陳梓瀚(vczh) 閱讀(1520) | 評論 (0)  編輯
            決定為Kernel FP加入一個跟模板函有關數的語法      摘要: Kernel FP的模板函數比較嚴格。對于任意的模板函數的類型參數,這個參數必須能夠接受所有類型。當然,類型推導會通過閱讀代碼來精確化程序員設定的類型。譬如說一個函數F的類型是T->T,但是經過閱讀代碼發現,參數只能是某種類型的列表,那么類型推導就會將這個函數的類型修改為list T->list T。

            但是這樣會有一個問題。類型推導只能夠推導已知的函數。如果一個模板函數里面用了操作符,而這個操作符暫時只為幾個類型定義的話,那么由于不是所有的類型都能夠接受該操作符,所以這個操作符就沒辦法給未知確切類型的參數使用。下面就有一個例子:  閱讀全文
            posted @ 2008-11-02 06:52 陳梓瀚(vczh) 閱讀(1338) | 評論 (0)  編輯
            Kernel FP 模板函數實例化      摘要: 今天寫了Kernel FP模板函數實例化的代碼。雖然還有一點小bug,不過還是說一下。  閱讀全文
            posted @ 2008-11-01 07:05 陳梓瀚(vczh) 閱讀(1398) | 評論 (0)  編輯
            改進Kernel FP編譯器,生成類型推導的調試信息      摘要: 類型推導過于復雜,已經到了無法Step In/Over的地步了,于是只好靠輸出大量調試信息來解決問題。這里給出了我為Kernel FP開發的一些簡單的調試用宏。在不需要調試信息的時候,可以通過簡單關閉調試而將產生調試信息的運行時負擔完全去除。  閱讀全文
            posted @ 2008-10-29 10:04 陳梓瀚(vczh) 閱讀(2260) | 評論 (3)  編輯
            是時候重構了!      摘要: 實習的時候,自己的時間明顯沒有在學校的時候多啊。這次Kernel FP拖了很久,一個多月都還沒寫完。幸好語法分析器用了之前開發的Syngram,要不得多花一個月。Kernel FP的類型推導的代碼實在是很難看,趁著又發現了一個Bug,重構一下。

            內含代碼  閱讀全文
            posted @ 2008-10-27 05:23 陳梓瀚(vczh) 閱讀(1996) | 評論 (6)  編輯
            Kernel FP 虛擬機結構      摘要: Kernel FP的虛擬機設計起來比較別扭,主要還是因為laziness的問題。不過現在已經有了一個能用的想法了。  閱讀全文
            posted @ 2008-10-18 23:29 陳梓瀚(vczh) 閱讀(1544) | 評論 (1)  編輯
            Kernel FP 指令集      摘要: 類型推導到這里也就結束了。雖然可能有點小bug,不過這個以后遇到再處理了。接下來的一個模塊是跟類型推導沒有耦合的新模塊,兩邊可以平行處理。

            Kernel FP的指令集不同于以往的指令集。因為作為一門純函數式語言,就必須要有laziness。這就是說,凡是可以不運行的代碼都一定不運行,凡是可以晚一點執行的代碼一律等到需要的時候再執行。也就是說,參數傳進函數的時候,傳的是代碼而不是值。因此指令集只能用來表達代碼的邏輯結構。
              閱讀全文
            posted @ 2008-10-11 02:10 陳梓瀚(vczh) 閱讀(1446) | 評論 (1)  編輯
            Kernel FP let-in表達式子函數包含父函數對象的類型推導      摘要: 有一些主函數的某些參數只在let-in表達式所定義的子函數使用,然后被主函數間接使用。今天修了一個bug支持了這種函數的類型推導。例子如下:  閱讀全文
            posted @ 2008-10-08 08:19 陳梓瀚(vczh) 閱讀(1363) | 評論 (0)  編輯
            Kernel FP 更多的類型推導      摘要: 今天將Haskell的一部分列表處理函數抄進了Kernel FP里,堅持所有函數(模板函數)不寫類型,而讓編譯器進行類型推導:  閱讀全文
            posted @ 2008-10-07 08:10 陳梓瀚(vczh) 閱讀(1283) | 評論 (0)  編輯
            Kernal FP所有表達式種類實現類型推導!      摘要: 經過上一次的成功試驗,這次終于完成了剩余的表達式類型的類型推導。過程及結果如下:  閱讀全文
            posted @ 2008-10-06 06:47 陳梓瀚(vczh) 閱讀(1511) | 評論 (1)  編輯
            Kernel FP 類型推導(Type Inference)實驗成功!      摘要: 我終于在實驗階段解決了這個困擾了我5個月(雖然實際上我花了3個星期)的問題。目標是這樣的:你寫程序,可以盡可能的不寫一些類型信息,譬如函數參數和返回值的類型信息等。我的編譯器幫你把它的類型算出來。

            內詳,有例子、方法和模型。  閱讀全文
            posted @ 2008-10-04 07:19 陳梓瀚(vczh) 閱讀(1847) | 評論 (3)  編輯
            Kernel FP符號表完成      摘要: 經過了5個小時的艱苦奮斗,符號表終于計算出來了,而且也做了一部分語法分析。接下來的工作是類型推導。今天的結果如下。  閱讀全文
            posted @ 2008-10-02 07:46 陳梓瀚(vczh) 閱讀(1693) | 評論 (1)  編輯
            KernelFP 寫的一個用通配符匹配字符串的程序      摘要: 輸入:
            pattern : 含有通配符*與?的字符串
            string : 被匹配的字符串
            輸出:true與false代表匹配成功與失敗

            僅19行  閱讀全文
            posted @ 2008-10-01 09:41 陳梓瀚(vczh) 閱讀(1474) | 評論 (0)  編輯
            Kernel FP 語法分析完成      摘要: 語法分析器終于完成了,總共花了7個小時的時間。其中遇到了一些小問題,譬如lambda expression的\param->expression和let-in expression的let declaration-list in expression里面的expression需要盡可能長的解決辦法。因為用了Syngram,所以不得不調整出符合需求的文法。

            為了大概看一看文法有沒有寫對,我寫了一個程序,讀入KernelFP語言寫的一份代碼,將其格式化并輸出。  閱讀全文
            posted @ 2008-10-01 01:31 陳梓瀚(vczh) 閱讀(1570) | 評論 (0)  編輯
            最小內核語言      摘要: 國慶7天容易無聊,于是我打算實現一下以前失敗過的一種語言的特性:類型推導。于是順便做一做惰性計算吧。于是我嘗試設計了一門特性盡可能少的語言,并且強制讓一個函數的返回值僅跟輸入的參數有關。雖然這個特性不適合用來做IO,但是是有辦法解決的,而且不需要修改語言就可以直接支持。

            這門語言的定義及其簡單,需要預先定義的部分也是很少的,于是我嘗試實現了if、邏輯運算符以及itoa和atoi兩個函數  閱讀全文
            posted @ 2008-09-28 07:14 陳梓瀚(vczh) 閱讀(2152) | 評論 (4)  編輯
            自定義數據結構的語法分析器成功!      摘要: 經過三個小時的努力,一個供調試用的模擬器終于做出來了。對于一份語法說明來講,我們需要提供調試器,一直到調試完了才生成代碼,這樣比較容易找到問題。同時為了驗證自己的那個設計,于是做了一個調試器出來。這個調試器使用了這篇文章里的數據結構文件以及文法文件,以及使用了這篇文章里開發的一個樹到圖的轉換程序,成功得到結果!  閱讀全文
            posted @ 2008-09-14 07:22 陳梓瀚(vczh) 閱讀(1843) | 評論 (1)  編輯
            語法分析器定義接近完成!      摘要: 除了錯誤處理文件還沒有定義好以外,現在語法定義跟語法樹的數據結構定義以及分析器都完成了!有了這兩個文件,我的工具就可以替你生成一個函數和一堆類,讓你使用這個函數就可以將一份代碼轉換為一顆語法樹啦。娃哈哈……

            現在讓我們來看一個例子  閱讀全文
            posted @ 2008-09-14 00:53 陳梓瀚(vczh) 閱讀(1427) | 評論 (3)  編輯
            數據結構定義 分析器完成
            posted @ 2008-09-12 05:49 陳梓瀚(vczh) 閱讀(1230) | 評論 (0)  編輯
            項目實驗2:動態生成編譯器前端      摘要: 我們知道Yacc和Bison都是產生C++的代碼作為編譯器的前端的。但是有時候我們需要動態地產生一個編譯器前端,極端一點講,譬如“文法調試器”。調試器總不能動態生成.y文件,讓yacc編譯,讓gcc再度編譯,然后execute,最后將程序的輸出結果讀進來。這樣就太麻煩了,于是我們需要重新寫一個生成編譯器前端的程序。  閱讀全文
            posted @ 2008-09-06 02:45 陳梓瀚(vczh) 閱讀(2301) | 評論 (3)  編輯
            項目實驗1:將算法與數據結構分開      摘要: 現在的OOP都提倡將操作與數據結構結合在一起。為什么這里要提出將算法與數據結構分開呢?第一個原因是一個算法可能是用來處理一組數據結構的。第二個原因是算法并不屬于操作。我們可以借鑒訪問者模式來實現這個分離,但是這里有一個特別之處:我們要將訪問者模式帶給我們的那個接口實現得讓我們用起來很漂亮。  閱讀全文
            posted @ 2008-09-02 04:43 陳梓瀚(vczh) 閱讀(2620) | 評論 (10)  編輯
            Syngram Helper開始設計:一個能用來寫編譯器的工具      摘要: 大概一年前曾經用C++開發了一個可以在C++中直接寫上下文無關文法的上下文無關文法分析器。這玩意兒叫Syngram。Syngram曾經做了兩次,第一次做成了用一個類去讀文法文件,后來不爽就改成了直接在C++里面寫的。我弄了一個叫Term的類,重載了一些操作符,于是你可以搞分支、可選、錯誤處理等復雜的文法推導式。現在打算做一個周邊工具。  閱讀全文
            posted @ 2008-08-27 05:11 陳梓瀚(vczh) 閱讀(1865) | 評論 (5)  編輯
            手把手教你寫腳本引擎(四)——簡單的高級語言(2,處理語法)      摘要: 有了全盤的計劃之后,我們必須先處理輸入的腳本,才能夠進行下一步的工作。字符串處理方面可以參照一下三篇文章:《構造可配置語法分析器》、《構造正則表達式引擎》以及《如何手寫語法分析器》。作為補充,這里再說一說其他的辦法。  閱讀全文
            posted @ 2008-08-01 23:19 陳梓瀚(vczh) 閱讀(5198) | 評論 (4)  編輯
            手把手教你寫腳本引擎(三)——簡單的高級語言(1,基本原理)      摘要: 這一篇文章開始講述如何實現一個高級語言的腳本引擎了。由于工程量較為龐大,因此將分開幾篇文章講。學習做腳本還是要從簡單的東西做起的。上一篇文章介紹的命令腳本為實現高級語言的原理做了鋪墊。首先,高級語言和低級語言腳本的架構是一致的。其次,為了具有較大的優化的空間,我們將把高級語言轉換成低級語言,并配合一個低級語言的腳本引擎來實現高級語言的腳本引擎。當然,習慣上,在這種情況下我們把低級語言叫『指令』。  閱讀全文
            posted @ 2008-07-18 20:31 陳梓瀚(vczh) 閱讀(6651) | 評論 (8)  編輯
            手把手教你寫腳本引擎(二)——命令腳本      摘要: 這次要實現的是一個形式最簡單的腳本。這種腳本僅有命令、標號及跳轉構成,看起來就跟匯編一樣,不過好是比較好讀的。雖然這種腳本語言的語法非常簡單,但是最基本的要素還是要有的。

            作為一個腳本引擎,為了可以在各種各樣的合適的宿主程序中使用,腳本本身最好不要涉及到具體的領域。當然,如果這個腳本被創建的目的僅僅是為了某個領域的話,那就無所謂了。因此,一個腳本引擎需要一個檢查和運行代碼的機制、運行時環境的維護以及一個功能足夠使用的插件系統。一個完整的腳本引擎至少需要如下部件:  閱讀全文
            posted @ 2008-07-09 21:43 陳梓瀚(vczh) 閱讀(8882) | 評論 (10)  編輯
            手把手教你寫腳本引擎(一)——挑選語言的特性      摘要: 腳本引擎的作用在于增強程序的可配置性。從游戲到管理系統都需要腳本,甚至連工業級產品的Office、3DS Max以及AutoCAD等都添加了屬于自己的腳本語言。DHTML的出現讓我們可以在網頁代碼中嵌入腳本語言,PHP和ASP等技術的出現讓我們可以將一個應用程序的界面換成網頁,而邏輯使用腳本語言編寫。現在腳本語言的種類繁多,Python的發展讓BOOST庫擁有了對Python的支持,Rails框架的出現壯大了Ruby的實力,LUA更是被大量應用在游戲開發中。Windows甚至提供了wscript以便讓我們能夠調用javascript和vbscript的代碼。

            既然有了這么多可供選擇的腳本引擎,為什么我們仍然要開發自己的腳本引擎呢?  閱讀全文
            posted @ 2008-07-07 07:45 陳梓瀚(vczh) 閱讀(21655) | 評論 (12)  編輯
            關于腳本引擎
            posted @ 2008-07-06 08:37 陳梓瀚(vczh) 閱讀(2285) | 評論 (5)  編輯
            使用高階函數開發語法分析器      摘要: 這篇短文的Idea來源于一篇論文。這篇論文的題目是Higier-Order Functions for Parsing,Graham Hutton寫的。論文中使用了一種叫Miranda的函數式語言來講述如何使用高階函數開發語法分析器。

            高階函數很多語言都支持,譬如JavaScript啊,C#的lambda expression啊,或者是我自己做的語言Vczh Free Script 2.0。不過Miranda是惰性計算的語言,我們常用的語言都不具有惰性計算的特性。因此我閱讀了這篇文章之后,自己用Vczh Free Script 2.0寫了一個等價的小規模的語法分析器。結構跟論文中所提到的那個有所區別,不過相同的經驗可以直接應用在JavaScript里面或其它語言(例如Python等)的lambda expression里。C#我不知道行不行,沒去考證。

            這里首先要解決一個問題,就是如何引用沒被定義的名字的問題。譬如如下文法:

            Term= | "(" Exp ")"
            Fa  閱讀全文
            posted @ 2008-05-21 00:57 陳梓瀚(vczh) 閱讀(8167) | 評論 (5)  編輯
            如何實現語言中的閉包(Closure)      摘要: 已經忘了是去年還是前年聽到微軟說要在C# 3.0里為C#添加lambda表達式,與此同時Java的團隊也一直在說想為Java添加lambda表達式。到了今天,C#似乎已經把這個特性加進去了,Java還沒有。Java說這個特性還在計劃列表之中,不過暫時可以使用匿名類來代替。想必是因為在Java中表示函數指針的方法比較奇怪罷……

            其實無論是lambda表達式(事實上應該叫匿名函數)或是匿名類,都能歸屬到一種叫閉包的東西上面。閉包原來是代數中的用語,只是那些研究理論的老大們覺得這玩意兒也能拉到“閉包”里面去,于是就叫閉包了。匿名函數原本是丘奇發明的一個lambda-calculus的其中一部分,后來計算機的老大們突然發現lambda-calculus非常適合用來充當程序設計語言的模型,于是就對它進行了非常多的擴充,還弄了個什么類型理論出來。好像扯遠了。

            想象一下如下使用閉包的代碼:

            MyClosure=func(Number1)
            {
            return func(Numbe  閱讀全文
            posted @ 2008-04-20 21:55 陳梓瀚(vczh) 閱讀(7715) | 評論 (5)  編輯

            久久久久国产一区二区三区| 亚洲成av人片不卡无码久久| 久久亚洲AV成人无码国产| 日本强好片久久久久久AAA| 国产精品久久久久久吹潮| 精品久久久久久久久久久久久久久| 久久久久久亚洲精品无码| 亚洲色欲久久久综合网| 天天久久狠狠色综合| 青青草原综合久久大伊人| 国产99久久精品一区二区| 亚洲第一永久AV网站久久精品男人的天堂AV | 久久精品嫩草影院| 人妻系列无码专区久久五月天| 久久精品无码一区二区WWW| 久久综合欧美成人| 久久久久青草线蕉综合超碰 | 亚洲精品午夜国产va久久| 久久精品国产亚洲av麻豆色欲| 久久激情亚洲精品无码?V| 伊人久久大香线蕉综合Av| 久久激情亚洲精品无码?V| 久久亚洲国产精品一区二区| 亚洲精品乱码久久久久久蜜桃图片| 国产精品久久久天天影视香蕉| 久久婷婷激情综合色综合俺也去| 久久婷婷人人澡人人| 久久99精品国产99久久| 国产精品99精品久久免费| 亚洲精品无码久久久久| 久久大香萑太香蕉av| 伊人久久无码精品中文字幕| 要久久爱在线免费观看| 亚洲国产精品嫩草影院久久| 久久精品无码一区二区日韩AV| 国产巨作麻豆欧美亚洲综合久久 | 新狼窝色AV性久久久久久| 久久精品人妻中文系列| 97香蕉久久夜色精品国产| 国产成人久久精品一区二区三区 | 久久精品国产亚洲欧美|