Mercurial > hg > Papers > 2019 > anatofuz-thesis
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などが該当する。