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