192
|
1 C with Continuation (CwC) and Continuation based C (CbC)
|
724
|
2 河野 真治
|
|
3 琉球大学情報工学科
|
192
|
4
|
|
5 0. What is this.
|
|
6
|
861
|
7 この compile よりも、gcc / LLVM 版を使った方が良いでしょう。
|
|
8
|
724
|
9 これはC言語の拡張であり、下位言語でもあります。サブルーチン
|
|
10 の代わりに code segment というプログラミング単位を持つ言語
|
|
11 です。code segment は、軽量継続(light weight continuation)
|
|
12 によって接続されます。C の機能をすべて含む時は、C with
|
|
13 Continuation と呼びます。
|
192
|
14
|
|
15 #include <stdio.h>
|
|
16
|
|
17 code factorial(int n,int result,int orig,
|
|
18 code(*print)(),code(*exit1)(), void *exit1env)
|
|
19 {
|
|
20 if (n<0) {
|
|
21 printf("err %d!\n",n);
|
|
22 goto (*exit1)(0),exit1env;
|
|
23 }
|
|
24 if (n==0)
|
|
25 goto (*print)(n,result,orig,print,exit1,exit1env);
|
|
26 else {
|
|
27 result *= n;
|
|
28 n--;
|
|
29 goto factorial(n,result,orig,print,exit1,exit1env);
|
|
30 }
|
|
31 }
|
|
32
|
|
33 int main( int ac, char *av[])
|
|
34 {
|
|
35 int n;
|
|
36 n = 10;
|
|
37 goto factorial(n,1,n,print,return,environment);
|
|
38 }
|
|
39
|
|
40 code print(int n,int result,int orig,code(*print)(),(*exit1)(),void*exit1env)
|
|
41 {
|
|
42 printf("%d! = %d\n",orig, result);
|
|
43 goto (*exit1)(0),exit1env;
|
|
44 }
|
|
45
|
724
|
46 code segment だけを使い、手続き呼び出しをしないと、Cの下位言語
|
|
47 となります。これを、Continuation based B (Cbc) と呼びます。
|
|
48 実際、C をCbCにコンパイルすることが可能です。
|
192
|
49
|
724
|
50 CbC は、アーキテクチャに依存しないアセンブラ言語だと思えば良いでしょう。
|
192
|
51
|
724
|
52 1. 構文
|
192
|
53
|
|
54 code code_segment_name(interfaces) {
|
|
55 body;
|
|
56 }
|
|
57
|
724
|
58 code は code segment を表す型です。code segment ではreturn
|
|
59 文を使用することはできません。
|
192
|
60
|
724
|
61 Interfaces は引数です。構造体も使うことができます。Interface
|
|
62 の一部はレジスタにマップされるので参照を取ることはできません。
|
|
63 構造体は常に可能です。
|
192
|
64
|
724
|
65 code segment から移動するには goto 文を使います。
|
192
|
66
|
|
67 goto segment_name(interfaces);
|
|
68
|
724
|
69 間接gotoも可能です。同じinterfaceを持つcode segment間では、
|
|
70 効率の良い移動ができます。普通はjmp命令一つです。(stack
|
|
71 pointer の移動を含む場合もあるので、そうとは限らないんですが..)
|
|
72 異なるInterfaceの場合は、並列代入が起きます。
|
192
|
73
|
|
74
|
724
|
75 2. C との関係。
|
192
|
76
|
724
|
77 CwC からは自由にCの関数を呼び出すことができます。
|
192
|
78
|
724
|
79 C の関数からcode segment にgotoするのは自由ですが、
|
|
80 戻る場合には、Cの関数の環境を明示する必要があります。
|
192
|
81
|
|
82 goto factorial(n,1,n,print,return,environment);
|
|
83
|
724
|
84 return と environment は特殊な変数で、それぞれ、呼び出した
|
|
85 関数の継続(呼び出した関数に戻ることはできません)と、
|
|
86 その関数の環境(つまりスタック)です。setjump のjump_buf
|
|
87 に似てますが、allocate することはできません。
|
192
|
88
|
|
89 void *environment;
|
|
90
|
724
|
91 という型を持ちます。return 変数は、元の関数の継続、
|
|
92 つまりreturn文そのものです。その型は元の関数に
|
|
93 依存します。
|
192
|
94
|
|
95 code (*return)(int return_value);
|
|
96
|
724
|
97 ここにgotoするには環境を明示したgotoを使います。
|
|
98 普通にgotoしてはいけません。コンパイラはチェックしてません。
|
|
99 ごめんなさい。多重にfunction-code-function-codeして、
|
|
100 一番外のheavy continuationに抜けることはできます。
|
192
|
101
|
|
102 goto (*exit1)(0),exit1env;
|
|
103
|
724
|
104 thread として使うことは今のところはできません。
|
192
|
105
|
724
|
106 3. 使い方
|
192
|
107
|
724
|
108 mc-powerpc, mc-ia32 がコンパイラです。アセンブラソースを出力します。
|
|
109 アセンブルとリンクにはgccを使って下さい。
|
192
|
110
|
|
111 mc-powerpc source.c
|
|
112 gcc source.s
|
724
|
113 a.out を生成。
|
192
|
114 mc-powerpc source.c
|
|
115 gcc -c sources.s
|
724
|
116 .o を生成。
|
192
|
117
|
|
118 -s comments in assembler source.
|
|
119 -c check only.
|
|
120 -oname output file names
|
|
121 -Idir add library include directory
|
|
122
|
724
|
123 test の下にいくつか例題があります。
|
192
|
124
|
724
|
125 3. 実装されてない部分
|
192
|
126
|
724
|
127 // Mips コンパイラはまだ動きません。
|
192
|
128
|
724
|
129 64 bit long long が動きます。
|
|
130 // long long, long double は型として使うことはできますが、
|
|
131 // 演算はできません。変数の定義もできないと思う。
|
|
132 // Long long value (0LL) は使えますが、単なるlongを返します。
|
|
133 // long は32bit. int もpointerも同じ。
|
192
|
134
|
724
|
135 Mac OS X と Red hat Linux だけでテストしてあります。
|
|
136 Intel Mac でも動作します。
|
192
|
137
|
724
|
138 // Inline は無視され、普通のstatic関数にコンパイルされます。
|
192
|
139
|
724
|
140 //浮動小数点レジスタへの代入計算はできません。
|
245
|
141 // *=, /=, +=.
|
192
|
142
|
724
|
143 // built-in allocaはありません。
|
192
|
144
|
724
|
145 // varargs もないです。
|
192
|
146
|
724
|
147 // Switch 文は、分岐にコンパイルされます。テーブルは生成されません。
|
192
|
148
|
724
|
149 // マクロの機能のうち連結とかは動きません。
|
192
|
150
|
724
|
151 マクロはコルーチンで、プリプロセッサではありません。振舞いがcppと
|
|
152 少し異なります。
|
192
|
153
|
724
|
154 デバッグ用の -g はありません。
|
192
|
155
|
724
|
156 CbC のcode segment から実行を始めることはできません。
|
192
|
157
|
724
|
158 // #include は、呼び出したソースコードのカレントディレクトリをサーチしません。
|
|
159 #include は、呼び出したソースコードのカレントディレクトリをサーチします。
|
192
|
160
|
724
|
161 bit-field (こんなの要らないけどさ...) サポートしてますが、
|
|
162 大域変数への初期化は出来ません。
|
607
|
163
|
724
|
164 asm は部分的にしか実装されてません。
|
607
|
165
|
339
|
166
|
724
|
167 その他、たくさん。ANSI コンパチを目指しているわけではないので...
|
192
|
168
|
607
|
169
|
|
170 /************************************************************************
|
|
171 ** Copyright (C) 2006 Shinji Kono
|
724
|
172 ** 連絡先: 琉球大学情報工学科 河野 真治
|
|
173 ** (E-Mail Address: kono@ie.u-ryukyu.ac.jp)
|
607
|
174 **
|
724
|
175 ** このソースのいかなる複写,改変,修正も許諾します。ただし、
|
|
176 ** その際には、誰が貢献したを示すこの部分を残すこと。
|
|
177 ** 再配布や雑誌の付録などの問い合わせも必要ありません。
|
|
178 ** 営利利用も上記に反しない範囲で許可します。
|
|
179 ** バイナリの配布の際にはversion messageを保存することを条件とします。
|
|
180 ** このプログラムについては特に何の保証もしない、悪しからず。
|
607
|
181 **
|
|
182 ** Everyone is permitted to do anything on this program
|
|
183 ** including copying, modifying, improving,
|
|
184 ** as long as you don't try to pretend that you wrote it.
|
|
185 ** i.e., the above copyright notice has to appear in all copies.
|
|
186 ** Binary distribution requires original version messages.
|
|
187 ** You don't have to ask before copying, redistribution or publishing.
|
|
188 ** THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
|
|
189 ***********************************************************************/
|
|
190
|