changeset 57:e16c3d3e30b2

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Sat, 16 Feb 2019 17:16:19 +0900
parents aa2a9c95e294
children ca050432ad63
files prepaper/finalpre.pdf prepaper/finalpre.tex prepaper/src/cbc_example_test.cbc
diffstat 3 files changed, 14 insertions(+), 18 deletions(-) [+]
line wrap: on
line diff
Binary file prepaper/finalpre.pdf has changed
--- a/prepaper/finalpre.tex	Sat Feb 16 17:10:12 2019 +0900
+++ b/prepaper/finalpre.tex	Sat Feb 16 17:16:19 2019 +0900
@@ -89,7 +89,7 @@
 
 \section{CbC}
 Perl6処理系の改良には、 gccとLLVM/Clang上に実装した、 Continuation based C(CbC)を用いる。
-CbCはCodeGearを基本的な処理単位とし、 CodeGearの遷移でプログラムを記述するCの下位言語である。
+CbCは関数よりも細かな単位である、 CodeGearを基本的な処理単位とし、 CodeGearの遷移でプログラムを記述するCの下位言語である。
 CodeGearの宣言は、 \_\_codeという型を持つ関数として宣言する。
 \_\_codeは内部的にはvoid型として扱っているが、 プログラマからの扱いはCodeGearである事を示す指示子のような役割である。
 CodeGearはCの関数とは異なり返り値を持たず、 呼び差し元の関数に戻る代わりに別のCodeGearへ遷移する。
@@ -109,10 +109,12 @@
 %
 
 \section{MoarVM}
-MoarVMはPerl6に特化したVMである。
-C言語で実装されている。
+MoarVMはPerl6の専用の処理系であり、 C言語で実装されている。
 JITコンパイルなどが現在導入されているが、 起動時間などが低速である問題がある。
-MoarVM独自のByteCodeがあり、 NQPからこれを出力する機能などが存在している。
+MoarVM独自のByteCodeがあり、 Perl6の記述言語であるNQPからこれを出力する機能などが存在している。
+
+MoarVMはレジスタマシンであり、 レジスタ操作や数値の加算を行う命令が存在する。
+この命令は、 Perl6プログラムが変換されたバイトコードによって指定される。
 
 
 \section{MoarVMのディスパッチ}
@@ -122,18 +124,18 @@
 分岐後は命令に応じた処理をMoarVMが行い、 次の命令を実行する。
 分岐後は命令にごとの処理を実行し、 現在の命令列から、 実行した命令の長さ分命令列を進める。
 進めた後にcase文の先頭もしくはCのラベルジャンプを利用して次の処理に遷移する。
-これを命令コードのディスパッチと呼ぶ。
+この一連の処理を命令コードのディスパッチと呼ぶ。
 命令コードの実行の中では、 現在のMoarVMのレジスタであるreg\_baseやスレッドごとの環境である構造体tcなどを参照する。
 この方法の問題点として、 巨大なcase文になっている為命令列の分割が出来ない。
 ディスパッチ部分の処理が都度走る為低速になる。
 Cファイルでの可読性とモジュール化が損なわれてしまう。
-ラベルにbreak pointを設定できない為デバッグし辛いなどがあげられる。
+ラベルにbreak pointを設定できない為デバッグし辛いなどが挙げられる。
 \lstinputlisting[label=origdis,  caption=MoarVM内のインタプリタのディスパッチ]{src/dispatch.c}
 
 \section{CbCMoarVMのディスパッチ}
 本研究ではMoarVMは2018.04.01のバージョンで実装している。
-命令コードの実行すべき単位はCbCのCodeGearの単位として扱える為命令処理をCodeGearに変換する。
-変換されたCodeGearはオリジナルのMoarVMの命令コードと対応させる為にCodeGearの配列に格納する。
+命令コードの実行すべき単位は、 CbCのCodeGearの単位として扱える為、 命令処理をCodeGearに変換する。
+変換されたCodeGearは、 オリジナルのMoarVMの命令コードと対応させる為に、 CodeGearの配列に格納する。
 MoarVMはこの配列を参照し、 要素として得られるCodeGearに軽量継続を行う。
 CodeGearでの処理が終了すると、 次のCodeGearを決定する為に必要な計算をcbc\_nextというCodeGearで行い,次の命令列に軽量継続する。
 \lstinputlisting[label=codeseg,  caption=CbCMoarVM内のインタプリタの状態遷移]{src/cbc_codesegs.cbc}
@@ -147,8 +149,9 @@
 \end{figure}
 
 
-オリジナルのMoarVMとは異なり、同一関数上で実行する訳では無い為、 MVM\_interp\_runで定義している局所変数のレジスタreg\_baseなどにアクセスすることは通常では出来ない。
-その為CodeGearの遷移において、 これら必要なインタプリタの情報を纏めた構造体INTERを宣言し、 このポインタであるINTERPを引数として入力する。
+オリジナルのMoarVMとは異なり、同一関数上で実行する訳では無い。
+従って、 MVM\_interp\_runで定義している局所変数のレジスタreg\_baseなどにアクセスすることは通常では出来ない。
+CodeGearの遷移において、 これら必要なインタプリタの情報を纏めた構造体INTERを宣言し、 このポインタであるINTERPを引数として入力する。
 各CodeGearではこのINTERPを経由することでレジスタ情報などにアクセスする。
 
 この方法の利点としてCodeGearは単なる関数として扱える為、元のソースコードの様に同一ファイル内に全ての処理を書く必要がない。
--- a/prepaper/src/cbc_example_test.cbc	Sat Feb 16 17:10:12 2019 +0900
+++ b/prepaper/src/cbc_example_test.cbc	Sat Feb 16 17:16:19 2019 +0900
@@ -1,18 +1,11 @@
 __code cg1(TEST testin){
     TEST testout;
     testout.number = testin.number + 1;
-    testout.string = testin.string;
+    testout.string = "Hello";
     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);
 }