comparison README.jp @ 192:b0d6a6940cb7

*** empty log message ***
author kono
date Tue, 02 Dec 2003 12:18:54 +0900
parents
children 8a72b0afccfc
comparison
equal deleted inserted replaced
191:8646a4a9cde9 192:b0d6a6940cb7
1 C with Continuation (CwC) and Continuation based C (CbC)
2 $Id$
3 河野 真治
4 琉球大学情報工学科
5 2003 December
6
7 0. What is this.
8
9 これはC言語の拡張であり、下位言語でもあります。サブルーチン
10 の代わりに code segment というプログラミング単位を持つ言語
11 です。code segment は、軽量継続(light weight continuation)
12 によって接続されます。C の機能をすべて含む時は、C with
13 Continuation と呼びます。
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
46 code segment だけを使い、手続き呼び出しをしないと、Cの下位言語
47 となります。これを、Continuation based B (Cbc) と呼びます。
48 実際、C をCbCにコンパイルすることが可能です。
49
50 CbC は、アーキテクチャに依存しないアセンブラ言語だと思えば良いでしょう。
51
52 1. 構文
53
54 code code_segment_name(interfaces) {
55 body;
56 }
57
58 code は code segment を表す型です。code segment ではreturn
59 文を使用することはできません。
60
61 Interfaces は引数です。構造体も使うことができます。Inteface
62 の一部はレジスタにマップされるので参照を取ることはできません。
63 構造体は常に可能です。
64
65 code segment から移動するには goto 文を使います。
66
67 goto segment_name(interfaces);
68
69 間接gotoも可能です。同じinterfaceを持つcode segment間では、
70 効率の良い移動ができます。普通はjmp命令一つです。(stack
71 pointer の移動を含む場合もあるので、そうとは限らないんですが..)
72 異なるInterfaceの場合は、並列代入が起きます。
73
74
75 2. C との関係。
76
77 CwC からは自由にCの関数を呼び出すことができます。
78
79 C の関数からcode segment にgotoするのは自由ですが、
80 戻る場合には、Cの関数の環境を明示する必要があります。
81
82 goto factorial(n,1,n,print,return,environment);
83
84 return と environment は特殊な変数で、それぞれ、呼び出した
85 関数の継続(呼び出した関数に戻ることはできません)と、
86 その関数の環境(つまりスタック)です。setjump のjump_buf
87 に似てますが、allocate することはできません。
88
89 void *environment;
90
91 という型を持ちます。return 変数は、元の関数の継続、
92 つまりreturn文そのものです。その型は元の関数に
93 依存します。
94
95 code (*return)(int return_value);
96
97 ここにgotoするには環境を明示したgotoを使います。
98 普通にgotoしてはいけません。コンパイラはチェックしてません。
99 ごめんなさい。多重にfunction-code-function-codeして、
100 一番外のheavy continuationに抜けることはできます。
101
102 goto (*exit1)(0),exit1env;
103
104 thread として使うことは今のところはできません。
105
106 3. 使い方
107
108 mc-powerpc, mc-ia32 がコンパイラです。アセンブラソースを出力します。
109 アセンブルとリンクにはgccを使って下さい。
110
111 mc-powerpc source.c
112 gcc source.s
113 a.out を生成。
114 mc-powerpc source.c
115 gcc -c sources.s
116 .o を生成。
117
118 -s comments in assembler source.
119 -c check only.
120 -oname output file names
121 -Idir add library include directory
122
123 test の下にいくつか例題があります。
124
125 3. 実装されてない部分
126
127 Mips コンパイラはまだ動きません。
128
129 long long, long double は型として使うことはできますが、
130 演算はできません。変数の定義もできないと思う。
131
132 Long long value (0LL) は使えますが、単なるlongを返します。
133 long は32bit. int もpointerも同じ。
134
135 Mac OS X と Red hat Linux だけでテストしてあります。
136
137 Inline 無視され、普通の関数にコンパイルされます。
138
139 浮動小数点レジスタへの代入計算はできません。
140 *=, /=, +=.
141
142 built-in allocaはありません。
143
144 varargs もないです。
145
146 Switch 文は、分岐にコンパイルされます。テーブルは生成されません。
147
148 マクロの機能、連結とかは動きません。
149
150 マクロはコルーチンで、プリプロセッサではありません。振舞いがcppと
151 少し異なります。
152
153 デバッグ用の -g はありません。
154
155 CbC のcode segment から実行を始めることはできません。
156
157 #include は、呼び出したソースコードのカレントディレクトリを
158 サーチしません。
159
160 その他、たくさん。ANSI コンパチを目指しているわけではないので...
161