Mercurial > hg > Papers > 2019 > anatofuz-thesis
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
--- 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); }