Mercurial > hg > CbC > old > device
changeset 192:b0d6a6940cb7
*** empty log message ***
author | kono |
---|---|
date | Tue, 02 Dec 2003 12:18:54 +0900 |
parents | 8646a4a9cde9 |
children | ce0c38b6c85e |
files | README README.jp |
diffstat | 2 files changed, 310 insertions(+), 0 deletions(-) [+] |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/README Tue Dec 02 12:18:54 2003 +0900 @@ -0,0 +1,149 @@ +C with Continuation (CwC) and Continuation based C (CbC) + $Id$ + Shinji Kono + University of the Ryukyus + 2003 December + +0. What is this. + +This is a extension of C ( and a subset of C ). It has a +programming unit which is called code segment. Code +segment can be communicate with so called light weight 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; + } + +If you don't use function call, this language becomes subset of C. +It is called Continuation based C. Actually it can be a lower layer of +C language. Normal C program can be compiled into CbC. + +CbC is a kind of architecture independent assembler language. + +1. Syntax + + code code_segment_name(interfaces) { + body; + } + +code is a type for code segment. A code segment has no return +statements. + +Interfaces are arguments. It can be struts. or unions. Some +part of interfaces are mapped into registers. No +references are allowed in register interface variables. + +Goto statements transfer the control from a segment +to a segment. + goto segment_name(interfaces); +If two code segments has a same interfaces, transfer cost is very +small. It us usually a single jump instruction. +If there are differences, some parallel assignment is performed. + +2. Interaction between function and code segment. + +In CwC, you can call C function at any time in code segments. +If you want to call code segment from C and want to do some +return, explicit handling of function environment. + + goto factorial(n,1,n,print,return,environment); + +return and environment is a special variable which contains +return point. An environment variable is something like jumpbuf +in setjump, but it is a simple pointer. Unlike jumpbuf, +there is no way to allocate are for environment. + void *environment; + +A return variable is a continuation with environment of +original function. It's type is varied for called function. + + code (*return)(int return_value); + +To go to the continuation, use goto with environment. + + goto (*exit1)(0),exit1env; + +3. How to use + +mc-powerpc, mc-ia32 is a compiler. It generates assembler +source code .s from C source code. + + mc-powerpc source.c + gcc source.s +generates a.out. + mc-powerpc source.c + gcc -c sources.s +generates sources.o + + -s comments in assembler source. + -c check only. + -oname output file names + -Idir add library include directory + +Some examples can be fond in test directory. + +3. Unimplemented lists + +Mips version is not ready. + +long long, long double, unsigned long long can be used as type, +but no operation (including assignment) are no allowed. + +Long long value (0LL) can be used but it gives long value. +Long is equal to an int and a pointer (32bit). + +Only Mac OS X and Red hat Linux is supported. + +Inline directive is ignored and gives normal function definition. + +Register float arguments does no accepts assignment operation such as + *=, /=, +=. + +No built-in alloca. + +No varargs. + +Switch statements is implemented as series of compare and branch, +no tables. + +Some operations such as concatenation are not implemented in macro +processor. + +Macro processor is a coroutine in this compiler, slightly different +from cpp. + +No -g support. + +No runtime driver for CbC. + + #include does not search, sources current directory. + +
--- /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 コンパチを目指しているわけではないので... +