• <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
                類型推導過于復雜,已經到了無法Step In/Over的地步了,于是只好靠輸出大量調試信息來解決問題。這里給出了我為Kernel FP開發的一些簡單的調試用宏。在不需要調試信息的時候,可以通過簡單關閉調試而將產生調試信息的運行時負擔完全去除。

                這里是宏的代碼:
             1 /*******************************************************************************
             2 Vczh Library++ 2.0
             3 Kernel FP::調試庫
             4 開發者:陳梓瀚
             5 
             6 類:
             7 函數:
             8 *******************************************************************************/
             9 #ifndef VL_KFPPRIVATEDEBUGLIBRARY
            10 #define VL_KFPPRIVATEDEBUGLIBRARY
            11 
            12 #define ENABLE_KFP_DEBUG_MODE
            13 
            14 #ifdef ENABLE_KFP_DEBUG_MODE
            15 
            16 #define Debug_IncreaseLevel()                Info.DebugInfo.IncreaseLevel()
            17 #define Debug_DecreaseLevel()                Info.DebugInfo.DecreaseLevel()
            18 #define Debug_AppendSeparator()                Info.DebugInfo.AppendSeparator()
            19 #define Debug_AppendMessage(Message)        Info.DebugInfo.AppendMessage(Message)
            20 
            21 #else
            22 
            23 #define Debug_IncreaseLevel()
            24 #define Debug_DecreaseLevel()
            25 #define Debug_AppendSeparator()
            26 #define Debug_AppendMessage(Message)
            27 
            28 #endif
            29 
            30 #endif

                于是編譯器通過閱讀代碼輸出兩個文件,一個是推導結果,另一個是推導過程中產生的調試信息:
             1 【模塊:system】
             2   module system::system
             3   type bool
             4   type char
             5   type int
             6   type list T
             7   type void
             8   ctor empty :: type list T
             9   ctor false :: type bool
            10   ctor list :: <T> -> (system.list <T>-> type list T
            11   ctor true :: type bool
            12   func chr :: (system.int -> system.char) alias chr codefrom -1
            13   func iadd :: (system.int -> (system.int -> system.int)) alias iadd codefrom -1
            14   func idiv :: (system.int -> (system.int -> system.int)) alias idiv codefrom -1
            15   func iequ :: (system.int -> (system.int -> system.bool)) alias iequ codefrom -1
            16   func ilg :: (system.int -> (system.int -> system.bool)) alias ilg codefrom -1
            17   func imod :: (system.int -> (system.int -> system.int)) alias imod codefrom -1
            18   func imul :: (system.int -> (system.int -> system.int)) alias imul codefrom -1
            19   func ism :: (system.int -> (system.int -> system.bool)) alias ism codefrom -1
            20   func isub :: (system.int -> (system.int -> system.int)) alias isub codefrom -1
            21   func ord :: (system.char -> system.int) alias ord codefrom -1
            22 【模塊:sysutils】
            23   module sysutils::sysutils
            24   import system
            25   type pair T1 T2
            26   ctor pair :: <T1> -> <T2> -> type pair T1 T2
            27   func and :: (system.bool -> (system.bool -> system.bool)) codefrom 4
            28   func if T1 :: (system.bool -> (<T1> -> (<T1> -> <T1>))) codefrom 9
            29   func ineg :: (system.int -> system.int) codefrom 11
            30   func not :: (system.bool -> system.bool) codefrom 2
            31   func or :: (system.bool -> (system.bool -> system.bool)) codefrom 6
            32   func pairop T1 T2 T3 :: ((<T1> -> (<T2> -> <T3>)) -> ((sysutils.pair <T1> <T2>-> <T3>)) codefrom 12
            33   func xor :: (system.bool -> (system.bool -> system.bool)) codefrom 8
            34 【模塊:sysutils.1
            35   module sysutils::sysutils.1
            36   import sysutils
            37   name a
            38 【模塊:sysutils.2
            39   module sysutils::sysutils.2
            40   import sysutils
            41   name a
            42   name b
            43 【模塊:sysutils.3
            44   module sysutils::sysutils.3
            45   import sysutils
            46   name a
            47   name b
            48 【模塊:sysutils.4
            49   module sysutils::sysutils.4
            50   import sysutils
            51   name a
            52   name b
            53 【模塊:sysutils.5
            54   module sysutils::sysutils.5
            55   import sysutils
            56   name cond
            57   name f
            58   name t
            59 【模塊:sysutils.5.1
            60   module sysutils::sysutils.5.1
            61   import sysutils.5
            62   func result T1 :: <T1> codefrom 0
            63 【模塊:sysutils.6
            64   module sysutils::sysutils.6
            65   import sysutils
            66   name num
            67 【模塊:sysutils.7
            68   module sysutils::sysutils.7
            69   import sysutils
            70   name op
            71 【模塊:sysutils.7.1
            72   module sysutils::sysutils.7.1
            73   import sysutils.7
            74   name p
            75 【模塊:sysutils.7.1.1
            76   module sysutils::sysutils.7.1.1
            77   import sysutils.7.1
            78   name a
            79   name b

                這里就是調試信息了。調試信息給出了類型推導的全過程:
              1 進行一輪推導,單元名"system"
              2 *********************************************
              3 進行一輪推導,單元名"sysutils"
              4     開始推導函數"sysutils::and"
              5     期望類型:(system.bool -> (system.bool -> system.bool))。
              6     假定參數"b"的類型:system.bool。
              7     假定參數"a"的類型:system.bool。
              8     假定結果的類型:system.bool。
              9         <VL_KfpCodeSelectExpression> 推導表達式:
             10           select a of
             11             case true : b
             12             case false : false
             13           end
             14         期望類型:system.bool。
             15             <VL_KfpCodePrimitiveExpression> 推導表達式:
             16             a
             17             期望類型:空。
             18             類型[1]:system.bool。
             19             源:sysutils.2.a。
             20             產生類型:system.bool
             21         判斷Case匹配表達式類型:true。
             22         Case匹配表達式類型:system.bool。
             23         融合Case匹配表達式類型:system.bool。
             24         判斷Case匹配表達式類型:false。
             25         Case匹配表達式類型:system.bool
             26         融合Case匹配表達式類型:system.bool。
             27         Case分支期望類型:system.bool。
             28             <VL_KfpCodePrimitiveExpression> 推導表達式:
             29             b
             30             期望類型:system.bool
             31             類型[1]:system.bool。
             32             源:sysutils.2.b。
             33         Case分支期望類型:system.bool。
             34             <VL_KfpCodePrimitiveExpression> 推導表達式:
             35             false
             36             期望類型:system.bool
             37             類型[1]:system.bool。
             38             源:system.false。
             39         推導結果:system.bool。
             40     結果類型:(system.bool -> (system.bool -> system.bool))。
             41     *********************************************
             42     開始推導函數"sysutils::if"
             43     期望類型:空。
             44     假定參數"f"的類型:<$1>。
             45     假定參數"t"的類型:<$2>。
             46     假定參數"cond"的類型:<$3>。
             47     假定結果的類型:<$4>
             48         <VL_KfpCodeLetInExpression> 推導表達式:
             49           (let
             50             def result = 
             51               select cond of
             52                 case true : t
             53                 case false : f
             54               end
             55           inresult)
             56         期望類型:<$4>
             57         對內部函數進行推導。
             58             開始推導函數"sysutils.5.1::result"。
             59             期望類型:空。
             60             假定結果的類型:空。
             61                 <VL_KfpCodeSelectExpression> 推導表達式:
             62                   select cond of
             63                     case true : t
             64                     case false : f
             65                   end
             66                 期望類型:空。
             67                     <VL_KfpCodePrimitiveExpression> 推導表達式:
             68                     cond
             69                     期望類型:空。
             70                     類型[1]:<$3>。
             71                     源:sysutils.5.cond。
             72                     產生類型:<$3>。
             73                 判斷Case匹配表達式類型:true。
             74                 Case匹配表達式類型:system.bool。
             75                 融合Case匹配表達式類型:system.bool。
             76                 判斷Case匹配表達式類型:false
             77                 Case匹配表達式類型:system.bool
             78                 融合Case匹配表達式類型:system.bool。
             79                 Case分支期望類型:空。
             80                     <VL_KfpCodePrimitiveExpression> 推導表達式:
             81                     t
             82                     期望類型:空。
             83                     類型[1]:<$2>
             84                     源:sysutils.5.t。
             85                     產生類型:<$2>。
             86                 Case分支期望類型:<$2>
             87                     <VL_KfpCodePrimitiveExpression> 推導表達式:
             88                     f
             89                     期望類型:<$2>
             90                     類型[1]:<$1>。
             91                     源:sysutils.5.f。
             92                     產生類型:<$2>
             93                 推導結果:<$2>
             94             結果類型:<$2>。
             95             *********************************************
             96         對表達式進行推導。
             97             <VL_KfpCodePrimitiveExpression> 推導表達式:
             98             result
             99             期望類型:<$4>。
            100             類型[1]:<$2>。
            101             源:sysutils.5.1.result。
            102             產生類型:<$4>
            103         結果類型:(system.bool -> (<$4> -> (<$4> -> <$4>)))。
            104         *********************************************
            105         開始推導函數"sysutils::ineg"。
            106         期望類型:(system.int -> system.int)。
            107         假定參數"num"的類型:system.int。
            108         假定結果的類型:system.int
            109             <VL_KfpCodeInvokeExpression> 推導表達式:
            110             ((isub 0) num)
            111             期望類型:system.int。
            112                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            113                 num
            114                 期望類型:空。
            115                 類型[1]:system.int。
            116                 源:sysutils.6.num。
            117                 產生類型:system.int。
            118             推導的參數類型:system.int。
            119                 <VL_KfpCodeInvokeExpression> 推導表達式:
            120                 (isub 0)
            121                 期望類型:(system.int -> system.int)。
            122                     <VL_KfpCodePrimitiveExpression> 推導表達式:
            123                     0
            124                     期望類型:空。
            125                     類型[1]:system.int。
            126                     源:<INTEGER-CONSTANT>。
            127                     產生類型:system.int
            128                 推導的參數類型:system.int。
            129                     <VL_KfpCodePrimitiveExpression> 推導表達式:
            130                     isub
            131                     期望類型:(system.int -> (system.int -> system.int))。
            132                     類型[1]:(system.int -> (system.int -> system.int))。
            133                     源:system.isub。
            134                 推導的函數類型:(system.int -> (system.int -> system.int))。
            135                 推導結果:(system.int -> system.int)。
            136             推導的函數類型:(system.int -> system.int)。
            137             推導結果:system.int。
            138         結果類型:(system.int -> system.int)。
            139         *********************************************
            140         開始推導函數"sysutils::not"
            141         期望類型:(system.bool -> system.bool)。
            142         假定參數"a"的類型:system.bool。
            143         假定結果的類型:system.bool。
            144             <VL_KfpCodeSelectExpression> 推導表達式:
            145               select a of
            146                 case true : false
            147                 case false : true
            148               end
            149             期望類型:system.bool。
            150                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            151                 a
            152                 期望類型:空。
            153                 類型[1]:system.bool
            154                 源:sysutils.1.a。
            155                 產生類型:system.bool
            156             判斷Case匹配表達式類型:true。
            157             Case匹配表達式類型:system.bool。
            158             融合Case匹配表達式類型:system.bool
            159             判斷Case匹配表達式類型:false
            160             Case匹配表達式類型:system.bool
            161             融合Case匹配表達式類型:system.bool。
            162             Case分支期望類型:system.bool。
            163                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            164                 false
            165                 期望類型:system.bool。
            166                 類型[1]:system.bool
            167                 源:system.false
            168             Case分支期望類型:system.bool。
            169                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            170                 true
            171                 期望類型:system.bool
            172                 類型[1]:system.bool。
            173                 源:system.true
            174             推導結果:system.bool。
            175         結果類型:(system.bool -> system.bool)。
            176         *********************************************
            177         開始推導函數"sysutils::or"
            178         期望類型:(system.bool -> (system.bool -> system.bool))。
            179         假定參數"b"的類型:system.bool。
            180         假定參數"a"的類型:system.bool。
            181         假定結果的類型:system.bool。
            182             <VL_KfpCodeSelectExpression> 推導表達式:
            183               select a of
            184                 case true : true
            185                 case false : b
            186               end
            187             期望類型:system.bool。
            188                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            189                 a
            190                 期望類型:空。
            191                 類型[1]:system.bool。
            192                 源:sysutils.3.a。
            193                 產生類型:system.bool。
            194             判斷Case匹配表達式類型:true。
            195             Case匹配表達式類型:system.bool
            196             融合Case匹配表達式類型:system.bool。
            197             判斷Case匹配表達式類型:false。
            198             Case匹配表達式類型:system.bool
            199             融合Case匹配表達式類型:system.bool。
            200             Case分支期望類型:system.bool。
            201                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            202                 true
            203                 期望類型:system.bool。
            204                 類型[1]:system.bool
            205                 源:system.true。
            206             Case分支期望類型:system.bool。
            207                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            208                 b
            209                 期望類型:system.bool。
            210                 類型[1]:system.bool
            211                 源:sysutils.3.b。
            212             推導結果:system.bool
            213         結果類型:(system.bool -> (system.bool -> system.bool))。
            214         *********************************************
            215         開始推導函數"sysutils::pairop"。
            216         期望類型:空。
            217         假定參數"op"的類型:<$1>
            218         假定結果的類型:<$2>。
            219             <VL_KfpCodeLambdaExpression> 推導表達式:
            220             (p -> 
            221               select p of
            222                 case ((pair a) b) : ((op a) b)
            223               end)
            224             期望類型:<$2>。
            225             融合后的期望類型:(<$3> -> <$4>)。
            226                 <VL_KfpCodeSelectExpression> 推導表達式:
            227                   select p of
            228                     case ((pair a) b) : ((op a) b)
            229                   end
            230                 期望類型:<$4>。
            231                     <VL_KfpCodePrimitiveExpression> 推導表達式:
            232                     p
            233                     期望類型:空。
            234                     類型[1]:<$3>
            235                     源:sysutils.7.1.p。
            236                     產生類型:<$3>。
            237                 判斷Case匹配表達式類型:((pair a) b)。
            238                 Case匹配表達式類型:(sysutils.pair <$5> <$6>)。
            239                 融合Case匹配表達式類型:(sysutils.pair <$5> <$6>)。
            240                 Case分支期望類型:<$4>
            241                     <VL_KfpCodeInvokeExpression> 推導表達式:
            242                     ((op a) b)
            243                     期望類型:<$4>。
            244                         <VL_KfpCodePrimitiveExpression> 推導表達式:
            245                         b
            246                         期望類型:空。
            247                         類型[1]:<$6>。
            248                         源:sysutils.7.1.1.b。
            249                         產生類型:<$6>。
            250                     推導的參數類型:<$6>
            251                         <VL_KfpCodeInvokeExpression> 推導表達式:
            252                         (op a)
            253                         期望類型:(<$6> -> <$4>)。
            254                             <VL_KfpCodePrimitiveExpression> 推導表達式:
            255                             a
            256                             期望類型:空。
            257                             類型[1]:<$5>
            258                             源:sysutils.7.1.1.a。
            259                             產生類型:<$5>。
            260                         推導的參數類型:<$5>。
            261                             <VL_KfpCodePrimitiveExpression> 推導表達式:
            262                             op
            263                             期望類型:(<$5> -> (<$6> -> <$4>))。
            264                             類型[1]:<$1>
            265                             源:sysutils.7.op。
            266                             產生類型:(<$5> -> (<$6> -> <$4>))。
            267                         推導的函數類型:(<$5> -> (<$6> -> <$4>))。
            268                         推導結果:(<$6> -> <$4>)。
            269                     推導的函數類型:(<$6> -> <$4>)。
            270                     推導結果:<$4>。
            271                 推導結果:<$4>。
            272             推導結果:((sysutils.pair <$5> <$6>-> <$4>)。
            273         結果類型:((<$5> -> (<$6> -> <$4>)) -> ((sysutils.pair <$5> <$6>-> <$4>))。
            274         *********************************************
            275         開始推導函數"sysutils::xor"。
            276         期望類型:(system.bool -> (system.bool -> system.bool))。
            277         假定參數"b"的類型:system.bool。
            278         假定參數"a"的類型:system.bool
            279         假定結果的類型:system.bool
            280             <VL_KfpCodeSelectExpression> 推導表達式:
            281               select a of
            282                 case true : (not b)
            283                 case false : b
            284               end
            285             期望類型:system.bool。
            286                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            287                 a
            288                 期望類型:空。
            289                 類型[1]:system.bool。
            290                 源:sysutils.4.a。
            291                 產生類型:system.bool。
            292             判斷Case匹配表達式類型:true
            293             Case匹配表達式類型:system.bool。
            294             融合Case匹配表達式類型:system.bool
            295             判斷Case匹配表達式類型:false。
            296             Case匹配表達式類型:system.bool。
            297             融合Case匹配表達式類型:system.bool。
            298             Case分支期望類型:system.bool
            299                 <VL_KfpCodeInvokeExpression> 推導表達式:
            300                 (not b)
            301                 期望類型:system.bool。
            302                     <VL_KfpCodePrimitiveExpression> 推導表達式:
            303                     b
            304                     期望類型:空。
            305                     類型[1]:system.bool。
            306                     源:sysutils.4.b。
            307                     產生類型:system.bool。
            308                 推導的參數類型:system.bool。
            309                     <VL_KfpCodePrimitiveExpression> 推導表達式:
            310                     not
            311                     期望類型:(system.bool -> system.bool)。
            312                     找不到符號"not"或該符號不具有可參考的類型信息,無法進行類型推導。
            313                 推導的函數類型:空。
            314                 推導失敗。
            315             Case分支期望類型:system.bool
            316                 <VL_KfpCodePrimitiveExpression> 推導表達式:
            317                 b
            318                 期望類型:system.bool
            319                 類型[1]:system.bool。
            320                 源:sysutils.4.b。
            321             推導結果:system.bool
            322         結果類型:(system.bool -> (system.bool -> system.bool))。
            323         *********************************************
            324     *********************************************
            325 進行一輪推導,單元名"sysutils"
            326     開始推導函數"sysutils::if"。
            327     期望類型:(system.bool -> (<T1> -> (<T1> -> <T1>)))。
            328     假定參數"f"的類型:<$1>。
            329     假定參數"t"的類型:<$1>
            330     假定參數"cond"的類型:system.bool
            331     假定結果的類型:<$1>。
            332         <VL_KfpCodeLetInExpression> 推導表達式:
            333           (let
            334             def result = 
            335               select cond of
            336                 case true : t
            337                 case false : f
            338               end
            339           inresult)
            340         期望類型:<$1>。
            341         對內部函數進行推導。
            342         對表達式進行推導。
            343             <VL_KfpCodePrimitiveExpression> 推導表達式:
            344             result
            345             期望類型:<$1>
            346             類型[1]:<T1>。
            347             源:sysutils.5.1.result。
            348             產生類型:<$1>。
            349         結果類型:(system.bool -> (<$1> -> (<$1> -> <$1>)))。
            350         *********************************************
            351     *********************************************
            posted on 2008-10-29 10:04 陳梓瀚(vczh) 閱讀(2260) 評論(3)  編輯 收藏 引用 所屬分類: 腳本技術

            評論:
            # re: 改進Kernel FP編譯器,生成類型推導的調試信息 2008-10-31 18:59 | 金山毒霸2008
            這么完整的類型推導的全過程,太寶貴了。  回復  更多評論
              
            # re: 改進Kernel FP編譯器,生成類型推導的調試信息 2008-11-29 22:32 | jge
            其實,在大多數通用向的編程語言中(不包含特殊的語義),類型推導是很簡單的。我看你貼出的log你可能對類型是什么還比較模糊,不過方向是對,即語法樹中節點對子節點提出期望類型,子節點與該類型做unification。 google下Hindley–Milner吧。  回復  更多評論
              
            # re: 改進Kernel FP編譯器,生成類型推導的調試信息 2008-11-30 10:52 | 陳梓瀚(vczh)
            通用的編程語言的類型,幾乎只有python是需要推導的。我的類型指的是形式語言中“類型系統”的那種類型。

            Kernel FP推導的主要問題在于,需要推導模板參數,而且參數還可能是另一種模板函數。而且let-in語句帶來的互相引用的問題也很復雜。  回復  更多評論
              
            久久夜色精品国产网站| 国产精品99久久久精品无码| 亚洲AV日韩精品久久久久久久| 日日狠狠久久偷偷色综合免费 | 久久香蕉国产线看观看精品yw| 性欧美大战久久久久久久久| 狠狠干狠狠久久| 久久乐国产综合亚洲精品| 久久亚洲AV成人出白浆无码国产| 色综合久久88色综合天天| 女人高潮久久久叫人喷水| 99久久久精品免费观看国产 | 久久精品极品盛宴观看| 久久久久人妻一区精品性色av| 久久婷婷久久一区二区三区| 久久久午夜精品福利内容| 999久久久国产精品| 婷婷伊人久久大香线蕉AV| 久久久久无码专区亚洲av| 91精品国产综合久久精品| 中文字幕人妻色偷偷久久| 四虎国产精品成人免费久久| 久久久久一区二区三区| 久久久久国产精品嫩草影院| 久久99国产精品成人欧美| 精品久久一区二区三区| 国内精品久久久久影院一蜜桃| 国产精品久久久久久久久久影院| 狠狠久久综合| 亚洲国产精品久久久久婷婷老年| 久久精品国产精品亚洲毛片| 久久天天躁狠狠躁夜夜2020 | 久久性生大片免费观看性| 久久久久人妻一区精品色| 久久精品国产AV一区二区三区| 久久丝袜精品中文字幕| 久久五月精品中文字幕| 久久精品国产亚洲网站| 久久最近最新中文字幕大全| 久久精品天天中文字幕人妻 | 久久精品综合一区二区三区|