随笔-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) 阅读(2244) 评论(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语句带来的互相引用的问题也很复杂。  回复  更多评论
  

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理