changeset 50:bf7074a44a5a

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 15 Feb 2019 19:16:21 +0900
parents 472bdd09ebd6
children fafc7d66ceb0
files paper/chapter4.tex paper/main.pdf
diffstat 2 files changed, 22 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter4.tex	Fri Feb 15 18:09:21 2019 +0900
+++ b/paper/chapter4.tex	Fri Feb 15 19:16:21 2019 +0900
@@ -180,10 +180,30 @@
 \lstinputlisting[frame=lrbt, label=cbc_interp, caption=CbCMoarVMのバイトコード命令に対応するCodeGear]{./codes/src/cbc_codesegs.cbc}
 
 各CodeGearは入出力として構造体INTERのポインタを利用する。
-これは前述の通り、 各CodeGear中でMoarVMの情報にアクセスする必要があるが、 MVM\_interp\_runから軽量継続でCodeGearに移動してしまうため、 INTERに設定している各変数にアクセス出来なくなる為である。
-その為、 INTERのメンバを初期化した後に、 構造体INTERを初期化しメンバを代入、 その後一度関数を経由してCodeGearの軽量継続へと移動する様に実装している。
+これは、各命令の中で使用している cur\_op や tcなどの変数へのアクセスの為である。
+通常のMoarVMの場合、 MVM\_interp\_runの関数内でタグgotoや、 switch文を利用する為に、 MVM\_interp\_runのローカル変数に各命令処理の中でアクセスする事が可能である。
+しかし、 CbCMoarVMの場合、 MVM\_interp\_runから軽量継続を利用し、 CodeGearに遷移してしまう為、 これらローカル変数にアクセスできない。
+
 
 作成したCodeGearのリストCODESは、 ソースコード\ref{cbc_next}に示すとおり、 cbc\_nextというCodeGearのみが取り扱う。
 cbc\_nextは、 マクロNEXTを利用しているが、 マクロNEXTはCODESにアクセスし、 対象となるCodeGearの名前を取得する。
 CodeGearを取得後、 引数としてiを渡し、 goto文によって命令ごとのCodeGearに遷移する。
 
+命令ディスパッチに関するCodeGearの状態遷移図を図\ref{fig:dispatch_cbc}に示す。
+
+\begin{figure}[ht]
+\caption{CbCMoarVMの命令バイトコードディスパッチの状態遷移}
+ \begin{center}
+  \includegraphics[width=120mm]{./fig/cbc_next.pdf}
+ \end{center}
+ \label{fig:dispatch_cbc}
+\end{figure}
+
+図中の破線部分は通常のC言語の関数呼び出しが行われる。
+CodeGearからCの関数呼び出しの返り値を利用することなどは通常のC言語と同様に可能である。
+各命令に対応したCodeGearは、 cbc\_next から遷移し、 処理を行った後 cbc\_next にgoto文で軽量継続する。
+
+また、 変換した命令の中には switch case文での、 breakが発生せず、 次のcase文に移行する命令が存在する。
+各CodeGearは1命令に閉じてしまっている為、 cbc\_next ではなく、 明示的に次に次のCodeGearを指定する必要がある。
+今回は直接 CodeGear 中に遷移先のCodeGearをgoto文を付けて記述した。
+ソースコード\ref{cbc_interp}中では、 cbc\_const\_i8などが該当する。
Binary file paper/main.pdf has changed