view README.jp @ 935:7672a37e7545 default tip

Raspbery PI ARM support begin
author kono
date Sat, 24 Dec 2016 03:02:57 +0000
parents c005a392e27e
children
line wrap: on
line source

C with Continuation (CwC) and Continuation based C (CbC)
             河野 真治 
             琉球大学情報工学科

0. What is this.

この compile よりも、gcc / LLVM 版を使った方が良いでしょう。

これは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 は引数です。構造体も使うことができます。Interface
の一部はレジスタにマップされるので参照を取ることはできません。
構造体は常に可能です。

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 コンパイラはまだ動きません。

64 bit long long が動きます。
//    long long, long double は型として使うことはできますが、
//    演算はできません。変数の定義もできないと思う。
//    Long long value (0LL) は使えますが、単なるlongを返します。
//    long は32bit. int もpointerも同じ。

Mac OS X と Red hat Linux だけでテストしてあります。
Intel Mac でも動作します。

// Inline は無視され、普通のstatic関数にコンパイルされます。 

//浮動小数点レジスタへの代入計算はできません。
//    *=, /=, +=.

// built-in allocaはありません。

// varargs もないです。

// Switch 文は、分岐にコンパイルされます。テーブルは生成されません。

// マクロの機能のうち連結とかは動きません。

マクロはコルーチンで、プリプロセッサではありません。振舞いがcppと
少し異なります。

デバッグ用の -g はありません。

CbC のcode segment から実行を始めることはできません。

// #include は、呼び出したソースコードのカレントディレクトリをサーチしません。
 #include は、呼び出したソースコードのカレントディレクトリをサーチします。

bit-field (こんなの要らないけどさ...) サポートしてますが、
大域変数への初期化は出来ません。

asm は部分的にしか実装されてません。


その他、たくさん。ANSI コンパチを目指しているわけではないので...


/************************************************************************
** Copyright (C) 2006 Shinji Kono
** 連絡先: 琉球大学情報工学科 河野 真治  
** (E-Mail Address: kono@ie.u-ryukyu.ac.jp)
**
**    このソースのいかなる複写,改変,修正も許諾します。ただし、
**    その際には、誰が貢献したを示すこの部分を残すこと。
**    再配布や雑誌の付録などの問い合わせも必要ありません。
**    営利利用も上記に反しない範囲で許可します。
**    バイナリの配布の際にはversion messageを保存することを条件とします。
**    このプログラムについては特に何の保証もしない、悪しからず。
**
**    Everyone is permitted to do anything on this program 
**    including copying, modifying, improving,
**    as long as you don't try to pretend that you wrote it.
**    i.e., the above copyright notice has to appear in all copies.  
**    Binary distribution requires original version messages.
**    You don't have to ask before copying, redistribution or publishing.
**    THE AUTHOR DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE.
***********************************************************************/