changeset 29:96e9cf9c2ea2

add source files
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Tue, 12 Feb 2019 17:02:56 +0900
parents f6a579a77708
children 3ad581842874
files paper/chapter3.tex paper/codes/cbc_example_test.cbc paper/codes/fib.nqp paper/codes/nqp_ops.nqp paper/codes/src_main.nqp paper/main.pdf
diffstat 6 files changed, 86 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- 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が設定される。
 
+
--- /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);
+}
--- /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));
--- /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) )
+        )));
+});
--- /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<ast>);
+$comp.addstage('optimize', :after<ast>);
+hll-config($comp.config);
+nqp::bindhllsym('perl6', '$COMPILER_CONFIG', $comp.config);
Binary file paper/main.pdf has changed