Mercurial > hg > CbC > old > device
diff README.jp @ 192:b0d6a6940cb7
*** empty log message ***
author | kono |
---|---|
date | Tue, 02 Dec 2003 12:18:54 +0900 |
parents | |
children | 8a72b0afccfc |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README.jp Tue Dec 02 12:18:54 2003 +0900 @@ -0,0 +1,161 @@ +C with Continuation (CwC) and Continuation based C (CbC) + $Id$ + 河野 真治 + 琉球大学情報工学科 + 2003 December + +0. What is this. + +これはC言語の拡張であり、下位言語でもあります。サブルーチン +の代わりに code segment というプログラミング単位を持つ言語 +です。code segment は、軽量継続(light weight continuation) +によって接続されます。C の機能をすべて含む時は、C with +Continuation と呼びます。 + + #include <stdio.h> + + code factorial(int n,int result,int orig, + code(*print)(),code(*exit1)(), void *exit1env) + { + if (n<0) { + printf("err %d!\n",n); + goto (*exit1)(0),exit1env; + } + if (n==0) + goto (*print)(n,result,orig,print,exit1,exit1env); + else { + result *= n; + n--; + goto factorial(n,result,orig,print,exit1,exit1env); + } + } + + int main( int ac, char *av[]) + { + int n; + n = 10; + goto factorial(n,1,n,print,return,environment); + } + + code print(int n,int result,int orig,code(*print)(),(*exit1)(),void*exit1env) + { + printf("%d! = %d\n",orig, result); + goto (*exit1)(0),exit1env; + } + +code segment だけを使い、手続き呼び出しをしないと、Cの下位言語 +となります。これを、Continuation based B (Cbc) と呼びます。 +実際、C をCbCにコンパイルすることが可能です。 + +CbC は、アーキテクチャに依存しないアセンブラ言語だと思えば良いでしょう。 + +1. 構文 + + code code_segment_name(interfaces) { + body; + } + +code は code segment を表す型です。code segment ではreturn +文を使用することはできません。 + +Interfaces は引数です。構造体も使うことができます。Inteface +の一部はレジスタにマップされるので参照を取ることはできません。 +構造体は常に可能です。 + +code segment から移動するには goto 文を使います。 + + goto segment_name(interfaces); + +間接gotoも可能です。同じinterfaceを持つcode segment間では、 +効率の良い移動ができます。普通はjmp命令一つです。(stack +pointer の移動を含む場合もあるので、そうとは限らないんですが..) +異なるInterfaceの場合は、並列代入が起きます。 + + +2. C との関係。 + +CwC からは自由にCの関数を呼び出すことができます。 + +C の関数からcode segment にgotoするのは自由ですが、 +戻る場合には、Cの関数の環境を明示する必要があります。 + + goto factorial(n,1,n,print,return,environment); + +return と environment は特殊な変数で、それぞれ、呼び出した +関数の継続(呼び出した関数に戻ることはできません)と、 +その関数の環境(つまりスタック)です。setjump のjump_buf +に似てますが、allocate することはできません。 + + void *environment; + +という型を持ちます。return 変数は、元の関数の継続、 +つまりreturn文そのものです。その型は元の関数に +依存します。 + + code (*return)(int return_value); + +ここにgotoするには環境を明示したgotoを使います。 +普通にgotoしてはいけません。コンパイラはチェックしてません。 +ごめんなさい。多重にfunction-code-function-codeして、 +一番外のheavy continuationに抜けることはできます。 + + goto (*exit1)(0),exit1env; + +thread として使うことは今のところはできません。 + +3. 使い方 + +mc-powerpc, mc-ia32 がコンパイラです。アセンブラソースを出力します。 +アセンブルとリンクにはgccを使って下さい。 + + mc-powerpc source.c + gcc source.s +a.out を生成。 + mc-powerpc source.c + gcc -c sources.s +.o を生成。 + + -s comments in assembler source. + -c check only. + -oname output file names + -Idir add library include directory + +test の下にいくつか例題があります。 + +3. 実装されてない部分 + +Mips コンパイラはまだ動きません。 + +long long, long double は型として使うことはできますが、 +演算はできません。変数の定義もできないと思う。 + +Long long value (0LL) は使えますが、単なるlongを返します。 +long は32bit. int もpointerも同じ。 + +Mac OS X と Red hat Linux だけでテストしてあります。 + +Inline 無視され、普通の関数にコンパイルされます。 + +浮動小数点レジスタへの代入計算はできません。 + *=, /=, +=. + +built-in allocaはありません。 + +varargs もないです。 + +Switch 文は、分岐にコンパイルされます。テーブルは生成されません。 + +マクロの機能、連結とかは動きません。 + +マクロはコルーチンで、プリプロセッサではありません。振舞いがcppと +少し異なります。 + +デバッグ用の -g はありません。 + +CbC のcode segment から実行を始めることはできません。 + + #include は、呼び出したソースコードのカレントディレクトリを +サーチしません。 + +その他、たくさん。ANSI コンパチを目指しているわけではないので... +