annotate paper/rectype.ind @ 43:c2207a9208a5

modify
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 16 Jun 2012 03:22:51 +0900
parents ba21600eabba
children 39f6db695840
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
1 -title: Recursive type syntax in Continuation based C
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
2
32
be591bf4e2b5 merge 31
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
3 \newcommand{\rectype}{{\tt \_\_rectype}}
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
4
32
be591bf4e2b5 merge 31
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
5 --author: Nobuyasu Oshiro, Shinji KONO
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
6
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
7 --abstract:
32
be591bf4e2b5 merge 31
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
8
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
9 We have implemented Continuation based C (CbC).
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
10 CbC is an extension of C, which has parameterized goto statement.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
11 It is useful for finite state automaton or many core tasks.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
12 Goto statement is a way to force tail call elimination.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
13 The destination of goto statement is called Code Segment, which is actually a normal function of C.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
14 To represent recursive function call, the type system of C is not enough, because
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
15 it has no recursive types.
43
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 42
diff changeset
16 We introduce \rectype keyword for recursive type, and it is implemented in GCC-4.6.0.
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
17 We will compare the conventional methods, \rectype keyword and a method using C structure.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
18 Also we show usage of CbC and it's benchmark.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
19
32
be591bf4e2b5 merge 31
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
20 --Motivation
be591bf4e2b5 merge 31
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
21
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
22 The C programming language is used in many practical programs, operating system
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
23 kernels, byte code machines, network servers or embedded systems. Low level feature
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
24 of C is useful, but sometimes it requires programming hacks. For example, in case of
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
25 byte code machine often entire program is a huge switch statement which has many
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
26 labels which correspond the byte codes. Operating system or network server has
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
27 many layers such as system call dispatch, transport or presentation layer. It
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
28 requires deep call levels, 2 or 3 for each layer, resulting 10-30 call levels.
32
be591bf4e2b5 merge 31
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 30
diff changeset
29
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
30 Continuation based C (CbC) provides a structured way to represent these situations. It
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
31 is a small medication of C. It consists of a syntax to force tail-call-elimination
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
32 and parameterized goto statement.
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
33
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
34 C has capable of recursive functions, but we find it's type system is not enough
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
35 to represent CbC programming. In this paper, we introduce \rectype
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
36 keyword as a recursive type. To handle recursive type, conventionally tagged struct
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
37 is used. It is also fit for CbC program.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
38
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
39 We will describe the CbC and \rectype implementation of CbC on GCC 4.6.0.
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
40
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
41 --Continuation based C
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
42
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
43 CbC's basic programming unit is a Code Segment. It is not a subroutine, but it
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
44 looks like a function, because it has input and output. We can use C struct
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 as input and output interfaces.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
47 struct interface1 { int i; };
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
48 struct interface2 { int o; };
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
49
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50 __code f(struct interface1 a) {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 struct interface2 b; b.o=a.i;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 goto g(b);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
53 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
54
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
55 In this example, a Code Segment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
56 \verb+f+ has \verb+input a+ and sends \verb+output b+ to a Code Segment \verb+g+.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
57 There is no return from Code Segment \verb+b+, \verb+b+ should call another
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58 continuation using \verb+goto+. Any control structure in C is allowed in CwC
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
59 language, but in case of CbC, we restrict ourselves to use \verb+if+ statement
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
60 only, because it is sufficient to implement C to CbC translation. In this case,
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
61 Code Segment has one input interface and several output interfaces (fig.\ref{code}).
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
62
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
63 <center><img src="figure/code.pdf" alt="code"></center>
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
64
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
65
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
66 \verb+__code+ and parameterized global goto statement is an extension of
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
67 Continuation based C. Unlike \verb+C--+ \cite{cminusminus}'s parameterized goto,
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
68 we cannot goto into normal C function.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
70 In CwC, we can go to a Code Segment from a C function and we can call C functions
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
71 in a Code Segment. So we don't have to shift completely from C to CbC. The later
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
72 one is straight forward, but the former one needs further extensions.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
74 void *env;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
75 __code (*exit)(int);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
76
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
77 __code h(char *s) {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 printf(s);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 goto (*exit)(0),env;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
80 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
81
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 int main() {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 env = __environment;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 exit = __return;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85 goto h("hello World\n");
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 In this hello world example, the environment of \verb+main()+
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 and its continuation is kept in global variables. The environment
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 and the continuation can be get using \verb+__environment+,
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
91 and \verb+__return+. Arbitrary mixture of Code Segments and functions
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 are allowed (in CwC). The continuation of \verb+goto+ statement
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
93 never returns to original function, but it goes to caller of original
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
94 function. In this case, it returns result 0 to the operating system.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
95
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
96
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
97
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
98 --Recursive type syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
99
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
100 A continuation is a pointer to a Code Segment to be executed after.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
101 For example, it is passed as follows;
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
102
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
103 __code csA( __code (*p)() ) {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
104 goto p(csB);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
105 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
106
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
107 where {\tt p} is the continuation and {\tt csB} is a Code Segment which
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
108 has the same type of {\tt csA}. This declaration is not enough because
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
109 it lacks the type of the argument. If add the type declaration, we
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
110 get following program;
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
111
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
112 __code csA( __code (*p)( __code (*)( __code (*)( __code (*)())))) {
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
113 goto p(csB);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
114 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
115
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
116 or
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
117 __code csA( __code (*p)( __code(*)())) {
15
68d2c32f74cf modify explanation of rectype syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
118 goto p(csB);
68d2c32f74cf modify explanation of rectype syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
119 }
68d2c32f74cf modify explanation of rectype syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
120
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
121 It is enough to type {\verb+csB+}, but of course it is not completely will typed.
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
122 Omitting types of the arguments of a function is allowed, but it requires
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
123 complex declaration and it is incomplete.
15
68d2c32f74cf modify explanation of rectype syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
124
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
125 We introduce \rectype syntax for this situation. In an argument deflation,
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
126 \rectype represents it's function type. Using \rectype, previous example can
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
127 be written like this;
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
128
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
129 __code csA( __rectype *p) {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
130 goto p(csB);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
131 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
133 {\tt *p} has a type of {\tt csA} itself.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
134
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
135 The same situation is happen in conventional C, since Code Segment is a
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
136 mere C function with tail-call-elimination. \rectype provides exact and
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
137 concise way to describe recursive type. If we have extra arguments,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
138
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
139 __code csBs(int a, __rectype *p) ;
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
140
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
141 __code csAs(int a, __rectype *p) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
142 goto p(a, csBs);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
143 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
144
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
145 In this case, we have two \rectype keywords. It may points the same type or
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
146 different types. There is no ambiguity here, because it point the exact
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
147 position. If it points the same position in the same type declaration,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
148 it is the same type.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
149
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
150
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
151 --Recursive type syntax in a function body
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
152
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
153 \rectype can be appeared in a function arguments, a function body or struct definition as a
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
154 pointer type, otherwise it errors.
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
155
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
156 In a function body, it has a type of the function itself.
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
157
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
158 __code csAs(int a, __rectype *p) {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
159 __rectype *p1 = p;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
160 goto p1(a, csBs);
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
161 }
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
162
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
163 It is possible to write the following way;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
164
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
165 __code csAs(int a, __rectype *p) {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
166 __code (*p)(int, __retype *);
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
167 p1 = p;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
168 goto p1(a, csBs);
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
169 }
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
170
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
171 but previous one is shorter.
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
172
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
173 We cannot allow non pointer type \rectype, because it generates infinite size of object.
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
174
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
175 In case of struct,
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
176
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
177 struct {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
178 int a;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
179 __rectype *next;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
180 }
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
181
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
182 is the same of this;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
183
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
184 struct b {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
185 int a;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
186 struct b *next;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
187 }
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
188
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
189 this is a conventional way to represent recursive type in C. Using this technique we
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
190 can write a continuation like this;
13
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
191
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
192 struct interface {
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
193 __code (*next)(struct interface);
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
194 };
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
195
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
196 __code csA(struct interface p) {
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
197 struct interface ds = { csB };
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
198 goto p.next(ds); }
13
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
199
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
200 int main() {
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
201 struct interface ds = { print };
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
202 goto csA(ds);
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
203 /* NOTREACHED*/
13
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
204 return 0;
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
205 }
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
206
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
207 \rectype is clearer but struct technique provides abstract representation. It requires
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
208 extra struct declaration, but it give us the same assembler output.
13
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
209
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
210 __code fibonacci(__rectype *p, int num, int count, int result, int prev)
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
211
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
212
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
213 --How to implement \rectype
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
214
29
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
215 \rectype syntax is implemented overriding AST.
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
216 First, \rectype syntax make Tree same \code(\ref{fig:tree1}).
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
217 Second, tree was created to be rectype flag.
29
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 28
diff changeset
218 Third, to override AST(\ref{fig:tree2}).
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
219
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
220 \begin{figure}[htpb]
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
221 \begin{minipage}{0.5\hsize}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
222 \begin{center}
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
223 \scalebox{0.35}{\includegraphics{figure/tree1.pdf}}
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
224 \end{center}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
225 \caption{AST of function pointer}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
226 \label{fig:tree1}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
227 \end{minipage}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
228 \begin{minipage}{0.2\hsize}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
229 \begin{center}
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
230 \scalebox{0.35}{\includegraphics{figure/tree2.pdf}}
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
231 \end{center}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
232 \caption{AST of \rectype}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
233 \label{fig:tree2}
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
234 \end{minipage}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
235 \end{figure}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
236
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
237 This AST(\ref{fig:tree2}) is made by syntax of \verb+__code csA(__rectype *p)+ .
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
238 \treelist have information of argument.
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
239 First \treelist represent that argument is function pointer(\verb+__code (*p)()+) .
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
240 Second \treelist represent that csA is Fixed-length argument.
42
ba21600eabba spell check
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 40
diff changeset
241 Third \treelist is connected with \pointertype.
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
242 \pointertype have pointer of function(\functiontype).
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
243 We have to override it in the pointer of csA.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
244
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
245
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
246
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
247
21
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
248 --Problems with implementation of \rectype.
33
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 13 30
diff changeset
249
21
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
250 Segmentation fault has occurred in the following program on compile.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
251
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
252 __code csA(__rectype *p) {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
253 goto p(3);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
254 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
255
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
256 The above code is the wrong argument of p.
22
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
257 The p's argument is converted by GCC.
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
258 3 of type int is converted to a pointer type of Code Segment.
22
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
259 At this time, GCC looks at the type of the argument.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
260 p's argument is pointer of csA.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
261 csA's argument is p.
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
262 GCC is also an infinite recursion happens to see the type of argument of the argument.
22
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
263
23
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
264 We Solve this problem that does not check the arguments if the \rectype flag is true.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
265 The following program become part was fixed gcc/c-family/c-pretty-print.c.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
266
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
267 static void
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
268 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
269 {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
270 if (TREE_CODE (t) == POINTER_TYPE)
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
271 {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
272 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
273 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
274 pp_c_right_paren (pp);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
275 #ifndef noCbC
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
276 if (IS_RECTYPE(t)) return;
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
277 #endif
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
278 t = TREE_TYPE (t);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
279 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
280 pp_direct_abstract_declarator (pp, t);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
281 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
282
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
283
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
284 Variable t have information of p's argument.
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
285 If t is \pointertype, t is assigned type of \pointertype(\verb+t = TREE_TYPE (t);+).
23
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
286 We have added code \verb+if (IS_RECTYPE(t)) return;+
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
287 Thereby we have solved type checking and infinite recursion problem.
21
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
288
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
289
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
290
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
291
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
292 --Method other than \rectype
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
293
18
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
294 The recursively program of C's syntax can be solved using struct syntax.
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
295 For example, if we write
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
296
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
297 struct interface {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
298 __code (*next)(struct interface);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
299 };
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
300
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
301 __code csA(struct interface p) {
18
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
302 struct interface ds;
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
303 ds.next = csB;
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
304 goto p.next(ds);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
305 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
306
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
307 int main() {
18
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
308 struct interface ds;
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
309 ds = print;
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
310 goto csA(ds);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
311 return 0;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
312 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
313
18
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
314 there is no need to write recursively.
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
315 Because the struct syntax wrapped in a function pointer.
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
316 Code Segment does not receive function pointer in arguments.
18
33b7a54edaa9 method other rectype
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 17
diff changeset
317 Recursively program does not occur.
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
318
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
319
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
320 --Comparison
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
321
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
322 Here is CbC program that finds the Fibonacci sequence.
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
323
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
324 __code print(__rectype *p, long int num,
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
325 long int count, long int result, long int prev) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
326 printf("fibonacci(%d) = %ld\n",num,result);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
327 goto cs_while(print, num, count, result, prev);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
328 }
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
329
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
330 __code fibonacci(__rectype *p, long int num,
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
331 long int count, long int result, long int prev) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
332 if (count == 0) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
333 result += 0;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
334 count++;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
335 } else if (count == 1) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
336 result += 1;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
337 count++;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
338 } else if (count > 1){
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
339 long int tmp = prev;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
340 prev = result;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
341 result = result + tmp;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
342 count++;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
343 } else {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
344 printf("please enter nutural number\n");
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
345 exit(0);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
346 }
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
347 if (num < count) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
348 goto p(fibonacci, num, count, result, prev);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
349 }
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
350 goto fibonacci(p, num, count, result, prev);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
351 }
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
352 __code cs_while(__rectype *p, long int num,
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
353 long int count, long int result, long int prev) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
354 if (num > 0) {
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
355 num--;
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
356 goto fibonacci(print, num, 0, 0, 0);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
357 }
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
358 exit(0);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
359 }
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
360
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
361 It is written using \rectype syntax.
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
362 Do not use the \rectype syntax program would be the following declaration.
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
363
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
364 __code print(__code (*p)(__code(*)(),long int,long int,long int,long int),
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
365 long int num, long int count, long int result, long int prev);
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
366
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
367 __code fibonacci(__code (*p)(__code(*)(),long int,long int, long int,long int),
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
368 long int num, long int count, long int result, long int prev);
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
369
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
370 __code cs_while(__code (*p)(__code(*)(),long int, long int, long int, long int),
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
371 long int num, long int count, long int result, long int prev);
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
372
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
373 Comparing the program that made the declaration of each.
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
374 AST is almost the same should be created both.
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
375 Therefore, there should be no difference was the result.
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
376
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
377 Here is the result.
19
dc62dc1fe059 modify compression
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
378
dc62dc1fe059 modify compression
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
379 --Conclusion
39
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
380
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
381
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
382 We have designed and implemented Continuation based language for practical use.
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
383 We have implemented \rectype syntax in GCC for CbC.
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
384 Thereby Easyly be able to write CbC program than previous.
39
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
385
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
386 This \rectype implementation may be other problems.
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
387 If so, it is necessary to find and fix them on future.
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
388
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
389