changeset 48:e08406aa6917

update
author anatofuz <anatofuz@cr.ie.u-ryukyu.ac.jp>
date Fri, 15 Feb 2019 18:05:24 +0900
parents 3f52d5153c09
children 472bdd09ebd6
files paper/chapter4.tex paper/main.pdf
diffstat 2 files changed, 31 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/paper/chapter4.tex	Fri Feb 15 17:24:45 2019 +0900
+++ b/paper/chapter4.tex	Fri Feb 15 18:05:24 2019 +0900
@@ -156,3 +156,34 @@
 これは、マクロ内部で現在の命令を示すopや、 命令列 cur\_op にアクセスする必要があるが、 従来のマクロの記述ではCbCを利用した場合に、変数にアクセス出来なくなる為に導入している。
 
 \lstinputlisting[frame=lrbt, label=cbc_inter, caption=MoarVMの情報を格納した構造体INTER]{./codes/src/INTERP.h}
+
+\section{命令実行箇所のCodeGearへの変換}
+
+命令実行箇所は、 case文又はラベルgotoで移動した先に記述されている。
+これらの箇所を、 それぞれ専用のCodeGearに変換することで、 命令の実行をCodeGearの遷移としてCbCを利用して実装する。
+MVM\_interp\_runでは、 ソースコード\ref{origin_dispatch}中で示すとおり、 マクロOPを用いて記述されている。
+
+OPを用いて記述しているそれぞれの命令は、 通常ソースコード\ref{labels_list}に示すラベル配列、 またはswitch case文で遷移する。
+従来はソースコード\ref{origin_dispatch_macro}に示す、 変数opの値利用してをマクロNEXTで対象の命令のラベル、 およびswitch文に値を引き渡す処理をしていた。
+CodeGearでの実装の際も、 このインターフェイスに揃えて実装する。
+変数opの数値は、 ソースコード\ref{labels_list}に示すラベル配列の、 命令の登場順と対応している。
+その為、命令を変換したCodeGearを、 ラベル配列と順序を対応させ、 CodeGearの配列を作成する。
+順序さえ対応させれば、 CodeGearの名前などは問わない。
+実際に作成したCodeGearのリストをソースコード\ref{codegear_list}に示す。
+変換したCodeGearは、それぞれCodeGearであることを示す為、 接頭辞としてcbc\_を付けている。
+
+\lstinputlisting[frame=lrbt, label=codegear_list, caption=CodeGear配列の一部]{./codes/src/oplables-cbc-codes.h}
+
+変換された各命令に対応するCodeGearの一部を、 ソースコード\ref{cbc_interp}に示す。
+このCodeGearはソースコード\ref{origin_dispatch}と対応している
+
+\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の軽量継続へと移動する様に実装している。
+
+作成したCodeGearのリストCODESは、 ソースコード\ref{cbc_next}に示すとおり、 cbc\_nextというCodeGearのみが取り扱う。
+cbc\_nextは、 マクロNEXTを利用しているが、 マクロNEXTはCODESにアクセスし、 対象となるCodeGearの名前を取得する。
+CodeGearを取得後、 引数としてiを渡し、 goto文によって命令ごとのCodeGearに遷移する。
+
Binary file paper/main.pdf has changed