# HG changeset patch # User anatofuz # Date 1549958576 -32400 # Node ID 96e9cf9c2ea2c8c6de8701bc991cc3d54b3721f9 # Parent f6a579a777084008277ac5f4c38bdb3ba7b53bdb add source files diff -r f6a579a77708 -r 96e9cf9c2ea2 paper/chapter3.tex --- a/paper/chapter3.tex Tue Feb 12 16:37:57 2019 +0900 +++ b/paper/chapter3.tex Tue Feb 12 17:02:56 2019 +0900 @@ -25,8 +25,8 @@ 通常C言語の関数呼び出しでは、 スタックポインタを操作し、 ローカル変数や、 レジスタ情報をスタックに保存する。 これらは通常アセンブラのcall命令として処理される。 -CbCの場合、 スタックフレームを操作せず、 レジスタの値を変更せずに次のCodeGearに遷移する。 -この際Cの関数呼び出しとは異なり、 プログラムカウンタを操作するのみのjmp命令として処理される。 +CbCの場合、 スタックフレームを操作せずに次のCodeGearに遷移する。 +この際Cの関数呼び出しとは異なり、 プロラムカウンタを操作するのみのjmp命令として処理される。 通常Schemeのcall/ccなどの継続と呼ばれる処理は、 現在のプログラムまでの位置や情報を、 環境として所持した状態で遷移する。 CbCの場合これら環境を持たず遷移する為、 通常の継続と比較して軽量であるから、 軽量継続であると言える。 CbCは軽量継続を利用するためにレジスタレベルでの実装が可能となり、 Cよりも低級な言語と言える。 @@ -40,4 +40,10 @@ \lstinputlisting[frame=lrbt, label=cbc_example_test, caption=加算と文字列を設定するCbCコードの例]{./codes/cbc_example_test.cbc} +この例では、 cg1, cg2, cg3という CodeGear を用意し、これらをcg1,cg2,cg3の順で軽量継続していく。 +入出力としてmain関数で生成したTEST構造体を受け渡し、 cg1で数値の加算を、 cg2で文字列の設定を行う。 +main関数からcg1へのgoto文では、 Cの関数からCodeGearへの移動となる為、 call命令ではなくjmp命令で行われる。 +cg1からcg2、 またcg2からcg3へは、 CodeGear間での移動となるためjmp命令での軽量継続で処理される。 +この例では最終的に test.number には1が、 test.stringにはHelloが設定される。 + diff -r f6a579a77708 -r 96e9cf9c2ea2 paper/codes/cbc_example_test.cbc --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/codes/cbc_example_test.cbc Tue Feb 12 17:02:56 2019 +0900 @@ -0,0 +1,34 @@ +extern int printf(const char*,...); + +typedef struct test_struct { + int number; + char* string; +} TEST, *TESTP; + + +__code cg1(TEST); +__code cg2(TEST); +__code cg3(TEST); + +__code cg1(TEST testin){ + TEST testout; + testout.number = testin.number + 1; + testout.string = testin.string; + goto cg2(testout); +} + +__code cg2(TEST testin){ + TEST testout; + testout.number = testin.number; + testout.string = "Hello"; + goto cg3(testout); +} + +__code cg3(TEST testin){ + printf("number = %d\t string= %s\n",testin.number,testin.string); +} + +int main(){ + TEST test = {0,0}; + goto cg1(test); +} diff -r f6a579a77708 -r 96e9cf9c2ea2 paper/codes/fib.nqp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/codes/fib.nqp Tue Feb 12 17:02:56 2019 +0900 @@ -0,0 +1,14 @@ +#! nqp + +sub fib($n) { + $n < 2 ?? $n !! fib($n-1) + fib($n - 2); +} + +my $N := 29; + +my $t0 := nqp::time_n(); +my $z := fib($N); +my $t1 := nqp::time_n(); + +say("fib($N) = " ~ fib($N)); +say("time = " ~ ($t1-$t0)); diff -r f6a579a77708 -r 96e9cf9c2ea2 paper/codes/nqp_ops.nqp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/codes/nqp_ops.nqp Tue Feb 12 17:02:56 2019 +0900 @@ -0,0 +1,14 @@ +$ops.add_hll_op('nqp', 'preinc', -> $qastcomp, $op { + my $var := $op[0]; + unless nqp::istype($var, QAST::Var) { + nqp::die("Pre-increment can only work on a variable"); + } + $qastcomp.as_mast(QAST::Op.new( + :op('bind'), + $var, + QAST::Op.new( + :op('add_i'), + $var, + QAST::IVal.new( :value(1) ) + ))); +}); diff -r f6a579a77708 -r 96e9cf9c2ea2 paper/codes/src_main.nqp --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/paper/codes/src_main.nqp Tue Feb 12 17:02:56 2019 +0900 @@ -0,0 +1,16 @@ +use Perl6::Grammar; +use Perl6::Actions; +use Perl6::Compiler; + +# Initialize Rakudo runtime support. +nqp::p6init(); + +# Create and configure compiler object. +my $comp := Perl6::Compiler.new(); +$comp.language('perl6'); +$comp.parsegrammar(Perl6::Grammar); +$comp.parseactions(Perl6::Actions); +$comp.addstage('syntaxcheck', :before); +$comp.addstage('optimize', :after); +hll-config($comp.config); +nqp::bindhllsym('perl6', '$COMPILER_CONFIG', $comp.config); diff -r f6a579a77708 -r 96e9cf9c2ea2 paper/main.pdf Binary file paper/main.pdf has changed