annotate paper/rectype.ind @ 51:bdbfe2a272ff

fix
author Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
date Sat, 16 Jun 2012 05:05:25 +0900
parents 1c9d41bb0c19
children 0cd49f4081e0
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.
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
16 We introduce \rectype{} keyword for recursive type, and it is implemented in GCC-4.6.0.
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
17 We will compare the conventional methods, \rectype{} keyword and a method using C structure.
11
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
45
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
34 Continuation has long history. Usually it means full copy of compuational evironment as in Scheme\cite{scheme}. Our continuation is a simple C function without environment because we have no stack in CbC.
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
35 Using explicit stack, we can convert normal C program into CbC using CPS transformation\cite{cps},
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
36 but we commit it's detail here.
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
37
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
38 C has capable of recursive functions, but we find it's type system is not enough
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
39 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
40 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
41 is used. It is also fit for CbC program.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
42
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
43 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
44
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
45 --Continuation based C
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
46
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
47 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
48 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
49 as input and output interfaces.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
50
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
51 struct interface1 { int i; };
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
52 struct interface2 { int o; };
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 __code f(struct interface1 a) {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
55 struct interface2 b; b.o=a.i;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
56 goto g(b);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
57 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
58
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
59 In this example, a Code Segment
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
60 \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
61 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
62 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
63 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
64 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
65 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
66
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
67 <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
68
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
69
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
70 \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
71 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
72 we cannot goto into normal C function.
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
73
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
74 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
75 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
76 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
77
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
78 void *env;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
79 __code (*exit)(int);
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 __code h(char *s) {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
82 printf(s);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
83 goto (*exit)(0),env;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
84 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
85
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
86 int main() {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
87 env = __environment;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
88 exit = __return;
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
89 goto h("hello World\n");
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
90 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
91
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
92 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
93 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
94 and the continuation can be get using \verb+__environment+,
28
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 27
diff changeset
95 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
96 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
97 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
98 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
99
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
100
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
101
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
102 --Recursive type syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
103
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
104 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
105 For example, it is passed as follows;
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
106
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
107 __code csA( __code (*p)() ) {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
108 goto p(csB);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
109 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
110
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
111 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
112 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
113 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
114 get following program;
14
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 __code csA( __code (*p)( __code (*)( __code (*)( __code (*)())))) {
14
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
117 goto p(csB);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
118 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
119
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
120 or
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
121 __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
122 goto p(csB);
68d2c32f74cf modify explanation of rectype syntax
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 14
diff changeset
123 }
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 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
126 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
127 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
128
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
129 We introduce \rectype{} syntax for this situation. In an argument deflation,
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
130 \rectype{} represents it's function type. Using \rectype{}, previous example can
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
131 be written like this;
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
132
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
133 __code csA( __rectype *p) {
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
134 goto p(csB);
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
135 }
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
136
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
137 {\tt *p} has a type of {\tt csA} itself.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
138
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
139 The same situation is happen in conventional C, since Code Segment is a
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
140 mere C function with tail-call-elimination. \rectype{} provides exact and
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
141 concise way to describe recursive type. If we have extra arguments,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
142
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
143 __code csBs(int a, __rectype *p) ;
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 __code csAs(int a, __rectype *p) {
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
146 goto p(a, csBs);
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
147 }
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
148
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
149 In this case, we have two \rectype{} keywords. It may points the same type or
37
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
150 different types. There is no ambiguity here, because it point the exact
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
151 position. If it points the same position in the same type declaration,
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
152 it is the same type.
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 35
diff changeset
153
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
154
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
155 --Recursive type syntax in a function body
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
156
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
157 \rectype{} can be appeared in a function arguments, a function body or struct definition as a
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
158 pointer type, otherwise it errors.
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
159
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
160 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
161
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
162 __code csAs(int a, __rectype *p) {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
163 __rectype *p1 = p;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
164 goto p1(a, csBs);
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
165 }
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
166
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
167 It is possible to write the following way;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
168
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
169 __code csAs(int a, __rectype *p) {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
170 __code (*p)(int, __retype *);
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
171 p1 = p;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
172 goto p1(a, csBs);
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
173 }
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
174
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
175 but previous one is shorter.
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
176
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
177 We cannot allow non pointer type \rectype{}, because it generates infinite size of object.
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
178
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
179 In case of struct,
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 struct {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
182 int a;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
183 __rectype *next;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
184 }
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
185
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
186 is the same of this;
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 struct b {
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
189 int a;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
190 struct b *next;
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
191 }
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
192
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
193 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
194 can write a continuation like this;
13
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 struct interface {
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
197 __code (*next)(struct interface);
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
198 };
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 __code csA(struct interface p) {
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
201 struct interface ds = { csB };
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
202 goto p.next(ds); }
13
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
203
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
204 int main() {
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
205 struct interface ds = { print };
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
206 goto csA(ds);
38
34a726a5c0d4 on going...
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 37
diff changeset
207 /* NOTREACHED*/
13
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
208 return 0;
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
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
211 \rectype{} is clearer but struct technique provides abstract representation. It requires
40
4b828672f6b9 modify rectype.ind
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 39
diff changeset
212 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
213
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
214 __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
215
22dbcdbcae5f add CbC.mm
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 11
diff changeset
216
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
217 --How to implement \rectype{}
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
218
45
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
219 \rectype{} syntax is implemented as a GCC's AST (Abstract Syntax Tree).
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
220 A function type has tree lists of its argments and its return type.
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
221 In \verb+__code+ case, return type is void.
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
222 When we find \rectype{}, which is as pointer to the function, a pointer type node
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
223 is created (Fig.\ref{fig:tree1}).
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
224 Normaly the type node has a pointer to function type, but
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
225 we put a pointer to the parent function itself (Fig.\ref{fig:tree2}).
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
226
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
227 It looks like a normal function type and works fine except type comparison, which
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
228 falls into an infinite loop. In order to stop type loop, we introduce \rectype{} flag
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
229 in the type node. A type comparison was simply stopped when it met \rectype{} flag.
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
230
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
231 \begin{figure}[htpb]
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
232 \begin{minipage}{0.5\hsize}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
233 \begin{center}
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
234 \scalebox{0.35}{\includegraphics{figure/tree1.pdf}}
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
235 \end{center}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
236 \caption{AST of function pointer}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
237 \label{fig:tree1}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
238 \end{minipage}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
239 \begin{minipage}{0.2\hsize}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
240 \begin{center}
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
241 \scalebox{0.35}{\includegraphics{figure/tree2.pdf}}
30
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
242 \end{center}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
243 \caption{AST of \rectype}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 29
diff changeset
244 \label{fig:tree2}
24
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
245 \end{minipage}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
246 \end{figure}
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 23
diff changeset
247
45
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
248 A type check is taken in the parametarized goto statement or function call.
21
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
249
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
250 __code csA(__rectype *p) {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
251 goto p(3);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
252 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 20
diff changeset
253
45
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
254 In this case, {\tt 3} is not a type of \verb+__code csA(__rectype *P)+ and the compiler complains.
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
255 But the code below does not check its argument.
22
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 21
diff changeset
256
45
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
257 __code csA(__code (*p)()) {
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
258 goto p(3);
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
259 }
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
260
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
261 The \rectype{} flag is implemented in following program in
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
262 gcc/c-family/c-pretty-print.c.
23
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
263
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
264 static void
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
265 pp_c_abstract_declarator (c_pretty_printer *pp, tree t)
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 if (TREE_CODE (t) == POINTER_TYPE)
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
268 {
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
269 if (TREE_CODE (TREE_TYPE (t)) == ARRAY_TYPE
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
270 || TREE_CODE (TREE_TYPE (t)) == FUNCTION_TYPE)
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
271 pp_c_right_paren (pp);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
272 #ifndef noCbC
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
273 if (IS_RECTYPE(t)) return;
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
274 #endif
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
275 t = TREE_TYPE (t);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
276 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
277 pp_direct_abstract_declarator (pp, t);
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
278 }
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
279
45
a737be4a6167 on going
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents: 44
diff changeset
280 \verb+if (IS_RECTYPE(t)) return;+ prevents infinite type check.
23
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 22
diff changeset
281
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
282 --Comparison
11
bf3c780d3039 changed to outline format
Shinji KONO <kono@ie.u-ryukyu.ac.jp>
parents:
diff changeset
283
26
680becde8c9f modify coparison
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 25
diff changeset
284
19
dc62dc1fe059 modify compression
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
285
46
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
286
51
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
287 Here is the result in IA32 and x64 architecture (Table\ref{tab:compare}).
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
288 GCC-4.2.3 is IA32 architecture.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
289 GCC-4.6.0 is x64 architecture.
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 50
diff changeset
290
47
28a2460b085b modify table
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
291 conv1 1 is function call. conv1 2, conv1 3 is optimized CPS transformed source.
46
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
292
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
293 \begin{table}[htpb]
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
294 \centering
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
295 \small
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
296 \begin{tabular}{|l|r|r|r|} \hline
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
297 & ./conv1 1 & ./conv1 2 & ./conv1 3 \\ \hline
48
9b32bda0cb63 modify table
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 47
diff changeset
298 GCC-4.2.3(+omit)IA32 & 4.20 & 2.25 & 2.76 \\ \hline
50
1c9d41bb0c19 modify table
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 49
diff changeset
299 GCC-4.6.0(+O2)x64 & 1.65 & 1.10 & 1.08 \\ \hline
46
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
300 \end{tabular}
47
28a2460b085b modify table
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
301 \caption{GCC bench mark(in sec)}
28a2460b085b modify table
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 46
diff changeset
302 \label{tab:compare}
46
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
303 \end{table}
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
304
f6b9b7648484 add compare
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 45
diff changeset
305
19
dc62dc1fe059 modify compression
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 18
diff changeset
306 --Conclusion
39
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
307
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
308
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
309 We have designed and implemented Continuation based language for practical use.
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
310 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
311 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
312
44
39f6db695840 modify macro
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 43
diff changeset
313 This \rectype{} implementation may be other problems.
39
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
314 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
315
09cd9c5c7c40 modify conclution
Nobuyasu Oshiro <dimolto@cr.ie.u-ryukyu.ac.jp>
parents: 38
diff changeset
316