• <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
                Kernel FP的虛擬機設計起來比較別扭,主要還是因為laziness的問題。不過現在已經有了一個能用的想法了。

                第一個需要確定的是assembly。當然,這個assembly只是概念上的,現在并沒有什么確定的形式。一個assembly需要一些函數的結構以及名表。名表的作用是減少特化模板函數所需要的內存空間。一個函數總是可以被分解成一個模板以及對于每一種類型需求下所做出的一些改變。例如:

                現在有代碼:
            1 def inc a = iadd a 1
            2 
            3 def inc s = concat a (list ' ')
            4 
            5 def inc2 x = inc (inc x)

                在調用inc2的時候,會根據x的類型確定所需要的inc究竟是什么。這個時候,inc2僅僅依賴于inc,所以在生成assembly的時候可以為這段指令的inc留一個自定義的位置,然后記錄當x為string的時候調用第二個,當x為int的時候調用第一個。這個時候inc2的定義就被完整的保留了下來,而且也不需要在運行的時候才判斷重載。

                事實上,函數應當屬于值。而且有了laziness,代碼也應當屬于值。所以實際上運行的時候只需要一種數據結構,也就是值了。值有以下幾種:
                1、整數和字符(浮點數以后再加)
                2、類型構造(譬如list a b)
                3、表達式樹(譬如\a->imul a a)

                在Kernel FP運行的任意一個階段,所產生的中間結果會這最終結果都只能是這三種類型的其中一種。而且這三種類型還是互相嵌套的。那么在什么時候開始運算呢?實際上我們一貫來需要的首先是判斷一個值得類型,也就是將值轉換成1或者2。Kernel FP里面的select-case表達式也需要這種功能。至此什么時候該laziness已經非常清楚了。一個表達式來了,我們首先獲得它的類型(從而獲得其結構),這個時候就一直運行到知道整數的內容、字符的內容或者得到類型構造的構造符號(譬如list)的時候暫停。當結果為類型構造的時候,讀到了內容的時候繼續遞歸。這樣就可以保證一個值無論在Kernel FP,或者在一個使用Kernel FP的虛擬機的C++程序里面,不需要執行的Kernel FP代碼一定不會被執行。

                Kernel FP的表達式一共有primitive表達式(整數或者字符)、函數調用表達式、let-in的局部名稱定義表達式、lambda表達式以及select-case表達式。其中,運行的時候let-in表達式可以轉化為lambda表達式,函數定義也可以轉換為lambda表達式,所以運行時所需的表達式結構也就很容易確定下來了:

                1、值(整數常量或字符常量)
                2、名引用(引用到一個局部的或全局的名稱并提供相應的名表,并且保證對同一個名稱在不同的地方求值不會導致重復的代碼執行)
                3、函數調用
                4、lambda表達式(用于積累到所有參數足夠的時候,獲得表達式以及局部的名引用對象表)
                5、select-case表達式(用于讓laziness的代碼開始運轉所需的部分)

                那么,當需要知道一個表達式的值的時候需要做什么事情呢?
                首先,對于值來說,因為是常量,所以不需要進行更多的運算。
                第二,對于名引用來說,因為執行的是名引用的表達式,因此不需要什么特殊的動作,只需要按照這里定義的策略執行。
                第三,對于函數調用,我們需要將函數的參數傳入lambda表達式的第一個參數,生成一個新的名引用對象并將lambda表達式的內容提上來。
                第四、lambda表達式,不需計算,因為函數本身就是一個值。
                第五、select-case表達式,對被判斷的表達式本身的類型進行判斷,運行最少的代碼之后,生成case所需要的名引用對象并將case的結果表達式的內容提上來。

                至此,運行帶有laziness的Kernel FP代碼所需要的數據結構以及策略都定下來了。
            posted on 2008-10-18 23:29 陳梓瀚(vczh) 閱讀(1537) 評論(1)  編輯 收藏 引用 所屬分類: 腳本技術

            評論:
            # re: Kernel FP 虛擬機結構 2008-10-25 22:44 | 金山詞霸2008
            這個虛擬機的策略到時聽可行。  回復  更多評論
              
            久久综合偷偷噜噜噜色| 中文字幕一区二区三区久久网站 | 久久久精品视频免费观看| 久久涩综合| 99久久婷婷国产一区二区| 天堂无码久久综合东京热| AV狠狠色丁香婷婷综合久久 | 九九99精品久久久久久| 污污内射久久一区二区欧美日韩| 久久久久一级精品亚洲国产成人综合AV区 | 久久影院久久香蕉国产线看观看| 久久亚洲精品无码VA大香大香| 一级做a爱片久久毛片| 亚洲欧洲中文日韩久久AV乱码| 97精品伊人久久久大香线蕉| 伊人久久无码精品中文字幕| 亚洲国产精品久久久久| 亚洲国产精品久久电影欧美| 久久婷婷午色综合夜啪| 久久精品成人免费网站| 久久久久久夜精品精品免费啦| 色综合久久无码五十路人妻| 久久久久亚洲精品中文字幕| 亚洲综合精品香蕉久久网97| 奇米综合四色77777久久| 91精品国产色综合久久| 欧美激情精品久久久久| 国产精品内射久久久久欢欢| 久久人人爽人人精品视频| 久久99精品国产| 99久久免费国产特黄| 无码人妻久久一区二区三区免费丨 | 国产AⅤ精品一区二区三区久久 | 婷婷久久久亚洲欧洲日产国码AV| 热RE99久久精品国产66热| 国产成人精品久久综合| 99久久国产热无码精品免费久久久久| 国产V亚洲V天堂无码久久久| 好久久免费视频高清| 一本大道久久a久久精品综合| 91精品国产高清久久久久久91|