annotate README.jp @ 204:4c614334f3d0

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